GME  13
OCLException.h
Go to the documentation of this file.
00001 //###############################################################################################################################################
00002 //
00003 //      Object Constraint Language Generic Manager
00004 //      OCLException.h
00005 //
00006 //###############################################################################################################################################
00007 
00008 #ifndef OCLException_h
00009 #define OCLException_h
00010 
00011 #include "OCLCommon.h"
00012 
00013 //###############################################################################################################################################
00014 //
00015 //      P R E D E F I N E D   C O D E S
00016 //
00017 //###############################################################################################################################################
00018 
00019 #define EX_TYPE_DOESNT_EXIST    100
00020 #define EX_TYPE_AMBIGUOUS       101
00021 #define EX_BASETYPE_DOESNT_EXIST 102
00022 #define EX_OPERATOR_AMBIGUOUS 103
00023 #define EX_OPERATOR_DOESNT_EXIST 104
00024 #define EX_FUNCTION_AMBIGUOUS 105
00025 #define EX_FUNCTION_DOESNT_EXIST 106
00026 #define EX_ATTRIBUTE_AMBIGUOUS 107
00027 #define EX_ATTRIBUTE_DOESNT_EXIST 108
00028 #define EX_ASSOCIATION_AMBIGUOUS 109
00029 #define EX_ASSOCIATION_DOESNT_EXIST 110
00030 #define EX_METHOD_AMBIGUOUS 111
00031 #define EX_METHOD_DOESNT_EXIST 112
00032 #define EX_ITERATOR_AMBIGUOUS 113
00033 #define EX_ITERATOR_DOESNT_EXIST 114
00034 #define EX_INVALID_TYPE                 115
00035 #define EX_TYPE_ISNT_COMPOUND   116
00036 #define EX_VARIABLE_ALREADY_EXISTS      117
00037 #define EX_BOOLEAN_REQUIRED 118
00038 #define EX_IF_TYPE_MISMATCH 119
00039 #define EX_TYPE_ISNT_A 120
00040 #define EX_OPERATOR_NOT_IMPLEMENTED 121
00041 #define EX_INVALID_CALL 122
00042 #define EX_ITERATOR_NOT_IMPLEMENTED 123
00043 #define EX_OBJECT_CALL_PROHIBITED 124
00044 #define EX_METHOD_ITERATOR_AMBIGUOUS 125
00045 #define EX_METHOD_NOT_IMPLEMENTED 126
00046 #define EX_FUNCTION_NOT_IMPLEMENTED 127
00047 #define EX_ASSOCIATION_NOT_IMPLEMENTED 128
00048 #define EX_ATTRIBUTE_NOT_IMPLEMENTED 129
00049 #define EX_ATTRIBUTE_ASSOCIATION_AMBIGUOUS 130
00050 #define EX_VARIABLE_DOESNT_EXIST 131
00051 #define EX_CANNOT_CREATE_OBJECT 132
00052 #define EX_CANNOT_CREATE_COLLECTION 133
00053 #define EX_ATTRIBUTE_INNERATTRIBUTE_AMBIGUOUS 134
00054 #define EX_TYPE_NOT_COMPOUND_ITERATOR 135
00055 #define EX_TYPE_COMPOUND_ASSOCIATION 136
00056 #define EX_ITERATOR_ONE_ARGUMENT 137
00057 #define EX_CONSTRAINT_DEF_RETURN_MISSING 138
00058 #define EX_CONSTRAINT_DEF_RETURN_MISMATCH 139
00059 #define EX_CONSTRAINT_DEF_FAILED 140
00060 #define EX_ASSIGNMENT_TYPE_MISMATCH 141
00061 #define EX_CAST_TYPE_MISMATCH 142
00062 #define EX_IMPL_ITER_DOESNT_EXIST 143
00063 #define EX_FUNC_IMPL_METH_ITER_DOESNT_EXIST 144
00064 #define EX_IMPL_ASSOC_DOESNT_EXIST 145
00065 #define EX_VAR_IMPL_ATTRIB_ASSOC_DOESNT_EXIST 146
00066 #define EX_STOP_EVALUATION 147
00067 
00068 //###############################################################################################################################################
00069 //
00070 //      M A C R O S
00071 //
00072 //###############################################################################################################################################
00073 
00074         #define THROWOCL0( type, code_or_message )      \
00075                 throw OclCommon::Exception( OclCommon::Exception:: type, code_or_message )
00076 
00077         #define THROWOCL1( type, code_or_message, param1 )      \
00078                 throw OclCommon::Exception( OclCommon::Exception:: type, code_or_message, param1 )
00079 
00080         #define THROWOCL2( type, code_or_message, param1, param2 )      \
00081                 throw OclCommon::Exception( OclCommon::Exception:: type, code_or_message, param1, param2 )
00082 
00083         #define THROWOCL3( type, code_or_message, param1, param2, param3 )      \
00084                 throw OclCommon::Exception( OclCommon::Exception:: type, code_or_message, param1, param2, param3 )
00085 
00086 namespace OclCommon
00087 {
00088         //class Exception;
00089         class ExceptionPool;
00090 
00091 //###############################################################################################################################################
00092 //
00093 //      C L A S S : Exception
00094 //
00095 //===============================================================================================================================================
00096 //
00097 //      D E S C R I P T I O N :
00098 //
00099 //###############################################################################################################################################
00100 
00101         class Exception
00102         {
00103                 public :
00104                         enum ExceptionType { ET_SYNTACTIC = 0, ET_SEMANTIC = 1, ET_RUNTIME = 2, ET_WARNING = 3 };
00105 
00106                 private :
00107                         int                                     m_iCode;
00108                         std::string                     m_strMessage;
00109                         ExceptionType           m_eType;
00110                         StringVector            m_vecParameters;
00111                         int                                     m_iLine;
00112                         int                                     m_iColumn;
00113 
00114                 public :
00115                         Exception()
00116                                 : m_iCode( -1 ), m_iLine( -1 ), m_iColumn( -1 ), m_strMessage( "" ), m_eType( ET_SEMANTIC )
00117                         {
00118                         }
00119 
00120                         Exception( ExceptionType eType, int iCode, int iLine = -1, int iColumn = -1 )
00121                                 : m_iCode( iCode ), m_iLine( iLine ), m_iColumn( iColumn ), m_strMessage( "" ), m_eType( eType )
00122                         {
00123                         }
00124 
00125                         Exception( ExceptionType eType, int iCode, const std::string& param, int iLine = -1, int iColumn = -1 )
00126                                 : m_iCode( iCode ), m_strMessage( "" ), m_iLine( iLine ), m_iColumn( iColumn ), m_eType( eType )
00127                         {
00128                                 m_vecParameters.push_back( param );
00129                         }
00130 
00131                         Exception( ExceptionType eType, int iCode, const std::string& param1, const std::string& param2, int iLine = -1, int iColumn = -1 )
00132                                 : m_iCode( iCode ), m_strMessage( "" ), m_iLine( iLine ), m_iColumn( iColumn ), m_eType( eType )
00133                         {
00134                                 m_vecParameters.push_back( param1 );
00135                                 m_vecParameters.push_back( param2 );
00136                         }
00137 
00138                         Exception( ExceptionType eType, int iCode, const std::string& param1, const std::string& param2, const std::string& param3, int iLine = -1, int iColumn = -1 )
00139                                 : m_iCode( iCode ), m_strMessage( "" ), m_iLine( iLine ), m_iColumn( iColumn ), m_eType( eType )
00140                         {
00141                                 m_vecParameters.push_back( param1 );
00142                                 m_vecParameters.push_back( param2 );
00143                                 m_vecParameters.push_back( param3 );
00144                         }
00145 
00146                         Exception( ExceptionType eType, int iCode, const StringVector& vecParameters, int iLine = -1, int iColumn = -1 )
00147                                 : m_iCode( iCode ), m_vecParameters( vecParameters ), m_strMessage( "" ), m_iLine( iLine ), m_iColumn( iColumn ), m_eType( eType )
00148                         {
00149                         }
00150 
00151                         Exception( ExceptionType eType, const std::string& strMessage, int iLine = -1, int iColumn = -1 )
00152                                 : m_iCode( -1 ), m_strMessage( strMessage ), m_iLine( iLine ), m_iColumn( iColumn ), m_eType( eType )
00153                         {
00154                         }
00155 
00156                         Exception( ExceptionType eType, const std::string& strMessage, const std::string& param, int iLine = -1, int iColumn = -1 )
00157                                 : m_iCode( -1 ), m_strMessage( strMessage ), m_iLine( iLine ), m_iColumn( iColumn ), m_eType( eType )
00158                         {
00159                                 m_vecParameters.push_back( param );
00160                         }
00161 
00162                         Exception( ExceptionType eType, const std::string& strMessage, const std::string& param1, const std::string& param2, int iLine = -1, int iColumn = -1 )
00163                                 : m_iCode( -1 ), m_strMessage( strMessage ), m_iLine( iLine ), m_iColumn( iColumn ), m_eType( eType )
00164                         {
00165                                 m_vecParameters.push_back( param1 );
00166                                 m_vecParameters.push_back( param2 );
00167                         }
00168 
00169                         Exception( ExceptionType eType, const std::string& strMessage, const std::string& param1, const std::string& param2, const std::string& param3, int iLine = -1, int iColumn = -1 )
00170                                 : m_iCode( -1 ), m_strMessage( strMessage ), m_iLine( iLine ), m_iColumn( iColumn ), m_eType( eType )
00171                         {
00172                                 m_vecParameters.push_back( param1 );
00173                                 m_vecParameters.push_back( param2 );
00174                                 m_vecParameters.push_back( param3 );
00175                         }
00176 
00177 
00178                         Exception( ExceptionType eType, const std::string& strMessage, const StringVector& vecParameters, int iLine = -1, int iColumn = -1 )
00179                                 : m_iCode( -1 ), m_vecParameters( vecParameters ), m_strMessage( strMessage ), m_iLine( iLine ), m_iColumn( iColumn ), m_eType( eType )
00180                         {
00181                         }
00182 
00183                         Exception( ExceptionType eType, const Exception& e )
00184                                 : m_iCode( e.m_iCode ), m_vecParameters( e.m_vecParameters ), m_iLine( e.m_iLine ), m_iColumn( e.m_iColumn ), m_strMessage( e.m_strMessage ), m_eType( e.m_eType )
00185                         {
00186                         }
00187 
00188                         Exception& operator=( const Exception& e )
00189                         {
00190                                 if ( this != &e ) {
00191                                         m_iCode = e.m_iCode;
00192                                         m_vecParameters = e.m_vecParameters;
00193                                         m_iLine = e.m_iLine;
00194                                         m_strMessage = e.m_strMessage;
00195                                         m_eType = e.m_eType;
00196                                 }
00197                                 return *this;
00198                         }
00199 
00200                         int GetLine()
00201                         {
00202                                 return m_iLine;
00203                         }
00204 
00205                         int GetColumn()
00206                         {
00207                                 return m_iColumn;
00208                         }
00209 
00210                         void SetLine( int iLine )
00211                         {
00212                                 m_iLine = iLine;
00213                         }
00214 
00215                         void SetColumn( int iColumn )
00216                         {
00217                                 m_iColumn = iColumn;
00218                         }
00219 
00220                         std::string GGetMessage();//z!
00221 
00222                         int GetCode()
00223                         {
00224                                 return m_iCode;
00225                         }
00226 
00227                         ExceptionType GetType()
00228                         {
00229                                 return m_eType;
00230                         }
00231         };
00232 
00233 //##############################################################################################################################################
00234 //
00235 //      C L A S S : ExceptionPool
00236 //
00237 //==============================================================================================================================================
00238 //
00239 //      D E S C R I P T I O N :
00240 //
00241 //##############################################################################################################################################
00242 
00243         class ExceptionPool
00244         {
00245                 private :
00246                         typedef std::vector< Exception > ExceptionVector;
00247 
00248                         ExceptionVector m_vecExceptions;
00249                         bool                            m_bHasError;
00250 
00251                 public :
00252                         ExceptionPool()
00253                                 : m_bHasError( false )
00254                         {
00255                         }
00256 
00257                         ExceptionPool( const ExceptionPool& object )
00258                                 : m_vecExceptions( object.m_vecExceptions ), m_bHasError( object.m_bHasError )
00259                         {
00260                         }
00261 
00262                         ExceptionPool& operator=( const ExceptionPool& object )
00263                         {
00264                                 if ( this != &object ) {
00265                                         m_vecExceptions = object.m_vecExceptions;
00266                                         m_bHasError = object.m_bHasError;
00267                                 }
00268                                 return *this;
00269                         }
00270 
00271                         void Add( Exception& e )
00272                         {
00273                                 m_vecExceptions.push_back( e );
00274                                 if ( e.GetType() != Exception::ET_WARNING )
00275                                         m_bHasError = true;
00276                         }
00277 
00278                         void Add( ExceptionPool& ePool )
00279                         {
00280                                 for ( unsigned int i = 0 ; i < ePool.m_vecExceptions.size() ; i++ )
00281                                         Add( ePool.m_vecExceptions[ i ] );
00282                         }
00283 
00284                         int Size() const
00285                         {
00286                                 return m_vecExceptions.size();
00287                         }
00288 
00289                         Exception& GetAt( int iPos ) const
00290                         {
00291                                 return ((ExceptionPool*)this)->m_vecExceptions[ iPos ];
00292                         }
00293 
00294                         bool IsEmpty()
00295                         {
00296                                 return m_vecExceptions.empty();
00297                         }
00298 
00299                         void Clear( int from = -1, int to = -1 )
00300                         {
00301                                 if ( m_vecExceptions.empty() )
00302                                         return;
00303                                 if ( from < 0 )
00304                                         from = 0;
00305                                 if ( from > (int) m_vecExceptions.size() )
00306                                         return;
00307                                 if ( to < 0 || to >= (int) m_vecExceptions.size() )
00308                                         to = m_vecExceptions.size() - 1;
00309                                 if ( from == 0 && to == (int) m_vecExceptions.size() - 1 )
00310                                         m_vecExceptions.clear();
00311                                 else {
00312                                         ExceptionVector vecTemp( m_vecExceptions );
00313                                         m_vecExceptions.clear();
00314                                         int i;
00315                                         for ( i = 0 ; i < from ; i++ )
00316                                                 m_vecExceptions.push_back( vecTemp[ i ] );
00317                                         for ( i = to ; i < (int) vecTemp.size() ; i++ )
00318                                                 m_vecExceptions.push_back( vecTemp[ i ] );
00319                                 }
00320                                 m_bHasError = false;
00321                                 for ( unsigned int i = 0 ; i < m_vecExceptions.size() ; i++ )
00322                                         if ( m_vecExceptions[ i ].GetType() != Exception::ET_WARNING ) {
00323                                                 m_bHasError = true;
00324                                                 break;
00325                                         }
00326                         }
00327 
00328                         bool HasError() const
00329                         {
00330                                 return m_bHasError;
00331                         }
00332 
00333                         void SetLine( int iLine )
00334                         {
00335                                 for ( unsigned int i = 0 ; i < m_vecExceptions.size() ; i++ )
00336                                         m_vecExceptions[ i ].SetLine( iLine );
00337                         }
00338 
00339                         void SetColumn( int iColumn )
00340                         {
00341                                 for ( unsigned int i = 0 ; i < m_vecExceptions.size() ; i++ )
00342                                         m_vecExceptions[ i ].SetColumn( iColumn );
00343                         }
00344         };
00345 
00346 }; // namespace OclCommon
00347 
00348 #endif // OCLException_h
00349 
00350