00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef factoryWithNamesH
00023 #define factoryWithNamesH
00024
00025 #include <sigc++/sigc++.h>
00026 #include "loki/Singleton.h"
00027 #include "loki/Functor.h"
00028
00029 #include "factory.h"
00030
00031
00032 template < class AbstractProduct, typename IdentifierType, typename ObjectCreatorCallBack = AbstractProduct*(*)(), typename NameType = ASCString >
00033 class FactoryWithNames : protected Factory<AbstractProduct, IdentifierType>
00034 {
00035 private:
00036 typedef std::map<NameType, IdentifierType> NameMap;
00037 NameMap names;
00038 public:
00039 vector<NameType> getNames(){
00040 vector<NameType> nameList;
00041
00042 for ( typename NameMap::iterator i = names.begin(); i != names.end(); ++i )
00043 nameList.push_back( i->first );
00044 return nameList;
00045 }
00046
00047 IdentifierType getID( const ASCString& name )
00048 {
00049 return names[name];
00050 }
00051
00052 bool registerClass( IdentifierType id, typename FactoryWithNames<AbstractProduct, IdentifierType, typename FactoryWithNames::ObjectCreatorCallBack, NameType>::ObjectCreatorCallBack createFn, Loki::Functor<NameType, LOKI_TYPELIST_1(const IdentifierType&)> nameProvider )
00053 {
00054 return registerClass( id, createFn, nameProvider(id) );
00055 }
00056
00057 bool registerClass( IdentifierType id, typename FactoryWithNames<AbstractProduct, IdentifierType, typename FactoryWithNames::ObjectCreatorCallBack, NameType>::ObjectCreatorCallBack createFn, NameType name )
00058 {
00059 if ( Factory<AbstractProduct, IdentifierType>::registerClass ( id, createFn )) {
00060 names[name] = id;
00061 return true;
00062 } else
00063 return false;
00064 }
00065
00066 AbstractProduct* createObject( IdentifierType id ) {
00067 return Factory<AbstractProduct, IdentifierType>::createObject( id );
00068 }
00069
00070 };
00071
00072 #endif