Main Page | Modules | Namespace List | Class Hierarchy | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

Registrar.h

Go to the documentation of this file.
00001 #ifndef __REGISTRAR_H
00002 #define __REGISTRAR_H
00003 
00004 #include <iostream>
00005 #include <map>
00006 #include <string>
00007 #include <assert.h>
00008 
00013 namespace Teem
00014 {
00037     template<typename T, typename IdT, typename Arg1T = void, typename Arg2T = void> class Registrar
00038     {
00039     public:
00041         template<typename Sub> void registerItem(const IdT &id)
00042         {
00043             mItems[id] = &Creator<Sub>;
00044         }
00045         
00047         T* createItem(const IdT &id, Arg1T arg1, Arg2T arg2)
00048         {
00049             if (mItems.find(id) == mItems.end())
00050             {
00051                 std::cerr << "Class of type " << id << " unregistred, aborting.\n\nKnown classes are:\n";
00052                 dump(std::cerr);
00053                 std::cerr << std::endl;
00054                 exit(1);
00055             }
00056             return mItems[id](arg1, arg2);
00057         }
00058         
00060         void dump(std::ostream &stream)
00061         {
00062             for (typename std::map<IdT, CreatorFunc>::iterator it = mItems.begin(); it != mItems.end(); ++it)
00063                 stream << "* " << it->first << "\n";
00064         }
00065     
00066     protected:
00068         typedef T* (*CreatorFunc)(Arg1T, Arg2T);
00069         std::map<IdT, CreatorFunc> mItems; 
00070         
00072         template<typename Sub> static T* Creator(Arg1T arg1, Arg2T arg2)
00073         {
00074             return new Sub(arg1, arg2);
00075         }
00076     };
00077     
00100     template<typename T, typename IdT, typename ArgT> class Registrar<T, IdT, ArgT, void>
00101     {
00102     public:
00104         template<typename Sub> void registerItem(const IdT &id)
00105         {
00106             mItems[id] = &Creator<Sub>;
00107         }
00108         
00110         T* createItem(const IdT &id, ArgT arg)
00111         {
00112             if (mItems.find(id) == mItems.end())
00113             {
00114                 std::cerr << "Class of type " << id << " unregistred, aborting.\n\nKnown classes are:\n";
00115                 dump(std::cerr);
00116                 std::cerr << std::endl;
00117                 exit(1);
00118             }
00119             return mItems[id](arg);
00120         }
00121         
00123         void dump(std::ostream &stream)
00124         {
00125             for (typename std::map<IdT, CreatorFunc>::iterator it = mItems.begin(); it != mItems.end(); ++it)
00126                 stream << "* " << it->first << "\n";
00127         }
00128         
00129     protected:
00131         typedef T* (*CreatorFunc)(ArgT);
00132         std::map<IdT, CreatorFunc> mItems; 
00133         
00135         template<typename Sub> static T* Creator(ArgT arg)
00136         {
00137             return new Sub(arg);
00138         }
00139     };
00140     
00163     template<typename T, typename IdT> class Registrar<T, IdT, void, void>
00164     {
00165     public:
00167         template<typename Sub> void registerItem(const IdT &id)
00168         {
00169             mItems[id] = &Creator<Sub>;
00170         }
00171         
00173         T* createItem(const IdT &id)
00174         {
00175             if (mItems.find(id) == mItems.end())
00176             {
00177                 std::cerr << "Class of type " << id << " unregistred, aborting.\n\nKnown classes are:\n";
00178                 dump(std::cerr);
00179                 std::cerr << std::endl;
00180                 exit(1);
00181             }
00182             return mItems[id]();
00183         }
00184         
00186         void dump(std::ostream &stream)
00187         {
00188             for (typename std::map<IdT, CreatorFunc>::iterator it = mItems.begin(); it != mItems.end(); ++it)
00189                 stream << "* " << it->first << "\n";
00190         }
00191         
00192     protected:
00194         typedef T* (*CreatorFunc)();
00195         std::map<IdT, CreatorFunc> mItems; 
00196         
00198         template<typename Sub> static T* Creator()
00199         {
00200             return new Sub();
00201         }
00202     };
00203 }
00204 
00205 #endif

Generated on Mon Oct 24 17:38:25 2005 for Teem by  doxygen 1.4.2