00001 #ifndef __VMMLIB_STRING_UTILS__H__
00002 #define __VMMLIB_STRING_UTILS__H__
00003
00004 #include <string>
00005 #include <vector>
00006 #include <iostream>
00007 #include <sstream>
00008
00009 namespace vmml
00010 {
00011
00012
00013
00014
00015
00016
00017
00018
00019 namespace stringUtils
00020 {
00021 inline long toInt( const std::string& source )
00022 {
00023 return atol( source.c_str() );
00024 };
00025
00026
00027
00028 inline double toDouble( const std::string& source )
00029 {
00030 return atof( source.c_str() );
00031 };
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044 template < typename T >
00045 inline bool toString( T source, std::string& target )
00046 {
00047 std::stringstream ss;
00048 ss.precision( 8 * sizeof( void* ) - 1 );
00049 ss << source;
00050 target = ss.str();
00051 return ( ss.rdstate() & std::stringstream::failbit ) == 0;
00052 };
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064 template < typename T >
00065 inline bool fromString( const std::string& source, T& target )
00066 {
00067 std::stringstream ss;
00068 ss << source;
00069 ss >> target;
00070 return ( ss.rdstate() & std::stringstream::failbit ) == 0;
00071 };
00072
00073
00074
00075 inline void toLower( std::string& string_ )
00076 {
00077 size_t len = string_.size();
00078 if ( len == 0 )
00079 return;
00080 for (size_t i = 0; i < len; ++i )
00081 {
00082 string_[i] = static_cast< char > ( tolower( string_[i] ) );
00083 }
00084 }
00085
00086
00087
00088 inline std::string& trim( std::string& string_ )
00089 {
00090
00091 std::string::iterator it = string_.begin();
00092 for( ; it != string_.end(); ++it )
00093 {
00094 if( !isspace( *it ) )
00095 break;
00096 }
00097
00098 string_.erase( string_.begin(), it );
00099
00100
00101 std::string::reverse_iterator rit = string_.rbegin();
00102 for( ; rit != string_.rend(); ++rit )
00103 {
00104 if( !isspace( *rit ) )
00105 break;
00106 }
00107
00108 std::string::difference_type dt = string_.rend() - rit;
00109 string_.erase( string_.begin() + dt, string_.end() );
00110
00111 return string_;
00112 }
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124 template< typename T >
00125 void split( const std::string& source, T& targets, char splitter = ' ' )
00126 {
00127 size_t pos = 0;
00128 size_t startpos;
00129 size_t npos = std::string::npos;
00130 std::string tmp;
00131
00132 std::string src( source );
00133 trim( src );
00134 size_t length = src.size();
00135
00136 while ( pos != npos && pos < length )
00137 {
00138 startpos = pos;
00139 pos = src.find_first_of( splitter, pos );
00140 if ( pos != 0 )
00141 {
00142 tmp = source.substr( startpos, pos-startpos );
00143 if ( trim( tmp ).size() )
00144 targets.push_back( tmp );
00145 if ( pos != npos )
00146 ++pos;
00147 }
00148 else
00149 break;
00150 }
00151 }
00152
00153 }
00154 }
00155
00156 #endif