GME
13
|
00001 //############################################################################################################################################### 00002 // 00003 // Object Constraint Language Generic Manager 00004 // OCLContext.h 00005 // 00006 //############################################################################################################################################### 00007 00008 #ifndef OCLContext_h 00009 #define OCLContext_h 00010 00011 #include "OCLCommon.h" 00012 00013 namespace OclCommon 00014 { 00015 class Context; 00016 template < class TItem > class RealContext; 00017 template < class TItem > class ContextStack; 00018 00019 //############################################################################################################################################## 00020 // 00021 // C L A S S : Context 00022 // 00023 //============================================================================================================================================== 00024 // 00025 // D E S C R I P T I O N : 00026 // 00027 //############################################################################################################################################## 00028 00029 class Context 00030 { 00031 public : 00032 enum ContextType { CT_EXCLUSIVE = 0 , CT_INCLUSIVE = 1 }; 00033 00034 private : 00035 ContextType m_eType; 00036 00037 protected : 00038 Context( ContextType eType ) 00039 : m_eType( eType ) 00040 { 00041 } 00042 00043 public : 00044 virtual ~Context() 00045 { 00046 } 00047 00048 ContextType GetType() const 00049 { 00050 return m_eType; 00051 } 00052 }; 00053 00054 //############################################################################################################################################## 00055 // 00056 // T E M P L A T E C L A S S : RealContext 00057 // 00058 //============================================================================================================================================== 00059 // 00060 // D E S C R I P T I O N : 00061 // 00062 //############################################################################################################################################## 00063 00064 template< class TItem > 00065 class RealContext 00066 : public Context 00067 { 00068 public : 00069 typedef struct CItem_tag { std::string name; TItem item; } CItem; 00070 typedef std::vector< CItem > CItemVector; 00071 00072 00073 private : 00074 typedef struct StoreItem{ TItem object; bool bAssignable; }; 00075 typedef std::map< std::string, StoreItem > TMap; 00076 00077 private : 00078 TMap m_mapVariables; 00079 00080 public : 00081 RealContext( Context::ContextType eType ) 00082 : Context( eType ) 00083 { 00084 } 00085 00086 RealContext<TItem>& operator=( const RealContext<TItem>& object ) 00087 { 00088 if ( this != &object ) 00089 m_mapVariables = object.m_mapVariables; 00090 Context::operator=( object ); 00091 return *this; 00092 } 00093 00094 bool ExistsVariable( const std::string& strName ) const 00095 { 00096 TItem object; 00097 return GetVariable( strName, object ); 00098 } 00099 00100 bool GetVariable( const std::string& strName, TItem& object ) const 00101 { 00102 StoreItem item; 00103 bool bExists = GetVariable( strName, item ); 00104 if ( bExists ) 00105 object = item.object; 00106 return bExists; 00107 } 00108 00109 bool AddVariable( const std::string& strName, const TItem& object, bool bAssignable = false ) 00110 { 00111 StoreItem item; 00112 if ( GetVariable( strName, item ) ) 00113 return false; 00114 item.object = object; 00115 item.bAssignable = bAssignable; 00116 #if (_MSC_VER == 1200) 00117 m_mapVariables.insert( TMap::value_type( strName, item ) ); 00118 #else 00119 m_mapVariables.insert( typename TMap::value_type( strName, item ) ); 00120 #endif 00121 return true; 00122 } 00123 00124 bool IsAssignable( const std::string& strName, bool& bAssignable ) const 00125 { 00126 StoreItem item; 00127 bool bExists = GetVariable( strName, item ); 00128 if ( bExists ) 00129 bAssignable = item.bAssignable; 00130 return bExists; 00131 } 00132 00133 bool RemoveVariable( const std::string& strName ) 00134 { 00135 if ( ExistsVariable( strName ) ) { 00136 m_mapVariables.erase( strName ); 00137 return true; 00138 } 00139 return false; 00140 } 00141 00142 bool SetVariable( const std::string& strName, const TItem& object ) 00143 { 00144 StoreItem item; 00145 bool bExists = GetVariable( strName, item ); 00146 if ( ! bExists || ! item.bAssignable ) 00147 return false; 00148 m_mapVariables.erase( strName ); 00149 item.object = object; 00150 #if (_MSC_VER == 1200) 00151 m_mapVariables.insert( TMap::value_type( strName, item ) ); 00152 #else 00153 m_mapVariables.insert( typename TMap::value_type( strName, item ) ); 00154 #endif 00155 return true; 00156 } 00157 00158 CItemVector GetState() const 00159 { 00160 CItemVector vecItems; 00161 CItem selfItem; 00162 bool bHasSelf = false; 00163 for ( typename TMap::const_iterator i = m_mapVariables.begin() ; i != m_mapVariables.end() ; ++i ) { 00164 if ( (*i).first == "self" ) { 00165 bHasSelf = true; 00166 selfItem.name = "self"; 00167 selfItem.item = (*i).second.object; 00168 } 00169 else { 00170 CItem cItem; 00171 cItem.name = (*i).first; 00172 cItem.item = (*i).second.object; 00173 vecItems.push_back( cItem ); 00174 } 00175 } 00176 if ( bHasSelf ) { 00177 if ( vecItems.empty() ) 00178 vecItems.push_back( selfItem ); 00179 else 00180 vecItems.insert( vecItems.begin(), selfItem ); 00181 } 00182 return vecItems; 00183 } 00184 00185 private : 00186 bool GetVariable( const std::string& strName, StoreItem& item ) const 00187 { 00188 typename TMap::const_iterator i = m_mapVariables.find( strName ); 00189 if ( i == m_mapVariables.end() ) 00190 return false; 00191 item = (*i).second; 00192 return true; 00193 } 00194 }; 00195 00196 //############################################################################################################################################## 00197 // 00198 // T E M P L A T E C L A S S : ContextStack 00199 // 00200 //============================================================================================================================================== 00201 // 00202 // D E S C R I P T I O N : 00203 // 00204 //############################################################################################################################################## 00205 00206 template< class TItem > 00207 class ContextStack 00208 { 00209 public : 00210 typedef typename RealContext< TItem >::CItem StateItem; 00211 typedef std::vector< StateItem > StateItemVector; 00212 00213 private : 00214 typedef RealContext< TItem > CTItem; 00215 typedef std::vector< CTItem > CTVector; 00216 00217 private : 00218 CTVector m_vecContexts; 00219 00220 public : 00221 ContextStack() 00222 { 00223 AddContext( Context::CT_EXCLUSIVE ); 00224 } 00225 00226 ContextStack<TItem>& operator=( const ContextStack<TItem>& object ) 00227 { 00228 if ( this != &object ) 00229 m_vecContexts = object.m_vecContexts; 00230 return *this; 00231 } 00232 00233 void AddContext( Context::ContextType eType ) 00234 { 00235 m_vecContexts.push_back( CTItem( eType ) ); 00236 } 00237 00238 bool RemoveContext() 00239 { 00240 if ( ! m_vecContexts.empty() ) { 00241 typename CTVector::iterator i = m_vecContexts.end(); 00242 --i; 00243 m_vecContexts.erase( i ); 00244 return true; 00245 } 00246 return false; 00247 } 00248 00249 bool ExistsVariable( const std::string& strName ) const 00250 { 00251 for ( int i = m_vecContexts.size() - 1 ; i >= 0 ; i-- ) 00252 if ( m_vecContexts[ i ].ExistsVariable( strName ) ) 00253 return true; 00254 else 00255 if ( m_vecContexts[ i ].GetType() == Context::CT_EXCLUSIVE ) 00256 break; 00257 return false; 00258 } 00259 00260 bool GetVariable( const std::string& strName, TItem& object ) const 00261 { 00262 for ( int i = m_vecContexts.size() - 1 ; i >= 0 ; i-- ) 00263 if ( m_vecContexts[ i ].GetVariable( strName, object ) ) 00264 return true; 00265 else 00266 if ( m_vecContexts[ i ].GetType() == Context::CT_EXCLUSIVE ) 00267 break; 00268 return false; 00269 } 00270 00271 bool IsAssignable( const std::string& strName, bool& bAssignable ) const 00272 { 00273 for ( int i = m_vecContexts.size() - 1 ; i >= 0 ; i-- ) 00274 if ( m_vecContexts[ i ].IsAssignable( strName, bAssignable ) ) 00275 return true; 00276 else 00277 if ( m_vecContexts[ i ].GetType() == Context::CT_EXCLUSIVE ) 00278 break; 00279 return false; 00280 } 00281 00282 bool AddVariable( const std::string& strName, const TItem& object, bool bAssignable = false, bool bRedefine = false ) 00283 { 00284 if ( bRedefine && ! m_vecContexts[ m_vecContexts.size() - 1 ].ExistsVariable( strName ) || ! ExistsVariable( strName ) ) { 00285 m_vecContexts[ m_vecContexts.size() - 1 ].AddVariable( strName, object, bAssignable ); 00286 return true; 00287 } 00288 return false; 00289 } 00290 00291 bool RemoveVariable( const std::string& strName ) 00292 { 00293 for ( int i = m_vecContexts.size() - 1 ; i >= 0 ; i-- ) 00294 if ( m_vecContexts[ i ].RemoveVariable( strName ) ) 00295 return true; 00296 else 00297 if ( m_vecContexts[ i ].GetType() == Context::CT_EXCLUSIVE ) 00298 break; 00299 return false; 00300 } 00301 00302 bool SetVariable( const std::string& strName, const TItem& object ) 00303 { 00304 for ( int i = m_vecContexts.size() - 1 ; i >= 0 ; i-- ) 00305 if ( m_vecContexts[ i ].SetVariable( strName, object ) ) 00306 return true; 00307 else 00308 if ( m_vecContexts[ i ].GetType() == Context::CT_EXCLUSIVE ) 00309 break; 00310 return false; 00311 } 00312 00313 StateItemVector GetState() const 00314 { 00315 StateItemVector vecItemsOut; 00316 for ( unsigned int i = 0 ; i < m_vecContexts.size() ; i++ ) { 00317 StateItemVector vecItems = m_vecContexts[ i ].GetState(); 00318 if ( i != 0 && vecItems[ 0 ].name == "self" ) { 00319 char chBuffer[ 100 ]; 00320 sprintf_s( chBuffer, sizeof(chBuffer), "%lu", i + 1 ); 00321 vecItems[ 0 ].name = "self - " + std::string( chBuffer ); 00322 } 00323 for ( unsigned int j = 0 ; j < vecItems.size() ; j++ ) 00324 vecItemsOut.push_back( vecItems[ j ] ); 00325 } 00326 return vecItemsOut; 00327 } 00328 }; 00329 00330 }; // namespace OclCommon 00331 00332 #endif // OclContext_h