38#ifndef DRAIN_STRING_H_
39#define DRAIN_STRING_H_
58 bool startsWith(
const std::string &s,
const std::string & substring);
62 bool endsWith(
const std::string &s,
const std::string & substring);
69 std::string &
upperCase(std::string & s,
size_t n = std::numeric_limits<size_t>::max());
82 std::string &
lowerCase(std::string & s,
size_t n = std::numeric_limits<size_t>::max());
110 void replace(
const std::string &src,
char from,
char to, std::ostream & ostr);
118 void replace(
const std::string &src,
char from,
char to, std::string &dst);
127 void replace(
const std::string &src,
const std::string &from,
const std::string & to, std::string & dst);
134 template <
typename T1,
typename T2>
136 void replace(std::string &src,
const T1 &from,
const T2 &to){
146 template <
typename T1,
typename T2>
148 std::string
replace(
const std::string &src,
const T1 &from,
const T2 &to){
156 typedef std::map<std::string,std::string> conv_map_t;
163 void replace(
const conv_map_t & m, std::string &s, std::size_t pos = 0);
186 template <
typename T>
188 void replace(
const std::map<char,T> & m,
const std::string & src, std::ostream & ostr){
189 typename std::map<char,T>::const_iterator it;
206 void replace(
const std::map<char,char> & m,
const std::string & src, std::string & dst);
213 template <
class T1,
class T2>
215 void replace(
const std::map<T1,T2> & m,
const std::string & src, std::string & dst){
216 std::stringstream result;
223 void replace(
const std::map<char,std::string> & m, std::string & src){
233 std::string
trim(
const std::string &s,
const std::string &trimChars=
" \t\n\r");
244 std::string
trimSymmetric(
const std::string &s,
const std::string &leading=
"'\"",
const std::string & trailing=
"");
260 bool trimScan(
const std::string &s,
size_t & pos1,
size_t & pos2,
const std::string &trimChars=
" \t\n");
276 template <
class T,
class C>
278 void split(
const std::string & s, T & sequence,
const C &separators,
const std::string & trimChars=
" \t\n");
305 template <
class T1,
class T2,
class C>
307 bool split2(
const std::string & s, T1 & first, T2 & second,
const C &separators,
const std::string & trimChars=
" \t\n");
317 size_t extractPrefixLength(
const std::string & src1,
const std::string & src2,
size_t step = 1);
329 size_t extractPrefix(
const std::string & src1,
const std::string & src2,
330 std::string & prefix, std::string & dst1, std::string & dst2,
size_t step = 1);
340 size_t extractPrefix(std::string & s1, std::string & s2, std::string & prefix,
size_t step = 1){
351 std::ostream &
join(
const T & container, std::ostream & ostr,
char separator = 0){
353 for (
typename T::const_iterator it = container.begin(); it != container.end(); ++it){
368 std::string
join(T & container,
char separator = 0){
369 std::stringstream sstr;
375 template <
unsigned int S>
377 void read(std::istream &istr, std::string & s){
379 while (istr.read(buffer, S)){
382 s.append(buffer, istr.gcount());
397 void convert(
const std::string &s, T & dst);
408 T
convert(
const std::string &s);
412 std::string &
import(
const T & src, std::string & target);
432 const T &
lazyConvert(
const std::string &s, T & tmp);
438 void appendString(T & sequence,
const std::string & str){
439 typename T::value_type tmp;
445 void appendSubstring(T & sequence,
const std::string & str, std::string::size_type pos, std::string::size_type n){
448 appendString(sequence, str.substr(pos, n));
451 appendString(sequence,
"");
459template <
class T,
class C>
460void StringTools::split(
const std::string & str, T & sequence,
const C & separators,
const std::string & trimChars){
464 const bool TRIM = !trimChars.empty();
465 const std::string::size_type n = str.size();
467 std::string::size_type pos1 = 0;
468 std::string::size_type pos2 = n;
474 appendSubstring(sequence, str, pos1, pos2-pos1);
477 appendString(sequence, str);
484 std::string::size_type pos = pos1;
489 pos = str.find_first_of(separators, pos);
490 if (pos == std::string::npos){
494 appendSubstring(sequence, str, pos1, pos2-pos1);
501 appendSubstring(sequence, str, pos1, pos2-pos1);
502 pos = str.find_first_not_of(trimChars, pos+1);
516template <
class T1,
class T2,
class S>
517bool StringTools::split2(
const std::string & s, T1 & first, T2 & second,
const S & separators,
const std::string & trimChars){
519 std::size_t i = s.find_first_of(separators);
521 if (i != std::string::npos){
523 std::string srcFirst(s, 0, i);
525 std::string srcSecond(s, std::min(s.size(), i));
527 if (!trimChars.empty()){
534 if (!srcSecond.empty()){
535 if (!trimChars.empty()){
563 if (trimChars.empty()){
595 std::stringstream sstr(str);
620std::string & StringTools::import(
const std::string & src, std::string & dst){
626std::string & StringTools::import(
const T & x, std::string & dst){
627 std::stringstream sstr;
629 dst.assign(sstr.str());
Definition DataSelector.cpp:1277