1*11c03c6dSDamjan Jovanovic /************************************************************** 2*11c03c6dSDamjan Jovanovic * 3*11c03c6dSDamjan Jovanovic * Licensed to the Apache Software Foundation (ASF) under one 4*11c03c6dSDamjan Jovanovic * or more contributor license agreements. See the NOTICE file 5*11c03c6dSDamjan Jovanovic * distributed with this work for additional information 6*11c03c6dSDamjan Jovanovic * regarding copyright ownership. The ASF licenses this file 7*11c03c6dSDamjan Jovanovic * to you under the Apache License, Version 2.0 (the 8*11c03c6dSDamjan Jovanovic * "License"); you may not use this file except in compliance 9*11c03c6dSDamjan Jovanovic * with the License. You may obtain a copy of the License at 10*11c03c6dSDamjan Jovanovic * 11*11c03c6dSDamjan Jovanovic * http://www.apache.org/licenses/LICENSE-2.0 12*11c03c6dSDamjan Jovanovic * 13*11c03c6dSDamjan Jovanovic * Unless required by applicable law or agreed to in writing, 14*11c03c6dSDamjan Jovanovic * software distributed under the License is distributed on an 15*11c03c6dSDamjan Jovanovic * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*11c03c6dSDamjan Jovanovic * KIND, either express or implied. See the License for the 17*11c03c6dSDamjan Jovanovic * specific language governing permissions and limitations 18*11c03c6dSDamjan Jovanovic * under the License. 19*11c03c6dSDamjan Jovanovic * 20*11c03c6dSDamjan Jovanovic *************************************************************/ 21*11c03c6dSDamjan Jovanovic 22*11c03c6dSDamjan Jovanovic 23*11c03c6dSDamjan Jovanovic 24*11c03c6dSDamjan Jovanovic #ifndef CSV_STREAMSTR_HXX 25*11c03c6dSDamjan Jovanovic #define CSV_STREAMSTR_HXX 26*11c03c6dSDamjan Jovanovic 27*11c03c6dSDamjan Jovanovic // BASE CLASSES 28*11c03c6dSDamjan Jovanovic #include <cosv/bstream.hxx> 29*11c03c6dSDamjan Jovanovic // USED SERVICES 30*11c03c6dSDamjan Jovanovic #include <cosv/str_types.hxx> 31*11c03c6dSDamjan Jovanovic #include <string.h> 32*11c03c6dSDamjan Jovanovic 33*11c03c6dSDamjan Jovanovic 34*11c03c6dSDamjan Jovanovic 35*11c03c6dSDamjan Jovanovic 36*11c03c6dSDamjan Jovanovic namespace csv 37*11c03c6dSDamjan Jovanovic { 38*11c03c6dSDamjan Jovanovic class String; 39*11c03c6dSDamjan Jovanovic 40*11c03c6dSDamjan Jovanovic 41*11c03c6dSDamjan Jovanovic void c_str(); // Dummy needed for StreamStr::operator<<(StreamStr::F_CSTR); 42*11c03c6dSDamjan Jovanovic 43*11c03c6dSDamjan Jovanovic 44*11c03c6dSDamjan Jovanovic /** A string buffer class for all kinds of string manipulation. 45*11c03c6dSDamjan Jovanovic */ 46*11c03c6dSDamjan Jovanovic class StreamStr : public bostream 47*11c03c6dSDamjan Jovanovic { 48*11c03c6dSDamjan Jovanovic public: 49*11c03c6dSDamjan Jovanovic typedef StreamStr self; 50*11c03c6dSDamjan Jovanovic 51*11c03c6dSDamjan Jovanovic typedef str::size size_type; 52*11c03c6dSDamjan Jovanovic typedef str::position position_type; 53*11c03c6dSDamjan Jovanovic typedef intt seek_type; 54*11c03c6dSDamjan Jovanovic typedef str::insert_mode insert_mode; 55*11c03c6dSDamjan Jovanovic 56*11c03c6dSDamjan Jovanovic typedef const char * const_iterator; 57*11c03c6dSDamjan Jovanovic typedef char * iterator; 58*11c03c6dSDamjan Jovanovic 59*11c03c6dSDamjan Jovanovic typedef void (*F_CSTR)(); 60*11c03c6dSDamjan Jovanovic 61*11c03c6dSDamjan Jovanovic 62*11c03c6dSDamjan Jovanovic /** Represents an area within a string. 63*11c03c6dSDamjan Jovanovic */ 64*11c03c6dSDamjan Jovanovic struct Area 65*11c03c6dSDamjan Jovanovic { 66*11c03c6dSDamjan Jovanovic typedef str::size size_type; 67*11c03c6dSDamjan Jovanovic 68*11c03c6dSDamjan Jovanovic Area( 69*11c03c6dSDamjan Jovanovic const char * i_str = "", 70*11c03c6dSDamjan Jovanovic size_type i_nLength = str::maxsize ) 71*11c03c6dSDamjan Jovanovic : sStr(i_str), 72*11c03c6dSDamjan Jovanovic nLength( i_nLength == str::maxsize 73*11c03c6dSDamjan Jovanovic ? strlen(i_str) 74*11c03c6dSDamjan Jovanovic : i_nLength ) {} 75*11c03c6dSDamjan Jovanovic const char * sStr; 76*11c03c6dSDamjan Jovanovic size_type nLength; 77*11c03c6dSDamjan Jovanovic }; 78*11c03c6dSDamjan Jovanovic 79*11c03c6dSDamjan Jovanovic // LIFECYCLE 80*11c03c6dSDamjan Jovanovic StreamStr( 81*11c03c6dSDamjan Jovanovic size_type i_nCapacity ); 82*11c03c6dSDamjan Jovanovic StreamStr( 83*11c03c6dSDamjan Jovanovic const char * i_sInitStr, 84*11c03c6dSDamjan Jovanovic size_type i_nCapacity ); /// Only used if > strlen(i_sInitStr). 85*11c03c6dSDamjan Jovanovic StreamStr( 86*11c03c6dSDamjan Jovanovic size_type i_nGuessedCapacity, 87*11c03c6dSDamjan Jovanovic const char * str1, // [!= 0] 88*11c03c6dSDamjan Jovanovic const char * str2, // [!= 0] 89*11c03c6dSDamjan Jovanovic ... ); // Has to end with NIL . 90*11c03c6dSDamjan Jovanovic StreamStr( 91*11c03c6dSDamjan Jovanovic csv::bstream & i_source ); 92*11c03c6dSDamjan Jovanovic /// Copies also insert_mode and current position. 93*11c03c6dSDamjan Jovanovic StreamStr( 94*11c03c6dSDamjan Jovanovic const self & i_rOther ); 95*11c03c6dSDamjan Jovanovic ~StreamStr(); 96*11c03c6dSDamjan Jovanovic 97*11c03c6dSDamjan Jovanovic // OPERATORS 98*11c03c6dSDamjan Jovanovic /// Copies also insert_mode and current position. 99*11c03c6dSDamjan Jovanovic self & operator=( 100*11c03c6dSDamjan Jovanovic const self & i_rOther ); 101*11c03c6dSDamjan Jovanovic 102*11c03c6dSDamjan Jovanovic self & operator<<( 103*11c03c6dSDamjan Jovanovic const char * i_s ); 104*11c03c6dSDamjan Jovanovic self & operator<<( 105*11c03c6dSDamjan Jovanovic const String & i_s ); 106*11c03c6dSDamjan Jovanovic self & operator<<( 107*11c03c6dSDamjan Jovanovic char i_c ); 108*11c03c6dSDamjan Jovanovic self & operator<<( 109*11c03c6dSDamjan Jovanovic unsigned char i_c ); 110*11c03c6dSDamjan Jovanovic self & operator<<( 111*11c03c6dSDamjan Jovanovic signed char i_c ); 112*11c03c6dSDamjan Jovanovic 113*11c03c6dSDamjan Jovanovic self & operator<<( 114*11c03c6dSDamjan Jovanovic short i_n ); 115*11c03c6dSDamjan Jovanovic self & operator<<( 116*11c03c6dSDamjan Jovanovic unsigned short i_n ); 117*11c03c6dSDamjan Jovanovic self & operator<<( 118*11c03c6dSDamjan Jovanovic int i_n ); 119*11c03c6dSDamjan Jovanovic self & operator<<( 120*11c03c6dSDamjan Jovanovic unsigned int i_n ); 121*11c03c6dSDamjan Jovanovic self & operator<<( 122*11c03c6dSDamjan Jovanovic long i_n ); 123*11c03c6dSDamjan Jovanovic self & operator<<( 124*11c03c6dSDamjan Jovanovic unsigned long i_n ); 125*11c03c6dSDamjan Jovanovic 126*11c03c6dSDamjan Jovanovic self & operator<<( 127*11c03c6dSDamjan Jovanovic float i_n ); 128*11c03c6dSDamjan Jovanovic self & operator<<( 129*11c03c6dSDamjan Jovanovic double i_n ); 130*11c03c6dSDamjan Jovanovic 131*11c03c6dSDamjan Jovanovic /** This operator is used to finish a sequence of streaming 132*11c03c6dSDamjan Jovanovic oeprators by returning the c-string of the complete string. 133*11c03c6dSDamjan Jovanovic 134*11c03c6dSDamjan Jovanovic @return The same as ->c_str(). 135*11c03c6dSDamjan Jovanovic 136*11c03c6dSDamjan Jovanovic @example 137*11c03c6dSDamjan Jovanovic csv::StreamStr s(100); 138*11c03c6dSDamjan Jovanovic const char * 139*11c03c6dSDamjan Jovanovic fullname = s << qualifier() << "::" << name() << csv::c_str; 140*11c03c6dSDamjan Jovanovic */ 141*11c03c6dSDamjan Jovanovic const char * operator<<( 142*11c03c6dSDamjan Jovanovic F_CSTR i_f ); 143*11c03c6dSDamjan Jovanovic 144*11c03c6dSDamjan Jovanovic const char & operator[]( 145*11c03c6dSDamjan Jovanovic position_type i_nPosition ) const; 146*11c03c6dSDamjan Jovanovic char & operator[]( 147*11c03c6dSDamjan Jovanovic position_type i_nPosition ); 148*11c03c6dSDamjan Jovanovic 149*11c03c6dSDamjan Jovanovic // OPERATIONS 150*11c03c6dSDamjan Jovanovic void resize( 151*11c03c6dSDamjan Jovanovic size_type i_nMinimumCapacity ); 152*11c03c6dSDamjan Jovanovic 153*11c03c6dSDamjan Jovanovic void clear(); 154*11c03c6dSDamjan Jovanovic void swap( 155*11c03c6dSDamjan Jovanovic StreamStr & io_swap ); 156*11c03c6dSDamjan Jovanovic 157*11c03c6dSDamjan Jovanovic /** Sets start point for the next operator<<() call. 158*11c03c6dSDamjan Jovanovic if the intended position is not reachable, nothing happens. 159*11c03c6dSDamjan Jovanovic */ 160*11c03c6dSDamjan Jovanovic self & seekp( 161*11c03c6dSDamjan Jovanovic seek_type i_nCount, 162*11c03c6dSDamjan Jovanovic seek_dir i_eDirection = ::csv::beg ); 163*11c03c6dSDamjan Jovanovic self & reset() { return seekp(0); } 164*11c03c6dSDamjan Jovanovic /** Sets the insertion mode of all and only the operator<<() calls. 165*11c03c6dSDamjan Jovanovic 166*11c03c6dSDamjan Jovanovic Default is str::overwrite: 167*11c03c6dSDamjan Jovanovic str::overwrite: seekp() always sets the cur end of the string. 168*11c03c6dSDamjan Jovanovic operator<<() calls push the end of the string forward. 169*11c03c6dSDamjan Jovanovic str::insert: seekp() only sets the insertion point. 170*11c03c6dSDamjan Jovanovic operator<<() calls insert their text at the tellp() 171*11c03c6dSDamjan Jovanovic position and keep the rest of the string. tellp() is 172*11c03c6dSDamjan Jovanovic then after the inserted text, on the beginning of the 173*11c03c6dSDamjan Jovanovic rest of the string. 174*11c03c6dSDamjan Jovanovic */ 175*11c03c6dSDamjan Jovanovic self & set_insert_mode( 176*11c03c6dSDamjan Jovanovic insert_mode i_eMode ); 177*11c03c6dSDamjan Jovanovic 178*11c03c6dSDamjan Jovanovic void push_front( 179*11c03c6dSDamjan Jovanovic const char * i_str ); 180*11c03c6dSDamjan Jovanovic void push_front( 181*11c03c6dSDamjan Jovanovic char i_c ); 182*11c03c6dSDamjan Jovanovic void push_back( 183*11c03c6dSDamjan Jovanovic const char * i_str ); 184*11c03c6dSDamjan Jovanovic void push_back( 185*11c03c6dSDamjan Jovanovic char i_c ); 186*11c03c6dSDamjan Jovanovic void pop_front( 187*11c03c6dSDamjan Jovanovic size_type i_nCount ); 188*11c03c6dSDamjan Jovanovic void pop_back( 189*11c03c6dSDamjan Jovanovic size_type i_nCount ); 190*11c03c6dSDamjan Jovanovic 191*11c03c6dSDamjan Jovanovic /// Works like operator<<(). Does the same as Perl's join(). 192*11c03c6dSDamjan Jovanovic self & operator_join( 193*11c03c6dSDamjan Jovanovic std::vector<String>::const_iterator 194*11c03c6dSDamjan Jovanovic i_rBegin, 195*11c03c6dSDamjan Jovanovic std::vector<String>::const_iterator 196*11c03c6dSDamjan Jovanovic i_rEnd, 197*11c03c6dSDamjan Jovanovic const char * i_sLink ); 198*11c03c6dSDamjan Jovanovic /// Works like operator<<() 199*11c03c6dSDamjan Jovanovic self & operator_add_substr( 200*11c03c6dSDamjan Jovanovic const char * i_sText, 201*11c03c6dSDamjan Jovanovic size_type i_nLength ); 202*11c03c6dSDamjan Jovanovic /// Works like operator<<() 203*11c03c6dSDamjan Jovanovic self & operator_add_token( 204*11c03c6dSDamjan Jovanovic const char * i_sText, 205*11c03c6dSDamjan Jovanovic char i_cDelimiter ); 206*11c03c6dSDamjan Jovanovic /// Works like operator<<() 207*11c03c6dSDamjan Jovanovic self & operator_read_line( 208*11c03c6dSDamjan Jovanovic bstream & i_src ); 209*11c03c6dSDamjan Jovanovic 210*11c03c6dSDamjan Jovanovic void strip_front( 211*11c03c6dSDamjan Jovanovic char i_cToRemove ); 212*11c03c6dSDamjan Jovanovic void strip_back( 213*11c03c6dSDamjan Jovanovic char i_cToRemove ); 214*11c03c6dSDamjan Jovanovic void strip_frontback( 215*11c03c6dSDamjan Jovanovic char i_cToRemove ); 216*11c03c6dSDamjan Jovanovic void strip_front_whitespace(); /// removes space, tab and crlf. 217*11c03c6dSDamjan Jovanovic void strip_back_whitespace(); 218*11c03c6dSDamjan Jovanovic void strip_frontback_whitespace(); 219*11c03c6dSDamjan Jovanovic 220*11c03c6dSDamjan Jovanovic /** @precond i_begin is valid 221*11c03c6dSDamjan Jovanovic @precond i_end is valid 222*11c03c6dSDamjan Jovanovic @precond i_end >= i_begin 223*11c03c6dSDamjan Jovanovic */ 224*11c03c6dSDamjan Jovanovic void remove( 225*11c03c6dSDamjan Jovanovic iterator i_begin, 226*11c03c6dSDamjan Jovanovic iterator i_end ); 227*11c03c6dSDamjan Jovanovic void replace( 228*11c03c6dSDamjan Jovanovic position_type i_nStart, 229*11c03c6dSDamjan Jovanovic size_type i_nSize, 230*11c03c6dSDamjan Jovanovic Area i_aReplacement ); 231*11c03c6dSDamjan Jovanovic 232*11c03c6dSDamjan Jovanovic void replace_all( 233*11c03c6dSDamjan Jovanovic char i_cCarToSearch, 234*11c03c6dSDamjan Jovanovic char i_cReplacement ); 235*11c03c6dSDamjan Jovanovic void replace_all( 236*11c03c6dSDamjan Jovanovic Area i_aStrToSearch, 237*11c03c6dSDamjan Jovanovic Area i_aReplacement ); 238*11c03c6dSDamjan Jovanovic 239*11c03c6dSDamjan Jovanovic StreamStr & to_lower( 240*11c03c6dSDamjan Jovanovic position_type i_nStart = 0, 241*11c03c6dSDamjan Jovanovic size_type i_nLength = str::maxsize ); 242*11c03c6dSDamjan Jovanovic StreamStr & to_upper( 243*11c03c6dSDamjan Jovanovic position_type i_nStart = 0, 244*11c03c6dSDamjan Jovanovic size_type i_nLength = str::maxsize ); 245*11c03c6dSDamjan Jovanovic 246*11c03c6dSDamjan Jovanovic // INQUIRY 247*11c03c6dSDamjan Jovanovic const char * c_str() const; 248*11c03c6dSDamjan Jovanovic const char * data() const; 249*11c03c6dSDamjan Jovanovic 250*11c03c6dSDamjan Jovanovic bool empty() const; 251*11c03c6dSDamjan Jovanovic size_type size() const; 252*11c03c6dSDamjan Jovanovic size_type length() const; 253*11c03c6dSDamjan Jovanovic 254*11c03c6dSDamjan Jovanovic size_type capacity() const; 255*11c03c6dSDamjan Jovanovic 256*11c03c6dSDamjan Jovanovic position_type tellp() const; 257*11c03c6dSDamjan Jovanovic 258*11c03c6dSDamjan Jovanovic const_iterator begin() const; 259*11c03c6dSDamjan Jovanovic const_iterator cur() const; 260*11c03c6dSDamjan Jovanovic const_iterator end() const; 261*11c03c6dSDamjan Jovanovic 262*11c03c6dSDamjan Jovanovic size_type token_count( 263*11c03c6dSDamjan Jovanovic char i_cSplit ) const; 264*11c03c6dSDamjan Jovanovic String token( 265*11c03c6dSDamjan Jovanovic position_type i_nNr, /// Starting with 0. 266*11c03c6dSDamjan Jovanovic char i_cSpli ) const; 267*11c03c6dSDamjan Jovanovic 268*11c03c6dSDamjan Jovanovic // ACCESS 269*11c03c6dSDamjan Jovanovic iterator begin(); 270*11c03c6dSDamjan Jovanovic iterator cur(); 271*11c03c6dSDamjan Jovanovic iterator end(); 272*11c03c6dSDamjan Jovanovic 273*11c03c6dSDamjan Jovanovic private: 274*11c03c6dSDamjan Jovanovic // Interface bostream 275*11c03c6dSDamjan Jovanovic virtual UINT32 do_write( 276*11c03c6dSDamjan Jovanovic const void * i_pSrc, 277*11c03c6dSDamjan Jovanovic UINT32 i_nNrofBytes); 278*11c03c6dSDamjan Jovanovic // Locals 279*11c03c6dSDamjan Jovanovic void ProvideAddingSize( 280*11c03c6dSDamjan Jovanovic size_type i_nSize2Add ); 281*11c03c6dSDamjan Jovanovic /// Resizes with the factor 2.0 (under 128), 1.5 or until i_nMinimumCapacity, whatever is bigger. 282*11c03c6dSDamjan Jovanovic void Resize( 283*11c03c6dSDamjan Jovanovic size_type i_nMinimumCapacity = 0 ); 284*11c03c6dSDamjan Jovanovic void Advance( 285*11c03c6dSDamjan Jovanovic size_type i_nAddedSize ); 286*11c03c6dSDamjan Jovanovic void MoveData( 287*11c03c6dSDamjan Jovanovic char * i_pStart, 288*11c03c6dSDamjan Jovanovic char * i_pEnd, 289*11c03c6dSDamjan Jovanovic seek_type i_nDiff ); 290*11c03c6dSDamjan Jovanovic // DATA 291*11c03c6dSDamjan Jovanovic size_type nCapacity1; /// Capacity of characters to contain + 1 for terminating 0. 292*11c03c6dSDamjan Jovanovic DYN char * dpData; 293*11c03c6dSDamjan Jovanovic char * pEnd; 294*11c03c6dSDamjan Jovanovic char * pCur; 295*11c03c6dSDamjan Jovanovic insert_mode eMode; 296*11c03c6dSDamjan Jovanovic }; 297*11c03c6dSDamjan Jovanovic 298*11c03c6dSDamjan Jovanovic 299*11c03c6dSDamjan Jovanovic 300*11c03c6dSDamjan Jovanovic class StreamStrLock 301*11c03c6dSDamjan Jovanovic { 302*11c03c6dSDamjan Jovanovic public: 303*11c03c6dSDamjan Jovanovic StreamStrLock( 304*11c03c6dSDamjan Jovanovic uintt i_nMinimalSize ); 305*11c03c6dSDamjan Jovanovic ~StreamStrLock(); 306*11c03c6dSDamjan Jovanovic 307*11c03c6dSDamjan Jovanovic StreamStr & operator()() { return *pStr; } 308*11c03c6dSDamjan Jovanovic 309*11c03c6dSDamjan Jovanovic private: 310*11c03c6dSDamjan Jovanovic StreamStr * pStr; 311*11c03c6dSDamjan Jovanovic }; 312*11c03c6dSDamjan Jovanovic 313*11c03c6dSDamjan Jovanovic /** Splits a string into tokens by whitespace. 314*11c03c6dSDamjan Jovanovic 315*11c03c6dSDamjan Jovanovic The tokens are added to the end of o_list. 316*11c03c6dSDamjan Jovanovic */ 317*11c03c6dSDamjan Jovanovic void Split( 318*11c03c6dSDamjan Jovanovic std::vector<String> & 319*11c03c6dSDamjan Jovanovic o_list, 320*11c03c6dSDamjan Jovanovic const char * i_text ); 321*11c03c6dSDamjan Jovanovic inline void Join( 322*11c03c6dSDamjan Jovanovic StreamStr & o_text, 323*11c03c6dSDamjan Jovanovic std::vector<String> & 324*11c03c6dSDamjan Jovanovic i_list, 325*11c03c6dSDamjan Jovanovic const char * i_sLink = " "); 326*11c03c6dSDamjan Jovanovic 327*11c03c6dSDamjan Jovanovic // IMPLEMENTATION 328*11c03c6dSDamjan Jovanovic 329*11c03c6dSDamjan Jovanovic inline const char * 330*11c03c6dSDamjan Jovanovic StreamStr::operator<<( F_CSTR ) 331*11c03c6dSDamjan Jovanovic { return dpData; } 332*11c03c6dSDamjan Jovanovic inline void 333*11c03c6dSDamjan Jovanovic StreamStr::clear() 334*11c03c6dSDamjan Jovanovic { pEnd = pCur = dpData; *pEnd = '\0'; } 335*11c03c6dSDamjan Jovanovic inline const char * 336*11c03c6dSDamjan Jovanovic StreamStr::c_str() const 337*11c03c6dSDamjan Jovanovic { return dpData; } 338*11c03c6dSDamjan Jovanovic inline const char * 339*11c03c6dSDamjan Jovanovic StreamStr::data() const 340*11c03c6dSDamjan Jovanovic { return dpData; } 341*11c03c6dSDamjan Jovanovic inline bool 342*11c03c6dSDamjan Jovanovic StreamStr::empty() const 343*11c03c6dSDamjan Jovanovic { return dpData == pEnd; } 344*11c03c6dSDamjan Jovanovic inline StreamStr::size_type 345*11c03c6dSDamjan Jovanovic StreamStr::size() const 346*11c03c6dSDamjan Jovanovic { return pEnd - dpData; } 347*11c03c6dSDamjan Jovanovic inline StreamStr::size_type 348*11c03c6dSDamjan Jovanovic StreamStr::length() const 349*11c03c6dSDamjan Jovanovic { return size(); } 350*11c03c6dSDamjan Jovanovic inline StreamStr::size_type 351*11c03c6dSDamjan Jovanovic StreamStr::capacity() const 352*11c03c6dSDamjan Jovanovic { return nCapacity1-1; } 353*11c03c6dSDamjan Jovanovic inline StreamStr::position_type 354*11c03c6dSDamjan Jovanovic StreamStr::tellp() const 355*11c03c6dSDamjan Jovanovic { return size_type(pCur-dpData); } 356*11c03c6dSDamjan Jovanovic inline StreamStr::const_iterator 357*11c03c6dSDamjan Jovanovic StreamStr::begin() const 358*11c03c6dSDamjan Jovanovic { return dpData; } 359*11c03c6dSDamjan Jovanovic inline StreamStr::const_iterator 360*11c03c6dSDamjan Jovanovic StreamStr::cur() const 361*11c03c6dSDamjan Jovanovic { return pCur; } 362*11c03c6dSDamjan Jovanovic inline StreamStr::const_iterator 363*11c03c6dSDamjan Jovanovic StreamStr::end() const 364*11c03c6dSDamjan Jovanovic { return pEnd; } 365*11c03c6dSDamjan Jovanovic inline StreamStr::iterator 366*11c03c6dSDamjan Jovanovic StreamStr::begin() 367*11c03c6dSDamjan Jovanovic { return dpData; } 368*11c03c6dSDamjan Jovanovic inline StreamStr::iterator 369*11c03c6dSDamjan Jovanovic StreamStr::cur() 370*11c03c6dSDamjan Jovanovic { return pCur; } 371*11c03c6dSDamjan Jovanovic inline StreamStr::iterator 372*11c03c6dSDamjan Jovanovic StreamStr::end() 373*11c03c6dSDamjan Jovanovic { return pEnd; } 374*11c03c6dSDamjan Jovanovic 375*11c03c6dSDamjan Jovanovic inline void 376*11c03c6dSDamjan Jovanovic Join( StreamStr & o_text, 377*11c03c6dSDamjan Jovanovic std::vector<String> & i_list, 378*11c03c6dSDamjan Jovanovic const char * i_sLink ) 379*11c03c6dSDamjan Jovanovic { 380*11c03c6dSDamjan Jovanovic o_text.operator_join(i_list.begin(),i_list.end(),i_sLink); 381*11c03c6dSDamjan Jovanovic } 382*11c03c6dSDamjan Jovanovic 383*11c03c6dSDamjan Jovanovic 384*11c03c6dSDamjan Jovanovic 385*11c03c6dSDamjan Jovanovic 386*11c03c6dSDamjan Jovanovic } // namespace csv 387*11c03c6dSDamjan Jovanovic #endif 388