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