Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Some new classes of CPP version of Msg
[simgrid.git] / src / cxx / Object.hpp
diff --git a/src/cxx/Object.hpp b/src/cxx/Object.hpp
new file mode 100644 (file)
index 0000000..660f4eb
--- /dev/null
@@ -0,0 +1,285 @@
+\r
+#ifndef MSG_OBJECT_H\r
+#define MSG_OBJECT_H\r
+\r
+// Compilation C++ recquise\r
+#ifndef __cplusplus\r
+       #error Object.hpp requires C++ compilation (use a .cxx suffix)\r
+#endif\r
+\r
+#include <stdlib.h>\r
+\r
+#include <ClassNotFoundException.hpp>\r
+\r
+namespace SimGrid\r
+{\r
+       namespace Msg\r
+       {\r
+               //////////////////////////////////////////////////////////////////////////////\r
+               // Macros\r
+               \r
+               // Returns the runtime class of the class_name object.\r
+               #define MSG_GET_CLASS(class_name) \\r
+                                       ((Class*)(&class_name::class##class_name))\r
+                       \r
+               // Declare the class class_name as dynamic\r
+               #define MSG_DECLARE_DYNAMIC(class_name) \\r
+               public: \\r
+                       static Class class##class_name; \\r
+                       virtual Class* getClass() const; \\r
+                       static Object*  createObject(); \\r
+\r
+               // The runtime class implementation.    \r
+               #define MSG_IMPLEMENT_CLASS(class_name, base_class_name, pfn,class_init) \\r
+                       Class class_name::class##class_name = { \\r
+                               #class_name, sizeof(class class_name),pfn, \\r
+                                       MSG_GET_CLASS(base_class_name), NULL,class_init}; \\r
+                       Class* class_name::getClass() const \\r
+                                { return MSG_GET_CLASS(class_name); } \\r
+               \r
+               // CreateObject implementation. \r
+               #define MSG_IMPLEMENT_DYNAMIC(class_name, base_class_name) \\r
+                       Object* class_name::createObject() \\r
+                               { return (Object*)(new class_name); } \\r
+                       DeclaringClass _declaringClass_##class_name(MSG_GET_CLASS(class_name)); \\r
+                       MSG_IMPLEMENT_CLASS(class_name, base_class_name, \\r
+                               class_name::createObject, &_declaringClass_##class_name) \\r
+\r
+               //////////////////////////////////////////////////////////////////////////////\r
+               // Classes declared in this file.\r
+\r
+               class Object;   // The msg object.\r
+\r
+               //////////////////////////////////////////////////////////////////////////////\r
+               // Structures declared in this files.\r
+\r
+               struct Class;           // used during the rtti operations\r
+               struct DeclaringClass;  // used during the instances registration.\r
+\r
+\r
+        class DeclaringClasses;\r
+\r
+               //////////////////////////////////////////////////////////////////////////////\r
+               // Global functions\r
+\r
+               // Used during the registration.\r
+               void DeclareClass(Class* c);\r
+\r
+               //////////////////////////////////////////////////////////////////////////////\r
+               // DeclaringClass\r
+\r
+               struct SIMGRIDX_EXPORT DeclaringClass\r
+               {\r
+                       // Constructor : add the runtime classe in the list.\r
+                       DeclaringClass(Class* c);\r
+                       \r
+                       // Destructor\r
+                       virtual ~DeclaringClass(void);\r
+\r
+               // Attributes :\r
+                   // the list of runtime classes.\r
+                   static DeclaringClasses* declaringClasses;\r
+               };\r
+\r
+        #define MSG_DELCARING_CLASSES (*(DeclaringClass::declaringClasses))\r
+               \r
+               \r
+               struct SIMGRIDX_EXPORT Class\r
+               {\r
+               \r
+               // Attributes\r
+       \r
+                       const char* name;                                               // class name.\r
+                       size_t typeSize;                                                // type size.                   \r
+                       Object* (*createObjectFn)(void);                // pointer to the create object function. \r
+                       Class* baseClass;                                               // the runtime class of the runtime class.\r
+                       Class* next;                                                    // the next runtime class in the list.\r
+                       const DeclaringClass* declaringClass;   // used during the registration of the class.\r
+               \r
+               // Operations\r
+               \r
+                       // Create the runtime class from its name.\r
+                       static Class* fromName(const char* name)\r
+                       throw (ClassNotFoundException);\r
+                       \r
+                       // Create an object from the name of the its class.\r
+                       static Object* createObject(const char* name);\r
+                       \r
+                       // Create an instance of the class.\r
+                       Object* createObject(void);\r
+                       \r
+                       // Return true is the class is dervived from the base class baseClass.\r
+                       bool isDerivedFrom(const Class* baseClass) const;\r
+\r
+               };\r
+\r
+        // Create an instance of the class.\r
+        inline Object* Class::createObject(void)\r
+        {\r
+            return (*createObjectFn)();\r
+        }\r
+       \r
+            \r
+               class SIMGRIDX_EXPORT Object\r
+               {\r
+               public:\r
+               \r
+                       // Default constructor.\r
+                       Object(){}\r
+                       \r
+                       // Destructor.\r
+                       virtual ~Object(){}\r
+                       \r
+                       // Operations.\r
+               \r
+                       // Get the runtime class.\r
+                       virtual Class* getClass(void) const;\r
+                       \r
+                       // Returns true if the class is derived from the class baseClass. Otherwise\r
+                       // the method returns false.\r
+                       bool isDerivedFrom(const Class* baseClass) const;\r
+                       \r
+                       // Returns true if the object is valid. Otherwise the method returns false.\r
+                       virtual bool isValid(void) const;\r
+\r
+                       // Returns true is the object is an instance of the class specified as parameter.\r
+                       bool isInstanceOf(const char* className);\r
+                       \r
+                       // Operators.\r
+\r
+                       // Attributes.\r
+                       \r
+                       // The runtime class.\r
+                       static const Class classObject;\r
+               };\r
+\r
+               // inline member functions of the class Object.\r
+               \r
+               // Returns the runtime class of the object.\r
+               inline Class* Object::getClass(void) const\r
+               {\r
+                       return MSG_GET_CLASS(Object);\r
+               }\r
+\r
+        // Returns true if the class is derived from the class pBaseClass. Otherwise\r
+               // the method returns false.\r
+        inline bool Object::isDerivedFrom(const Class* baseClass) const\r
+        {\r
+            return (getClass()->isDerivedFrom(baseClass));\r
+        }\r
+               \r
+               // Returns true if the object is valid. Otherwise the method returns false.\r
+               inline bool Object::isValid(void) const\r
+               {\r
+                       // returns always true.\r
+                       return true;    \r
+               }\r
+\r
+       \r
+               class DeclaringClasses \r
+               {\r
+               public:\r
+               \r
+                       // Constructor.\r
+                       DeclaringClasses();\r
+\r
+                       // Destructor.\r
+                       virtual ~DeclaringClasses(){}\r
+               \r
+               // Operations.\r
+               \r
+                       // Add the class at the head of the list.\r
+                       void addHead(Class* c);\r
+                       \r
+                       // Get the runtime class of the head of the list.\r
+                       Class* getHead(void) const ;\r
+                       \r
+                       // Remove the class from the list (don't destroy it).\r
+                       bool remove(Class* c);\r
+            \r
+            // Remove the head of the list.\r
+                       Class* removeHead(void);\r
+                       \r
+                       // Return true if the list is empty.\r
+                       \r
+                       bool isEmpty(void) const;\r
+                       \r
+                       // Remove of the elements of the list.\r
+                       void removeAll(void);\r
+                       \r
+                       // Get the number of classes in the list.\r
+                   unsigned int getCount(void);\r
+                   \r
+                   void lock(void){}\r
+                   \r
+                   void unlock(void){}\r
+               \r
+                       //Attributes\r
+               \r
+                       // The head of the list.\r
+                       Class* head;\r
+\r
+               private:\r
+               \r
+               // Attributes\r
+               \r
+                       // The number of elements of the list.\r
+                       unsigned int count;\r
+               };\r
+\r
+\r
+        // Constructor (Add the class in the list).\r
+        inline DeclaringClass::DeclaringClass(Class* c)\r
+        {\r
+                if(!declaringClasses)\r
+                        declaringClasses = new DeclaringClasses();\r
+\r
+                DeclareClass(c);\r
+        }\r
+\r
+        // Destructor.\r
+        inline DeclaringClass::~DeclaringClass()\r
+        {\r
+                /*if(NULL != declaringClasses)\r
+                        delete declaringClasses;\r
+\r
+                declaringClasses=NULL;*/\r
+\r
+        }\r
+\r
+               // Returns the number of elements of the list.\r
+               inline unsigned int DeclaringClasses::getCount()\r
+               {\r
+                       return count;\r
+               }\r
+               \r
+               // Returns the head of the list.\r
+               inline Class* DeclaringClasses::getHead() const\r
+               {\r
+                       return head;\r
+               }\r
+               \r
+               // Returns true if the list is empty. Otherwise this function\r
+               // returns false.\r
+               inline bool DeclaringClasses::isEmpty() const\r
+               {\r
+                       return(!head);\r
+               }\r
+               \r
+               // Removes all the elements of the list.\r
+               inline void DeclaringClasses::removeAll()\r
+               {\r
+                       head = 0;\r
+                   count=0;\r
+               }\r
+                       \r
+       } // namespace Msg     \r
+} // namespace SimGrid\r
+\r
+\r
+using namespace SimGrid::Msg;\r
+\r
+#define instanceOf(class_name) reinterpret_cast<class_name*>(Class::createObject(#class_name))\r
+\r
+#endif // !MSG_OBJECT_H\r
+\r