+++ /dev/null
-#include <object.hpp>\r
-#include <string.h>\r
-\r
-\r
-DeclaringClasses* DeclaringClass::declaringClasses = NULL;\r
-\r
-\r
-namespace msg\r
-{\r
- // Generate static object constructor for class registration\r
- void DeclareClass(Class* c)\r
- {\r
- MSG_DELCARING_CLASSES.lock();\r
- MSG_DELCARING_CLASSES.addHead(c);\r
- MSG_DELCARING_CLASSES.unlock();\r
- }\r
-} \r
-\r
-//////////////////////////////////////////////////////////////////////////////\r
-// Implémentation des fonctions membre de la classe Class\r
-\r
-// true if the class is derived from base classe referenced \r
-// by pBaseClass\r
-bool Class::isDerivedFrom(const Class* baseClass) const\r
-{\r
- const Class* cur = this;\r
-\r
- while(cur)\r
- {\r
- if(cur == baseClass)\r
- return true;\r
-\r
- cur = cur->baseClass;\r
- }\r
-\r
- return false;\r
-}\r
-\r
-// Dynamic name lookup and creation\r
-Class* Class::fromName(const char* name)\r
-{\r
- Class* cur;\r
-\r
- MSG_DELCARING_CLASSES.lock();\r
- \r
- for(cur = MSG_DELCARING_CLASSES.getHead(); cur; cur = cur->next)\r
- {\r
- if(!strcmp(name,cur->name))\r
- break;\r
- }\r
-\r
- MSG_DELCARING_CLASSES.unlock();\r
- return cur;\r
-}\r
-\r
-Object* Class::createObject(const char* name)\r
-{\r
- Class* c = fromName(name);\r
- \r
- if(NULL == c)\r
- return NULL;\r
- \r
- return c->createObject();\r
-}\r
-\r
-\r
-//////////////////////////////////////////////////////////////////////////////\r
-// Object members implementation\r
-\r
-// Special runtime-class structure for Object (no base class)\r
-const struct Class Object::classObject =\r
-{ \r
- "Object", // name\r
- sizeof(Object), // typeSize\r
- NULL, // baseClass\r
- NULL, // next\r
- NULL // declaringClass\r
-};\r
-\r
-\r
-//////////////////////////////////////////////////////////////////////////////\r
-// DeclaringClasses members implementation\r
-//\r
-\r
-DeclaringClasses::DeclaringClasses()\r
-{\r
- head = NULL;\r
- count = 0;\r
-}\r
-\r
-\r
-// Ajoute une nouvelle classe en tête de liste\r
-void DeclaringClasses::addHead(Class* c)\r
-{\r
- if(NULL != head)\r
- c->next = head;\r
-\r
- head = c;\r
- count++;\r
-}\r
-\r
-// Retourne la tête de liste et la retire de la liste\r
-Class* DeclaringClasses::removeHead(void)\r
-{\r
- Class* c = NULL;\r
-\r
- if(NULL != head)\r
- {\r
- c = head;\r
- head = head->next;\r
- count--;\r
- }\r
-\r
- return c;\r
-}\r
-\r
-// Retire la classe pClasse de la liste, mais ne la détruit pas \r
-bool DeclaringClasses::remove(Class* c)\r
-{\r
- if(NULL == head)\r
- return false;\r
-\r
- bool success = false;\r
-\r
- if(head == c)\r
- {\r
- head = c->next;\r
- count--;\r
- success = true;\r
- }\r
- else\r
- {\r
- Class* cur = head;\r
-\r
- while((NULL != cur) && (cur->next!= c))\r
- cur = cur->next;\r
-\r
- if(NULL != cur)\r
- {\r
- cur->next = c->next;\r
- count--;\r
- success = true;\r
- }\r
- }\r
- \r
- return success;\r
-}\r
- \r
-\r