8 #ifndef SCARAB_FACTORY_HH_ 9 #define SCARAB_FACTORY_HH_ 21 LOGGER( slog_fact,
"factory" );
27 template<
class XBaseType,
typename ... XArgs >
32 template<
class XBaseType,
typename ... XArgs >
40 friend class factory< XBaseType, XArgs... >;
43 virtual XBaseType*
create( XArgs ... args )
const = 0;
49 template<
class XBaseType,
class XDerivedType,
typename ... XArgs >
53 registrar(
const std::string& a_class_name );
57 void register_class(
const std::string& a_class_name )
const;
59 XBaseType*
create( XArgs ... args )
const;
66 template<
class XBaseType,
typename ... XArgs >
76 XBaseType*
create(
const std::string& a_class_name, XArgs ... args );
77 XBaseType*
create(
const FactoryCIt& iter, XArgs ... args );
80 bool has_class(
const std::string& a_class_name )
const;
81 void remove_class(
const std::string& a_class_name );
83 FactoryCIt begin()
const;
84 FactoryCIt end()
const;
101 template<
class XBaseType >
112 virtual XBaseType*
create()
const = 0;
116 template<
class XBaseType,
class XDerivedType >
120 registrar(
const std::string& a_class_name );
124 void register_class(
const std::string& a_class_name )
const;
126 XBaseType*
create()
const;
132 template<
class XBaseType >
136 typedef std::map< std::string, const base_registrar< XBaseType >* >
FactoryMap;
142 XBaseType*
create(
const std::string& a_class_name );
143 XBaseType*
create(
const FactoryCIt& iter );
146 bool has_class(
const std::string& a_class_name )
const;
147 void remove_class(
const std::string& a_class_name );
149 FactoryCIt begin()
const;
150 FactoryCIt end()
const;
170 template<
class XBaseType,
typename ... XArgs >
173 std::unique_lock< std::mutex > t_lock( this->f_factory_mutex );
174 return iter->second->create( args... );
177 template<
class XBaseType,
typename ... XArgs >
185 std::unique_lock< std::mutex > t_lock( this->f_factory_mutex );
187 if( it == fMap->end() )
189 LERROR( slog_fact,
"Did not find factory for <" << a_class_name <<
">." );
193 return it->second->create( args... );
196 template<
class XBaseType,
typename ... XArgs >
200 LOGGER( slog_factory_reg,
"factory-register");
202 std::unique_lock< std::mutex > t_lock( this->f_factory_mutex );
204 if (it != fMap->end())
206 LERROR( slog_factory_reg,
"Already have factory registered for <" << a_class_name <<
">." );
210 LDEBUG( slog_factory_reg,
"Registered a factory for class " << a_class_name <<
" at " << (*fMap)[ a_class_name ] <<
", factory #" << fMap->size()-1 <<
" for " << this );
213 template<
class XBaseType,
typename ... XArgs >
216 return fMap->find( a_class_name ) != fMap->end();
219 template<
class XBaseType,
typename ... XArgs >
222 LDEBUG( slog_fact,
"Removing factory for class " << a_class_name <<
" from " <<
this );
223 FactoryIt iter = fMap->find( a_class_name );
224 if( iter != fMap->end() ) fMap->erase( iter );
228 template<
class XBaseType,
typename ... XArgs >
234 template<
class XBaseType,
typename ... XArgs >
240 template<
class XBaseType,
typename ... XArgs >
243 std::unique_lock< std::mutex > t_lock( this->f_factory_mutex );
244 return fMap->begin();
247 template<
class XBaseType,
typename ... XArgs >
250 std::unique_lock< std::mutex > t_lock( this->f_factory_mutex );
256 template<
class XBaseType,
class XDerivedType,
typename ... XArgs >
259 f_class_name( a_class_name )
264 template<
class XBaseType,
class XDerivedType,
typename ... XArgs >
270 template<
class XBaseType,
class XDerivedType,
typename ... XArgs >
277 template<
class XBaseType,
class XDerivedType,
typename ... XArgs >
280 return dynamic_cast< XBaseType*
>(
new XDerivedType( args... ) );
290 template<
class XBaseType >
293 std::unique_lock< std::mutex > t_lock( this->f_factory_mutex );
294 return iter->second->create();
297 template<
class XBaseType >
305 std::unique_lock< std::mutex > t_lock( this->f_factory_mutex );
307 if( it == fMap->end() )
309 LERROR( slog_fact,
"Did not find factory for <" << a_class_name <<
">." );
313 return it->second->create();
316 template<
class XBaseType >
320 LOGGER( slog_factory_reg,
"factory-register");
322 std::unique_lock< std::mutex > t_lock( this->f_factory_mutex );
324 if (it != fMap->end())
326 LERROR( slog_factory_reg,
"Already have factory registered for <" << a_class_name <<
">." );
330 LDEBUG( slog_factory_reg,
"Registered a factory for class " << a_class_name <<
", factory #" << fMap->size()-1 <<
" for " << this );
333 template<
class XBaseType >
336 return fMap->find( a_class_name ) != fMap->end();
339 template<
class XBaseType >
342 LDEBUG( slog_fact,
"Removing factory for class " << a_class_name <<
" from " <<
this );
343 FactoryIt iter = fMap->find( a_class_name );
344 if( iter != fMap->end() ) fMap->erase( iter );
348 template<
class XBaseType >
354 template<
class XBaseType >
360 template<
class XBaseType >
364 return fMap->begin();
367 template<
class XBaseType >
376 template<
class XBaseType,
class XDerivedType >
379 f_class_name( a_class_name )
384 template<
class XBaseType,
class XDerivedType >
390 template<
class XBaseType,
class XDerivedType >
397 template<
class XBaseType,
class XDerivedType >
400 return dynamic_cast< XBaseType*
>(
new XDerivedType() );
virtual ~base_registrar()
XBaseType * create(const std::string &a_class_name, XArgs ... args)
FactoryMap::const_iterator FactoryCIt
LOGGER(mtlog, "authentication")
static factory< XBaseType, XArgs... > * get_instance()
XBaseType * create(XArgs ... args) const
void register_class(const std::string &a_class_name, const base_registrar< XBaseType, XArgs... > *base_registrar)
FactoryMap::value_type FactoryEntry
void register_class(const std::string &a_class_name) const
registrar(const std::string &a_class_name)
Contains the logger class and macros, based on Kasper's KLogger class.
FactoryMap::iterator FactoryIt
virtual ~base_registrar()
std::mutex f_factory_mutex
std::map< std::string, const base_registrar< XBaseType > *> FactoryMap
FactoryMap::iterator FactoryIt
std::mutex f_factory_mutex
bool has_class(const std::string &a_class_name) const
std::map< std::string, const base_registrar< XBaseType, XArgs... > *> FactoryMap
FactoryMap::const_iterator FactoryCIt
void remove_class(const std::string &a_class_name)
virtual XBaseType * create(XArgs ... args) const =0
#define allow_singleton_access(class_name)
FactoryMap::value_type FactoryEntry