Go to the documentation of this file.00001 #ifndef UTILMM_STRINGTOOLS_HH
00002 #define UTILMM_STRINGTOOLS_HH
00003
00004 #include <string>
00005 #include <list>
00006 #include <ctype.h>
00007
00008 #include <boost/filesystem/path.hpp>
00009 #include <boost/lexical_cast.hpp>
00010
00011 namespace utilmm {
00012 typedef std::list<std::string> stringlist;
00013
00014 inline stringlist split(std::string const& s, std::string const& sep = " ", bool ignore_empty = true)
00015 {
00016 using std::string;
00017
00018 stringlist l;
00019 string::size_type sep_length = sep.length();
00020
00021 string::size_type from = 0;
00022 for(;;)
00023 {
00024 string::size_type to = s.find(sep, from);
00025 if (to == string::npos)
00026 {
00027 if (from < s.length() || !ignore_empty)
00028 l.push_back(string(s, from));
00029 return l;
00030 }
00031
00032 if (to > from || !ignore_empty)
00033 l.push_back(string(s, from, to - from));
00034 from = to + sep_length;
00035 }
00036 }
00037
00038 inline std::string join(stringlist const& l, std::string const& sep = " ")
00039 {
00040 using std::string;
00041
00042 if (l.empty())
00043 return "";
00044
00045 string s = l.front();
00046
00047 stringlist::const_iterator const end = l.end();
00048 stringlist::const_iterator it = l.begin();
00049 for (++it; it != l.end(); ++it)
00050 s += sep + *it;
00051 return s;
00052 }
00053
00054 template<typename T>
00055 inline std::string join(std::list<T> const& l, std::string const& sep = " ")
00056 {
00057 stringlist strl;
00058 for (typename std::template list<T>::const_iterator it = l.begin(); it != l.end(); ++it)
00059 strl.push_back(boost::lexical_cast<std::string>(*it));
00060 return join(strl, sep);
00061 }
00062
00063 inline std::string upcase(std::string const& s)
00064 {
00065 using std::string;
00066 string ret(s);
00067 string::iterator it, end = ret.end();
00068 for (it = ret.begin(); it != ret.end(); ++it)
00069 *it = toupper(*it);
00070
00071 return ret;
00072 }
00073
00074 inline bool starts_with(std::string const& str, std::string const& start)
00075 { return std::string(str, 0, start.length()) == start; }
00076
00077 inline boost::filesystem::path clean_path(std::string str)
00078 {
00079 using std::string;
00080 string::size_type i = str.find("//");
00081 while (i < str.length())
00082 {
00083 str = str.erase(i, 1);
00084 i = str.find("//");
00085 }
00086
00087 boost::filesystem::path p(str);
00088 return p.normalize();
00089 }
00090 }
00091 #endif
00092