Logo AND Algorithmique Numérique Distribuée

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