File indexing completed on 2024-04-06 12:23:37
0001 #ifndef PhysicsTools_Calibration_ProcessRegistry_icc
0002 #define PhysicsTools_Calibration_ProcessRegistry_icc
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014 #include <string>
0015 #include <map>
0016
0017 #include "FWCore/Utilities/interface/thread_safety_macros.h"
0018 #include "PhysicsTools/MVAComputer/interface/ProcessRegistry.h"
0019
0020 namespace PhysicsTools {
0021
0022 template <class Base_t, class CalibBase_t, class Parent_t>
0023 Base_t *ProcessRegistry<Base_t, CalibBase_t, Parent_t>::Factory::create(const char *name,
0024 const CalibBase_t *calib,
0025 Parent_t *parent) {
0026 return ProcessRegistry::create(name, calib, parent);
0027 }
0028
0029 template <class Base_t, class CalibBase_t, class Parent_t>
0030 tbb::concurrent_unordered_map<std::string, const ProcessRegistry<Base_t, CalibBase_t, Parent_t> *> *
0031 ProcessRegistry<Base_t, CalibBase_t, Parent_t>::getRegistry() {
0032 CMS_THREAD_SAFE static struct Sentinel {
0033 Sentinel() : instance(new RegistryMap) {}
0034 ~Sentinel() {
0035 delete instance;
0036 instance = nullptr;
0037 }
0038
0039 RegistryMap *instance;
0040 } sentinel;
0041
0042 return sentinel.instance;
0043 }
0044
0045 template <class Base_t, class CalibBase_t, class Parent_t>
0046 Base_t *ProcessRegistry<Base_t, CalibBase_t, Parent_t>::create(const char *name,
0047 const CalibBase_t *calib,
0048 Parent_t *parent) {
0049 typename RegistryMap::iterator pos = getRegistry()->find(name);
0050
0051 if (pos == getRegistry()->end())
0052 return nullptr;
0053
0054 return pos->second->instance(name, calib, parent);
0055 }
0056
0057 template <class Base_t, class CalibBase_t, class Parent_t>
0058 void ProcessRegistry<Base_t, CalibBase_t, Parent_t>::registerProcess(const char *name,
0059 const ProcessRegistry *process) {
0060 (*getRegistry())[name] = process;
0061 }
0062
0063 template <class Base_t, class CalibBase_t, class Parent_t>
0064 void ProcessRegistry<Base_t, CalibBase_t, Parent_t>::unregisterProcess(const char *name) {
0065 RegistryMap *map = getRegistry();
0066 if (map)
0067 map->unsafe_erase(name);
0068 }
0069
0070 }
0071
0072 #endif