Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
not needed now.
[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 {\r
42         Class* cur;\r
43 \r
44         MSG_DELCARING_CLASSES.lock();\r
45         \r
46         for(cur = MSG_DELCARING_CLASSES.getHead(); cur; cur = cur->next)\r
47         {\r
48                 if(!strcmp(name,cur->name))\r
49                         break;\r
50         }\r
51 \r
52         MSG_DELCARING_CLASSES.unlock();\r
53         return cur;\r
54 }\r
55 \r
56 Object* Class::createObject(const char* name)\r
57 {\r
58         Class* c = fromName(name);\r
59         \r
60         if(NULL == c)\r
61                 return NULL;\r
62                 \r
63         return c->createObject();\r
64 }\r
65 \r
66 \r
67 //////////////////////////////////////////////////////////////////////////////\r
68 // Object members implementation\r
69 \r
70 // Special runtime-class structure for Object (no base class)\r
71 const struct Class Object::classObject =\r
72\r
73         "Object",               // name\r
74         sizeof(Object), // typeSize\r
75         NULL,                   // baseClass\r
76         NULL,                   // next\r
77         NULL                    // declaringClass\r
78 };\r
79 \r
80 \r
81 //////////////////////////////////////////////////////////////////////////////\r
82 // DeclaringClasses members implementation\r
83 //\r
84 \r
85 DeclaringClasses::DeclaringClasses()\r
86 {\r
87         head = NULL;\r
88         count = 0;\r
89 }\r
90 \r
91 \r
92 // Ajoute une nouvelle classe en tête de liste\r
93 void DeclaringClasses::addHead(Class* c)\r
94 {\r
95         if(NULL != head)\r
96                 c->next = head;\r
97 \r
98         head = c;\r
99     count++;\r
100 }\r
101 \r
102 // Retourne la tête de liste et la retire de la liste\r
103 Class* DeclaringClasses::removeHead(void)\r
104 {\r
105         Class* c = NULL;\r
106 \r
107         if(NULL != head)\r
108         {\r
109                 c = head;\r
110                 head = head->next;\r
111                 count--;\r
112         }\r
113 \r
114         return c;\r
115 }\r
116 \r
117 // Retire la classe pClasse de la liste, mais ne la détruit pas \r
118 bool DeclaringClasses::remove(Class* c)\r
119 {\r
120         if(NULL == head)\r
121                 return false;\r
122 \r
123         bool success = false;\r
124 \r
125         if(head == c)\r
126         {\r
127                 head = c->next;\r
128         count--;\r
129                 success = true;\r
130         }\r
131         else\r
132         {\r
133                 Class* cur = head;\r
134 \r
135                 while((NULL != cur) && (cur->next!= c))\r
136                         cur = cur->next;\r
137 \r
138                 if(NULL != cur)\r
139                 {\r
140                         cur->next = c->next;\r
141             count--;\r
142                         success = true;\r
143                 }\r
144         }\r
145         \r
146         return success;\r
147 }\r
148                 \r
149 \r