Utils.hh
Go to the documentation of this file.00001
00002 #ifndef RIVET_Utils_HH
00003 #define RIVET_Utils_HH
00004
00005 #include <Rivet/Math/Math.hh>
00006 #include <cctype>
00007 #include <algorithm>
00008 #include <cerrno>
00009
00010
00011 namespace Rivet {
00012
00013
00014 inline int nocase_cmp(const string& s1, const string& s2) {
00015 string::const_iterator it1 = s1.begin();
00016 string::const_iterator it2 = s2.begin();
00017 while ( (it1 != s1.end()) && (it2 != s2.end()) ) {
00018 if(::toupper(*it1) != ::toupper(*it2)) {
00019
00020 return (::toupper(*it1) < ::toupper(*it2)) ? -1 : 1;
00021 }
00022
00023 ++it1;
00024 ++it2;
00025 }
00026 size_t size1 = s1.size(), size2 = s2.size();
00027
00028 if (size1 == size2) return 0;
00029 return (size1 < size2) ? -1 : 1;
00030 }
00031
00032
00033 inline string toLower(const string& s) {
00034 string out = s;
00035 transform(out.begin(), out.end(), out.begin(), (int(*)(int)) tolower);
00036 return out;
00037 }
00038
00039
00040 inline string toUpper(const string& s) {
00041 string out = s;
00042 std::transform(out.begin(), out.end(), out.begin(), (int(*)(int)) toupper);
00043 return out;
00044 }
00045
00046
00047 inline bool startsWith(const string& s, const string& start) {
00048 if (s.length() < start.length()) return false;
00049 return s.substr(0, start.length()) == start;
00050 }
00051
00052
00053
00054 inline bool endsWith(const string& s, const string& end) {
00055 if (s.length() < end.length()) return false;
00056 return s.substr(s.length() - end.length()) == end;
00057 }
00058
00059
00060
00061
00062 inline vector<string> pathsplit(const string& path) {
00063 const string delim = ":";
00064 vector<string> dirs;
00065 string tmppath = path;
00066 while (true) {
00067 const size_t delim_pos = tmppath.find(delim);
00068 if (delim_pos == string::npos) break;
00069 const string dir = tmppath.substr(0, delim_pos);
00070 if (dir.length()) dirs.push_back(dir);
00071 tmppath.replace(0, delim_pos+1, "");
00072 }
00073 if (tmppath.length()) dirs.push_back(tmppath);
00074 return dirs;
00075 }
00076
00077
00078 inline vector<string> split(const string& path, const string& UNUSED(delim) = ":") {
00079 return pathsplit(path);
00080 }
00081
00082
00083
00084
00085 inline string pathjoin(const vector<string>& paths) {
00086 const string delim = ":";
00087 string rtn;
00088 for (vector<string>::const_iterator is = paths.begin(); is != paths.end(); ++is) {
00089 if (rtn.size() > 0) rtn += delim;
00090 rtn += *is;
00091 }
00092 return rtn;
00093 }
00094
00095
00096 }
00097 #endif
00098
00099
00100 #ifndef CEDARSTD
00101 #define CEDARSTD
00102 namespace std {
00103
00104 template <typename T>
00105 inline void operator+=(set<T>& s1, const set<T>& s2) {
00106 for (typename set<T>::const_iterator s = s2.begin(); s != s2.end(); ++s) {
00107 s1.insert(*s);
00108 }
00109 }
00110
00111 template <typename T>
00112 inline set<T> operator+(const set<T>& s1, const set<T>& s2) {
00113 set<T> rtn(s1);
00114 rtn += s2;
00115 return rtn;
00116 }
00117
00118 template <typename T>
00119 inline string join(const set<T>& s, const string& sep = " ") {
00120 stringstream out;
00121 bool first = false;
00122 for (typename set<T>::const_iterator it = s.begin(); it != s.end(); ++it) {
00123 if (first) {
00124 first = false;
00125 } else {
00126 out << sep;
00127 }
00128 out << *it;
00129 }
00130 return out.str();
00131 }
00132
00133
00134 template <typename T>
00135 inline void operator+=(vector<T>& v1, const vector<T>& v2) {
00136 for (typename vector<T>::const_iterator s = v2.begin(); s != v2.end(); ++s) {
00137 v1.push_back(*s);
00138 }
00139 }
00140
00141 template <typename T>
00142 inline vector<T> operator+(const vector<T>& v1, const vector<T>& v2) {
00143 vector<T> rtn(v1);
00144 rtn += v2;
00145 return rtn;
00146 }
00147
00148 template <typename T>
00149 inline string join(const vector<T>& v, const string& sep = " ") {
00150 stringstream out;
00151 for (size_t i = 0; i < v.size(); ++i) {
00152 if (i != 0) out << sep;
00153 out << v[i];
00154 }
00155 return out.str();
00156 }
00157
00158 }
00159 #endif