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