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