Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Use pointers instead references.
[simgrid.git] / src / cxx / Object.cxx
index 2aa26b2..5d91680 100644 (file)
@@ -1,20 +1,42 @@
-#include <object.hpp>\r
+/*\r
+ * Object.cxx\r
+ *\r
+ * Copyright 2006,2007 Martin Quinson, Malek Cherier           \r
+ * All right reserved. \r
+ *\r
+ * This program is free software; you can redistribute \r
+ * it and/or modify it under the terms of the license \r
+ *(GNU LGPL) which comes with this package. \r
+ *\r
+ */\r
\r
+ /* SimGrid::Msg RTTI implementation.\r
+  */  \r
+\r
+#include <Object.hpp>\r
 #include <string.h>\r
 \r
+#include <xbt/dynar.h>\r
+\r
 \r
-DeclaringClasses* DeclaringClass::declaringClasses = NULL;\r
 \r
 \r
-namespace msg\r
+DeclaringClasses* DeclaringClass::declaringClasses = NULL;\r
+\r
+namespace SimGrid\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
+       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
@@ -38,6 +60,7 @@ bool Class::isDerivedFrom(const Class* baseClass) const
 \r
 // Dynamic name lookup and creation\r
 Class* Class::fromName(const char* name)\r
+throw (ClassNotFoundException)\r
 {\r
        Class* cur;\r
 \r
@@ -46,20 +69,18 @@ Class* Class::fromName(const char* name)
        for(cur = MSG_DELCARING_CLASSES.getHead(); cur; cur = cur->next)\r
        {\r
                if(!strcmp(name,cur->name))\r
-                       break;\r
+                       return cur;\r
+\r
        }\r
 \r
        MSG_DELCARING_CLASSES.unlock();\r
-       return cur;\r
+       throw ClassNotFoundException(name);\r
 }\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
@@ -145,5 +166,12 @@ bool DeclaringClasses::remove(Class* c)
        \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