xref: /AOO42X/main/autodoc/inc/cosv/streamstr.hxx (revision 9bce9b0d387299c68bd81d539e1478357a103de5)
18a106958SDamjan Jovanovic /**************************************************************
28a106958SDamjan Jovanovic  *
38a106958SDamjan Jovanovic  * Licensed to the Apache Software Foundation (ASF) under one
48a106958SDamjan Jovanovic  * or more contributor license agreements.  See the NOTICE file
58a106958SDamjan Jovanovic  * distributed with this work for additional information
68a106958SDamjan Jovanovic  * regarding copyright ownership.  The ASF licenses this file
78a106958SDamjan Jovanovic  * to you under the Apache License, Version 2.0 (the
88a106958SDamjan Jovanovic  * "License"); you may not use this file except in compliance
98a106958SDamjan Jovanovic  * with the License.  You may obtain a copy of the License at
108a106958SDamjan Jovanovic  *
118a106958SDamjan Jovanovic  *   http://www.apache.org/licenses/LICENSE-2.0
128a106958SDamjan Jovanovic  *
138a106958SDamjan Jovanovic  * Unless required by applicable law or agreed to in writing,
148a106958SDamjan Jovanovic  * software distributed under the License is distributed on an
158a106958SDamjan Jovanovic  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
168a106958SDamjan Jovanovic  * KIND, either express or implied.  See the License for the
178a106958SDamjan Jovanovic  * specific language governing permissions and limitations
188a106958SDamjan Jovanovic  * under the License.
198a106958SDamjan Jovanovic  *
208a106958SDamjan Jovanovic  *************************************************************/
218a106958SDamjan Jovanovic 
228a106958SDamjan Jovanovic 
238a106958SDamjan Jovanovic 
248a106958SDamjan Jovanovic #ifndef CSV_STREAMSTR_HXX
258a106958SDamjan Jovanovic #define CSV_STREAMSTR_HXX
268a106958SDamjan Jovanovic 
278a106958SDamjan Jovanovic // BASE CLASSES
288a106958SDamjan Jovanovic #include <cosv/bstream.hxx>
298a106958SDamjan Jovanovic // USED SERVICES
308a106958SDamjan Jovanovic #include <cosv/str_types.hxx>
318a106958SDamjan Jovanovic #include <string.h>
328a106958SDamjan Jovanovic 
338a106958SDamjan Jovanovic 
348a106958SDamjan Jovanovic 
358a106958SDamjan Jovanovic 
368a106958SDamjan Jovanovic namespace csv
378a106958SDamjan Jovanovic {
388a106958SDamjan Jovanovic     class String;
398a106958SDamjan Jovanovic 
408a106958SDamjan Jovanovic 
418a106958SDamjan Jovanovic void c_str();   // Dummy needed for StreamStr::operator<<(StreamStr::F_CSTR);
428a106958SDamjan Jovanovic 
438a106958SDamjan Jovanovic 
448a106958SDamjan Jovanovic /** A string buffer class for all kinds of string manipulation.
458a106958SDamjan Jovanovic */
468a106958SDamjan Jovanovic class StreamStr : public bostream
478a106958SDamjan Jovanovic {
488a106958SDamjan Jovanovic    public:
498a106958SDamjan Jovanovic     typedef StreamStr       self;
508a106958SDamjan Jovanovic 
518a106958SDamjan Jovanovic     typedef str::size           size_type;
528a106958SDamjan Jovanovic     typedef str::position       position_type;
538a106958SDamjan Jovanovic     typedef intt                seek_type;
548a106958SDamjan Jovanovic     typedef str::insert_mode    insert_mode;
558a106958SDamjan Jovanovic 
568a106958SDamjan Jovanovic     typedef const char *        const_iterator;
578a106958SDamjan Jovanovic     typedef char *              iterator;
588a106958SDamjan Jovanovic 
598a106958SDamjan Jovanovic     typedef void (*F_CSTR)();
608a106958SDamjan Jovanovic 
618a106958SDamjan Jovanovic 
628a106958SDamjan Jovanovic     /** Represents an area within a string.
638a106958SDamjan Jovanovic     */
648a106958SDamjan Jovanovic     struct Area
658a106958SDamjan Jovanovic     {
668a106958SDamjan Jovanovic         typedef str::size           size_type;
678a106958SDamjan Jovanovic 
Areacsv::StreamStr::Area688a106958SDamjan Jovanovic                         Area(
698a106958SDamjan Jovanovic                             const char *        i_str = "",
708a106958SDamjan Jovanovic                             size_type           i_nLength = str::maxsize )
718a106958SDamjan Jovanovic                                                 :   sStr(i_str),
728a106958SDamjan Jovanovic                                                     nLength( i_nLength == str::maxsize
738a106958SDamjan Jovanovic                                                                 ?   strlen(i_str)
748a106958SDamjan Jovanovic                                                                 :   i_nLength ) {}
758a106958SDamjan Jovanovic         const char *    sStr;
768a106958SDamjan Jovanovic         size_type       nLength;
778a106958SDamjan Jovanovic     };
788a106958SDamjan Jovanovic 
798a106958SDamjan Jovanovic     // LIFECYCLE
808a106958SDamjan Jovanovic                         StreamStr(
818a106958SDamjan Jovanovic                             size_type           i_nCapacity );
828a106958SDamjan Jovanovic                         StreamStr(
838a106958SDamjan Jovanovic                             const char *        i_sInitStr,
848a106958SDamjan Jovanovic                             size_type           i_nCapacity ); /// Only used if > strlen(i_sInitStr).
858a106958SDamjan Jovanovic                         StreamStr(
868a106958SDamjan Jovanovic                             size_type           i_nGuessedCapacity,
878a106958SDamjan Jovanovic                             const char *        str1,   // [!= 0]
888a106958SDamjan Jovanovic                             const char *        str2,   // [!= 0]
898a106958SDamjan Jovanovic                             ...                 );      // Has to end with NIL .
908a106958SDamjan Jovanovic                         StreamStr(
918a106958SDamjan Jovanovic                             csv::bstream &      i_source );
928a106958SDamjan Jovanovic     /// Copies also insert_mode and current position.
938a106958SDamjan Jovanovic                         StreamStr(
948a106958SDamjan Jovanovic                             const self &        i_rOther );
958a106958SDamjan Jovanovic                         ~StreamStr();
968a106958SDamjan Jovanovic 
978a106958SDamjan Jovanovic     // OPERATORS
988a106958SDamjan Jovanovic     /// Copies also insert_mode and current position.
998a106958SDamjan Jovanovic     self &              operator=(
1008a106958SDamjan Jovanovic                             const self &        i_rOther );
1018a106958SDamjan Jovanovic 
1028a106958SDamjan Jovanovic     self &              operator<<(
1038a106958SDamjan Jovanovic                             const char *        i_s );
1048a106958SDamjan Jovanovic     self &              operator<<(
1058a106958SDamjan Jovanovic                             const String &      i_s );
1068a106958SDamjan Jovanovic     self &              operator<<(
1078a106958SDamjan Jovanovic                             char                i_c );
1088a106958SDamjan Jovanovic     self &              operator<<(
1098a106958SDamjan Jovanovic                             unsigned char       i_c );
1108a106958SDamjan Jovanovic     self &              operator<<(
1118a106958SDamjan Jovanovic                             signed char         i_c );
1128a106958SDamjan Jovanovic 
1138a106958SDamjan Jovanovic     self &              operator<<(
1148a106958SDamjan Jovanovic                             short               i_n );
1158a106958SDamjan Jovanovic     self &              operator<<(
1168a106958SDamjan Jovanovic                             unsigned short      i_n );
1178a106958SDamjan Jovanovic     self &              operator<<(
1188a106958SDamjan Jovanovic                             int                 i_n );
1198a106958SDamjan Jovanovic     self &              operator<<(
1208a106958SDamjan Jovanovic                             unsigned int        i_n );
1218a106958SDamjan Jovanovic     self &              operator<<(
1228a106958SDamjan Jovanovic                             long                i_n );
1238a106958SDamjan Jovanovic     self &              operator<<(
1248a106958SDamjan Jovanovic                             unsigned long       i_n );
1258a106958SDamjan Jovanovic 
1268a106958SDamjan Jovanovic     self &              operator<<(
1278a106958SDamjan Jovanovic                             float               i_n );
1288a106958SDamjan Jovanovic     self &              operator<<(
1298a106958SDamjan Jovanovic                             double              i_n );
1308a106958SDamjan Jovanovic 
1318a106958SDamjan Jovanovic     /** This operator is used to finish a sequence of streaming
132*7f6a93c8SJohn Bampton         operators by returning the c-string of the complete string.
1338a106958SDamjan Jovanovic 
1348a106958SDamjan Jovanovic         @return The same as ->c_str().
1358a106958SDamjan Jovanovic 
1368a106958SDamjan Jovanovic         @example
1378a106958SDamjan Jovanovic         csv::StreamStr  s(100);
1388a106958SDamjan Jovanovic         const char *
1398a106958SDamjan Jovanovic             fullname =  s << qualifier() << "::" << name() << csv::c_str;
1408a106958SDamjan Jovanovic     */
1418a106958SDamjan Jovanovic     const char *        operator<<(
1428a106958SDamjan Jovanovic                             F_CSTR              i_f );
1438a106958SDamjan Jovanovic 
1448a106958SDamjan Jovanovic     const char &        operator[](
1458a106958SDamjan Jovanovic                             position_type       i_nPosition ) const;
1468a106958SDamjan Jovanovic     char &              operator[](
1478a106958SDamjan Jovanovic                             position_type       i_nPosition );
1488a106958SDamjan Jovanovic 
1498a106958SDamjan Jovanovic     //  OPERATIONS
1508a106958SDamjan Jovanovic     void                resize(
1518a106958SDamjan Jovanovic                             size_type           i_nMinimumCapacity );
1528a106958SDamjan Jovanovic 
1538a106958SDamjan Jovanovic     void                clear();
1548a106958SDamjan Jovanovic     void                swap(
1558a106958SDamjan Jovanovic                             StreamStr &         io_swap );
1568a106958SDamjan Jovanovic 
1578a106958SDamjan Jovanovic     /** Sets start point for the next operator<<() call.
1588a106958SDamjan Jovanovic         if the intended position is not reachable, nothing happens.
1598a106958SDamjan Jovanovic     */
1608a106958SDamjan Jovanovic     self &              seekp(
1618a106958SDamjan Jovanovic                             seek_type           i_nCount,
1628a106958SDamjan Jovanovic                             seek_dir            i_eDirection = ::csv::beg );
reset()1638a106958SDamjan Jovanovic     self &              reset()                 { return seekp(0); }
1648a106958SDamjan Jovanovic     /** Sets the insertion mode of all and only the operator<<() calls.
1658a106958SDamjan Jovanovic 
1668a106958SDamjan Jovanovic         Default is str::overwrite:
1678a106958SDamjan Jovanovic         str::overwrite: seekp() always sets the cur end of the string.
1688a106958SDamjan Jovanovic                         operator<<() calls push the end of the string forward.
1698a106958SDamjan Jovanovic         str::insert:    seekp() only sets the insertion point.
1708a106958SDamjan Jovanovic                         operator<<() calls insert their text at the tellp()
1718a106958SDamjan Jovanovic                         position and keep the rest of the string. tellp() is
1728a106958SDamjan Jovanovic                         then after the inserted text, on the beginning of the
1738a106958SDamjan Jovanovic                         rest of the string.
1748a106958SDamjan Jovanovic     */
1758a106958SDamjan Jovanovic     self &              set_insert_mode(
1768a106958SDamjan Jovanovic                             insert_mode         i_eMode );
1778a106958SDamjan Jovanovic 
1788a106958SDamjan Jovanovic     void                push_front(
1798a106958SDamjan Jovanovic                             const char *        i_str );
1808a106958SDamjan Jovanovic     void                push_front(
1818a106958SDamjan Jovanovic                             char                i_c );
1828a106958SDamjan Jovanovic     void                push_back(
1838a106958SDamjan Jovanovic                             const char *        i_str );
1848a106958SDamjan Jovanovic     void                push_back(
1858a106958SDamjan Jovanovic                             char                i_c );
1868a106958SDamjan Jovanovic     void                pop_front(
1878a106958SDamjan Jovanovic                             size_type           i_nCount );
1888a106958SDamjan Jovanovic     void                pop_back(
1898a106958SDamjan Jovanovic                             size_type           i_nCount );
1908a106958SDamjan Jovanovic 
1918a106958SDamjan Jovanovic     /// Works like operator<<(). Does the same as Perl's join().
1928a106958SDamjan Jovanovic     self &              operator_join(
1938a106958SDamjan Jovanovic                             std::vector<String>::const_iterator
1948a106958SDamjan Jovanovic                                                 i_rBegin,
1958a106958SDamjan Jovanovic                             std::vector<String>::const_iterator
1968a106958SDamjan Jovanovic                                                 i_rEnd,
1978a106958SDamjan Jovanovic                             const char *        i_sLink );
1988a106958SDamjan Jovanovic     /// Works like operator<<()
1998a106958SDamjan Jovanovic     self &              operator_add_substr(
2008a106958SDamjan Jovanovic                             const char *        i_sText,
2018a106958SDamjan Jovanovic                             size_type           i_nLength );
2028a106958SDamjan Jovanovic     /// Works like operator<<()
2038a106958SDamjan Jovanovic     self &              operator_add_token(
2048a106958SDamjan Jovanovic                             const char *        i_sText,
2058a106958SDamjan Jovanovic                             char                i_cDelimiter );
2068a106958SDamjan Jovanovic     /// Works like operator<<()
2078a106958SDamjan Jovanovic     self &              operator_read_line(
2088a106958SDamjan Jovanovic                             bstream &           i_src );
2098a106958SDamjan Jovanovic 
2108a106958SDamjan Jovanovic     void                strip_front(
2118a106958SDamjan Jovanovic                             char                i_cToRemove );
2128a106958SDamjan Jovanovic     void                strip_back(
2138a106958SDamjan Jovanovic                             char                i_cToRemove );
2148a106958SDamjan Jovanovic     void                strip_frontback(
2158a106958SDamjan Jovanovic                             char                i_cToRemove );
2168a106958SDamjan Jovanovic     void                strip_front_whitespace();    /// removes space, tab and crlf.
2178a106958SDamjan Jovanovic     void                strip_back_whitespace();
2188a106958SDamjan Jovanovic     void                strip_frontback_whitespace();
2198a106958SDamjan Jovanovic 
2208a106958SDamjan Jovanovic     /** @precond i_begin is valid
2218a106958SDamjan Jovanovic         @precond i_end is valid
2228a106958SDamjan Jovanovic         @precond i_end >= i_begin
2238a106958SDamjan Jovanovic     */
2248a106958SDamjan Jovanovic     void                remove(
2258a106958SDamjan Jovanovic                             iterator            i_begin,
2268a106958SDamjan Jovanovic                             iterator            i_end );
2278a106958SDamjan Jovanovic     void                replace(
2288a106958SDamjan Jovanovic                             position_type       i_nStart,
2298a106958SDamjan Jovanovic                             size_type           i_nSize,
2308a106958SDamjan Jovanovic                             Area                i_aReplacement );
2318a106958SDamjan Jovanovic 
2328a106958SDamjan Jovanovic     void                replace_all(
2338a106958SDamjan Jovanovic                             char                i_cCarToSearch,
2348a106958SDamjan Jovanovic                             char                i_cReplacement );
2358a106958SDamjan Jovanovic     void                replace_all(
2368a106958SDamjan Jovanovic                             Area                i_aStrToSearch,
2378a106958SDamjan Jovanovic                             Area                i_aReplacement );
2388a106958SDamjan Jovanovic 
2398a106958SDamjan Jovanovic     StreamStr &         to_lower(
2408a106958SDamjan Jovanovic                             position_type       i_nStart = 0,
2418a106958SDamjan Jovanovic                             size_type           i_nLength = str::maxsize );
2428a106958SDamjan Jovanovic     StreamStr &         to_upper(
2438a106958SDamjan Jovanovic                             position_type       i_nStart = 0,
2448a106958SDamjan Jovanovic                             size_type           i_nLength = str::maxsize );
2458a106958SDamjan Jovanovic 
2468a106958SDamjan Jovanovic     // INQUIRY
2478a106958SDamjan Jovanovic     const char *        c_str() const;
2488a106958SDamjan Jovanovic     const char *        data() const;
2498a106958SDamjan Jovanovic 
2508a106958SDamjan Jovanovic     bool                empty() const;
2518a106958SDamjan Jovanovic     size_type           size() const;
2528a106958SDamjan Jovanovic     size_type           length() const;
2538a106958SDamjan Jovanovic 
2548a106958SDamjan Jovanovic     size_type           capacity() const;
2558a106958SDamjan Jovanovic 
2568a106958SDamjan Jovanovic     position_type       tellp() const;
2578a106958SDamjan Jovanovic 
2588a106958SDamjan Jovanovic     const_iterator      begin() const;
2598a106958SDamjan Jovanovic     const_iterator      cur() const;
2608a106958SDamjan Jovanovic     const_iterator      end() const;
2618a106958SDamjan Jovanovic 
2628a106958SDamjan Jovanovic     size_type           token_count(
2638a106958SDamjan Jovanovic                             char                i_cSplit ) const;
2648a106958SDamjan Jovanovic     String              token(
2658a106958SDamjan Jovanovic                             position_type       i_nNr,      /// Starting with 0.
2668a106958SDamjan Jovanovic                             char                i_cSpli ) const;
2678a106958SDamjan Jovanovic 
2688a106958SDamjan Jovanovic     // ACCESS
2698a106958SDamjan Jovanovic     iterator            begin();
2708a106958SDamjan Jovanovic     iterator            cur();
2718a106958SDamjan Jovanovic     iterator            end();
2728a106958SDamjan Jovanovic 
2738a106958SDamjan Jovanovic    private:
2748a106958SDamjan Jovanovic     // Interface bostream
2758a106958SDamjan Jovanovic     virtual UINT32      do_write(
2768a106958SDamjan Jovanovic                             const void *    i_pSrc,
2778a106958SDamjan Jovanovic                             UINT32          i_nNrofBytes);
2788a106958SDamjan Jovanovic     // Locals
2798a106958SDamjan Jovanovic     void                ProvideAddingSize(
2808a106958SDamjan Jovanovic                             size_type           i_nSize2Add );
2818a106958SDamjan Jovanovic     /// Resizes with the factor 2.0 (under 128), 1.5 or until i_nMinimumCapacity, whatever is bigger.
2828a106958SDamjan Jovanovic     void                Resize(
2838a106958SDamjan Jovanovic                             size_type           i_nMinimumCapacity = 0 );
2848a106958SDamjan Jovanovic     void                Advance(
2858a106958SDamjan Jovanovic                             size_type           i_nAddedSize );
2868a106958SDamjan Jovanovic     void                MoveData(
2878a106958SDamjan Jovanovic                             char *              i_pStart,
2888a106958SDamjan Jovanovic                             char *              i_pEnd,
2898a106958SDamjan Jovanovic                             seek_type           i_nDiff );
2908a106958SDamjan Jovanovic     // DATA
2918a106958SDamjan Jovanovic     size_type           nCapacity1;     /// Capacity of characters to contain + 1 for terminating 0.
2928a106958SDamjan Jovanovic     DYN char *          dpData;
2938a106958SDamjan Jovanovic     char *              pEnd;
2948a106958SDamjan Jovanovic     char *              pCur;
2958a106958SDamjan Jovanovic     insert_mode         eMode;
2968a106958SDamjan Jovanovic };
2978a106958SDamjan Jovanovic 
2988a106958SDamjan Jovanovic 
2998a106958SDamjan Jovanovic 
3008a106958SDamjan Jovanovic class StreamStrLock
3018a106958SDamjan Jovanovic {
3028a106958SDamjan Jovanovic   public:
3038a106958SDamjan Jovanovic                         StreamStrLock(
3048a106958SDamjan Jovanovic                             uintt               i_nMinimalSize );
3058a106958SDamjan Jovanovic                         ~StreamStrLock();
3068a106958SDamjan Jovanovic 
operator ()()3078a106958SDamjan Jovanovic     StreamStr &         operator()()            { return *pStr; }
3088a106958SDamjan Jovanovic 
3098a106958SDamjan Jovanovic   private:
3108a106958SDamjan Jovanovic     StreamStr *         pStr;
3118a106958SDamjan Jovanovic };
3128a106958SDamjan Jovanovic 
3138a106958SDamjan Jovanovic /** Splits a string into tokens by whitespace.
3148a106958SDamjan Jovanovic 
3158a106958SDamjan Jovanovic     The tokens are added to the end of o_list.
3168a106958SDamjan Jovanovic */
3178a106958SDamjan Jovanovic void                Split(
3188a106958SDamjan Jovanovic                         std::vector<String> &
3198a106958SDamjan Jovanovic                                             o_list,
3208a106958SDamjan Jovanovic                         const char *        i_text );
3218a106958SDamjan Jovanovic inline void         Join(
3228a106958SDamjan Jovanovic                         StreamStr &         o_text,
3238a106958SDamjan Jovanovic                         std::vector<String> &
3248a106958SDamjan Jovanovic                                             i_list,
3258a106958SDamjan Jovanovic                         const char *        i_sLink = " ");
3268a106958SDamjan Jovanovic 
3278a106958SDamjan Jovanovic // IMPLEMENTATION
3288a106958SDamjan Jovanovic 
3298a106958SDamjan Jovanovic inline const char *
operator <<(F_CSTR)3308a106958SDamjan Jovanovic StreamStr::operator<<( F_CSTR )
3318a106958SDamjan Jovanovic     { return dpData; }
3328a106958SDamjan Jovanovic inline void
clear()3338a106958SDamjan Jovanovic StreamStr::clear()
3348a106958SDamjan Jovanovic     { pEnd = pCur = dpData; *pEnd = '\0'; }
3358a106958SDamjan Jovanovic inline const char *
c_str() const3368a106958SDamjan Jovanovic StreamStr::c_str() const
3378a106958SDamjan Jovanovic     { return dpData; }
3388a106958SDamjan Jovanovic inline const char *
data() const3398a106958SDamjan Jovanovic StreamStr::data() const
3408a106958SDamjan Jovanovic     { return dpData; }
3418a106958SDamjan Jovanovic inline bool
empty() const3428a106958SDamjan Jovanovic StreamStr::empty() const
3438a106958SDamjan Jovanovic     { return dpData == pEnd; }
3448a106958SDamjan Jovanovic inline StreamStr::size_type
size() const3458a106958SDamjan Jovanovic StreamStr::size() const
3468a106958SDamjan Jovanovic     { return pEnd - dpData; }
3478a106958SDamjan Jovanovic inline StreamStr::size_type
length() const3488a106958SDamjan Jovanovic StreamStr::length() const
3498a106958SDamjan Jovanovic     { return size(); }
3508a106958SDamjan Jovanovic inline StreamStr::size_type
capacity() const3518a106958SDamjan Jovanovic StreamStr::capacity() const
3528a106958SDamjan Jovanovic     { return nCapacity1-1; }
3538a106958SDamjan Jovanovic inline StreamStr::position_type
tellp() const3548a106958SDamjan Jovanovic StreamStr::tellp() const
3558a106958SDamjan Jovanovic     { return size_type(pCur-dpData); }
3568a106958SDamjan Jovanovic inline StreamStr::const_iterator
begin() const3578a106958SDamjan Jovanovic StreamStr::begin() const
3588a106958SDamjan Jovanovic     { return dpData; }
3598a106958SDamjan Jovanovic inline StreamStr::const_iterator
cur() const3608a106958SDamjan Jovanovic StreamStr::cur() const
3618a106958SDamjan Jovanovic     { return pCur; }
3628a106958SDamjan Jovanovic inline StreamStr::const_iterator
end() const3638a106958SDamjan Jovanovic StreamStr::end() const
3648a106958SDamjan Jovanovic     { return pEnd; }
3658a106958SDamjan Jovanovic inline StreamStr::iterator
begin()3668a106958SDamjan Jovanovic StreamStr::begin()
3678a106958SDamjan Jovanovic     { return dpData; }
3688a106958SDamjan Jovanovic inline StreamStr::iterator
cur()3698a106958SDamjan Jovanovic StreamStr::cur()
3708a106958SDamjan Jovanovic     { return pCur; }
3718a106958SDamjan Jovanovic inline StreamStr::iterator
end()3728a106958SDamjan Jovanovic StreamStr::end()
3738a106958SDamjan Jovanovic     { return pEnd; }
3748a106958SDamjan Jovanovic 
3758a106958SDamjan Jovanovic inline void
Join(StreamStr & o_text,std::vector<String> & i_list,const char * i_sLink)3768a106958SDamjan Jovanovic Join( StreamStr &           o_text,
3778a106958SDamjan Jovanovic       std::vector<String> & i_list,
3788a106958SDamjan Jovanovic       const char *          i_sLink )
3798a106958SDamjan Jovanovic {
3808a106958SDamjan Jovanovic     o_text.operator_join(i_list.begin(),i_list.end(),i_sLink);
3818a106958SDamjan Jovanovic }
3828a106958SDamjan Jovanovic 
3838a106958SDamjan Jovanovic 
3848a106958SDamjan Jovanovic 
3858a106958SDamjan Jovanovic 
3868a106958SDamjan Jovanovic }   // namespace csv
3878a106958SDamjan Jovanovic #endif
388