39 #include "cafAssert.h"
55 #define CAFFA_FACTORY_CONCATENATE_STRINGS( foo, bar ) CAFFA_FACTORY_CONCATENATE_STRINGS_IMPL_( foo, bar )
56 #define CAFFA_FACTORY_CONCATENATE_STRINGS_IMPL_( foo, bar ) foo##bar
58 #define CAFFA_UNIQUE_COMPILE_UNIT_VAR_NAME( foo ) CAFFA_FACTORY_CONCATENATE_STRINGS( foo, __LINE__ )
63 #define CAFFA_FACTORY_REGISTER( BaseType, TypeToCreate, KeyType, key ) \
64 static bool CAFFA_UNIQUE_COMPILE_UNIT_VAR_NAME( my##TypeToCreate ) = \
65 caffa::Factory<BaseType, KeyType>::instance()->registerCreator<TypeToCreate>( key )
66 #define CAFFA_FACTORY_REGISTER2( BaseType, TypeToCreate, KeyType, key ) \
67 static bool CAFFA_UNIQUE_COMPILE_UNIT_VAR_NAME( my2##TypeToCreate ) = \
68 caffa::Factory<BaseType, KeyType>::instance()->registerCreator<TypeToCreate>( key )
94 template <
typename BaseType,
typename KeyType>
97 class ObjectCreatorBase;
100 typedef typename std::map<KeyType, ObjectCreatorBase*>::iterator iterator_type;
108 template <
typename TypeToCreate>
109 bool registerCreator(
const KeyType& key )
111 iterator_type entryIt;
113 entryIt = m_factoryMap.find( key );
114 if ( entryIt == m_factoryMap.end() )
116 m_factoryMap[key] =
new ObjectCreator<TypeToCreate>();
122 BaseType* create(
const KeyType& key )
124 iterator_type entryIt;
126 entryIt = m_factoryMap.find( key );
127 if ( entryIt != m_factoryMap.end() )
129 return entryIt->second->create();
137 std::vector<KeyType> allKeys()
139 std::vector<KeyType> keys;
141 iterator_type entryIt;
142 for ( entryIt = m_factoryMap.begin(); entryIt != m_factoryMap.end(); ++entryIt )
144 keys.push_back( entryIt->first );
154 iterator_type entryIt;
156 for ( entryIt = m_factoryMap.begin(); entryIt != m_factoryMap.end(); ++entryIt )
158 delete ( entryIt->second );
164 class ObjectCreatorBase
167 ObjectCreatorBase() {}
168 virtual ~ObjectCreatorBase() {}
169 virtual BaseType* create() = 0;
172 template <
typename TypeToCreate>
173 class ObjectCreator :
public ObjectCreatorBase
176 BaseType* create()
override {
return new TypeToCreate(); }
180 std::map<KeyType, ObjectCreatorBase*> m_factoryMap;
Definition: cafFactory.h:96
Main Caffa namespace.
Definition: __init__.py:1