Go to the documentation of this file.00001 #ifndef Framework_ComponentMaker_h
00002 #define Framework_ComponentMaker_h
00003
00004
00005
00006
00007
00016
00017
00018
00019
00020
00021
00022 #include <string>
00023 #include "boost/shared_ptr.hpp"
00024
00025
00026 #include "FWCore/Framework/interface/ComponentDescription.h"
00027 #include "FWCore/Framework/interface/DataProxyProvider.h"
00028 #include "FWCore/Framework/interface/EventSetupRecordIntervalFinder.h"
00029
00030
00031
00032 namespace edm {
00033 namespace eventsetup {
00034 class EventSetupProvider;
00035 class DataProxyProvider;
00036
00037 class ComponentMakerBaseHelper
00038 {
00039 public:
00040 virtual ~ComponentMakerBaseHelper() {}
00041 protected:
00042 ComponentDescription createComponentDescription(ParameterSet const& iConfiguration,
00043 std::string const& iProcessName,
00044 ReleaseVersion const& iVersion,
00045 PassID const& iPass) const;
00046 };
00047
00048 template <class T>
00049 class ComponentMakerBase : private ComponentMakerBaseHelper {
00050 public:
00051 typedef typename T::base_type base_type;
00052 virtual boost::shared_ptr<base_type> addTo(EventSetupProvider& iProvider,
00053 ParameterSet const& iConfiguration,
00054 std::string const& iProcessName,
00055 ReleaseVersion const& iVersion,
00056 PassID const& iPass) const = 0;
00057 protected:
00058 using ComponentMakerBaseHelper::createComponentDescription;
00059 };
00060
00061 template <class T, class TComponent>
00062 class ComponentMaker : public ComponentMakerBase<T>
00063 {
00064
00065 public:
00066 ComponentMaker() {}
00067
00068 typedef typename T::base_type base_type;
00069
00070
00071 virtual boost::shared_ptr<base_type> addTo(EventSetupProvider& iProvider,
00072 ParameterSet const& iConfiguration,
00073 std::string const& iProcessName,
00074 ReleaseVersion const& iVersion,
00075 PassID const& iPass) const;
00076
00077
00078
00079
00080 private:
00081 ComponentMaker(const ComponentMaker&);
00082
00083 const ComponentMaker& operator=(const ComponentMaker&);
00084
00085 void setDescription(DataProxyProvider* iProv, const ComponentDescription& iDesc) const {
00086 iProv->setDescription(iDesc);
00087 }
00088 void setDescriptionForFinder(EventSetupRecordIntervalFinder* iFinder, const ComponentDescription& iDesc) const {
00089 iFinder->setDescriptionForFinder(iDesc);
00090 }
00091 void setPostConstruction(DataProxyProvider* iProv, const edm::ParameterSet& iPSet) const {
00092
00093
00094 iProv->setAppendToDataLabel(iPSet);
00095 }
00096 void setDescription(void*, const ComponentDescription&) const {
00097 }
00098 void setDescriptionForFinder(void*, const ComponentDescription&) const {
00099 }
00100 void setPostConstruction(void*, const edm::ParameterSet&) const {
00101 }
00102
00103
00104 };
00105
00106 template< class T, class TComponent>
00107 boost::shared_ptr<typename ComponentMaker<T,TComponent>::base_type>
00108 ComponentMaker<T,TComponent>::addTo(EventSetupProvider& iProvider,
00109 ParameterSet const& iConfiguration,
00110 std::string const& iProcessName,
00111 ReleaseVersion const& iVersion,
00112 PassID const& iPass) const
00113 {
00114 boost::shared_ptr<TComponent> component(new TComponent(iConfiguration));
00115 ComponentDescription description =
00116 this->createComponentDescription(iConfiguration,
00117 iProcessName,
00118 iVersion,
00119 iPass);
00120
00121 this->setDescription(component.get(),description);
00122 this->setDescriptionForFinder(component.get(),description);
00123 this->setPostConstruction(component.get(),iConfiguration);
00124 T::addTo(iProvider, component);
00125 return component;
00126 }
00127 }
00128 }
00129 #endif