111c03c6dSDamjan Jovanovic /************************************************************** 211c03c6dSDamjan Jovanovic * 311c03c6dSDamjan Jovanovic * Licensed to the Apache Software Foundation (ASF) under one 411c03c6dSDamjan Jovanovic * or more contributor license agreements. See the NOTICE file 511c03c6dSDamjan Jovanovic * distributed with this work for additional information 611c03c6dSDamjan Jovanovic * regarding copyright ownership. The ASF licenses this file 711c03c6dSDamjan Jovanovic * to you under the Apache License, Version 2.0 (the 811c03c6dSDamjan Jovanovic * "License"); you may not use this file except in compliance 911c03c6dSDamjan Jovanovic * with the License. You may obtain a copy of the License at 1011c03c6dSDamjan Jovanovic * 1111c03c6dSDamjan Jovanovic * http://www.apache.org/licenses/LICENSE-2.0 1211c03c6dSDamjan Jovanovic * 1311c03c6dSDamjan Jovanovic * Unless required by applicable law or agreed to in writing, 1411c03c6dSDamjan Jovanovic * software distributed under the License is distributed on an 1511c03c6dSDamjan Jovanovic * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 1611c03c6dSDamjan Jovanovic * KIND, either express or implied. See the License for the 1711c03c6dSDamjan Jovanovic * specific language governing permissions and limitations 1811c03c6dSDamjan Jovanovic * under the License. 1911c03c6dSDamjan Jovanovic * 2011c03c6dSDamjan Jovanovic *************************************************************/ 2111c03c6dSDamjan Jovanovic 2211c03c6dSDamjan Jovanovic 2311c03c6dSDamjan Jovanovic 2411c03c6dSDamjan Jovanovic #ifndef CSV_STREAMSTR_HXX 2511c03c6dSDamjan Jovanovic #define CSV_STREAMSTR_HXX 2611c03c6dSDamjan Jovanovic 2711c03c6dSDamjan Jovanovic // BASE CLASSES 2811c03c6dSDamjan Jovanovic #include <cosv/bstream.hxx> 2911c03c6dSDamjan Jovanovic // USED SERVICES 3011c03c6dSDamjan Jovanovic #include <cosv/str_types.hxx> 3111c03c6dSDamjan Jovanovic #include <string.h> 3211c03c6dSDamjan Jovanovic 3311c03c6dSDamjan Jovanovic 3411c03c6dSDamjan Jovanovic 3511c03c6dSDamjan Jovanovic 3611c03c6dSDamjan Jovanovic namespace csv 3711c03c6dSDamjan Jovanovic { 3811c03c6dSDamjan Jovanovic class String; 3911c03c6dSDamjan Jovanovic 4011c03c6dSDamjan Jovanovic 4111c03c6dSDamjan Jovanovic void c_str(); // Dummy needed for StreamStr::operator<<(StreamStr::F_CSTR); 4211c03c6dSDamjan Jovanovic 4311c03c6dSDamjan Jovanovic 4411c03c6dSDamjan Jovanovic /** A string buffer class for all kinds of string manipulation. 4511c03c6dSDamjan Jovanovic */ 4611c03c6dSDamjan Jovanovic class StreamStr : public bostream 4711c03c6dSDamjan Jovanovic { 4811c03c6dSDamjan Jovanovic public: 4911c03c6dSDamjan Jovanovic typedef StreamStr self; 5011c03c6dSDamjan Jovanovic 5111c03c6dSDamjan Jovanovic typedef str::size size_type; 5211c03c6dSDamjan Jovanovic typedef str::position position_type; 5311c03c6dSDamjan Jovanovic typedef intt seek_type; 5411c03c6dSDamjan Jovanovic typedef str::insert_mode insert_mode; 5511c03c6dSDamjan Jovanovic 5611c03c6dSDamjan Jovanovic typedef const char * const_iterator; 5711c03c6dSDamjan Jovanovic typedef char * iterator; 5811c03c6dSDamjan Jovanovic 5911c03c6dSDamjan Jovanovic typedef void (*F_CSTR)(); 6011c03c6dSDamjan Jovanovic 6111c03c6dSDamjan Jovanovic 6211c03c6dSDamjan Jovanovic /** Represents an area within a string. 6311c03c6dSDamjan Jovanovic */ 6411c03c6dSDamjan Jovanovic struct Area 6511c03c6dSDamjan Jovanovic { 6611c03c6dSDamjan Jovanovic typedef str::size size_type; 6711c03c6dSDamjan Jovanovic 6811c03c6dSDamjan Jovanovic Area( 6911c03c6dSDamjan Jovanovic const char * i_str = "", 7011c03c6dSDamjan Jovanovic size_type i_nLength = str::maxsize ) 7111c03c6dSDamjan Jovanovic : sStr(i_str), 7211c03c6dSDamjan Jovanovic nLength( i_nLength == str::maxsize 7311c03c6dSDamjan Jovanovic ? strlen(i_str) 7411c03c6dSDamjan Jovanovic : i_nLength ) {} 7511c03c6dSDamjan Jovanovic const char * sStr; 7611c03c6dSDamjan Jovanovic size_type nLength; 7711c03c6dSDamjan Jovanovic }; 7811c03c6dSDamjan Jovanovic 7911c03c6dSDamjan Jovanovic // LIFECYCLE 8011c03c6dSDamjan Jovanovic StreamStr( 8111c03c6dSDamjan Jovanovic size_type i_nCapacity ); 8211c03c6dSDamjan Jovanovic StreamStr( 8311c03c6dSDamjan Jovanovic const char * i_sInitStr, 8411c03c6dSDamjan Jovanovic size_type i_nCapacity ); /// Only used if > strlen(i_sInitStr). 8511c03c6dSDamjan Jovanovic StreamStr( 8611c03c6dSDamjan Jovanovic size_type i_nGuessedCapacity, 8711c03c6dSDamjan Jovanovic const char * str1, // [!= 0] 8811c03c6dSDamjan Jovanovic const char * str2, // [!= 0] 8911c03c6dSDamjan Jovanovic ... ); // Has to end with NIL . 9011c03c6dSDamjan Jovanovic StreamStr( 9111c03c6dSDamjan Jovanovic csv::bstream & i_source ); 9211c03c6dSDamjan Jovanovic /// Copies also insert_mode and current position. 9311c03c6dSDamjan Jovanovic StreamStr( 9411c03c6dSDamjan Jovanovic const self & i_rOther ); 9511c03c6dSDamjan Jovanovic ~StreamStr(); 9611c03c6dSDamjan Jovanovic 9711c03c6dSDamjan Jovanovic // OPERATORS 9811c03c6dSDamjan Jovanovic /// Copies also insert_mode and current position. 9911c03c6dSDamjan Jovanovic self & operator=( 10011c03c6dSDamjan Jovanovic const self & i_rOther ); 10111c03c6dSDamjan Jovanovic 10211c03c6dSDamjan Jovanovic self & operator<<( 10311c03c6dSDamjan Jovanovic const char * i_s ); 10411c03c6dSDamjan Jovanovic self & operator<<( 10511c03c6dSDamjan Jovanovic const String & i_s ); 10611c03c6dSDamjan Jovanovic self & operator<<( 10711c03c6dSDamjan Jovanovic char i_c ); 10811c03c6dSDamjan Jovanovic self & operator<<( 10911c03c6dSDamjan Jovanovic unsigned char i_c ); 11011c03c6dSDamjan Jovanovic self & operator<<( 11111c03c6dSDamjan Jovanovic signed char i_c ); 11211c03c6dSDamjan Jovanovic 11311c03c6dSDamjan Jovanovic self & operator<<( 11411c03c6dSDamjan Jovanovic short i_n ); 11511c03c6dSDamjan Jovanovic self & operator<<( 11611c03c6dSDamjan Jovanovic unsigned short i_n ); 11711c03c6dSDamjan Jovanovic self & operator<<( 11811c03c6dSDamjan Jovanovic int i_n ); 11911c03c6dSDamjan Jovanovic self & operator<<( 12011c03c6dSDamjan Jovanovic unsigned int i_n ); 12111c03c6dSDamjan Jovanovic self & operator<<( 12211c03c6dSDamjan Jovanovic long i_n ); 12311c03c6dSDamjan Jovanovic self & operator<<( 12411c03c6dSDamjan Jovanovic unsigned long i_n ); 12511c03c6dSDamjan Jovanovic 12611c03c6dSDamjan Jovanovic self & operator<<( 12711c03c6dSDamjan Jovanovic float i_n ); 12811c03c6dSDamjan Jovanovic self & operator<<( 12911c03c6dSDamjan Jovanovic double i_n ); 13011c03c6dSDamjan Jovanovic 13111c03c6dSDamjan Jovanovic /** This operator is used to finish a sequence of streaming 132*0cb2ec91SJohn Bampton operators by returning the c-string of the complete string. 13311c03c6dSDamjan Jovanovic 13411c03c6dSDamjan Jovanovic @return The same as ->c_str(). 13511c03c6dSDamjan Jovanovic 13611c03c6dSDamjan Jovanovic @example 13711c03c6dSDamjan Jovanovic csv::StreamStr s(100); 13811c03c6dSDamjan Jovanovic const char * 13911c03c6dSDamjan Jovanovic fullname = s << qualifier() << "::" << name() << csv::c_str; 14011c03c6dSDamjan Jovanovic */ 14111c03c6dSDamjan Jovanovic const char * operator<<( 14211c03c6dSDamjan Jovanovic F_CSTR i_f ); 14311c03c6dSDamjan Jovanovic 14411c03c6dSDamjan Jovanovic const char & operator[]( 14511c03c6dSDamjan Jovanovic position_type i_nPosition ) const; 14611c03c6dSDamjan Jovanovic char & operator[]( 14711c03c6dSDamjan Jovanovic position_type i_nPosition ); 14811c03c6dSDamjan Jovanovic 14911c03c6dSDamjan Jovanovic // OPERATIONS 15011c03c6dSDamjan Jovanovic void resize( 15111c03c6dSDamjan Jovanovic size_type i_nMinimumCapacity ); 15211c03c6dSDamjan Jovanovic 15311c03c6dSDamjan Jovanovic void clear(); 15411c03c6dSDamjan Jovanovic void swap( 15511c03c6dSDamjan Jovanovic StreamStr & io_swap ); 15611c03c6dSDamjan Jovanovic 15711c03c6dSDamjan Jovanovic /** Sets start point for the next operator<<() call. 15811c03c6dSDamjan Jovanovic if the intended position is not reachable, nothing happens. 15911c03c6dSDamjan Jovanovic */ 16011c03c6dSDamjan Jovanovic self & seekp( 16111c03c6dSDamjan Jovanovic seek_type i_nCount, 16211c03c6dSDamjan Jovanovic seek_dir i_eDirection = ::csv::beg ); 16311c03c6dSDamjan Jovanovic self & reset() { return seekp(0); } 16411c03c6dSDamjan Jovanovic /** Sets the insertion mode of all and only the operator<<() calls. 16511c03c6dSDamjan Jovanovic 16611c03c6dSDamjan Jovanovic Default is str::overwrite: 16711c03c6dSDamjan Jovanovic str::overwrite: seekp() always sets the cur end of the string. 16811c03c6dSDamjan Jovanovic operator<<() calls push the end of the string forward. 16911c03c6dSDamjan Jovanovic str::insert: seekp() only sets the insertion point. 17011c03c6dSDamjan Jovanovic operator<<() calls insert their text at the tellp() 17111c03c6dSDamjan Jovanovic position and keep the rest of the string. tellp() is 17211c03c6dSDamjan Jovanovic then after the inserted text, on the beginning of the 17311c03c6dSDamjan Jovanovic rest of the string. 17411c03c6dSDamjan Jovanovic */ 17511c03c6dSDamjan Jovanovic self & set_insert_mode( 17611c03c6dSDamjan Jovanovic insert_mode i_eMode ); 17711c03c6dSDamjan Jovanovic 17811c03c6dSDamjan Jovanovic void push_front( 17911c03c6dSDamjan Jovanovic const char * i_str ); 18011c03c6dSDamjan Jovanovic void push_front( 18111c03c6dSDamjan Jovanovic char i_c ); 18211c03c6dSDamjan Jovanovic void push_back( 18311c03c6dSDamjan Jovanovic const char * i_str ); 18411c03c6dSDamjan Jovanovic void push_back( 18511c03c6dSDamjan Jovanovic char i_c ); 18611c03c6dSDamjan Jovanovic void pop_front( 18711c03c6dSDamjan Jovanovic size_type i_nCount ); 18811c03c6dSDamjan Jovanovic void pop_back( 18911c03c6dSDamjan Jovanovic size_type i_nCount ); 19011c03c6dSDamjan Jovanovic 19111c03c6dSDamjan Jovanovic /// Works like operator<<(). Does the same as Perl's join(). 19211c03c6dSDamjan Jovanovic self & operator_join( 19311c03c6dSDamjan Jovanovic std::vector<String>::const_iterator 19411c03c6dSDamjan Jovanovic i_rBegin, 19511c03c6dSDamjan Jovanovic std::vector<String>::const_iterator 19611c03c6dSDamjan Jovanovic i_rEnd, 19711c03c6dSDamjan Jovanovic const char * i_sLink ); 19811c03c6dSDamjan Jovanovic /// Works like operator<<() 19911c03c6dSDamjan Jovanovic self & operator_add_substr( 20011c03c6dSDamjan Jovanovic const char * i_sText, 20111c03c6dSDamjan Jovanovic size_type i_nLength ); 20211c03c6dSDamjan Jovanovic /// Works like operator<<() 20311c03c6dSDamjan Jovanovic self & operator_add_token( 20411c03c6dSDamjan Jovanovic const char * i_sText, 20511c03c6dSDamjan Jovanovic char i_cDelimiter ); 20611c03c6dSDamjan Jovanovic /// Works like operator<<() 20711c03c6dSDamjan Jovanovic self & operator_read_line( 20811c03c6dSDamjan Jovanovic bstream & i_src ); 20911c03c6dSDamjan Jovanovic 21011c03c6dSDamjan Jovanovic void strip_front( 21111c03c6dSDamjan Jovanovic char i_cToRemove ); 21211c03c6dSDamjan Jovanovic void strip_back( 21311c03c6dSDamjan Jovanovic char i_cToRemove ); 21411c03c6dSDamjan Jovanovic void strip_frontback( 21511c03c6dSDamjan Jovanovic char i_cToRemove ); 21611c03c6dSDamjan Jovanovic void strip_front_whitespace(); /// removes space, tab and crlf. 21711c03c6dSDamjan Jovanovic void strip_back_whitespace(); 21811c03c6dSDamjan Jovanovic void strip_frontback_whitespace(); 21911c03c6dSDamjan Jovanovic 22011c03c6dSDamjan Jovanovic /** @precond i_begin is valid 22111c03c6dSDamjan Jovanovic @precond i_end is valid 22211c03c6dSDamjan Jovanovic @precond i_end >= i_begin 22311c03c6dSDamjan Jovanovic */ 22411c03c6dSDamjan Jovanovic void remove( 22511c03c6dSDamjan Jovanovic iterator i_begin, 22611c03c6dSDamjan Jovanovic iterator i_end ); 22711c03c6dSDamjan Jovanovic void replace( 22811c03c6dSDamjan Jovanovic position_type i_nStart, 22911c03c6dSDamjan Jovanovic size_type i_nSize, 23011c03c6dSDamjan Jovanovic Area i_aReplacement ); 23111c03c6dSDamjan Jovanovic 23211c03c6dSDamjan Jovanovic void replace_all( 23311c03c6dSDamjan Jovanovic char i_cCarToSearch, 23411c03c6dSDamjan Jovanovic char i_cReplacement ); 23511c03c6dSDamjan Jovanovic void replace_all( 23611c03c6dSDamjan Jovanovic Area i_aStrToSearch, 23711c03c6dSDamjan Jovanovic Area i_aReplacement ); 23811c03c6dSDamjan Jovanovic 23911c03c6dSDamjan Jovanovic StreamStr & to_lower( 24011c03c6dSDamjan Jovanovic position_type i_nStart = 0, 24111c03c6dSDamjan Jovanovic size_type i_nLength = str::maxsize ); 24211c03c6dSDamjan Jovanovic StreamStr & to_upper( 24311c03c6dSDamjan Jovanovic position_type i_nStart = 0, 24411c03c6dSDamjan Jovanovic size_type i_nLength = str::maxsize ); 24511c03c6dSDamjan Jovanovic 24611c03c6dSDamjan Jovanovic // INQUIRY 24711c03c6dSDamjan Jovanovic const char * c_str() const; 24811c03c6dSDamjan Jovanovic const char * data() const; 24911c03c6dSDamjan Jovanovic 25011c03c6dSDamjan Jovanovic bool empty() const; 25111c03c6dSDamjan Jovanovic size_type size() const; 25211c03c6dSDamjan Jovanovic size_type length() const; 25311c03c6dSDamjan Jovanovic 25411c03c6dSDamjan Jovanovic size_type capacity() const; 25511c03c6dSDamjan Jovanovic 25611c03c6dSDamjan Jovanovic position_type tellp() const; 25711c03c6dSDamjan Jovanovic 25811c03c6dSDamjan Jovanovic const_iterator begin() const; 25911c03c6dSDamjan Jovanovic const_iterator cur() const; 26011c03c6dSDamjan Jovanovic const_iterator end() const; 26111c03c6dSDamjan Jovanovic 26211c03c6dSDamjan Jovanovic size_type token_count( 26311c03c6dSDamjan Jovanovic char i_cSplit ) const; 26411c03c6dSDamjan Jovanovic String token( 26511c03c6dSDamjan Jovanovic position_type i_nNr, /// Starting with 0. 26611c03c6dSDamjan Jovanovic char i_cSpli ) const; 26711c03c6dSDamjan Jovanovic 26811c03c6dSDamjan Jovanovic // ACCESS 26911c03c6dSDamjan Jovanovic iterator begin(); 27011c03c6dSDamjan Jovanovic iterator cur(); 27111c03c6dSDamjan Jovanovic iterator end(); 27211c03c6dSDamjan Jovanovic 27311c03c6dSDamjan Jovanovic private: 27411c03c6dSDamjan Jovanovic // Interface bostream 27511c03c6dSDamjan Jovanovic virtual UINT32 do_write( 27611c03c6dSDamjan Jovanovic const void * i_pSrc, 27711c03c6dSDamjan Jovanovic UINT32 i_nNrofBytes); 27811c03c6dSDamjan Jovanovic // Locals 27911c03c6dSDamjan Jovanovic void ProvideAddingSize( 28011c03c6dSDamjan Jovanovic size_type i_nSize2Add ); 28111c03c6dSDamjan Jovanovic /// Resizes with the factor 2.0 (under 128), 1.5 or until i_nMinimumCapacity, whatever is bigger. 28211c03c6dSDamjan Jovanovic void Resize( 28311c03c6dSDamjan Jovanovic size_type i_nMinimumCapacity = 0 ); 28411c03c6dSDamjan Jovanovic void Advance( 28511c03c6dSDamjan Jovanovic size_type i_nAddedSize ); 28611c03c6dSDamjan Jovanovic void MoveData( 28711c03c6dSDamjan Jovanovic char * i_pStart, 28811c03c6dSDamjan Jovanovic char * i_pEnd, 28911c03c6dSDamjan Jovanovic seek_type i_nDiff ); 29011c03c6dSDamjan Jovanovic // DATA 29111c03c6dSDamjan Jovanovic size_type nCapacity1; /// Capacity of characters to contain + 1 for terminating 0. 29211c03c6dSDamjan Jovanovic DYN char * dpData; 29311c03c6dSDamjan Jovanovic char * pEnd; 29411c03c6dSDamjan Jovanovic char * pCur; 29511c03c6dSDamjan Jovanovic insert_mode eMode; 29611c03c6dSDamjan Jovanovic }; 29711c03c6dSDamjan Jovanovic 29811c03c6dSDamjan Jovanovic 29911c03c6dSDamjan Jovanovic 30011c03c6dSDamjan Jovanovic class StreamStrLock 30111c03c6dSDamjan Jovanovic { 30211c03c6dSDamjan Jovanovic public: 30311c03c6dSDamjan Jovanovic StreamStrLock( 30411c03c6dSDamjan Jovanovic uintt i_nMinimalSize ); 30511c03c6dSDamjan Jovanovic ~StreamStrLock(); 30611c03c6dSDamjan Jovanovic 30711c03c6dSDamjan Jovanovic StreamStr & operator()() { return *pStr; } 30811c03c6dSDamjan Jovanovic 30911c03c6dSDamjan Jovanovic private: 31011c03c6dSDamjan Jovanovic StreamStr * pStr; 31111c03c6dSDamjan Jovanovic }; 31211c03c6dSDamjan Jovanovic 31311c03c6dSDamjan Jovanovic /** Splits a string into tokens by whitespace. 31411c03c6dSDamjan Jovanovic 31511c03c6dSDamjan Jovanovic The tokens are added to the end of o_list. 31611c03c6dSDamjan Jovanovic */ 31711c03c6dSDamjan Jovanovic void Split( 31811c03c6dSDamjan Jovanovic std::vector<String> & 31911c03c6dSDamjan Jovanovic o_list, 32011c03c6dSDamjan Jovanovic const char * i_text ); 32111c03c6dSDamjan Jovanovic inline void Join( 32211c03c6dSDamjan Jovanovic StreamStr & o_text, 32311c03c6dSDamjan Jovanovic std::vector<String> & 32411c03c6dSDamjan Jovanovic i_list, 32511c03c6dSDamjan Jovanovic const char * i_sLink = " "); 32611c03c6dSDamjan Jovanovic 32711c03c6dSDamjan Jovanovic // IMPLEMENTATION 32811c03c6dSDamjan Jovanovic 32911c03c6dSDamjan Jovanovic inline const char * 33011c03c6dSDamjan Jovanovic StreamStr::operator<<( F_CSTR ) 33111c03c6dSDamjan Jovanovic { return dpData; } 33211c03c6dSDamjan Jovanovic inline void 33311c03c6dSDamjan Jovanovic StreamStr::clear() 33411c03c6dSDamjan Jovanovic { pEnd = pCur = dpData; *pEnd = '\0'; } 33511c03c6dSDamjan Jovanovic inline const char * 33611c03c6dSDamjan Jovanovic StreamStr::c_str() const 33711c03c6dSDamjan Jovanovic { return dpData; } 33811c03c6dSDamjan Jovanovic inline const char * 33911c03c6dSDamjan Jovanovic StreamStr::data() const 34011c03c6dSDamjan Jovanovic { return dpData; } 34111c03c6dSDamjan Jovanovic inline bool 34211c03c6dSDamjan Jovanovic StreamStr::empty() const 34311c03c6dSDamjan Jovanovic { return dpData == pEnd; } 34411c03c6dSDamjan Jovanovic inline StreamStr::size_type 34511c03c6dSDamjan Jovanovic StreamStr::size() const 34611c03c6dSDamjan Jovanovic { return pEnd - dpData; } 34711c03c6dSDamjan Jovanovic inline StreamStr::size_type 34811c03c6dSDamjan Jovanovic StreamStr::length() const 34911c03c6dSDamjan Jovanovic { return size(); } 35011c03c6dSDamjan Jovanovic inline StreamStr::size_type 35111c03c6dSDamjan Jovanovic StreamStr::capacity() const 35211c03c6dSDamjan Jovanovic { return nCapacity1-1; } 35311c03c6dSDamjan Jovanovic inline StreamStr::position_type 35411c03c6dSDamjan Jovanovic StreamStr::tellp() const 35511c03c6dSDamjan Jovanovic { return size_type(pCur-dpData); } 35611c03c6dSDamjan Jovanovic inline StreamStr::const_iterator 35711c03c6dSDamjan Jovanovic StreamStr::begin() const 35811c03c6dSDamjan Jovanovic { return dpData; } 35911c03c6dSDamjan Jovanovic inline StreamStr::const_iterator 36011c03c6dSDamjan Jovanovic StreamStr::cur() const 36111c03c6dSDamjan Jovanovic { return pCur; } 36211c03c6dSDamjan Jovanovic inline StreamStr::const_iterator 36311c03c6dSDamjan Jovanovic StreamStr::end() const 36411c03c6dSDamjan Jovanovic { return pEnd; } 36511c03c6dSDamjan Jovanovic inline StreamStr::iterator 36611c03c6dSDamjan Jovanovic StreamStr::begin() 36711c03c6dSDamjan Jovanovic { return dpData; } 36811c03c6dSDamjan Jovanovic inline StreamStr::iterator 36911c03c6dSDamjan Jovanovic StreamStr::cur() 37011c03c6dSDamjan Jovanovic { return pCur; } 37111c03c6dSDamjan Jovanovic inline StreamStr::iterator 37211c03c6dSDamjan Jovanovic StreamStr::end() 37311c03c6dSDamjan Jovanovic { return pEnd; } 37411c03c6dSDamjan Jovanovic 37511c03c6dSDamjan Jovanovic inline void 37611c03c6dSDamjan Jovanovic Join( StreamStr & o_text, 37711c03c6dSDamjan Jovanovic std::vector<String> & i_list, 37811c03c6dSDamjan Jovanovic const char * i_sLink ) 37911c03c6dSDamjan Jovanovic { 38011c03c6dSDamjan Jovanovic o_text.operator_join(i_list.begin(),i_list.end(),i_sLink); 38111c03c6dSDamjan Jovanovic } 38211c03c6dSDamjan Jovanovic 38311c03c6dSDamjan Jovanovic 38411c03c6dSDamjan Jovanovic 38511c03c6dSDamjan Jovanovic 38611c03c6dSDamjan Jovanovic } // namespace csv 38711c03c6dSDamjan Jovanovic #endif 388