GME  13
OCLCommon.cpp
Go to the documentation of this file.
00001 //###############################################################################################################################################
00002 //
00003 //      Object Constraint Language Generic Manager
00004 //      OCLCommon.cpp
00005 //
00006 //###############################################################################################################################################
00007 #include "Solve4786.h"
00008 #include "OCLCommon.h"
00009 
00010         std::string& TrimLeft( std::string& strIn )
00011         {
00012                 while ( ! strIn.empty() && ((strIn[0] < 20 && strIn[0] >= 0) || strIn[ 0 ] == ' ' || strIn[ 0 ] == '\t' ) )
00013                         strIn.erase( 0, 1 );
00014                 return strIn;
00015         }
00016 
00017         std::string& TrimRight( std::string& strIn )
00018         {
00019                 while ( ! strIn.empty() && ((strIn[strIn.length() - 1] < 20 && strIn[strIn.length() - 1] >= 0)|| strIn[ strIn.length() - 1 ] == ' ' || strIn[ strIn.length() - 1 ] == '\t' ) )
00020                         strIn.erase( strIn.length() - 1, 1 );
00021                 return strIn;
00022         }
00023 
00024         std::string& Trim( std::string& strIn )
00025         {
00026                 return TrimRight( TrimLeft( strIn ) );
00027         }
00028 
00029         bool operator!=( const std::string& str1, const std::string& str2 )
00030         {
00031                 return ! ( str1 == str2 );
00032         }
00033 
00034 namespace OclCommon {
00035 
00036         void convertR( const TypeSeq& si, int i, std::string& s )
00037         {
00038                 s += si[ i ];
00039                 if ( (int) si.size() >  i + 1 ) {
00040                         s += "(";
00041                         convertR( si, i + 1, s );
00042                         s += ")";
00043                 }
00044         }
00045 
00046         void Convert( const TypeSeq& si, std::string& s )
00047         {
00048                 s = "";
00049                 if ( si.size() > 0 )
00050                         convertR( si, 0, s );
00051         }
00052 
00053         int convertR( std::string& s, TypeSeq& si, int i )
00054         {
00055                 size_t p = s.find( '(' );
00056                 if ( p == std::string::npos ) {
00057                         si.push_back( s );
00058                         return 0;
00059                 }
00060                 if ( s[ s.length() - 1 ] != ')' )
00061                         return i + s.length();
00062                 std::string strTemp = s.substr( 0, p );
00063                 TrimRight( strTemp );
00064                 if ( strTemp.empty() )
00065                         return i;
00066                 si.push_back( strTemp );
00067                 strTemp = s.substr( p + 1, s.length() - 1 - p - 1 );
00068                 TrimLeft( strTemp );
00069                 i += s.length() - strTemp.length();
00070                 TrimRight( strTemp );
00071                 return convertR( strTemp, si, i );
00072         }
00073 
00074         int Convert( const std::string& s, TypeSeq& si )
00075         {
00076                 si.clear();
00077                 std::string ss( s );
00078                 TrimLeft( ss );
00079                 int i = s.length() - ss.length();
00080                 TrimRight( ss );
00081                 return convertR( ss, si, i );
00082         }
00083 
00084 }; // namespace OclCommon
00085 
00086