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());
 
   97    void replace(
const std::string &src, 
char search, 
char repl, std::ostream & ostr);
 
  104    void replace(
const std::string &src, 
char from, 
char repl, std::string &dst);
 
  110    template <
typename S, 
typename R>
 
  112    void replace(
const std::string &src, 
const S & search, 
const R & repl, std::ostream & ostr){
 
  114        const size_t length = getLength(search);
 
  115        std::string::size_type i = 0;
 
  116        std::string::size_type pos;
 
  119            pos = src.find(search, i);
 
  120            if (pos == std::string::npos){
 
  121                ostr << src.substr(i);
 
  126            ostr << src.substr(i, pos-i) << repl;
 
 
  138    template <
typename T1, 
typename T2>
 
  140    void replace(
const std::string &src, 
const T1 &search, 
const T2 & repl, std::string & dst){
 
  141        std::stringstream result;
 
  142        replace(src, search, repl, result);
 
 
  167    template <
typename T>
 
  169    void replace(
const std::string & src, 
const std::map<char,T> & m, std::ostream & ostr){
 
  170        typename std::map<char,T>::const_iterator it;
 
 
  182    template <
typename T>
 
  184    void replace(
const std::string & src, 
const std::map<char,T> & m, std::string & dst){
 
  185        std::stringstream result;
 
  195    void replace(
const std::string & src, 
const std::map<char,char> & m, std::string & dst);
 
  202    template <
class K, 
class V>
 
  204    void replace(
const std::string & src, 
const std::map<K,V> & m, std::string & dst){
 
  205        replaceWithMap(src, m, dst);
 
 
  208    template <
class K, 
class V>
 
  210    void replace(
const std::string & src, 
const std::initializer_list<std::pair<K,V> > & m, std::string & dst){
 
  211        replaceWithMap(src, m, dst);
 
  218    size_t getLength(
char c){
 
  223    size_t getLength(
const std::string & s){
 
  229    void replaceWithMap(
const std::string & src, 
const M & m, std::string & dst){
 
  239        for (
const auto & entry: m){
 
  241            replace(dst, entry.first, entry.second, dst);
 
  252    std::string 
trim(
const std::string &s, 
const std::string &trimChars=
" \t\n\r");
 
  263    std::string 
trimSymmetric(
const std::string &s, 
const std::string &leading= 
"'\"", 
const std::string & trailing=
"");
 
  279    bool trimScan(
const std::string &s, 
size_t & pos1, 
size_t & pos2, 
const std::string &trimChars=
" \t\n");
 
  295    template <
class T, 
class C>
 
  297    void split(
const std::string & s, T & sequence, 
const C &separators, 
const std::string & trimChars=
" \t\n");
 
  324    template <
class T1, 
class T2, 
class C>
 
  326    bool split2(
const std::string & s, T1 & first, T2 & second, 
const C &separators, 
const std::string & trimChars=
" \t\n");
 
  336    size_t extractPrefixLength(
const std::string & src1, 
const std::string & src2, 
size_t step = 1);
 
  348    size_t extractPrefix(
const std::string & src1, 
const std::string & src2,
 
  349            std::string & prefix, std::string & dst1, std::string & dst2, 
size_t step = 1);
 
  359    size_t extractPrefix(std::string & s1, std::string & s2, std::string & prefix, 
size_t step = 1){
 
 
  370    std::ostream & 
join(
const T & container, std::ostream & ostr, 
char separator = 0){
 
  372        for (
typename T::const_iterator it = container.begin(); it != container.end(); ++it){
 
 
  387    std::string 
join(T & container, 
char separator = 0){
 
  388        std::stringstream sstr;
 
 
  394    template <
unsigned int S>
 
  396    void read(std::istream &istr, std::string & s){
 
  398        while (istr.read(buffer, S)){
 
  401        s.append(buffer, istr.gcount());
 
 
  416    void convert(
const std::string &s, T & dst);
 
  427    T 
convert(
const std::string &s);
 
  431    std::string & 
import(
const T & src, std::string & target);
 
  451    const T & 
lazyConvert(
const std::string &s, T & tmp);
 
  457    void appendString(T & sequence, 
const std::string & str){
 
  458        typename T::value_type tmp;
 
  464    void appendSubstring(T & sequence, 
const std::string & str, std::string::size_type pos, std::string::size_type n){
 
  467            appendString(sequence, str.substr(pos, n));
 
  470            appendString(sequence, 
"");
 
 
  478template <
class T, 
class C>
 
  479void StringTools::split(
const std::string & str, T & sequence, 
const C & separators, 
const std::string & trimChars){
 
  483    const bool TRIM = !trimChars.empty();
 
  484    const std::string::size_type n = str.size();
 
  486    std::string::size_type pos1 = 0; 
 
  487    std::string::size_type pos2 = n; 
 
  493            appendSubstring(sequence, str, pos1, pos2-pos1);
 
  496            appendString(sequence, str);
 
  503        std::string::size_type pos = pos1; 
 
  508            pos  = str.find_first_of(separators, pos);
 
  509            if (pos == std::string::npos){
 
  513                appendSubstring(sequence, str, pos1, pos2-pos1);
 
  520                appendSubstring(sequence, str, pos1, pos2-pos1);
 
  521                pos  = str.find_first_not_of(trimChars, pos+1); 
 
 
  535template <
class T1, 
class T2, 
class S>
 
  536bool StringTools::split2(
const std::string & s, T1 & first, T2 & second, 
const S & separators, 
const std::string & trimChars){
 
  538    std::size_t i = s.find_first_of(separators);
 
  540    if (i != std::string::npos){ 
 
  542        std::string srcFirst(s, 0, i);
 
  544        std::string srcSecond(s, std::min(s.size(), i));
 
  546        if (!trimChars.empty()){
 
  553        if (!srcSecond.empty()){
 
  554            if (!trimChars.empty()){
 
  582        if (trimChars.empty()){
 
  614    std::stringstream sstr(str);
 
 
  639std::string & StringTools::import(
const std::string & src, std::string & dst){
 
  645std::string & StringTools::import(
const T & x, std::string & dst){
 
  646    std::stringstream sstr;
 
  648    dst.assign(sstr.str());
 
Definition DataSelector.cpp:1277