22 #include "drwnInterfaces.h"
23 #include "drwnLogger.h"
33 static void staticRegistration() { };
63 typedef U* (*drwnCreatorFcn)(void);
64 map<string, drwnCreatorFcn> _registry;
72 void registerClass(
const char *name, drwnCreatorFcn fcn);
74 void unregisterClass(
const char *name);
76 list<string> getRegisteredClasses()
const;
79 U *create(
const char *name)
const;
81 U *createFromXML(drwnXMLNode& xml)
const;
83 U *createFromFile(
const char *filename)
const;
96 template<
typename U,
typename T>
105 static U *creator() {
return new T(); }
108 #define DRWN_FACTORY_REGISTER(baseName, className) \
109 drwnFactoryAutoRegister<baseName, className> \
110 __ ## baseName ## _ ## className ## _ ## AutoRegister(#className);
118 if (!factory._initialized) {
119 DRWN_LOG_DEBUG(
"initializing drwnFactory for " <<
typeid(U).name());
120 factory._initialized =
true;
129 DRWN_ASSERT(name != NULL);
131 typename map<string, drwnCreatorFcn>::iterator jt = _registry.find(
string(name));
132 if (jt != _registry.end()) {
133 DRWN_LOG_ERROR(
"class \"" << name <<
"\" already registered with drwnFactory");
136 DRWN_LOG_DEBUG(
"registering class \"" << name <<
"\" with the drwnFactory");
137 _registry.insert(make_pair(
string(name), fcn));
144 DRWN_ASSERT(name != NULL);
145 DRWN_LOG_DEBUG(
"unregistering class \"" << name <<
"\" from drwnFactory");
146 typename map<string, drwnCreatorFcn>::iterator jt = _registry.find(
string(name));
147 if (jt == _registry.end()) {
148 DRWN_LOG_ERROR(
"class \"" << name <<
"\" does not exist in drwnFactory");
159 for (
typename map<string, drwnCreatorFcn>::const_iterator it = _registry.begin();
160 it != _registry.end(); ++it) {
161 names.push_back(it->first);
169 DRWN_ASSERT(name != NULL);
171 typename map<string, drwnCreatorFcn>::const_iterator jt = _registry.find(
string(name));
172 if (jt == _registry.end()) {
173 DRWN_LOG_ERROR(
"class \"" << name <<
"\" does not exist in drwnFactory");
177 return (*jt->second)();
184 U *
object = create(xml.name());
185 if (
object == NULL) {
196 DRWN_ASSERT(filename != NULL);
201 DRWN_ASSERT(node != NULL);
203 return createFromXML(*node);
209 DRWN_LOG_MESSAGE(
"drwnFactory has the following registered classes:");
210 for (
typename map<string, drwnCreatorFcn>::const_iterator it = _registry.begin();
211 it != _registry.end(); ++it) {
212 DRWN_LOG_MESSAGE(
" " << it->first);
U * createFromFile(const char *filename) const
create an object from file
Definition: drwnFactory.h:194
Some classes may provide default factory registration (e.g., built-in classes such as drwnClassifier ...
Definition: drwnFactory.h:32
void registerClass(const char *name, drwnCreatorFcn fcn)
register a class and creator function
Definition: drwnFactory.h:127
Templated factory for creating or cloning objects for a particular base class.
Definition: drwnFactory.h:59
drwnFactory()
singleton class so hide constructor
Definition: drwnFactory.h:90
U * createFromXML(drwnXMLNode &xml) const
create an object from an XML node
Definition: drwnFactory.h:181
drwnXMLNode * drwnParseXMLFile(drwnXMLDoc &xml, const char *filename, const char *tag=NULL)
parse an xml file into xml (loads all data into memory) and return a pointer to the first node (with ...
Definition: drwnXMLParser.cpp:22
void unregisterClass(const char *name)
unregister a previously registered class
Definition: drwnFactory.h:142
U * create(const char *name) const
create a default object
Definition: drwnFactory.h:167
Provides XML parsing functionality for serializing and deserializing objects and containers of object...
list< string > getRegisteredClasses() const
get a list of all registered classes
Definition: drwnFactory.h:156
Helper class for registering classes with a drwnFactory.
Definition: drwnFactory.h:97
void dump() const
dump the contents of the registery for debugging
Definition: drwnFactory.h:207
static drwnFactory< U > & get()
get the factory
Definition: drwnFactory.h:115