GME  13
OCLType.h
Go to the documentation of this file.
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