Logo AND Algorithmique Numérique Distribuée

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