Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Some new classes of CPP version of Msg
[simgrid.git] / src / cxx / Object.cxx
1 #include <Object.hpp>\r
2 #include <string.h>\r
3 \r
4 \r
5 DeclaringClasses* DeclaringClass::declaringClasses = NULL;\r
6 \r
7 \r
8 namespace SimGrid\r
9 {\r
10         namespace Msg\r
11         {\r
12 \r
13                 // Generate static object constructor for class registration\r
14                 void DeclareClass(Class* c)\r
15                 {\r
16                         MSG_DELCARING_CLASSES.lock();\r
17                         MSG_DELCARING_CLASSES.addHead(c);\r
18                         MSG_DELCARING_CLASSES.unlock();\r
19                 }\r
20         } // namespace Msg\r
21 } // namespace SimGrid\r
22 \r
23 //////////////////////////////////////////////////////////////////////////////\r
24 // Implémentation des fonctions membre de la classe Class\r
25 \r
26 // true if the class is derived from base classe referenced \r
27 // by pBaseClass\r
28 bool Class::isDerivedFrom(const Class* baseClass) const\r
29 {\r
30         const Class* cur = this;\r
31 \r
32         while(cur)\r
33         {\r
34                 if(cur == baseClass)\r
35                         return true;\r
36 \r
37                 cur = cur->baseClass;\r
38         }\r
39 \r
40         return false;\r
41 }\r
42 \r
43 // Dynamic name lookup and creation\r
44 Class* Class::fromName(const char* name)\r
45 throw (ClassNotFoundException)\r
46 {\r
47         Class* cur;\r
48 \r
49         MSG_DELCARING_CLASSES.lock();\r
50         \r
51         for(cur = MSG_DELCARING_CLASSES.getHead(); cur; cur = cur->next)\r
52         {\r
53                 if(!strcmp(name,cur->name))\r
54                         return cur;\r
55 \r
56         }\r
57 \r
58         MSG_DELCARING_CLASSES.unlock();\r
59         throw ClassNotFoundException(name);\r
60 }\r
61 \r
62 \r
63 Object* Class::createObject(const char* name)\r
64 {\r
65         Class* c = fromName(name);\r
66         return c->createObject();\r
67 }\r
68 \r
69 \r
70 //////////////////////////////////////////////////////////////////////////////\r
71 // Object members implementation\r
72 \r
73 // Special runtime-class structure for Object (no base class)\r
74 const struct Class Object::classObject =\r
75\r
76         "Object",               // name\r
77         sizeof(Object), // typeSize\r
78         NULL,                   // baseClass\r
79         NULL,                   // next\r
80         NULL                    // declaringClass\r
81 };\r
82 \r
83 \r
84 //////////////////////////////////////////////////////////////////////////////\r
85 // DeclaringClasses members implementation\r
86 //\r
87 \r
88 DeclaringClasses::DeclaringClasses()\r
89 {\r
90         head = NULL;\r
91         count = 0;\r
92 }\r
93 \r
94 \r
95 // Ajoute une nouvelle classe en tête de liste\r
96 void DeclaringClasses::addHead(Class* c)\r
97 {\r
98         if(NULL != head)\r
99                 c->next = head;\r
100 \r
101         head = c;\r
102     count++;\r
103 }\r
104 \r
105 // Retourne la tête de liste et la retire de la liste\r
106 Class* DeclaringClasses::removeHead(void)\r
107 {\r
108         Class* c = NULL;\r
109 \r
110         if(NULL != head)\r
111         {\r
112                 c = head;\r
113                 head = head->next;\r
114                 count--;\r
115         }\r
116 \r
117         return c;\r
118 }\r
119 \r
120 // Retire la classe pClasse de la liste, mais ne la détruit pas \r
121 bool DeclaringClasses::remove(Class* c)\r
122 {\r
123         if(NULL == head)\r
124                 return false;\r
125 \r
126         bool success = false;\r
127 \r
128         if(head == c)\r
129         {\r
130                 head = c->next;\r
131         count--;\r
132                 success = true;\r
133         }\r
134         else\r
135         {\r
136                 Class* cur = head;\r
137 \r
138                 while((NULL != cur) && (cur->next!= c))\r
139                         cur = cur->next;\r
140 \r
141                 if(NULL != cur)\r
142                 {\r
143                         cur->next = c->next;\r
144             count--;\r
145                         success = true;\r
146                 }\r
147         }\r
148         \r
149         return success;\r
150 }\r
151 \r
152 bool Object::isInstanceOf(const char* className)\r
153 {\r
154         Class* c = Class::fromName(className);\r
155 \r
156         return this->getClass()->isDerivedFrom(c);\r
157 }\r
158                 \r
159 \r