Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   File Members   Related Pages  

cxx_factory.h

00001 
00002 #ifndef __UPF_CXX_FACTORY_H__
00003 #define __UPF_CXX_FACTORY_H__
00004 
00005 #include "cxx_api.h"
00006 
00007 namespace upf
00008 {
00009 
00010 template<class T> class StdFactory;
00011 template<class T> class ClassRegistrator;
00012 
00013 template<class T> class StdFactory : public IClassFactory
00014 {
00015 public:
00016     Ptr<IObject> create()
00017     {
00018         T *obj = new T;
00019         obj->_upf_initInstance();
00020         return obj; 
00021     }
00022 
00023 private:
00024     _UPF_DECLARE_CLASS_NO_FRIENDS(StdFactory)
00025     friend class ClassRegistrator<T>;
00026 };
00027 
00028 _UPF_DO_IMPLEMENT_CLASS(StdFactory<T>, template<class T>)
00029 {
00030     UPF_INTERFACE(upf::IClassFactory)
00031 }
00032 
00033 
00034 template<class T> class ClassRegistrator
00035 {
00036 public:
00037     static void prepare(IWriteableClassInfo *classinfo, const char *cxxClassName)
00038     {
00039         // convert C++ style name to dot convention
00040         // (e.g. "::upf::impl::Manager" to "upf.impl.Manager")
00041         char *c, *classname = new char[strlen(cxxClassName)+1];
00042         while (*cxxClassName == ':') cxxClassName++;
00043         for (c = classname; *cxxClassName; cxxClassName++)
00044         {
00045             if (*cxxClassName == ':')
00046             {
00047                 *(c++) = '.';
00048                 cxxClassName++;
00049             }
00050             else
00051                 *(c++) = *cxxClassName;
00052         }
00053         *c = '\0';
00054 
00055         classinfo->setName(classname);
00056         delete[] classname;
00057 
00058         // create factory object:
00059         upf::StdFactory<T>::_upf_initClass(NULL);
00060         upf::StdFactory<T> *factory = new upf::StdFactory<T>;
00061         factory->_upf_initInstance();
00062 
00063         classinfo->setFactory(factory);
00064 
00065         T::_upf_initClass(classinfo);
00066         classinfo->addProperty("ImplLanguage", "C++ (" _UPF_COMPILER_STRING ")");
00067     }
00068 
00069     static bool registerClass(const char *cxxClassName)
00070     {
00071         Ptr<IWriteableClassInfo> ciw = upf::create<IWriteableClassInfo>();
00072         prepare(ciw, cxxClassName);
00073         Ptr<IManager> mng = upf::getManager();
00074         mng->registerClass(ciw->freeze());
00075         return true;
00076     }
00077 };
00078 
00079 
00080 
00081 }
00082 
00083 #endif

Generated on Wed Jan 15 23:10:55 2003 for Universal Plugins Framework by doxygen1.2.18