QMCPACK
RefVectorWithLeader.h
Go to the documentation of this file.
1 //////////////////////////////////////////////////////////////////////////////////////
2 // This file is distributed under the University of Illinois/NCSA Open Source License.
3 // See LICENSE file in top directory for details.
4 //
5 // Copyright (c) 2021 QMCPACK developers
6 //
7 // File developed by: Ye Luo, yeluo@anl.gov, Argonne National Laboratory
8 //
9 // File created by: Ye Luo, yeluo@anl.gov, Argonne National Laboratory
10 //
11 //////////////////////////////////////////////////////////////////////////////////////
12 
13 #ifndef QMCPLUSPLUS_REFVECTORWITHLEADER_H
14 #define QMCPLUSPLUS_REFVECTORWITHLEADER_H
15 
16 #include <cassert>
17 #include <vector>
18 #include <memory>
19 
20 namespace qmcplusplus
21 {
22 template<typename T>
23 class RefVectorWithLeader : public std::vector<std::reference_wrapper<T>>
24 {
25 public:
26  RefVectorWithLeader(T& leader) : leader_(leader) {}
27 
28  RefVectorWithLeader(T& leader, const std::vector<std::reference_wrapper<T>>& vec) : leader_(leader)
29  {
30  for (T& element : vec)
31  this->push_back(element);
32  }
33 
34  T& getLeader() const { return leader_; }
35 
36  T& operator[](size_t i) const { return std::vector<std::reference_wrapper<T>>::operator[](i).get(); }
37 
38  template<typename CASTTYPE>
39  CASTTYPE& getCastedLeader() const
40  {
41  static_assert(std::is_const<T>::value == std::is_const<CASTTYPE>::value, "Unmatched const type qualifier!");
42  assert(dynamic_cast<CASTTYPE*>(&leader_.get()) != nullptr);
43  return static_cast<CASTTYPE&>(leader_.get());
44  }
45 
46  template<typename CASTTYPE>
47  CASTTYPE& getCastedElement(size_t i) const
48  {
49  static_assert(std::is_const<T>::value == std::is_const<CASTTYPE>::value, "Unmatched const type qualifier!");
50  assert(dynamic_cast<CASTTYPE*>(&(*this)[i]) != nullptr);
51  return static_cast<CASTTYPE&>((*this)[i]);
52  }
53 
54 private:
55  std::reference_wrapper<T> leader_;
56 };
57 } // namespace qmcplusplus
58 
59 #endif
RefVectorWithLeader(T &leader, const std::vector< std::reference_wrapper< T >> &vec)
helper functions for EinsplineSetBuilder
Definition: Configuration.h:43
CASTTYPE & getCastedElement(size_t i) const
std::reference_wrapper< T > leader_