CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
ParameterSetDescriptionFiller.h
Go to the documentation of this file.
1 #ifndef FWCore_ParameterSet_ParameterSetDescriptionFiller_h
2 #define FWCore_ParameterSet_ParameterSetDescriptionFiller_h
3 // -*- C++ -*-
4 //
5 // Package: ParameterSet
6 // Class : ParameterSetDescriptionFiller
7 //
20 //
21 // Original Author: Chris Jones
22 // Created: Wed Aug 1 16:46:56 EDT 2007
23 //
24 
25 #include <type_traits>
26 #include <string>
27 #include <boost/mpl/if.hpp>
43 
44 namespace edm {
45  template< typename T>
47  {
48  public:
50 
51  virtual void fill(ConfigurationDescriptions & descriptions) const {
52  T::fillDescriptions(descriptions);
53  T::prevalidate(descriptions);
54  }
55 
56  virtual const std::string& baseType() const {
57  return T::baseType();
58  }
59 
60  virtual const std::string& extendedBaseType() const {
85 
86  return kEmpty;
87  }
88 
89  private:
92  };
93 
94  // We need a special version of this class for Services because there is
95  // no common base class for all Service classes. This means we cannot define
96  // the baseType and fillDescriptions functions for all Service classes without
97  // great difficulty.
98 
99  // First, some template metaprogramming to determining if the class T has
100  // a fillDescriptions function.
101 
102  namespace fillDetails {
103 
104  typedef char (& no_tag)[1]; // type indicating FALSE
105  typedef char (& yes_tag)[2]; // type indicating TRUE
106 
107  template <typename T, void (*)(ConfigurationDescriptions &)> struct fillDescriptions_function;
108  template <typename T> no_tag has_fillDescriptions_helper(...);
110 
111  template<typename T>
113  static bool const value =
114  sizeof(has_fillDescriptions_helper<T>(0)) == sizeof(yes_tag);
115  };
116 
117  template <typename T>
119  void operator()(ConfigurationDescriptions & descriptions) {
120  T::fillDescriptions(descriptions);
121  }
122  };
123 
124  template <typename T>
126  void operator()(ConfigurationDescriptions & descriptions) {
128  desc.setUnknown();
129  descriptions.addDefault(desc);
130  }
131  };
132 
133  template <typename T, void (*)(ConfigurationDescriptions &)> struct prevalidate_function;
134  template <typename T> no_tag has_prevalidate_helper(...);
136 
137  template<typename T>
139  static bool const value =
140  sizeof(has_prevalidate_helper<T>(0)) == sizeof(yes_tag);
141  };
142 
143  template <typename T>
144  struct DoPrevalidate {
145  void operator()(ConfigurationDescriptions & descriptions) {
146  T::prevalidate(descriptions);
147  }
148  };
149 
150  template <typename T>
151  struct DoNothing {
152  void operator()(ConfigurationDescriptions & descriptions) {
153  }
154  };
155 
156  }
157 
158  // Not needed at the moment
159  //void prevalidateService(ConfigurationDescriptions &);
160 
161  template< typename T>
163  {
164  public:
166 
167  // If T has a fillDescriptions function then just call that, otherwise
168  // put in an "unknown description" as a default.
169  virtual void fill(ConfigurationDescriptions & descriptions) const {
172  edm::fillDetails::DoFillAsUnknown<T> >::type fill_descriptions;
173  fill_descriptions(descriptions);
174  //we don't have a need for prevalidation of services at the moment, so this is a placeholder
175  // Probably the best package to declare this in would be FWCore/ServiceRegistry
176  //prevalidateService(descriptions);
177  }
178 
179  virtual const std::string& baseType() const {
180  return kBaseForService;
181  }
182 
183  virtual const std::string& extendedBaseType() const {
184  return kEmpty;
185  }
186 
187  private:
188  void prevalidate(ConfigurationDescriptions & descriptions);
191  };
192 
193  template<typename T>
195  {
196  public:
198 
199  // If T has a fillDescriptions function then just call that, otherwise
200  // put in an "unknown description" as a default.
201  virtual void fill(ConfigurationDescriptions & descriptions) const {
204  edm::fillDetails::DoFillAsUnknown<T> >::type fill_descriptions;
205  fill_descriptions(descriptions);
206 
210  prevalidate(descriptions);
211  }
212 
213  virtual const std::string& baseType() const {
214  return kBaseForESSource;
215  }
216 
217  virtual const std::string& extendedBaseType() const {
218  return kEmpty;
219  }
220 
221  private:
224  };
225 
226  template<typename T>
228  {
229  public:
231 
232  // If T has a fillDescriptions function then just call that, otherwise
233  // put in an "unknown description" as a default.
234  virtual void fill(ConfigurationDescriptions & descriptions) const {
237  edm::fillDetails::DoFillAsUnknown<T> >::type fill_descriptions;
238  fill_descriptions(descriptions);
239 
243  prevalidate(descriptions);
244  }
245 
246  virtual const std::string& baseType() const {
247  return kBaseForESProducer;
248  }
249 
250  virtual const std::string& extendedBaseType() const {
251  return kEmpty;
252  }
253 
254  private:
257  };
258 }
259 #endif
type
Definition: HCALResponse.h:21
virtual const std::string & baseType() const
void prevalidate(ConfigurationDescriptions &descriptions)
virtual void fill(ConfigurationDescriptions &descriptions) const
virtual const std::string & extendedBaseType() const
virtual const std::string & baseType() const
no_tag has_prevalidate_helper(...)
virtual const std::string & baseType() const
const ParameterSetDescriptionFiller & operator=(const ParameterSetDescriptionFiller &)
no_tag has_fillDescriptions_helper(...)
virtual const std::string & extendedBaseType() const
void addDefault(ParameterSetDescription const &psetDescription)
virtual const std::string & baseType() const
void operator()(ConfigurationDescriptions &descriptions)
const DescriptionFillerForESSources & operator=(const DescriptionFillerForESSources &)
virtual const std::string & extendedBaseType() const
const DescriptionFillerForESProducers & operator=(const DescriptionFillerForESProducers &)
virtual void fill(ConfigurationDescriptions &descriptions) const
virtual const std::string & extendedBaseType() const
void operator()(ConfigurationDescriptions &descriptions)
virtual void fill(ConfigurationDescriptions &descriptions) const
virtual void fill(ConfigurationDescriptions &descriptions) const
const DescriptionFillerForServices & operator=(const DescriptionFillerForServices &)
void operator()(ConfigurationDescriptions &descriptions)
void operator()(ConfigurationDescriptions &descriptions)