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
Areacsv::StreamStr::Area6811c03c6dSDamjan 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 );
reset()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
operator ()()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 *
operator <<(F_CSTR)33011c03c6dSDamjan Jovanovic StreamStr::operator<<( F_CSTR )
33111c03c6dSDamjan Jovanovic { return dpData; }
33211c03c6dSDamjan Jovanovic inline void
clear()33311c03c6dSDamjan Jovanovic StreamStr::clear()
33411c03c6dSDamjan Jovanovic { pEnd = pCur = dpData; *pEnd = '\0'; }
33511c03c6dSDamjan Jovanovic inline const char *
c_str() const33611c03c6dSDamjan Jovanovic StreamStr::c_str() const
33711c03c6dSDamjan Jovanovic { return dpData; }
33811c03c6dSDamjan Jovanovic inline const char *
data() const33911c03c6dSDamjan Jovanovic StreamStr::data() const
34011c03c6dSDamjan Jovanovic { return dpData; }
34111c03c6dSDamjan Jovanovic inline bool
empty() const34211c03c6dSDamjan Jovanovic StreamStr::empty() const
34311c03c6dSDamjan Jovanovic { return dpData == pEnd; }
34411c03c6dSDamjan Jovanovic inline StreamStr::size_type
size() const34511c03c6dSDamjan Jovanovic StreamStr::size() const
34611c03c6dSDamjan Jovanovic { return pEnd - dpData; }
34711c03c6dSDamjan Jovanovic inline StreamStr::size_type
length() const34811c03c6dSDamjan Jovanovic StreamStr::length() const
34911c03c6dSDamjan Jovanovic { return size(); }
35011c03c6dSDamjan Jovanovic inline StreamStr::size_type
capacity() const35111c03c6dSDamjan Jovanovic StreamStr::capacity() const
35211c03c6dSDamjan Jovanovic { return nCapacity1-1; }
35311c03c6dSDamjan Jovanovic inline StreamStr::position_type
tellp() const35411c03c6dSDamjan Jovanovic StreamStr::tellp() const
35511c03c6dSDamjan Jovanovic { return size_type(pCur-dpData); }
35611c03c6dSDamjan Jovanovic inline StreamStr::const_iterator
begin() const35711c03c6dSDamjan Jovanovic StreamStr::begin() const
35811c03c6dSDamjan Jovanovic { return dpData; }
35911c03c6dSDamjan Jovanovic inline StreamStr::const_iterator
cur() const36011c03c6dSDamjan Jovanovic StreamStr::cur() const
36111c03c6dSDamjan Jovanovic { return pCur; }
36211c03c6dSDamjan Jovanovic inline StreamStr::const_iterator
end() const36311c03c6dSDamjan Jovanovic StreamStr::end() const
36411c03c6dSDamjan Jovanovic { return pEnd; }
36511c03c6dSDamjan Jovanovic inline StreamStr::iterator
begin()36611c03c6dSDamjan Jovanovic StreamStr::begin()
36711c03c6dSDamjan Jovanovic { return dpData; }
36811c03c6dSDamjan Jovanovic inline StreamStr::iterator
cur()36911c03c6dSDamjan Jovanovic StreamStr::cur()
37011c03c6dSDamjan Jovanovic { return pCur; }
37111c03c6dSDamjan Jovanovic inline StreamStr::iterator
end()37211c03c6dSDamjan Jovanovic StreamStr::end()
37311c03c6dSDamjan Jovanovic { return pEnd; }
37411c03c6dSDamjan Jovanovic
37511c03c6dSDamjan Jovanovic inline void
Join(StreamStr & o_text,std::vector<String> & i_list,const char * i_sLink)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