Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-04-06 12:23:37

0001 #ifndef PhysicsTools_Calibration_ProcessRegistry_icc
0002 #define PhysicsTools_Calibration_ProcessRegistry_icc
0003 // -*- C++ -*-
0004 //
0005 // Package:     Discriminator
0006 // Class  :     ProcessRegistry
0007 //
0008 
0009 //
0010 // Author:  Christophe Saout <christophe.saout@cern.ch>
0011 // Created:     Sat Apr 24 15:18 CEST 2007
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 }  // namespace PhysicsTools
0071 
0072 #endif  // PhysicsTools_Calibration_ProcessRegistry_icc