#include <string>
#include <vector>
#include <sstream>
#include <iterator>
#include <algorithm>
#include <cctype>
namespace StringUtil {
using std::string;
using std::vector;
using std::istringstream;
using std::ostringstream;
using std::istream_iterator;
using std::back_inserter;
void basic_split(const string& str, vector<string>& strs);
void basic_split(const string& str, vector<string>& strs, const char sep);
void split(const string& str, vector<string>& strs);
void split(const string& str, vector<string>& strs, const char sep);
void basic_join(vector<string>& strs, string& str, const char sep);
void join(vector<string>& strs, string& str, const char sep = ' ');
void trim(string& str);
void left_trim(string& str);
void right_trim(string& str);
void lower(string& str);
void upper(string& str);
void captain(string& str);
template <typename T> string to_string(T value);
template <typename T> T string_to(string str, T value);
vector<string> split(const string& str);
vector<string> split(const string& str, const char sep);
string join(vector<string>& strs, const char sep = ' ');
string trim_new(string& str);
string left_trim_new(string& str);
string right_trim_new(string& str);
string lower_new(string& str);
string upper_new(string& str);
string captain_new(string& str);
void basic_split(const string& str, vector<string>& strs)
{
istringstream iss(str);
copy(istream_iterator<string>(iss), istream_iterator<string>(), back_inserter(strs));
}
void basic_split(const string& str, vector<string>& strs, const char sep)
{
int begin_idx = 0;
int end_idx = str.find(sep);
if (end_idx == -1) return;
while (end_idx != -1) {
strs.push_back(str.substr(begin_idx, end_idx-begin_idx));
begin_idx = end_idx + 1;
end_idx = str.find(sep, begin_idx);
}
strs.push_back(str.substr(begin_idx));
}
void split(const string& str, vector<string>& strs)
{
strs.clear();
basic_split(str, strs);
}
void split(const string& str, vector<string>& strs, const char sep)
{
strs.clear();
basic_split(str, strs, sep);
}
void basic_join(vector<string>& strs, string& str, const char sep)
{
for_each(strs.begin(), strs.end()-1, [&](const string& s) {
str += s + sep;
});
str += strs[strs.size()-1];
}
void join(vector<string>& strs, string& str, const char sep)
{
str = "";
basic_join(strs, str, sep);
}
void trim(string& str)
{
left_trim(str);
right_trim(str);
}
void left_trim(string& str)
{
str.erase(0, str.find_first_not_of(' '));
}
void right_trim(string& str)
{
str.erase(str.find_last_not_of(' ') + 1);
}
void lower(string& str)
{
for_each(str.begin(), str.end(), [&](char& ch) {
ch = tolower(ch);
});
}
void upper(string& str)
{
for_each(str.begin(), str.end(), [&](char& ch) {
ch = toupper(ch);
});
}
void captain(string& str)
{
lower(str);
str[0] = toupper(str[0]);
}
template <typename T>
string to_string(T value)
{
ostringstream oss;
oss << value;
return oss.str();
}
template <typename T>
T string_to(string str, T value)
{
istringstream iss(str);
iss >> value;
return value;
}
vector<string> split(const string& str)
{
vector<string> strs;
basic_split(str, strs);
return strs;
}
vector<string> split(const string& str, const char sep)
{
vector<string> strs;
basic_split(str, strs, sep);
return strs;
}
string join(vector<string>& strs, const char sep)
{
string str;
basic_join(strs, str, sep);
return str;
}
string trim_new(string& str)
{
string new_str = str;
trim(new_str);
return new_str;
}
string left_trim_new(string& str)
{
string new_str = str;
left_trim(new_str);
return new_str;
}
string right_trim_new(string& str)
{
string new_str = str;
right_trim(new_str);
return new_str;
}
string lower_new(string& str)
{
string new_str = str;
lower(new_str);
return new_str;
}
string upper_new(string& str)
{
string new_str = str;
upper(new_str);
return new_str;
}
string captain_new(string& str)
{
string new_str = str;
captain(new_str);
return new_str;
}
}