GME
13
|
00001 //############################################################################################################################################### 00002 // 00003 // Object Constraint Language Generic Manager 00004 // OCLType.h 00005 // 00006 //############################################################################################################################################### 00007 00008 #ifndef OCLType_h 00009 #define OCLType_h 00010 00011 #include "OCLCommon.h" 00012 #include "OCLException.h" 00013 #include "OCLFactory.h" 00014 #include "OCLFeature.h" 00015 #include "OCLSignature.h" 00016 00017 #include <memory> 00018 00019 namespace OclMeta 00020 { 00021 class Type; 00022 class CompoundType; 00023 class TypeManager; 00024 00025 typedef std::vector< std::unique_ptr<Type> > TypeVector; 00026 00027 union UCallResult 00028 { 00029 Feature* pFeature; 00030 OclCommon::Exception* pException; 00031 }; 00032 00033 struct CallResult 00034 { 00035 bool bIsValid; 00036 UCallResult uResult; 00037 }; 00038 00039 struct TypeResult 00040 { 00041 bool bIsValid; 00042 std::shared_ptr<Type> pType; 00043 std::shared_ptr<OclCommon::Exception> pException; 00044 }; 00045 00046 typedef std::map< std::string , CallResult > CallResultMap; 00047 typedef std::map< std::string , TypeResult > TypeResultMap; 00048 00049 //############################################################################################################################################## 00050 // 00051 // C L A S S : OclMeta::TypeManager 00052 // 00053 //============================================================================================================================================== 00054 // 00055 // D E S C R I P T I O N : 00056 // 00057 //############################################################################################################################################## 00058 00059 class TypeManager 00060 { 00061 private : 00062 TypeResultMap m_mapTypes; 00063 CallResultMap m_mapOperators; 00064 CallResultMap m_mapFunctions; 00065 00066 OclImplementation::TypeFactory* m_pTypeFactory; 00067 OclImplementation::OperatorFactory* m_pOperatorFactory; 00068 OclImplementation::FunctionFactory* m_pFunctionFactory; 00069 OclImplementation::ConstraintDefinitionFactory* m_pDefinitionFactory; 00070 00071 public : 00072 TypeManager( OclImplementation::TypeFactory* pTypeFactory, OclImplementation::OperatorFactory* pOperatorFactory, OclImplementation::FunctionFactory* pFunctionFactory, OclImplementation::ConstraintDefinitionFactory* pCDFactory ); 00073 virtual ~TypeManager(); 00074 00075 OclImplementation::ConstraintDefinitionFactory* GetDefinitionFactory() const; 00076 void Clear(); 00077 void ClearTypes(); 00078 void ClearDynamicTypes(); 00079 void ClearGlobals(); 00080 00081 std::shared_ptr<Type> GetType( const std::string& strName, const std::string& strNSpace ); 00082 00083 int GetTypeDistance( const std::string& strName ); 00084 int IsTypeA( const std::string& strName1, const std::string& strName2 ); 00085 std::string GetTypeBase( const std::string& strName1, const std::string& strName2 ); 00086 bool IsTypeA( const TypeSeq& vecType1, const TypeSeq& vecType2 ); 00087 TypeSeq GetTypeBase( const TypeSeq& vecType1, const TypeSeq& vecType2 ); 00088 00089 Operator* GetOperator( const OclSignature::Operator& signature ); 00090 Function* GetFunction( const OclSignature::Function& signature ); 00091 void RegisterFeature( CallResult& callResult ); 00092 void RegisterType( TypeResult& typeResult ); 00093 00094 private : 00095 int IsTypeAR( const std::string& strName1, const std::string& strName2, int iLevel ); 00096 std::string GetTypeBaseR( const std::string& strName1, const std::string& strName2 ); 00097 }; 00098 00099 //############################################################################################################################################## 00100 // 00101 // C L A S S : OclMeta::Type 00102 // 00103 //============================================================================================================================================== 00104 // 00105 // D E S C R I P T I O N : 00106 // 00107 //############################################################################################################################################## 00108 00109 class Type 00110 { 00111 private : 00112 bool m_bDynamic; 00113 std::string m_strName; 00114 StringVector m_vecSuperTypes; 00115 CallResultMap m_mapAttributes; 00116 CallResultMap m_mapAssociations; 00117 CallResultMap m_mapMethods; 00118 OclImplementation::AttributeFactory* m_pAttributeFactory; 00119 OclImplementation::AssociationFactory* m_pAssociationFactory; 00120 OclImplementation::MethodFactory* m_pMethodFactory; 00121 TypeManager* m_pTypeManager; 00122 00123 public : 00124 Type( const std::string& strName, const StringVector& vecSuperTypes, OclImplementation::AttributeFactory* pAttributeFactory, OclImplementation::AssociationFactory* pAssociationFactory, OclImplementation::MethodFactory* pMethodFactory, bool bDynamic ); 00125 virtual ~Type(); 00126 00127 bool IsDynamic() const; 00128 std::string GetName() const; 00129 const StringVector& GetSuperTypeNames() const; 00130 virtual bool IsCompound() const; 00131 00132 Attribute* GetAttribute( const OclSignature::Attribute& signature ); 00133 Association* GetAssociation( const OclSignature::Association& signature ); 00134 Method* GetMethod( const OclSignature::Method& signature ); 00135 // protected : 00136 CallResult GetResults( const OclSignature::Attribute& signature ); 00137 CallResult GetResults( const OclSignature::Association& signature ); 00138 CallResult GetResults( const OclSignature::Method& signature ); 00139 virtual CallResult GetResults( const OclSignature::Iterator& signature ); 00140 protected : 00141 TypeManager* GetTypeManager() const; 00142 00143 friend class TypeManager; 00144 }; 00145 00146 //############################################################################################################################################## 00147 // 00148 // C L A S S : OclMeta::CompoundType <<< + OclMeta::Type 00149 // 00150 //============================================================================================================================================== 00151 // 00152 // D E S C R I P T I O N : 00153 // 00154 //############################################################################################################################################## 00155 00156 class CompoundType 00157 : public Type 00158 { 00159 private : 00160 CallResultMap m_mapIterators; 00161 OclImplementation::IteratorFactory* m_pIteratorFactory; 00162 00163 public : 00164 CompoundType( const std::string& strName, const StringVector& vecSuperTypes, OclImplementation::AttributeFactory* pAttributeFactory, OclImplementation::AssociationFactory* pAssociationFactory, OclImplementation::MethodFactory* pMethodFactory, OclImplementation::IteratorFactory* pIteratorFactory, bool bDynamic ); 00165 virtual ~CompoundType(); 00166 00167 virtual bool IsCompound() const; 00168 00169 Iterator* GetIterator(int level, const OclSignature::Iterator& signature ); 00170 // protected : 00171 virtual CallResult GetResults( const OclSignature::Iterator& signature ); 00172 00173 friend class TypeManager; 00174 }; 00175 00176 }; // namespace OclMeta 00177 00178 #endif