GME  13
OCLObject.h
Go to the documentation of this file.
00001 //###############################################################################################################################################
00002 //
00003 //      Object Constraint Language Generic Manager
00004 //      OCLObject.h
00005 //
00006 //###############################################################################################################################################
00007 
00008 #ifndef OCLObject_h
00009 #define OCLObject_h
00010 
00011 #include "OCLCommon.h"
00012 #include "OCLRefCount.h"
00013 #include "unknwn.h"
00014 
00015 namespace OclMeta {
00016         class Object;
00017 };
00018 
00019 namespace  OclImplementation {
00020         class Object;
00021         class CompoundObject;
00022         class ObjectIterator;
00023 }
00024 
00025 namespace OclMeta
00026 {
00027         class TypeManager;
00028 
00029         typedef std::vector< Object > ObjectVector;
00030 
00031 //##############################################################################################################################################
00032 //
00033 //      C L A S S : OclMeta::Object <<< + OclCommon::RCSmart< OclImplementation::Object >
00034 //
00035 //==============================================================================================================================================
00036 //
00037 //      D E S C R I P T I O N :
00038 //
00039 //##############################################################################################################################################
00040 
00041         class Object
00042                 : protected OclCommon::RCSmart< OclImplementation::Object >
00043         {
00044                 public :
00045                         static const Object UNDEFINED;
00046 
00047                 private :
00048                         std::string m_strStaticTypeName;
00049 
00050                 public :
00051                                                                                         Object();
00052                                                                                         Object( OclImplementation::Object* pImplementation );
00053                                                                                         Object( const Object& object );
00054                         Object&                                                 operator=( const Object& object );
00055                         Object                                                  Clone() const;
00056 
00057                         bool                                                    Equals( const Object& object ) const;
00058                         bool                                                    operator==( const Object& object ) const;
00059                         bool                                                    operator!=( const Object& object ) const;
00060 
00061                         std::string                                             GetTypeName() const;
00062                         std::string                                     GetStaticTypeName() const;
00063                         void                                                    SetStaticTypeName( const std::string& strStaticTypeName );
00064                         bool                                                    IsCompound() const;
00065                         bool                                                    IsComparable() const;
00066                         bool                                                    IsUndefined() const;
00067                         OclImplementation::Object*      GetImplementation() const;
00068                         std::string                                             Print() const;
00069                         virtual IUnknown*                               GetObject() const;
00070         };
00071 
00072 }; // namespace OclMeta
00073 
00074 namespace OclImplementation
00075 {
00076 
00077 //##############################################################################################################################################
00078 //
00079 //      A B S T R A C T   C L A S S : OclImplementation::Object <<< + OclCommon::ReferenceCountable< OclImplementation::Object >
00080 //
00081 //==============================================================================================================================================
00082 //
00083 //      D E S C R I P T I O N :
00084 //
00085 //##############################################################################################################################################
00086 
00087         class Object
00088                 : public OclCommon::ReferenceCountable< Object >
00089         {
00090                 protected :
00091                         std::string m_strTypeName;
00092                         OclMeta::TypeManager*   m_pTypeManager;
00093 
00094                 protected :
00095                         Object( OclMeta::TypeManager* pManager, const std::string& strTypeName )
00096                                 : OclCommon::ReferenceCountable<Object>(), m_pTypeManager( pManager ), m_strTypeName( strTypeName )
00097                         {
00098                         }
00099 
00100                 public :
00101                         virtual ~Object()
00102                         {
00103                         }
00104 
00105                         std::string GetTypeName() const
00106                         {
00107                                 return m_strTypeName;
00108                         }
00109 
00110                         OclMeta::TypeManager* GetTypeManager() const
00111                         {
00112                                 return m_pTypeManager;
00113                         }
00114 
00115                         virtual bool IsCompound() const
00116                         {
00117                                 return false;
00118                         }
00119                         
00120                         virtual bool IsComparable() const
00121                         {
00122                                 if (m_strTypeName == "ocl::Integer"  ||  m_strTypeName == "ocl::Real"  ||
00123                                         m_strTypeName == "ocl::String")
00124                                         return true; 
00125                                 return false;
00126                         }
00127 
00128                         virtual Object* Clone() const
00129                         {
00130                                 return NULL;
00131                         }
00132 
00133                         virtual bool Equals( const Object& object ) const
00134                         {
00135                                 return this == &object;
00136                         }
00137 
00138                         virtual std::string Print() const = 0;
00139 
00140                         virtual IUnknown* GetObject() const {return NULL;};
00141 
00142                         virtual bool IsUndefined() const
00143                         {
00144                                 return false;
00145                         }
00146         };
00147 
00148 //##############################################################################################################################################
00149 //
00150 //      A B S T R A C T   C L A S S : OclImplementation::CompoundObject <<< + OclImplementation::Object
00151 //
00152 //==============================================================================================================================================
00153 //
00154 //      D E S C R I P T I O N :
00155 //
00156 //##############################################################################################################################################
00157 
00158         class CompoundObject
00159                 : public Object
00160         {
00161                 protected :
00162                         CompoundObject( OclMeta::TypeManager* pManager, const std::string& strTypeName )
00163                                 : Object( pManager, strTypeName )
00164                         {
00165                         }
00166 
00167                 public :
00168                         virtual ~CompoundObject()
00169                         {
00170                         }
00171 
00172                         bool IsCompound() const
00173                         {
00174                                 return true;
00175                         }
00176 
00177                         virtual void AddObject( const OclMeta::Object& object ) = 0;
00178 
00179                         virtual ObjectIterator* GetIterator() = 0;
00180         };
00181 
00182 //##############################################################################################################################################
00183 //
00184 //      P U R E   A B S T R A C T   C L A S S : OclImplementation::ObjectIterator
00185 //
00186 //==============================================================================================================================================
00187 //
00188 //      D E S C R I P T I O N :
00189 //
00190 //##############################################################################################################################################
00191 
00192         class ObjectIterator
00193         {
00194                 public :
00195                         ObjectIterator()
00196                         {
00197                         }
00198 
00199                         virtual ~ObjectIterator()
00200                         {
00201                         }
00202 
00203                         virtual bool HasNext() = 0;
00204 
00205                         virtual OclMeta::Object GetNext() = 0;
00206         };
00207 
00208 }; // namespace OclImplementation
00209 
00210 #endif // OCLObject_h