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
00040
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
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