35 #include <loki/Singleton.h> 37 Class& Loki::Singleton<Class>::Instance()
39 return Loki::SingletonHolder<Class>::Instance();
43 #define FACTORY_REGISTER(BASE, _ID, NAME) FACTORY_REGISTER_ID_TYPE(BASE, BASE##Id_##_ID, BASE##_ID, NAME) 44 #define FACTORY_REGISTER_ID_TYPE(BASE, ID, TYPE, NAME) \ 45 FACTORY_REGISTER_ID_TYPE_AUTO(BASE, ID, TYPE, NAME) \ 46 bool Register##TYPE##_Man() { \ 47 return BASE::Register<TYPE>(ID, NAME); \ 50 #define FACTORY_REGISTER_ID_TYPE_AUTO(BASE, ID, TYPE, NAME) \ 52 static const struct factory_register_##TYPE { \ 53 inline factory_register_##TYPE() { \ 54 BASE::Register<TYPE>(ID, NAME); \ 59 #define FACTORY_DEFINE(T) \ 60 class T##Factory : public Factory<T##Id, T, T##Factory> {}; \ 61 bool T::Register(T##Id id, T##Creator c, const char *name) { \ 62 DBG(#T "::Register(..., %s)\n", name); \ 63 return T##Factory::Instance().registerCreator(id, c) && T##Factory::Instance().registerIdName(id, name); \ 65 T* T::create(T##Id id) {return T##Factory::Instance().create(id);} \ 66 T* T::create(const char* name) { return T::create(T::id(name));} \ 67 T##Id* T::next(T##Id *id) { \ 68 const std::vector<T##Id>& ids = T##Factory::Instance().registeredIds(); \ 69 if (!id) return (T##Id*)&ids[0]; \ 70 T##Id *id0 = (T##Id*)&ids[0], *id1 = (T##Id*)&ids[ids.size() - 1]; \ 71 if (id >= id0 && id < id1) return id + 1; \ 72 if (id == id1) return NULL; \ 73 std::vector<T##Id>::const_iterator it = std::find(ids.begin(), ids.end(), *id); \ 74 if (it == ids.end()) return NULL; \ 75 return (T##Id*)&*(it++); \ 77 T##Id T::id(const char* name) { DBG(#T "::id(\"%s\")\n", name); return T##Factory::Instance().id(name, false);} \ 78 const char* T::name(T##Id id) {return T##Factory::Instance().name(id);} 83 template <
typename Id,
typename T,
class Class>
89 typedef Type* (*Creator)();
91 Type*
create(
const ID&
id);
94 std::pair<typename CreatorMap::iterator, bool> result = creators.insert(std::make_pair(
id, create<C>));
103 ID
id(
const char* name,
bool caseSensitive =
true)
const;
104 const char*
name(
const ID &
id)
const;
105 size_t count()
const;
118 static Type* create() {
121 typedef std::map<ID, Creator> CreatorMap;
124 typedef std::map<ID, const char*> NameMap;
128 template<
typename Id,
typename T,
class Class>
130 template<
typename Id,
typename T,
class Class>
133 template<
typename Id,
typename T,
class Class>
136 typename CreatorMap::const_iterator it = creators.find(
id);
137 if (it == creators.end()) {
142 return (it->second)();
145 template<
typename Id,
typename T,
class Class>
149 ids.insert(ids.end(),
id);
150 return creators.insert(
typename CreatorMap::value_type(
id, callback)).second;
153 template<
typename Id,
typename T,
class Class>
156 return name_map.insert(
typename NameMap::value_type(
id, name)).second;
159 template<
typename Id,
typename T,
class Class>
163 ids.erase(std::remove(ids.begin(), ids.end(),
id), ids.end());
165 return creators.erase(
id) == 1;
168 template<
typename Id,
typename T,
class Class>
172 #define strcasecmp(s1, s2) _strcmpi(s1, s2) 175 for (
typename NameMap::const_iterator it = name_map.begin(); it!=name_map.end(); ++it) {
177 if (it->second == name || !strcmp(it->second, name))
180 if (!strcasecmp(it->second, name)) {
189 template<
typename Id,
typename T,
class Class>
192 typename NameMap::const_iterator it = name_map.find(
id);
193 if (it == name_map.end())
198 template<
typename Id,
typename T,
class Class>
204 template<
typename Id,
typename T,
class Class>
207 std::vector<const char*> names;
208 for (
typename NameMap::const_iterator it = name_map.begin(); it != name_map.end(); ++it) {
209 names.push_back((*it).second);
214 template<
typename Id,
typename T,
class Class>
221 template<
typename Id,
typename T,
class Class>
225 int index = rand() % ids.size();
227 ID new_eid = ids.at(index);
Type * create(const ID &id)
Definition: factory.h:134
#define DBG(fmt,...)
Definition: singleton.h:33
Definition: singleton.h:49
bool register_(const ID &id)
Definition: factory.h:93
bool unregisterCreator(const ID &id)
Definition: factory.h:160
std::vector< const char * > registeredNames() const
Definition: factory.h:205
bool registerIdName(const ID &id, const char *name)
Definition: factory.h:154
Type * getRandom()
Definition: factory.h:222
Factory()
Definition: factory.h:113
#define DISABLE_COPY(Class)
Definition: singleton.h:40
ID id(const char *name, bool caseSensitive=true) const
Definition: factory.h:169
const std::vector< ID > & registeredIds() const
Definition: factory.h:199
const char * name(const ID &id) const
Definition: factory.h:190
bool registerCreator(const ID &id, const Creator &callback)
Definition: factory.h:146
size_t count() const
Definition: factory.h:215
virtual ~Factory()
Definition: factory.h:114