4 * Copyright 2006,2007 Martin Quinson, Malek Cherier
\r
5 * All right reserved.
\r
7 * This program is free software; you can redistribute
\r
8 * it and/or modify it under the terms of the license
\r
9 *(GNU LGPL) which comes with this package.
\r
13 /* SimGrid::Msg RTTI implementation.
\r
16 #include <Object.hpp>
\r
19 #include <xbt/dynar.h>
\r
24 DeclaringClasses* DeclaringClass::declaringClasses = NULL;
\r
31 // Generate static object constructor for class registration
\r
32 void DeclareClass(Class* c)
\r
34 MSG_DELCARING_CLASSES.lock();
\r
35 MSG_DELCARING_CLASSES.addHead(c);
\r
36 MSG_DELCARING_CLASSES.unlock();
\r
39 } // namespace SimGrid
\r
41 //////////////////////////////////////////////////////////////////////////////
\r
42 // Implémentation des fonctions membre de la classe Class
\r
44 // true if the class is derived from base classe referenced
\r
46 bool Class::isDerivedFrom(const Class* baseClass) const
\r
48 const Class* cur = this;
\r
52 if(cur == baseClass)
\r
55 cur = cur->baseClass;
\r
61 // Dynamic name lookup and creation
\r
62 Class* Class::fromName(const char* name)
\r
63 throw (ClassNotFoundException)
\r
67 MSG_DELCARING_CLASSES.lock();
\r
69 for(cur = MSG_DELCARING_CLASSES.getHead(); cur; cur = cur->next)
\r
71 if(!strcmp(name,cur->name))
\r
76 MSG_DELCARING_CLASSES.unlock();
\r
77 throw ClassNotFoundException(name);
\r
81 Object* Class::createObject(const char* name)
\r
83 Class* c = fromName(name);
\r
84 return c->createObject();
\r
88 //////////////////////////////////////////////////////////////////////////////
\r
89 // Object members implementation
\r
91 // Special runtime-class structure for Object (no base class)
\r
92 const struct Class Object::classObject =
\r
95 sizeof(Object), // typeSize
\r
98 NULL // declaringClass
\r
102 //////////////////////////////////////////////////////////////////////////////
\r
103 // DeclaringClasses members implementation
\r
106 DeclaringClasses::DeclaringClasses()
\r
113 // Ajoute une nouvelle classe en tête de liste
\r
114 void DeclaringClasses::addHead(Class* c)
\r
123 // Retourne la tête de liste et la retire de la liste
\r
124 Class* DeclaringClasses::removeHead(void)
\r
138 // Retire la classe pClasse de la liste, mais ne la détruit pas
\r
139 bool DeclaringClasses::remove(Class* c)
\r
144 bool success = false;
\r
156 while((NULL != cur) && (cur->next!= c))
\r
161 cur->next = c->next;
\r
170 bool Object::isInstanceOf(const char* className)
\r
172 Class* c = Class::fromName(className);
\r
174 return this->getClass()->isDerivedFrom(c);
\r