1 #ifndef _GAUDI_PLUGIN_SERVICE_DETAILS_H_ 2 #define _GAUDI_PLUGIN_SERVICE_DETAILS_H_ 23 #if defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103L 28 # define GAUDIPS_HASCLASSVISIBILITY 31 #if defined(GAUDIPS_HASCLASSVISIBILITY) 32 # define GAUDIPS_IMPORT __attribute__((visibility("default"))) 33 # define GAUDIPS_EXPORT __attribute__((visibility("default"))) 34 # define GAUDIPS_LOCAL __attribute__((visibility("hidden"))) 36 # define GAUDIPS_IMPORT 37 # define GAUDIPS_EXPORT 38 # define GAUDIPS_LOCAL 41 #ifdef GaudiPluginService_EXPORTS 42 #define GAUDIPS_API GAUDIPS_EXPORT 44 #define GAUDIPS_API GAUDIPS_IMPORT 47 namespace Gaudi {
namespace PluginService {
57 #if !defined(__REFLEX__) || defined(ATLAS) 58 template <
typename S,
typename... Args>
60 return new T(std::forward<Args>(
args)...);
84 union {
void* src; F
dst; } p2p;
112 library(
std::move(lib)), ptr(p),
113 type(
std::move(t)), rtype(
std::move(rt)),
136 template <
typename F,
typename T,
typename I>
138 union {
typename F::FuncType src;
void*
dst; } p2p;
141 return add(o.
str(), p2p.dst,
142 typeid(
typename F::FuncType).
name(),
143 typeid(
typename F::ReturnType).
name(),
164 if (!m_initialized)
const_cast<Registry*
>(
this)->initialize();
187 if (!m_initialized) initialize();
201 #if defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103L 238 #define _INTERNAL_FACTORY_REGISTER_CNAME(name, serial) \ 239 _register_ ## _ ## serial 241 #define _INTERNAL_DECLARE_FACTORY_WITH_CREATOR(type, typecreator, \ 242 id, factory, serial) \ 244 class _INTERNAL_FACTORY_REGISTER_CNAME(type, serial) { \ 246 typedef factory s_t; \ 247 typedef typecreator f_t; \ 248 static s_t::FuncType creator() { return &f_t::create<s_t>; } \ 249 _INTERNAL_FACTORY_REGISTER_CNAME(type, serial) () { \ 250 using ::Gaudi::PluginService::Details::Registry; \ 251 Registry::instance().add<s_t, type>(id, creator()); \ 253 } _INTERNAL_FACTORY_REGISTER_CNAME(s_ ## type, serial); \ 256 #define _INTERNAL_DECLARE_FACTORY(type, id, factory, serial) \ 257 _INTERNAL_DECLARE_FACTORY_WITH_CREATOR(type, \ 258 ::Gaudi::PluginService::Details::Factory<type>, \ 261 #endif //_GAUDI_PLUGIN_SERVICE_DETAILS_H_
void error(const std::string &msg)
Registry(const Registry &)
Private copy constructor for the singleton pattern.
Class providing default factory functions.
FactoryMap & factories()
Return the known factories (loading the list if not yet done).
std::vector< Gaudi::Details::PropertyBase * > Properties
GAUDIPS_API Logger & logger()
Return the current logger instance.
FactoryInfo & addProperty(const KeyType &k, std::string v)
std::map< KeyType, std::string > Properties
Type used for the properties implementation.
Simple logging class, just to provide a default implementation.
static S::ReturnType create(Args &&...args)
GAUDIPS_API void SetDebug(int debugLevel)
Backward compatibility with Reflex.
FactoryInfo(std::string lib, void *p=0, std::string t="", std::string rt="", std::string cn="", Properties props=Properties())
GAUDIPS_API std::string demangle(const std::type_info &id)
Return a canonical name for type_info object (implementation borrowed from GaudiKernel/System).
const FactoryMap & factories() const
Return the known factories (loading the list if not yet done).
void warning(const std::string &msg)
void info(const std::string &msg)
Logger(Level level=Warning)
GAUDIPS_API void * getCreator(const std::string &id, const std::string &type)
Function used to load a specific factory function.
In-memory database of the loaded factories.
FactoryInfo & add(const I &id, typename F::FuncType ptr)
Add a factory to the database.
GAUDIPS_API int Debug()
Backward compatibility with Reflex.
GAUDIPS_API void setLogger(Logger *logger)
Set the logger instance to use.
void setLevel(Level level)
std::map< KeyType, FactoryInfo > FactoryMap
Type used for the database implementation.
FactoryMap m_factories
Internal storage for factories.
Helper functions to set/get the application return code.
bool m_initialized
Flag recording if the registry has been initialized or not.
void debug(const std::string &msg)