00001
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "stdmisc.h"
00027
00028 #include "nel/misc/class_registry.h"
00029
00030 #include <typeinfo>
00031
00032 using namespace std;
00033
00034 namespace NLMISC
00035 {
00036
00037
00038
00039 set<CClassRegistry::CClassNode> *CClassRegistry::RegistredClasses = NULL;
00040
00041
00042
00043 void CClassRegistry::init()
00044 {
00045 if (RegistredClasses == NULL)
00046 RegistredClasses = new set<CClassRegistry::CClassNode>();
00047 }
00048
00049
00050
00051 IClassable *CClassRegistry::create(const string &className) throw(ERegistry)
00052 {
00053 init();
00054
00055 set<CClassNode>::iterator it;
00056 CClassNode node;
00057
00058 node.ClassName= className;
00059 it=RegistredClasses->find(node);
00060
00061 if(it==RegistredClasses->end())
00062 return NULL;
00063 else
00064 {
00065 IClassable *ptr;
00066 ptr=it->Creator();
00067 #ifdef NL_DEBUG
00068 nlassert(CClassRegistry::checkObject(ptr));
00069 #endif
00070 return ptr;
00071 }
00072
00073 }
00074
00075
00076 void CClassRegistry::registerClass(const string &className, IClassable* (*creator)(), const string &typeidCheck) throw(ERegistry)
00077 {
00078 init();
00079
00080 CClassNode node;
00081 node.ClassName= className;
00082 node.Creator=creator;
00083 node.TypeIdCheck= typeidCheck;
00084 if(!RegistredClasses->insert(node).second)
00085 {
00086 nlstop;
00087 throw ERegisteredClass();
00088 }
00089 }
00090
00091
00092 bool CClassRegistry::checkObject(IClassable* obj)
00093 {
00094 init();
00095
00096 set<CClassNode>::iterator it;
00097 CClassNode node;
00098 node.ClassName= obj->getClassName();
00099
00100 it=RegistredClasses->find(node);
00101 if(it==RegistredClasses->end())
00102 return false;
00103 node= *it;
00104
00105 if( node.TypeIdCheck != string(typeid(*obj).name()) )
00106 return false;
00107
00108 return true;
00109 }
00110
00111
00112
00113 }
00114