24 auto pred=[](
char c){
return std::isspace(c); };
26 std::string::const_iterator left
27 =std::find_if_not(s.begin(), s.end(), pred);
33 std::string::const_reverse_iterator right
34 =std::find_if_not(s.rbegin(), s.rend(), pred);
37 return s.substr(i, (j-i+1));
43 std::vector<std::string> &result,
59 INVARIANT(n > 0,
"Empty string case should already be handled");
68 std::string new_s=s.substr(start, i-start);
73 if(!remove_empty || !new_s.empty())
74 result.push_back(new_s);
80 std::string new_s=s.substr(start, n-start);
85 if(!remove_empty || !new_s.empty())
86 result.push_back(new_s);
88 if(!remove_empty && result.empty())
102 std::vector<std::string> result =
split_string(s, delim, strip);
104 if(result.size() != 2)
107 "' to contain two substrings "
109 delim +
" but has " +
118 const std::string &s,
123 std::vector<std::string> result;
129 const std::string &s,
133 const size_t index=s.find_last_of(delim);
134 if(index!=std::string::npos)
135 result=s.substr(0, index);
143 for(std::size_t i=0; i<s.size(); i++)
145 if(s[i]==
'\\' || s[i]==
'"')
156 std::ostringstream escaped;
157 for(
auto &ch : to_escape)
166 const int uch{
static_cast<unsigned char>(ch)};
169 else if(isalnum(uch))
172 escaped <<
'_' << std::hex << std::setfill(
'0') << std::setw(2) << uch;
174 return escaped.str();
180 std::string capitalized = str;
181 capitalized[0] = toupper(capitalized[0]);
186 const std::string &line,
187 const std::size_t left_margin,
188 const std::size_t width)
190 return wrap_line(line.cbegin(), line.cend(), left_margin, width);
194 std::string::const_iterator left,
195 std::string::const_iterator right,
196 const std::size_t left_margin,
197 const std::size_t width)
201 const std::size_t column_width = width - left_margin;
202 const std::string margin(left_margin,
' ');
204 auto distance = std::distance(left, right);
209 if(
static_cast<std::size_t
>(distance) <= column_width)
211 result.append(margin);
212 result.append(left, right);
217 auto it_line_begin = left;
222 auto it = it_line_begin + column_width;
224 auto rit_r = std::reverse_iterator<decltype(it)>(it) - 1;
225 auto rit_l = rit_r + column_width;
227 auto rit_space = std::find(rit_r, rit_l,
' ');
229 if(rit_space != rit_l)
231 auto it_space = rit_space.base() - 1;
234 result.append(margin);
235 result.append(it_line_begin, it_space);
238 it_line_begin = it_space + 1;
244 result.append(left, right);
248 }
while(
static_cast<std::size_t
>(std::distance(it_line_begin, right)) >
251 result.append(margin);
252 result.append(it_line_begin, right);