X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/a6aaba20655bd0936e02369871764649b740c04b..b9c27830674f1ed54f9553d4cd517842acc1aab1:/src/cxx/Object.hpp diff --git a/src/cxx/Object.hpp b/src/cxx/Object.hpp index d44ff2b655..fc89d91fa1 100644 --- a/src/cxx/Object.hpp +++ b/src/cxx/Object.hpp @@ -1,299 +1,299 @@ -/* - * Object.hpp - * - * This file contains the declaration of the wrapper class of the native MSG task type. - * - * Copyright 2006,2007 Martin Quinson, Malek Cherier - * All right reserved. - * - * This program is free software; you can redistribute - * it and/or modify it under the terms of the license - *(GNU LGPL) which comes with this package. - * - */ -#ifndef MSG_OBJECT_H -#define MSG_OBJECT_H - -// Compilation C++ recquise -#ifndef __cplusplus - #error Object.hpp requires C++ compilation (use a .cxx suffix) -#endif - -#include - -#include - -namespace SimGrid -{ - namespace Msg - { - ////////////////////////////////////////////////////////////////////////////// - // Macros - - // Returns the runtime class of the class_name object. - #define MSG_GET_CLASS(class_name) \ - ((Class*)(&class_name::class##class_name)) - - // Declare the class class_name as dynamic - #define MSG_DECLARE_DYNAMIC(class_name) \ - public: \ - static Class class##class_name; \ - virtual Class* getClass() const; \ - static Object* createObject() \ - - // The runtime class implementation. - #define MSG_IMPLEMENT_CLASS(class_name, base_class_name, pfn,class_init) \ - Class class_name::class##class_name = { \ - #class_name, sizeof(class class_name),pfn, \ - MSG_GET_CLASS(base_class_name), NULL,class_init}; \ - Class* class_name::getClass() const \ - { return MSG_GET_CLASS(class_name); } \ - - // CreateObject implementation. - #define MSG_IMPLEMENT_DYNAMIC(class_name, base_class_name) \ - Object* class_name::createObject() \ - { return (Object*)(new class_name); } \ - DeclaringClass _declaringClass_##class_name(MSG_GET_CLASS(class_name)); \ - MSG_IMPLEMENT_CLASS(class_name, base_class_name, \ - class_name::createObject, &_declaringClass_##class_name) \ - - ////////////////////////////////////////////////////////////////////////////// - // Classes declared in this file. - - class Object; // The msg object. - - ////////////////////////////////////////////////////////////////////////////// - // Structures declared in this files. - - struct Class; // used during the rtti operations - struct DeclaringClass; // used during the instances registration. - - - class DeclaringClasses; - - ////////////////////////////////////////////////////////////////////////////// - // Global functions - - // Used during the registration. - void DeclareClass(Class* c); - - ////////////////////////////////////////////////////////////////////////////// - // DeclaringClass - - struct SIMGRIDX_EXPORT DeclaringClass - { - // Constructor : add the runtime classe in the list. - DeclaringClass(Class* c); - - // Destructor - virtual ~DeclaringClass(void); - - // Attributes : - // the list of runtime classes. - static DeclaringClasses* declaringClasses; - }; - - #define MSG_DELCARING_CLASSES (*(DeclaringClass::declaringClasses)) - - - struct SIMGRIDX_EXPORT Class - { - - // Attributes - - const char* name; // class name. - size_t typeSize; // type size. - Object* (*createObjectFn)(void); // pointer to the create object function. - Class* baseClass; // the runtime class of the runtime class. - Class* next; // the next runtime class in the list. - const DeclaringClass* declaringClass; // used during the registration of the class. - - // Operations - - // Create the runtime class from its name. - static Class* fromName(const char* name) - throw (ClassNotFoundException); - - // Create an object from the name of the its class. - static Object* createObject(const char* name); - - // Create an instance of the class. - Object* createObject(void); - - // Return true is the class is dervived from the base class baseClass. - bool isDerivedFrom(const Class* baseClass) const; - - }; - - // Create an instance of the class. - inline Object* Class::createObject(void) - { - return (*createObjectFn)(); - } - - - class SIMGRIDX_EXPORT Object - { - public: - - // Default constructor. - Object(){} - - // Destructor. - virtual ~Object(){} - - // Operations. - - // Get the runtime class. - virtual Class* getClass(void) const; - - // Returns true if the class is derived from the class baseClass. Otherwise - // the method returns false. - bool isDerivedFrom(const Class* baseClass) const; - - // Returns true if the object is valid. Otherwise the method returns false. - virtual bool isValid(void) const; - - // Returns true is the object is an instance of the class specified as parameter. - bool isInstanceOf(const char* className); - - // Operators. - - // Attributes. - - // The runtime class. - static const Class classObject; - }; - - // inline member functions of the class Object. - - // Returns the runtime class of the object. - inline Class* Object::getClass(void) const - { - return MSG_GET_CLASS(Object); - } - - // Returns true if the class is derived from the class pBaseClass. Otherwise - // the method returns false. - inline bool Object::isDerivedFrom(const Class* baseClass) const - { - return (getClass()->isDerivedFrom(baseClass)); - } - - // Returns true if the object is valid. Otherwise the method returns false. - inline bool Object::isValid(void) const - { - // returns always true. - return true; - } - - - class DeclaringClasses - { - public: - - // Constructor. - DeclaringClasses(); - - // Destructor. - virtual ~DeclaringClasses(){} - - // Operations. - - // Add the class at the head of the list. - void addHead(Class* c); - - // Get the runtime class of the head of the list. - Class* getHead(void) const ; - - // Remove the class from the list (don't destroy it). - bool remove(Class* c); - - // Remove the head of the list. - Class* removeHead(void); - - // Return true if the list is empty. - - bool isEmpty(void) const; - - // Remove of the elements of the list. - void removeAll(void); - - // Get the number of classes in the list. - unsigned int getCount(void); - - void lock(void){} - - void unlock(void){} - - //Attributes - - // The head of the list. - Class* head; - - private: - - // Attributes - - // The number of elements of the list. - unsigned int count; - }; - - typedef Object* ObjectPtr; - - - // Constructor (Add the class in the list). - inline DeclaringClass::DeclaringClass(Class* c) - { - if(!declaringClasses) - declaringClasses = new DeclaringClasses(); - - DeclareClass(c); - } - - // Destructor. - inline DeclaringClass::~DeclaringClass() - { - /*if(NULL != declaringClasses) - delete declaringClasses; - - declaringClasses=NULL;*/ - - } - - // Returns the number of elements of the list. - inline unsigned int DeclaringClasses::getCount() - { - return count; - } - - // Returns the head of the list. - inline Class* DeclaringClasses::getHead() const - { - return head; - } - - // Returns true if the list is empty. Otherwise this function - // returns false. - inline bool DeclaringClasses::isEmpty() const - { - return(!head); - } - - // Removes all the elements of the list. - inline void DeclaringClasses::removeAll() - { - head = 0; - count=0; - } - - } // namespace Msg -} // namespace SimGrid - - -using namespace SimGrid::Msg; - -#define instanceOf(class_name) reinterpret_cast(Class::createObject(#class_name)) - -#endif // !MSG_OBJECT_H - +/* + * Object.hpp + * + * This file contains the declaration of the wrapper class of the native MSG task type. + * + * Copyright 2006,2007 Martin Quinson, Malek Cherier + * All right reserved. + * + * This program is free software; you can redistribute + * it and/or modify it under the terms of the license + *(GNU LGPL) which comes with this package. + * + */ +#ifndef MSG_OBJECT_H +#define MSG_OBJECT_H + +// Compilation C++ recquise +#ifndef __cplusplus + #error Object.hpp requires C++ compilation (use a .cxx suffix) +#endif + +#include + +#include + +namespace SimGrid +{ + namespace Msg + { + ////////////////////////////////////////////////////////////////////////////// + // Macros + + // Returns the runtime class of the class_name object. + #define MSG_GET_CLASS(class_name) \ + ((Class*)(&class_name::class##class_name)) + + // Declare the class class_name as dynamic + #define MSG_DECLARE_DYNAMIC(class_name) \ + public: \ + static Class class##class_name; \ + virtual Class* getClass() const; \ + static Object* createObject() \ + + // The runtime class implementation. + #define MSG_IMPLEMENT_CLASS(class_name, base_class_name, pfn,class_init) \ + Class class_name::class##class_name = { \ + #class_name, sizeof(class class_name),pfn, \ + MSG_GET_CLASS(base_class_name), NULL,class_init}; \ + Class* class_name::getClass() const \ + { return MSG_GET_CLASS(class_name); } \ + + // CreateObject implementation. + #define MSG_IMPLEMENT_DYNAMIC(class_name, base_class_name) \ + Object* class_name::createObject() \ + { return (Object*)(new class_name); } \ + DeclaringClass _declaringClass_##class_name(MSG_GET_CLASS(class_name)); \ + MSG_IMPLEMENT_CLASS(class_name, base_class_name, \ + class_name::createObject, &_declaringClass_##class_name) \ + + ////////////////////////////////////////////////////////////////////////////// + // Classes declared in this file. + + class Object; // The msg object. + + ////////////////////////////////////////////////////////////////////////////// + // Structures declared in this files. + + struct Class; // used during the rtti operations + struct DeclaringClass; // used during the instances registration. + + + class DeclaringClasses; + + ////////////////////////////////////////////////////////////////////////////// + // Global functions + + // Used during the registration. + void DeclareClass(Class* c); + + ////////////////////////////////////////////////////////////////////////////// + // DeclaringClass + + struct SIMGRIDX_EXPORT DeclaringClass + { + // Constructor : add the runtime classe in the list. + DeclaringClass(Class* c); + + // Destructor + virtual ~DeclaringClass(void); + + // Attributes : + // the list of runtime classes. + static DeclaringClasses* declaringClasses; + }; + + #define MSG_DELCARING_CLASSES (*(DeclaringClass::declaringClasses)) + + + struct SIMGRIDX_EXPORT Class + { + + // Attributes + + const char* name; // class name. + size_t typeSize; // type size. + Object* (*createObjectFn)(void); // pointer to the create object function. + Class* baseClass; // the runtime class of the runtime class. + Class* next; // the next runtime class in the list. + const DeclaringClass* declaringClass; // used during the registration of the class. + + // Operations + + // Create the runtime class from its name. + static Class* fromName(const char* name) + throw (ClassNotFoundException); + + // Create an object from the name of the its class. + static Object* createObject(const char* name); + + // Create an instance of the class. + Object* createObject(void); + + // Return true is the class is dervived from the base class baseClass. + bool isDerivedFrom(const Class* baseClass) const; + + }; + + // Create an instance of the class. + inline Object* Class::createObject(void) + { + return (*createObjectFn)(); + } + + + class SIMGRIDX_EXPORT Object + { + public: + + // Default constructor. + Object(){} + + // Destructor. + virtual ~Object(){} + + // Operations. + + // Get the runtime class. + virtual Class* getClass(void) const; + + // Returns true if the class is derived from the class baseClass. Otherwise + // the method returns false. + bool isDerivedFrom(const Class* baseClass) const; + + // Returns true if the object is valid. Otherwise the method returns false. + virtual bool isValid(void) const; + + // Returns true is the object is an instance of the class specified as parameter. + bool isInstanceOf(const char* className); + + // Operators. + + // Attributes. + + // The runtime class. + static const Class classObject; + }; + + // inline member functions of the class Object. + + // Returns the runtime class of the object. + inline Class* Object::getClass(void) const + { + return MSG_GET_CLASS(Object); + } + + // Returns true if the class is derived from the class pBaseClass. Otherwise + // the method returns false. + inline bool Object::isDerivedFrom(const Class* baseClass) const + { + return (getClass()->isDerivedFrom(baseClass)); + } + + // Returns true if the object is valid. Otherwise the method returns false. + inline bool Object::isValid(void) const + { + // returns always true. + return true; + } + + + class DeclaringClasses + { + public: + + // Constructor. + DeclaringClasses(); + + // Destructor. + virtual ~DeclaringClasses(){} + + // Operations. + + // Add the class at the head of the list. + void addHead(Class* c); + + // Get the runtime class of the head of the list. + Class* getHead(void) const ; + + // Remove the class from the list (don't destroy it). + bool remove(Class* c); + + // Remove the head of the list. + Class* removeHead(void); + + // Return true if the list is empty. + + bool isEmpty(void) const; + + // Remove of the elements of the list. + void removeAll(void); + + // Get the number of classes in the list. + unsigned int getCount(void); + + void lock(void){} + + void unlock(void){} + + //Attributes + + // The head of the list. + Class* head; + + private: + + // Attributes + + // The number of elements of the list. + unsigned int count; + }; + + typedef Object* ObjectPtr; + + + // Constructor (Add the class in the list). + inline DeclaringClass::DeclaringClass(Class* c) + { + if(!declaringClasses) + declaringClasses = new DeclaringClasses(); + + DeclareClass(c); + } + + // Destructor. + inline DeclaringClass::~DeclaringClass() + { + /*if(NULL != declaringClasses) + delete declaringClasses; + + declaringClasses=NULL;*/ + + } + + // Returns the number of elements of the list. + inline unsigned int DeclaringClasses::getCount() + { + return count; + } + + // Returns the head of the list. + inline Class* DeclaringClasses::getHead() const + { + return head; + } + + // Returns true if the list is empty. Otherwise this function + // returns false. + inline bool DeclaringClasses::isEmpty() const + { + return(!head); + } + + // Removes all the elements of the list. + inline void DeclaringClasses::removeAll() + { + head = 0; + count=0; + } + + } // namespace Msg +} // namespace SimGrid + + +using namespace SimGrid::Msg; + +#define instanceOf(class_name) reinterpret_cast(Class::createObject(#class_name)) + +#endif // !MSG_OBJECT_H +