-#include <Object.hpp>\r
-#include <string.h>\r
-\r
-\r
-DeclaringClasses* DeclaringClass::declaringClasses = NULL;\r
-\r
-\r
-namespace SimGrid\r
-{\r
- namespace Msg\r
- {\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
- } // namespace Msg\r
-} // namespace SimGrid\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
-throw (ClassNotFoundException)\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
- return cur;\r
-\r
- }\r
-\r
- MSG_DELCARING_CLASSES.unlock();\r
- throw ClassNotFoundException(name);\r
-}\r
-\r
-\r
-Object* Class::createObject(const char* name)\r
-{\r
- Class* c = fromName(name);\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
-bool Object::isInstanceOf(const char* className)\r
-{\r
- Class* c = Class::fromName(className);\r
-\r
- return this->getClass()->isDerivedFrom(c);\r
-}\r
- \r
-\r
+/*
+ * Object.cxx
+ *
+ * Copyright 2006,2007 Martin Quinson, Malek Cherier
+ * All right reserved.
+ *
+ * This program is free software; you can redistribute
+ * it and/or modify it under the terms of the license
+ *(GNU LGPL) which comes with this package.
+ *
+ */
+
+ /* SimGrid::Msg RTTI implementation.
+ */
+
+#include <Object.hpp>
+#include <string.h>
+
+#include <xbt/dynar.h>
+
+
+
+
+DeclaringClasses* DeclaringClass::declaringClasses = NULL;
+
+namespace SimGrid
+{
+ namespace Msg
+ {
+
+ // Generate static object constructor for class registration
+ void DeclareClass(Class* c)
+ {
+ MSG_DELCARING_CLASSES.lock();
+ MSG_DELCARING_CLASSES.addHead(c);
+ MSG_DELCARING_CLASSES.unlock();
+ }
+ } // namespace Msg
+} // namespace SimGrid
+
+//////////////////////////////////////////////////////////////////////////////
+// Implémentation des fonctions membre de la classe Class
+
+// true if the class is derived from base classe referenced
+// by pBaseClass
+bool Class::isDerivedFrom(const Class* baseClass) const
+{
+ const Class* cur = this;
+
+ while(cur)
+ {
+ if(cur == baseClass)
+ return true;
+
+ cur = cur->baseClass;
+ }
+
+ return false;
+}
+
+// Dynamic name lookup and creation
+Class* Class::fromName(const char* name)
+throw (ClassNotFoundException)
+{
+ Class* cur;
+
+ MSG_DELCARING_CLASSES.lock();
+
+ for(cur = MSG_DELCARING_CLASSES.getHead(); cur; cur = cur->next)
+ {
+ if(!strcmp(name,cur->name))
+ {
+ MSG_DELCARING_CLASSES.unlock();
+ return cur;
+ }
+ }
+
+ MSG_DELCARING_CLASSES.unlock();
+ throw ClassNotFoundException(name);
+}
+
+
+Object* Class::createObject(const char* name)
+{
+ Class* c = fromName(name);
+ return c->createObject();
+}
+
+
+//////////////////////////////////////////////////////////////////////////////
+// Object members implementation
+
+// Special runtime-class structure for Object (no base class)
+const struct Class Object::classObject =
+{
+ "Object", // name
+ sizeof(Object), // typeSize
+ NULL, // baseClass
+ NULL, // next
+ NULL // declaringClass
+};
+
+
+//////////////////////////////////////////////////////////////////////////////
+// DeclaringClasses members implementation
+//
+
+DeclaringClasses::DeclaringClasses()
+{
+ head = NULL;
+ count = 0;
+}
+
+
+// Ajoute une nouvelle classe en tête de liste
+void DeclaringClasses::addHead(Class* c)
+{
+ if(NULL != head)
+ c->next = head;
+
+ head = c;
+ count++;
+}
+
+// Retourne la tête de liste et la retire de la liste
+Class* DeclaringClasses::removeHead(void)
+{
+ Class* c = NULL;
+
+ if(NULL != head)
+ {
+ c = head;
+ head = head->next;
+ count--;
+ }
+
+ return c;
+}
+
+// Retire la classe pClasse de la liste, mais ne la détruit pas
+bool DeclaringClasses::remove(Class* c)
+{
+ if(NULL == head)
+ return false;
+
+ bool success = false;
+
+ if(head == c)
+ {
+ head = c->next;
+ count--;
+ success = true;
+ }
+ else
+ {
+ Class* cur = head;
+
+ while((NULL != cur) && (cur->next!= c))
+ cur = cur->next;
+
+ if(NULL != cur)
+ {
+ cur->next = c->next;
+ count--;
+ success = true;
+ }
+ }
+
+ return success;
+}
+
+bool Object::isInstanceOf(const char* className)
+{
+ Class* c = Class::fromName(className);
+
+ return this->getClass()->isDerivedFrom(c);
+}
+
+