GME  13
OCLFeature.h
Go to the documentation of this file.
00001 //###############################################################################################################################################
00002 //
00003 //      Object Constraint Language Generic Manager
00004 //      OCLFeature.h
00005 //
00006 //###############################################################################################################################################
00007 
00008 #ifndef OCLFeature_h
00009 #define OCLFeature_h
00010 
00011 #include "OCLCommon.h"
00012 #include "OCLFormalParameter.h"
00013 #include "OCLSignature.h"
00014 #include "OCLFeatureImplementation.h"
00015 
00016 namespace OclMeta
00017 {
00018         class Feature;
00019         class Attribute;
00020         class Association;
00021         class Iterator;
00022         class Method;
00023         class Operator;
00024         class Function;
00025 
00026         typedef std::vector< Attribute* > AttributeVector;
00027         typedef std::vector< Association* > AssociationVector;
00028         typedef std::vector< Iterator* > IteratorVector;
00029         typedef std::vector< Method* > MethodVector;
00030         typedef std::vector< Operator* > OperatorVector;
00031         typedef std::vector< Function* > FunctionVector;
00032 
00033         class Dependency;
00034 
00035         typedef std::set< Dependency > DependencySet;
00036 
00037 //##############################################################################################################################################
00038 //
00039 //      C L A S S : OclMeta::Feature
00040 //
00041 //==============================================================================================================================================
00042 //
00043 //      D E S C R I P T I O N :
00044 //
00045 //##############################################################################################################################################
00046 
00047         class Feature
00048                 : public OclSignature::Feature
00049         {
00050                 private :
00051                         bool                                            m_bDynamic;
00052                         bool                                            m_bDependence;
00053                         TypeSeq                                 m_vecTypeReturn;
00054 
00055                 protected :
00056                         Feature( const std::string& strName, const OclSignature::Feature::FeatureKind eKind, const TypeSeq& vecTypeReturn, bool bDynamic, bool bDependence = false )
00057                                 : OclSignature::Feature( strName, eKind ), m_vecTypeReturn( vecTypeReturn ), m_bDynamic( bDynamic ), m_bDependence( bDependence )
00058                         {
00059                         }
00060 
00061                 public :
00062                         virtual ~Feature()
00063                         {
00064                         }
00065 
00066                         bool IsDynamic() const
00067                         {
00068                                 return m_bDynamic;
00069                         }
00070 
00071                         TypeSeq GetReturnTypeSeq() const
00072                         {
00073                                 return m_vecTypeReturn;
00074                         }
00075 
00076                         void SetReturnTypeSeq( TypeSeq& vecType )
00077                         {
00078                                 m_vecTypeReturn = vecType;
00079                         }
00080 
00081                         bool IsDependence() const
00082                         {
00083                                 return m_bDependence;
00084                         }
00085         };
00086 
00087 //##############################################################################################################################################
00088 //
00089 //      T E M P L A T E   C L A S S : OclMeta::FeatureAppendix
00090 //
00091 //==============================================================================================================================================
00092 //
00093 //      D E S C R I P T I O N :
00094 //
00095 //##############################################################################################################################################
00096 
00097         template < class TImplementation >
00098         class FeatureAppendix
00099         {
00100                 private :
00101                         TImplementation*                m_pImplementation;
00102 
00103                 protected :
00104                         FeatureAppendix( TImplementation* pImplementation )
00105                                 : m_pImplementation( pImplementation )
00106                         {
00107                         }
00108 
00109                 public :
00110                         virtual ~FeatureAppendix()
00111                         {
00112                                 delete m_pImplementation;
00113                         }
00114 
00115                         TImplementation* GetImplementation() const
00116                         {
00117                                 return m_pImplementation;
00118                         }
00119         };
00120 
00121 //##############################################################################################################################################
00122 //
00123 //      C L A S S : OclMeta::Attribute <<< + OclMeta::Feature, + OclSignature::Attribute, OclMeta::FeatureAppendix<OclImplementation::Attribute>
00124 //
00125 //==============================================================================================================================================
00126 //
00127 //      D E S C R I P T I O N :
00128 //
00129 //##############################################################################################################################################
00130 
00131         class Attribute
00132                 :       public OclMeta::Feature,
00133                         public OclSignature::Attribute,
00134                         public OclMeta::FeatureAppendix< OclImplementation::Attribute >
00135         {
00136                 public :
00137                         Attribute( const std::string& strName, const TypeSeq& vecTypeReturn, OclImplementation::Attribute* pImplementation, bool bDynamic, bool bDependence = false )
00138                                 : OclMeta::Feature( strName, OclSignature::Feature::FK_ATTRIBUTE, vecTypeReturn, bDynamic, bDependence ), OclSignature::Attribute( strName ), OclMeta::FeatureAppendix<OclImplementation::Attribute>( pImplementation )
00139                         {
00140                         }
00141 
00142                         bool IsIdentical( const Attribute& object ) const
00143                         {
00144                                 return ((OclSignature::Attribute)*this).IsIdentical( object );
00145                         }
00146         };
00147 
00148 //##############################################################################################################################################
00149 //
00150 //      C L A S S : OclMeta::Association <<< + OclMeta::Feature, + OclSignature::Association, OclMeta::FeatureAppendix<OclImplementation::Association>
00151 //
00152 //==============================================================================================================================================
00153 //
00154 //      D E S C R I P T I O N :
00155 //
00156 //##############################################################################################################################################
00157 
00158         class Association
00159                 :       public OclMeta::Feature,
00160                         public OclSignature::Association,
00161                         public OclMeta::FeatureAppendix< OclImplementation::Association >
00162         {
00163                 public :
00164                         Association( const std::string& strName, const std::string& strAcceptable, TypeSeq& vecTypeReturn, OclImplementation::Association* pImplementation, bool bDynamic )
00165                                 : OclMeta::Feature( strName, OclSignature::Feature::FK_ASSOCIATION, vecTypeReturn, bDynamic ), OclSignature::Association( strName, strAcceptable ), OclMeta::FeatureAppendix<OclImplementation::Association>( pImplementation )
00166                         {
00167                         }
00168 
00169                         bool IsIdentical( const Association& object ) const
00170                         {
00171                                 return ((OclSignature::Association)*this).IsIdentical( object );
00172                         }
00173         };
00174 
00175 //##############################################################################################################################################
00176 //
00177 //      C L A S S : OclMeta::Iterator <<< + OclMeta::Feature, + OclSignature::Iterator, OclMeta::FeatureAppendix<OclImplementation::Iterator>
00178 //
00179 //==============================================================================================================================================
00180 //
00181 //      D E S C R I P T I O N :
00182 //
00183 //##############################################################################################################################################
00184 
00185         class Iterator
00186                 :       public OclMeta::Feature,
00187                         public OclSignature::Iterator,
00188                         public OclMeta::FeatureAppendix< OclImplementation::Iterator >
00189         {
00190                 public :
00191                         Iterator( const std::string& strName, const std::string& strParameterType, TypeSeq& vecTypeReturn, OclImplementation::Iterator* pImplementation, bool bDynamic )
00192                                 : OclMeta::Feature( strName, OclSignature::Feature::FK_ITERATOR, vecTypeReturn, bDynamic ), OclSignature::Iterator( strName, strParameterType ), OclMeta::FeatureAppendix<OclImplementation::Iterator>( pImplementation )
00193                         {
00194                         }
00195 
00196                         bool IsIdentical( const Iterator& object ) const
00197                         {
00198                                 return ((OclSignature::Iterator)*this).IsIdentical( object );
00199                         }
00200         };
00201 
00202 //##############################################################################################################################################
00203 //
00204 //      C L A S S : OclMeta::Method <<< + OclMeta::Feature, + OclSignature::Method, OclMeta::FeatureAppendix<OclImplementation::Method>
00205 //
00206 //==============================================================================================================================================
00207 //
00208 //      D E S C R I P T I O N :
00209 //
00210 //##############################################################################################################################################
00211 
00212         class Method
00213                 :       public OclMeta::Feature,
00214                         public OclSignature::Method,
00215                         public OclMeta::FeatureAppendix< OclImplementation::Method >
00216         {
00217                 public :
00218                         Method( const std::string& strName, const OclCommon::FormalParameterVector& vecParameters, TypeSeq& vecTypeReturn, OclImplementation::Method* pImplementation, bool bDynamic, bool bDependence = false )
00219                                 : OclMeta::Feature( strName, OclSignature::Feature::FK_METHOD, vecTypeReturn, bDynamic, bDependence ), OclSignature::Method( strName, vecParameters ), OclMeta::FeatureAppendix<OclImplementation::Method>( pImplementation )
00220                         {
00221                         }
00222 
00223                         bool IsIdentical( const Method& object ) const
00224                         {
00225                                 return ((OclSignature::Method)*this).IsIdentical( object );
00226                         }
00227         };
00228 
00229 //##############################################################################################################################################
00230 //
00231 //      C L A S S : OclMeta::Operator
00232 //
00233 //==============================================================================================================================================
00234 //
00235 //      D E S C R I P T I O N :
00236 //
00237 //##############################################################################################################################################
00238 
00239         class Operator
00240                 :       public OclMeta::Feature,
00241                         public OclSignature::Operator,
00242                         public OclMeta::FeatureAppendix< OclImplementation::Operator >
00243         {
00244                 public :
00245                         Operator( const std::string& strName, const std::string& strOperand1Type, const TypeSeq& vecTypeReturn, OclImplementation::Operator* pImplementation, bool bDynamic )
00246                                 : OclMeta::Feature( strName, OclSignature::Feature::FK_OPERATOR, vecTypeReturn, bDynamic ), OclSignature::Operator( strName, strOperand1Type ), OclMeta::FeatureAppendix<OclImplementation::Operator>( pImplementation )
00247                         {
00248                         }
00249 
00250                         Operator( const std::string& strName, const std::string& strOperand1Type, const std::string& strOperand2Type, const TypeSeq& vecTypeReturn, OclImplementation::Operator* pImplementation, bool bDynamic )
00251                                 : OclMeta::Feature( strName, OclSignature::Feature::FK_OPERATOR, vecTypeReturn, bDynamic ), OclSignature::Operator( strName, strOperand1Type, strOperand2Type ), OclMeta::FeatureAppendix<OclImplementation::Operator>( pImplementation )
00252                         {
00253                         }
00254 
00255                         bool IsIdentical( const Operator& object ) const
00256                         {
00257                                 return ((OclSignature::Operator)*this).IsIdentical( object );
00258                         }
00259         };
00260 
00261 //##############################################################################################################################################
00262 //
00263 //      C L A S S : OclMeta::Function <<< + OclMeta::Feature, + OclSignature::Function, OclMeta::FeatureAppendix<OclImplementation::Function>
00264 //
00265 //==============================================================================================================================================
00266 //
00267 //      D E S C R I P T I O N :
00268 //
00269 //##############################################################################################################################################
00270 
00271         class Function
00272                 :       public OclMeta::Feature,
00273                         public OclSignature::Function,
00274                         public OclMeta::FeatureAppendix< OclImplementation::Function >
00275         {
00276                 public :
00277                         Function( const std::string& strName, const OclCommon::FormalParameterVector& vecParameters, TypeSeq& vecTypeReturn, OclImplementation::Function* pImplementation, bool bDynamic )
00278                                 : OclMeta::Feature( strName, OclSignature::Feature::FK_FUNCTION, vecTypeReturn, bDynamic ), OclSignature::Function( strName, vecParameters ), OclMeta::FeatureAppendix<OclImplementation::Function>( pImplementation )
00279                         {
00280                         }
00281 
00282                         bool IsIdentical( const Function& object ) const
00283                         {
00284                                 return ((OclSignature::Function)*this).IsIdentical( object );
00285                         }
00286         };
00287 
00288 //##############################################################################################################################################
00289 //
00290 //      C L A S S : OclMeta::Dependency
00291 //
00292 //==============================================================================================================================================
00293 //
00294 //      D E S C R I P T I O N :
00295 //
00296 //##############################################################################################################################################
00297 
00298         class Dependency
00299         {
00300                 public :
00301                         Position        m_position;
00302                         std::string             m_strSignature;
00303                         bool            m_bFailed;
00304                         bool            m_bChecked;
00305 
00306 
00307                         Dependency( const std::string& strSignature, const Position& position )
00308                                 : m_strSignature( strSignature), m_position( position ), m_bFailed( false ), m_bChecked( false )
00309                         {
00310                         }
00311 
00312                         Dependency( const Dependency& d )
00313                                 : m_strSignature( d.m_strSignature ), m_position( d.m_position ), m_bFailed( d.m_bFailed ), m_bChecked( d.m_bChecked )
00314                         {
00315                         }
00316 
00317                         Dependency& operator=( const Dependency& d )
00318                         {
00319                                 if ( this != &d ) {
00320                                         m_strSignature = d.m_strSignature;
00321                                         m_position = d.m_position;
00322                                         m_bFailed = d.m_bFailed;
00323                                         m_bChecked = d.m_bChecked;
00324                                 }
00325                                 return *this;
00326                         }
00327 
00328                         bool operator==( const Dependency& d ) const
00329                         {
00330                                 return m_strSignature == d.m_strSignature;
00331                         }
00332 
00333                         bool operator!=( const Dependency& d ) const
00334                         {
00335                                 return ! ( *this == d );
00336                         }
00337 
00338                         bool operator<( const Dependency& d ) const
00339                         {
00340                                 return m_strSignature < d.m_strSignature;
00341                         }
00342 
00343                         std::string Print() const
00344                         {
00345                                 std::string strOut = "c: ";
00346                                 strOut += ( m_bChecked ) ? "1 " : "0 ";
00347                                 strOut += "f: ";
00348                                 strOut += ( m_bFailed ) ? "1 " : "0 ";
00349                                 return strOut + "s: " + m_strSignature;
00350                         }
00351 
00352                         static bool IsChecked( const DependencySet& ds )
00353                         {
00354                                 for ( DependencySet::const_iterator i = ds.begin() ; i != ds.end() ; ++i )
00355                                         if ( ! (*i).m_bChecked )
00356                                                 return false;
00357                                 return true;
00358                         }
00359 
00360                         static bool IsFailed( const DependencySet& ds )
00361                         {
00362                                 for ( DependencySet::const_iterator i = ds.begin() ; i != ds.end() ; ++i )
00363                                         if ( ! (*i).m_bChecked )
00364                                                 return false;
00365                                         else
00366                                                 if ( (*i).m_bFailed )
00367                                                         return true;
00368                                 return false;
00369                         }
00370 
00371                         static void SetChecked( DependencySet& ds, DependencySet::iterator i, bool bFailed )
00372                         {
00373                                 Dependency d = *i;
00374                                 d.m_bFailed = bFailed;
00375                                 d.m_bChecked = true;
00376                                 ds.erase( i );
00377                                 ds.insert( d );
00378                         }
00379 
00380                         static DependencySet::iterator LookUp( DependencySet& ds, const std::string& strSignature )
00381                         {
00382                                 Position pos;
00383                                 DependencySet::iterator it = ds.find( Dependency( strSignature, pos ) );
00384                                 return it;
00385                         }
00386 
00387                         static std::string Print( const DependencySet& setDependencies )
00388                         {
00389                                 std::string strOut;
00390                                 for ( DependencySet::const_iterator it = setDependencies.begin() ; it != setDependencies.end() ; ++it )
00391                                         strOut += (*it).Print() + "\r\n";
00392                                 return strOut;
00393                         }
00394         };
00395 
00396 }; // namespace OclMeta
00397 
00398 #endif // OCLFeature_h