GME
13
|
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