CMS 3D CMS Logo

ESProducts.h
Go to the documentation of this file.
1 #ifndef FWCore_Framework_ESProducts_h
2 #define FWCore_Framework_ESProducts_h
3 // -*- C++ -*-
4 //
5 // Package: Framework
6 // Class : ESProducts
7 //
18 //
19 // Author: Chris Jones
20 // Created: Sun Apr 17 17:30:46 EDT 2005
21 //
22 
23 // system include files
24 #include <memory>
25 
26 // user include files
28 
29 // forward declarations
30 namespace edm {
31  namespace eventsetup {
32  namespace produce {
33  template <typename T1, typename... TArgs>
34  struct ProductHolder : public ProductHolder<TArgs...> {
35  using parent_type = ProductHolder<TArgs...>;
36 
40  ProductHolder<T1, TArgs...>& operator=(ProductHolder<T1, TArgs...>&&) = default;
41  ProductHolder<T1, TArgs...>& operator=(ProductHolder<T1, TArgs...> const&) = default;
42 
43  template <typename T>
44  void setAllValues(T& iValuesFrom) {
45  iValuesFrom.setFromRecursive(*this);
46  }
47  using parent_type::moveTo;
48  void moveTo(T1& oValue) { oValue = std::move(value); }
49 
51  void setFrom(T1& iValue) { value = iValue; }
52  void setFrom(T1&& iValue) { value = std::move(iValue); }
53 
54  template <typename T>
55  void setFromRecursive(T& iValuesTo) {
56  iValuesTo.setFrom(value);
58  }
59 
60  template <typename T>
61  void moveToRecursive(T& iValuesTo) {
62  iValuesTo.moveTo(value);
64  }
65  T1 value;
66 
67  using tail_type = T1;
69  };
70 
71  template <typename T1>
72  struct ProductHolder<T1> {
74  ProductHolder(ProductHolder<T1>&&) = default;
75  ProductHolder(ProductHolder<T1> const&) = default;
78 
79  template <typename T>
80  void setAllValues(T& iValuesFrom) {
81  iValuesFrom.moveToRecursive(*this);
82  }
83  void moveTo(T1& oValue) { oValue = std::move(value); }
84  void setFrom(T1& iValue) { value = iValue; }
85  void setFrom(T1&& iValue) { value = std::move(iValue); }
86  template <typename T>
87  void moveToRecursive(T& iValuesTo) {
88  iValuesTo.moveTo(value);
89  }
90  template <typename T>
91  void setFromRecursive(T& iValuesTo) {
92  iValuesTo.setFrom(value);
93  }
94  T1 value;
95 
96  using tail_type = T1;
97  using head_type = Null;
98  };
99 
100  } // namespace produce
101  } // namespace eventsetup
102  struct ESFillDirectly {};
103 
104  template <typename... TArgs>
105  struct ESProducts : public eventsetup::produce::ProductHolder<TArgs...> {
107  template <typename... S>
109  parent_type::setAllValues(iProducts);
110  }
111  template <typename T>
112  /*explicit*/ ESProducts(T&& iValues) {
113  parent_type::setAllValues(iValues);
114  }
115  template <typename... Vars>
117  (this->setFrom(std::forward<Vars>(vars)), ...);
118  }
119 
120  ESProducts(ESProducts<TArgs...> const&) = default;
121  ESProducts(ESProducts<TArgs...>&&) = default;
122  ESProducts<TArgs...>& operator=(ESProducts<TArgs...> const&) = default;
123  ESProducts<TArgs...>& operator=(ESProducts<TArgs...>&&) = default;
124  };
125 
126  namespace es {
127  template <typename... TArgs>
129  return ESProducts<std::remove_reference_t<TArgs>...>(edm::ESFillDirectly{}, std::forward<TArgs>(args)...);
130  }
131  } // namespace es
132 
133  template <typename... TArgs, typename ToT>
134  void moveFromTo(ESProducts<TArgs...>& iFrom, ToT& iTo) {
135  iFrom.moveTo(iTo);
136  }
137 } // namespace edm
138 
139 #endif
ProductHolder< TArgs... > parent_type
Definition: ESProducts.h:35
ESProducts(ESFillDirectly, Vars &&...vars)
Definition: ESProducts.h:116
ESProducts< std::remove_reference_t< TArgs >... > products(TArgs &&...args)
Definition: ESProducts.h:128
ProductHolder< T1, TArgs... > & operator=(ProductHolder< T1, TArgs... > &&)=default
void moveFromTo(FromT &iFrom, ToT &iTo)
Definition: value.py:1
ESProducts(ESProducts< S... > &&iProducts)
Definition: ESProducts.h:108
HLT enums.
ESProducts(T &&iValues)
Definition: ESProducts.h:112
vars
Definition: DeepTauId.cc:77
long double T
eventsetup::produce::ProductHolder< TArgs... > parent_type
Definition: ESProducts.h:106
def move(src, dest)
Definition: eostools.py:511