xref: /AOO42X/main/autodoc/inc/cosv/string.hxx (revision 9bce9b0d387299c68bd81d539e1478357a103de5)
1*8a106958SDamjan Jovanovic /**************************************************************
2*8a106958SDamjan Jovanovic  *
3*8a106958SDamjan Jovanovic  * Licensed to the Apache Software Foundation (ASF) under one
4*8a106958SDamjan Jovanovic  * or more contributor license agreements.  See the NOTICE file
5*8a106958SDamjan Jovanovic  * distributed with this work for additional information
6*8a106958SDamjan Jovanovic  * regarding copyright ownership.  The ASF licenses this file
7*8a106958SDamjan Jovanovic  * to you under the Apache License, Version 2.0 (the
8*8a106958SDamjan Jovanovic  * "License"); you may not use this file except in compliance
9*8a106958SDamjan Jovanovic  * with the License.  You may obtain a copy of the License at
10*8a106958SDamjan Jovanovic  *
11*8a106958SDamjan Jovanovic  *   http://www.apache.org/licenses/LICENSE-2.0
12*8a106958SDamjan Jovanovic  *
13*8a106958SDamjan Jovanovic  * Unless required by applicable law or agreed to in writing,
14*8a106958SDamjan Jovanovic  * software distributed under the License is distributed on an
15*8a106958SDamjan Jovanovic  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*8a106958SDamjan Jovanovic  * KIND, either express or implied.  See the License for the
17*8a106958SDamjan Jovanovic  * specific language governing permissions and limitations
18*8a106958SDamjan Jovanovic  * under the License.
19*8a106958SDamjan Jovanovic  *
20*8a106958SDamjan Jovanovic  *************************************************************/
21*8a106958SDamjan Jovanovic 
22*8a106958SDamjan Jovanovic 
23*8a106958SDamjan Jovanovic 
24*8a106958SDamjan Jovanovic #ifndef COSV_STRING_HXX
25*8a106958SDamjan Jovanovic #define COSV_STRING_HXX
26*8a106958SDamjan Jovanovic 
27*8a106958SDamjan Jovanovic // USED SERVICES
28*8a106958SDamjan Jovanovic #include <cosv/stringdata.hxx>
29*8a106958SDamjan Jovanovic #include <cosv/str_types.hxx>
30*8a106958SDamjan Jovanovic #include <string.h>
31*8a106958SDamjan Jovanovic #include <cosv/csv_ostream.hxx>
32*8a106958SDamjan Jovanovic #include <vector>
33*8a106958SDamjan Jovanovic 
34*8a106958SDamjan Jovanovic 
35*8a106958SDamjan Jovanovic 
36*8a106958SDamjan Jovanovic 
37*8a106958SDamjan Jovanovic namespace csv
38*8a106958SDamjan Jovanovic {
39*8a106958SDamjan Jovanovic 
40*8a106958SDamjan Jovanovic 
41*8a106958SDamjan Jovanovic /** The Simple String:
42*8a106958SDamjan Jovanovic         It is used to just hold short to middle long texts as
43*8a106958SDamjan Jovanovic         data, which are constant at most times. They are reference
44*8a106958SDamjan Jovanovic         counted, so they are space efficient and have constant time
45*8a106958SDamjan Jovanovic         copy semantics.
46*8a106958SDamjan Jovanovic 
47*8a106958SDamjan Jovanovic     For all compare() functions the return value is like in strcmp().
48*8a106958SDamjan Jovanovic 
49*8a106958SDamjan Jovanovic     @attention
50*8a106958SDamjan Jovanovic     The present version of this class is NOT thread safe.
51*8a106958SDamjan Jovanovic */
52*8a106958SDamjan Jovanovic 
53*8a106958SDamjan Jovanovic 
54*8a106958SDamjan Jovanovic class String
55*8a106958SDamjan Jovanovic {
56*8a106958SDamjan Jovanovic   public:
57*8a106958SDamjan Jovanovic     typedef String              self;
58*8a106958SDamjan Jovanovic 
59*8a106958SDamjan Jovanovic     typedef str::size           size_type;
60*8a106958SDamjan Jovanovic     typedef str::position       position_type;
61*8a106958SDamjan Jovanovic 
62*8a106958SDamjan Jovanovic     typedef const char *        const_iterator;
63*8a106958SDamjan Jovanovic 
64*8a106958SDamjan Jovanovic     // LIFECYCLE
65*8a106958SDamjan Jovanovic                         String();
66*8a106958SDamjan Jovanovic 
67*8a106958SDamjan Jovanovic     /// Intentionally not explicit, smooth casting is intended.
68*8a106958SDamjan Jovanovic                         String(
69*8a106958SDamjan Jovanovic                             const char *        i_str );
70*8a106958SDamjan Jovanovic     /// @precond i_nLength <= strlen(i_str) or i_nLength == str::maxsize.
71*8a106958SDamjan Jovanovic                         String(
72*8a106958SDamjan Jovanovic                             const char *        i_str,
73*8a106958SDamjan Jovanovic                             size_type           i_nLength );
74*8a106958SDamjan Jovanovic     /** @precond i_nLength == str::maxsize
75*8a106958SDamjan Jovanovic                  || i_nStartPosition+i_nLength <= i_rStr.Size().
76*8a106958SDamjan Jovanovic     */
77*8a106958SDamjan Jovanovic                         String(
78*8a106958SDamjan Jovanovic                             const self &        i_rStr,
79*8a106958SDamjan Jovanovic                             position_type       i_nStartPosition,
80*8a106958SDamjan Jovanovic                             size_type           i_nLength );
81*8a106958SDamjan Jovanovic     /** @precond i_itBegin and i_itEnd are in the same valid
82*8a106958SDamjan Jovanovic         memory-area, such that zero to finite times repetition of
83*8a106958SDamjan Jovanovic         ++i_itBegin leads to i_itBegin == i_itEnd.
84*8a106958SDamjan Jovanovic     */
85*8a106958SDamjan Jovanovic                         String(
86*8a106958SDamjan Jovanovic                             const_iterator      i_itBegin,
87*8a106958SDamjan Jovanovic                             const_iterator      i_itEnd );
88*8a106958SDamjan Jovanovic 
89*8a106958SDamjan Jovanovic                         String(
90*8a106958SDamjan Jovanovic                             const self &        i_rStr );
91*8a106958SDamjan Jovanovic 
92*8a106958SDamjan Jovanovic                         ~String();
93*8a106958SDamjan Jovanovic     // OPERATORS
94*8a106958SDamjan Jovanovic     self &              operator=(
95*8a106958SDamjan Jovanovic                             const self &        i_rStr );
96*8a106958SDamjan Jovanovic     self &              operator=(
97*8a106958SDamjan Jovanovic                             const char *        i_str );
98*8a106958SDamjan Jovanovic 
99*8a106958SDamjan Jovanovic                         operator const char * () const;
100*8a106958SDamjan Jovanovic 
101*8a106958SDamjan Jovanovic     bool                operator==(
102*8a106958SDamjan Jovanovic                             const self &        i_rStr ) const;
103*8a106958SDamjan Jovanovic     bool                operator!=(
104*8a106958SDamjan Jovanovic                             const self &        i_rStr ) const;
105*8a106958SDamjan Jovanovic     bool                operator<(
106*8a106958SDamjan Jovanovic                             const self &        i_rStr ) const;
107*8a106958SDamjan Jovanovic     bool                operator>(
108*8a106958SDamjan Jovanovic                             const self &        i_rStr ) const;
109*8a106958SDamjan Jovanovic     bool                operator<=(
110*8a106958SDamjan Jovanovic                             const self &        i_rStr ) const;
111*8a106958SDamjan Jovanovic     bool                operator>=(
112*8a106958SDamjan Jovanovic                             const self &        i_rStr ) const;
113*8a106958SDamjan Jovanovic 
114*8a106958SDamjan Jovanovic     // OPERATIONS
115*8a106958SDamjan Jovanovic     void                clear();
116*8a106958SDamjan Jovanovic 
117*8a106958SDamjan Jovanovic     void                swap(
118*8a106958SDamjan Jovanovic                             self &              i_rStr );
119*8a106958SDamjan Jovanovic 
120*8a106958SDamjan Jovanovic     /** @precond i_nLength == str::maxsize
121*8a106958SDamjan Jovanovic                  || i_nStartPosition+i_nLength <= i_rStr.Size().
122*8a106958SDamjan Jovanovic     */
123*8a106958SDamjan Jovanovic     void                assign(
124*8a106958SDamjan Jovanovic                             const self &        i_rStr,
125*8a106958SDamjan Jovanovic                             position_type       i_nStartPosition,
126*8a106958SDamjan Jovanovic                             size_type           i_nLength );
127*8a106958SDamjan Jovanovic     void                assign(
128*8a106958SDamjan Jovanovic                             const char *        i_str );
129*8a106958SDamjan Jovanovic     /// @precond i_nLength == str::maxsize OR i_nLength < strlen(i_str) .
130*8a106958SDamjan Jovanovic     void                assign(
131*8a106958SDamjan Jovanovic                             const char *        i_str,
132*8a106958SDamjan Jovanovic                             size_type           i_nLength );
133*8a106958SDamjan Jovanovic     /// Create a string consisting of a sequence of i_nCount times the same char.
134*8a106958SDamjan Jovanovic     void                assign(
135*8a106958SDamjan Jovanovic                             size_type           i_nCount,
136*8a106958SDamjan Jovanovic                             char                i_c );
137*8a106958SDamjan Jovanovic     /** @precond i_itBegin and i_itEnd are in the same valid
138*8a106958SDamjan Jovanovic         memory-area, such that zero to finite times repetition of
139*8a106958SDamjan Jovanovic         ++i_itBegin leads to i_itBegin == i_itEnd.
140*8a106958SDamjan Jovanovic     */
141*8a106958SDamjan Jovanovic     void                assign(
142*8a106958SDamjan Jovanovic                             const_iterator      i_itBegin,
143*8a106958SDamjan Jovanovic                             const_iterator      i_itEnd );
144*8a106958SDamjan Jovanovic 
145*8a106958SDamjan Jovanovic     // INQUIRY
146*8a106958SDamjan Jovanovic     const char *        c_str() const;
147*8a106958SDamjan Jovanovic     const char *        data() const;
148*8a106958SDamjan Jovanovic 
149*8a106958SDamjan Jovanovic     bool                empty() const;
150*8a106958SDamjan Jovanovic     size_type           size() const;
151*8a106958SDamjan Jovanovic     size_type           length() const;
152*8a106958SDamjan Jovanovic 
153*8a106958SDamjan Jovanovic     const char &        char_at(
154*8a106958SDamjan Jovanovic                             position_type       i_nPosition ) const;
155*8a106958SDamjan Jovanovic 
156*8a106958SDamjan Jovanovic     const_iterator      begin() const;
157*8a106958SDamjan Jovanovic 
158*8a106958SDamjan Jovanovic     /// This is inefficient, so shouldn't be used within loops.
159*8a106958SDamjan Jovanovic     const_iterator      end() const;
160*8a106958SDamjan Jovanovic 
161*8a106958SDamjan Jovanovic     int                 compare(
162*8a106958SDamjan Jovanovic                             const self &        i_rStr ) const;
163*8a106958SDamjan Jovanovic     int                 compare(
164*8a106958SDamjan Jovanovic                             const CharOrder_Table &
165*8a106958SDamjan Jovanovic                                                 i_rOrder,
166*8a106958SDamjan Jovanovic                             const self &        i_rStr ) const;
167*8a106958SDamjan Jovanovic 
168*8a106958SDamjan Jovanovic     self                substr(
169*8a106958SDamjan Jovanovic                             position_type       i_nStartPosition = 0,
170*8a106958SDamjan Jovanovic                             size_type           i_nLength = str::maxsize ) const;
171*8a106958SDamjan Jovanovic 
172*8a106958SDamjan Jovanovic     /** @param i_strToSearch [i_strToSearch != 0]
173*8a106958SDamjan Jovanovic         i_strToSearch == "" will return npos.
174*8a106958SDamjan Jovanovic     */
175*8a106958SDamjan Jovanovic     position_type       find(
176*8a106958SDamjan Jovanovic                             const char *        i_strToSearch,
177*8a106958SDamjan Jovanovic                             position_type       i_nSearchStartPosition = 0 ) const;
178*8a106958SDamjan Jovanovic     position_type       find(
179*8a106958SDamjan Jovanovic                             char                i_charToSearch,
180*8a106958SDamjan Jovanovic                             position_type       i_nSearchStartPosition = 0 ) const;
181*8a106958SDamjan Jovanovic 
182*8a106958SDamjan Jovanovic //***********   Not yet implemented    *********************//
183*8a106958SDamjan Jovanovic     position_type       rfind(
184*8a106958SDamjan Jovanovic                             const char *        i_strToSearch,
185*8a106958SDamjan Jovanovic                             position_type       i_nSearchStartPosition = str::npos ) const;
186*8a106958SDamjan Jovanovic     position_type       rfind(
187*8a106958SDamjan Jovanovic                             char                i_charToSearch,
188*8a106958SDamjan Jovanovic                             position_type       i_nSearchStartPosition = str::npos ) const;
189*8a106958SDamjan Jovanovic 
190*8a106958SDamjan Jovanovic     position_type       find_first_not_of(
191*8a106958SDamjan Jovanovic                             const char *        i_strToSearch,
192*8a106958SDamjan Jovanovic                             position_type       i_nSearchStartPosition = 0 ) const;
193*8a106958SDamjan Jovanovic     position_type       find_first_not_of(
194*8a106958SDamjan Jovanovic                             char                i_charToSearch,
195*8a106958SDamjan Jovanovic                             position_type       i_nSearchStartPosition = 0 ) const;
196*8a106958SDamjan Jovanovic 
197*8a106958SDamjan Jovanovic     position_type       find_last_not_of(
198*8a106958SDamjan Jovanovic                             const char *        i_strToSearch,
199*8a106958SDamjan Jovanovic                             position_type       i_nSearchStartPosition = str::npos ) const;
200*8a106958SDamjan Jovanovic     position_type       find_last_not_of(
201*8a106958SDamjan Jovanovic                             char                i_charToSearch,
202*8a106958SDamjan Jovanovic                             position_type       i_nSearchStartPosition = str::npos ) const;
203*8a106958SDamjan Jovanovic //***********   end - not yet implemented    *****************//
204*8a106958SDamjan Jovanovic 
205*8a106958SDamjan Jovanovic     static const self & Null_();
206*8a106958SDamjan Jovanovic     static const char & Nulch_();
207*8a106958SDamjan Jovanovic 
208*8a106958SDamjan Jovanovic   private:
209*8a106958SDamjan Jovanovic     struct S_Data
210*8a106958SDamjan Jovanovic     {
211*8a106958SDamjan Jovanovic                             S_Data();
212*8a106958SDamjan Jovanovic         /// @precond i_nValidLength <= strlen(i_sData) or i_nValidLength == str::maxsize.
213*8a106958SDamjan Jovanovic         explicit            S_Data(
214*8a106958SDamjan Jovanovic                                 const char *        i_sData,
215*8a106958SDamjan Jovanovic                                 size_type           i_nValidLength = str::maxsize );
216*8a106958SDamjan Jovanovic                             ~S_Data();
217*8a106958SDamjan Jovanovic 
218*8a106958SDamjan Jovanovic         const S_Data *      Acquire() const;
219*8a106958SDamjan Jovanovic 
220*8a106958SDamjan Jovanovic         /// Deletes this, if nCount becomes 0.
221*8a106958SDamjan Jovanovic         void                Release() const;
222*8a106958SDamjan Jovanovic 
223*8a106958SDamjan Jovanovic         StringData<char>    aStr;
224*8a106958SDamjan Jovanovic         mutable UINT32      nCount;
225*8a106958SDamjan Jovanovic 
226*8a106958SDamjan Jovanovic       private:
227*8a106958SDamjan Jovanovic         // Forbidden functions, because this is a refcounted structure.
228*8a106958SDamjan Jovanovic                             S_Data(const S_Data&);
229*8a106958SDamjan Jovanovic         S_Data &            operator=(const S_Data&);
230*8a106958SDamjan Jovanovic     };
231*8a106958SDamjan Jovanovic 
232*8a106958SDamjan Jovanovic     // Locals
233*8a106958SDamjan Jovanovic     const StringData<char> &
234*8a106958SDamjan Jovanovic                         Str() const;
235*8a106958SDamjan Jovanovic 
236*8a106958SDamjan Jovanovic     // DATA
237*8a106958SDamjan Jovanovic     const S_Data *      pd;
238*8a106958SDamjan Jovanovic };
239*8a106958SDamjan Jovanovic 
240*8a106958SDamjan Jovanovic 
241*8a106958SDamjan Jovanovic //**********            Global compare functions            ***************//
242*8a106958SDamjan Jovanovic 
243*8a106958SDamjan Jovanovic     //*** Natural order, no substrings
244*8a106958SDamjan Jovanovic 
245*8a106958SDamjan Jovanovic inline int          compare(
246*8a106958SDamjan Jovanovic                         const String &          i_s1,
247*8a106958SDamjan Jovanovic                         const String &          i_s2 );
248*8a106958SDamjan Jovanovic inline int          compare(
249*8a106958SDamjan Jovanovic                         const String &          i_s1,
250*8a106958SDamjan Jovanovic                         const char *            i_s2 );
251*8a106958SDamjan Jovanovic inline int          compare(
252*8a106958SDamjan Jovanovic                         const char *            i_s1,
253*8a106958SDamjan Jovanovic                         const String &          i_s2 );
254*8a106958SDamjan Jovanovic inline int          compare(
255*8a106958SDamjan Jovanovic                         const char *            i_s1,
256*8a106958SDamjan Jovanovic                         const char *            i_s2 );
257*8a106958SDamjan Jovanovic 
258*8a106958SDamjan Jovanovic     //*** Natural order, substrings
259*8a106958SDamjan Jovanovic 
260*8a106958SDamjan Jovanovic int                 compare(
261*8a106958SDamjan Jovanovic                         const String &          i_s1,
262*8a106958SDamjan Jovanovic                         csv::str::position      i_nStartPosition1,
263*8a106958SDamjan Jovanovic                         const char *            i_s2,
264*8a106958SDamjan Jovanovic                         csv::str::size          i_nLength );
265*8a106958SDamjan Jovanovic int                 compare(
266*8a106958SDamjan Jovanovic                         const char *            i_s1,
267*8a106958SDamjan Jovanovic                         const String &          i_s2,
268*8a106958SDamjan Jovanovic                         csv::str::position      i_nStartPosition2,
269*8a106958SDamjan Jovanovic                         csv::str::size          i_nLength );
270*8a106958SDamjan Jovanovic inline int          compare(
271*8a106958SDamjan Jovanovic                         const char *            i_s1,
272*8a106958SDamjan Jovanovic                         const char *            i_s2,
273*8a106958SDamjan Jovanovic                         csv::str::size          i_nLength );
274*8a106958SDamjan Jovanovic 
275*8a106958SDamjan Jovanovic     //*** Defined order, no substrings
276*8a106958SDamjan Jovanovic 
277*8a106958SDamjan Jovanovic inline int          compare(
278*8a106958SDamjan Jovanovic                         const CharOrder_Table & i_rOrder,
279*8a106958SDamjan Jovanovic                         const String &          i_s1,
280*8a106958SDamjan Jovanovic                         const char *            i_s2 );
281*8a106958SDamjan Jovanovic inline int          compare(
282*8a106958SDamjan Jovanovic                         const CharOrder_Table & i_rOrder,
283*8a106958SDamjan Jovanovic                         const char *            i_s1,
284*8a106958SDamjan Jovanovic                         const String &          i_s2 );
285*8a106958SDamjan Jovanovic int                 compare(
286*8a106958SDamjan Jovanovic                         const CharOrder_Table & i_rOrder,
287*8a106958SDamjan Jovanovic                         const char *            i_s1,
288*8a106958SDamjan Jovanovic                         const char *            i_s2 );
289*8a106958SDamjan Jovanovic 
290*8a106958SDamjan Jovanovic     //*** Defined order, substrings
291*8a106958SDamjan Jovanovic 
292*8a106958SDamjan Jovanovic int                 compare(
293*8a106958SDamjan Jovanovic                         const CharOrder_Table & i_rOrder,
294*8a106958SDamjan Jovanovic                         const String &          i_s1,
295*8a106958SDamjan Jovanovic                         csv::str::position      i_nStartPosition1,
296*8a106958SDamjan Jovanovic                         const char *            i_s2,
297*8a106958SDamjan Jovanovic                         csv::str::size          i_nLength2 );
298*8a106958SDamjan Jovanovic int                 compare(
299*8a106958SDamjan Jovanovic                         const CharOrder_Table & i_rOrder,
300*8a106958SDamjan Jovanovic                         const char *            i_s1,
301*8a106958SDamjan Jovanovic                         const String &          i_s2,
302*8a106958SDamjan Jovanovic                         csv::str::position      i_nStartPosition2,
303*8a106958SDamjan Jovanovic                         csv::str::size          i_nLength );
304*8a106958SDamjan Jovanovic int                 compare(
305*8a106958SDamjan Jovanovic                         const CharOrder_Table & i_rOrder,
306*8a106958SDamjan Jovanovic                         const char *            i_s1,
307*8a106958SDamjan Jovanovic                         const char *            i_s2,
308*8a106958SDamjan Jovanovic                         csv::str::size          i_nLength );
309*8a106958SDamjan Jovanovic 
310*8a106958SDamjan Jovanovic 
311*8a106958SDamjan Jovanovic }   // namespace csv
312*8a106958SDamjan Jovanovic 
313*8a106958SDamjan Jovanovic 
314*8a106958SDamjan Jovanovic 
315*8a106958SDamjan Jovanovic 
316*8a106958SDamjan Jovanovic //******************    global comparation operators   *********************//
317*8a106958SDamjan Jovanovic 
318*8a106958SDamjan Jovanovic inline bool         operator==(
319*8a106958SDamjan Jovanovic                         const csv::String &         i_s1,
320*8a106958SDamjan Jovanovic                         const char *                i_s2 );
321*8a106958SDamjan Jovanovic inline bool         operator!=(
322*8a106958SDamjan Jovanovic                         const csv::String &         i_s1,
323*8a106958SDamjan Jovanovic                         const char *                i_s2 );
324*8a106958SDamjan Jovanovic inline bool         operator<(
325*8a106958SDamjan Jovanovic                         const csv::String &         i_s1,
326*8a106958SDamjan Jovanovic                         const char *                i_s2 );
327*8a106958SDamjan Jovanovic inline bool         operator>(
328*8a106958SDamjan Jovanovic                         const csv::String &         i_s1,
329*8a106958SDamjan Jovanovic                         const char *                i_s2 );
330*8a106958SDamjan Jovanovic inline bool         operator<=(
331*8a106958SDamjan Jovanovic                         const csv::String &         i_s1,
332*8a106958SDamjan Jovanovic                         const char *                i_s2 );
333*8a106958SDamjan Jovanovic inline bool         operator>=(
334*8a106958SDamjan Jovanovic                         const csv::String &         i_s1,
335*8a106958SDamjan Jovanovic                         const char *                i_s2 );
336*8a106958SDamjan Jovanovic 
337*8a106958SDamjan Jovanovic inline bool         operator==(
338*8a106958SDamjan Jovanovic                         const char *                i_s1,
339*8a106958SDamjan Jovanovic                         const csv::String &         i_s2 );
340*8a106958SDamjan Jovanovic inline bool         operator!=(
341*8a106958SDamjan Jovanovic                         const char *                i_s1,
342*8a106958SDamjan Jovanovic                         const csv::String &         i_s2 );
343*8a106958SDamjan Jovanovic inline bool         operator<(
344*8a106958SDamjan Jovanovic                         const char *                i_s1,
345*8a106958SDamjan Jovanovic                         const csv::String &         i_s2 );
346*8a106958SDamjan Jovanovic inline bool         operator>(
347*8a106958SDamjan Jovanovic                         const char *                i_s1,
348*8a106958SDamjan Jovanovic                         const csv::String &         i_s2 );
349*8a106958SDamjan Jovanovic inline bool         operator<=(
350*8a106958SDamjan Jovanovic                         const char *                i_s1,
351*8a106958SDamjan Jovanovic                         const csv::String &         i_s2 );
352*8a106958SDamjan Jovanovic inline bool         operator>=(
353*8a106958SDamjan Jovanovic                         const char *                i_s1,
354*8a106958SDamjan Jovanovic                         const csv::String &         i_s2 );
355*8a106958SDamjan Jovanovic 
356*8a106958SDamjan Jovanovic 
357*8a106958SDamjan Jovanovic //******************    global stream operators   *********************//
358*8a106958SDamjan Jovanovic 
359*8a106958SDamjan Jovanovic 
360*8a106958SDamjan Jovanovic inline csv::ostream &
361*8a106958SDamjan Jovanovic operator<<( csv::ostream &        o_rOut,
362*8a106958SDamjan Jovanovic             const csv::String &   i_rSrc );
363*8a106958SDamjan Jovanovic 
364*8a106958SDamjan Jovanovic 
365*8a106958SDamjan Jovanovic 
366*8a106958SDamjan Jovanovic 
367*8a106958SDamjan Jovanovic // IMPLEMENTATION
368*8a106958SDamjan Jovanovic namespace csv
369*8a106958SDamjan Jovanovic {
370*8a106958SDamjan Jovanovic 
371*8a106958SDamjan Jovanovic 
372*8a106958SDamjan Jovanovic inline const StringData<char> &
Str() const373*8a106958SDamjan Jovanovic String::Str() const
374*8a106958SDamjan Jovanovic { return pd->aStr; }
375*8a106958SDamjan Jovanovic 
376*8a106958SDamjan Jovanovic 
377*8a106958SDamjan Jovanovic inline const char &
char_at(position_type i_nPosition) const378*8a106958SDamjan Jovanovic String::char_at( position_type i_nPosition ) const
379*8a106958SDamjan Jovanovic { if ( i_nPosition < Str().Size() )
380*8a106958SDamjan Jovanovic       return Str().Data()[i_nPosition];
381*8a106958SDamjan Jovanovic   return Nulch_();
382*8a106958SDamjan Jovanovic }
383*8a106958SDamjan Jovanovic 
384*8a106958SDamjan Jovanovic inline bool
operator ==(const self & i_rStr) const385*8a106958SDamjan Jovanovic String::operator==( const self &        i_rStr ) const
386*8a106958SDamjan Jovanovic { return compare(i_rStr) == 0; }
387*8a106958SDamjan Jovanovic 
388*8a106958SDamjan Jovanovic inline bool
operator !=(const self & i_rStr) const389*8a106958SDamjan Jovanovic String::operator!=( const self &        i_rStr ) const
390*8a106958SDamjan Jovanovic { return compare(i_rStr) != 0; }
391*8a106958SDamjan Jovanovic 
392*8a106958SDamjan Jovanovic inline bool
operator <(const self & i_rStr) const393*8a106958SDamjan Jovanovic String::operator<( const self &        i_rStr ) const
394*8a106958SDamjan Jovanovic { return compare(i_rStr) < 0; }
395*8a106958SDamjan Jovanovic 
396*8a106958SDamjan Jovanovic inline bool
operator >(const self & i_rStr) const397*8a106958SDamjan Jovanovic String::operator>( const self &        i_rStr ) const
398*8a106958SDamjan Jovanovic { return compare(i_rStr) > 0; }
399*8a106958SDamjan Jovanovic 
400*8a106958SDamjan Jovanovic inline bool
operator <=(const self & i_rStr) const401*8a106958SDamjan Jovanovic String::operator<=( const self &        i_rStr ) const
402*8a106958SDamjan Jovanovic { return compare(i_rStr) <= 0; }
403*8a106958SDamjan Jovanovic 
404*8a106958SDamjan Jovanovic inline bool
operator >=(const self & i_rStr) const405*8a106958SDamjan Jovanovic String::operator>=( const self &        i_rStr ) const
406*8a106958SDamjan Jovanovic { return compare(i_rStr) >= 0; }
407*8a106958SDamjan Jovanovic 
408*8a106958SDamjan Jovanovic inline void
clear()409*8a106958SDamjan Jovanovic String::clear()
410*8a106958SDamjan Jovanovic { operator=( String::Null_() ); }
411*8a106958SDamjan Jovanovic 
412*8a106958SDamjan Jovanovic inline const char *
c_str() const413*8a106958SDamjan Jovanovic String::c_str() const
414*8a106958SDamjan Jovanovic { return Str().Data(); }
415*8a106958SDamjan Jovanovic 
416*8a106958SDamjan Jovanovic inline
operator const char*() const417*8a106958SDamjan Jovanovic String::operator const char * () const
418*8a106958SDamjan Jovanovic { return c_str(); }
419*8a106958SDamjan Jovanovic 
420*8a106958SDamjan Jovanovic inline const char *
data() const421*8a106958SDamjan Jovanovic String::data() const
422*8a106958SDamjan Jovanovic { return c_str(); }
423*8a106958SDamjan Jovanovic 
424*8a106958SDamjan Jovanovic inline String::size_type
size() const425*8a106958SDamjan Jovanovic String::size() const
426*8a106958SDamjan Jovanovic { return Str().Size(); }
427*8a106958SDamjan Jovanovic 
428*8a106958SDamjan Jovanovic inline bool
empty() const429*8a106958SDamjan Jovanovic String::empty() const
430*8a106958SDamjan Jovanovic { return size() == 0; }
431*8a106958SDamjan Jovanovic 
432*8a106958SDamjan Jovanovic inline String::size_type
length() const433*8a106958SDamjan Jovanovic String::length() const
434*8a106958SDamjan Jovanovic { return size(); }
435*8a106958SDamjan Jovanovic 
436*8a106958SDamjan Jovanovic inline String::const_iterator
begin() const437*8a106958SDamjan Jovanovic String::begin() const
438*8a106958SDamjan Jovanovic { return data(); }
439*8a106958SDamjan Jovanovic 
440*8a106958SDamjan Jovanovic inline String::const_iterator
end() const441*8a106958SDamjan Jovanovic String::end() const
442*8a106958SDamjan Jovanovic { return data() + size(); }
443*8a106958SDamjan Jovanovic 
444*8a106958SDamjan Jovanovic 
445*8a106958SDamjan Jovanovic 
446*8a106958SDamjan Jovanovic //******************     global compare-functions      ********************//
447*8a106958SDamjan Jovanovic inline int
compare(const String & i_s1,const String & i_s2)448*8a106958SDamjan Jovanovic compare( const String &          i_s1,
449*8a106958SDamjan Jovanovic          const String &          i_s2 )
450*8a106958SDamjan Jovanovic { return i_s1.compare(i_s2); }
451*8a106958SDamjan Jovanovic 
452*8a106958SDamjan Jovanovic inline int
compare(const String & i_s1,const char * i_s2)453*8a106958SDamjan Jovanovic compare( const String &                     i_s1,
454*8a106958SDamjan Jovanovic          const char *                       i_s2 )
455*8a106958SDamjan Jovanovic { return strcmp(i_s1.c_str(), i_s2); }
456*8a106958SDamjan Jovanovic 
457*8a106958SDamjan Jovanovic inline int
compare(const char * i_s1,const String & i_s2)458*8a106958SDamjan Jovanovic compare( const char *                       i_s1,
459*8a106958SDamjan Jovanovic          const String &                     i_s2 )
460*8a106958SDamjan Jovanovic { return strcmp(i_s1, i_s2.c_str()); }
461*8a106958SDamjan Jovanovic 
462*8a106958SDamjan Jovanovic inline int
compare(const char * i_s1,const char * i_s2)463*8a106958SDamjan Jovanovic compare( const char *            i_s1,
464*8a106958SDamjan Jovanovic          const char *            i_s2 )
465*8a106958SDamjan Jovanovic { return strcmp(i_s1, i_s2); }
466*8a106958SDamjan Jovanovic 
467*8a106958SDamjan Jovanovic inline int
compare(const char * i_s1,const char * i_s2,str::size i_nLength)468*8a106958SDamjan Jovanovic compare( const char *                    i_s1,
469*8a106958SDamjan Jovanovic          const char *                    i_s2,
470*8a106958SDamjan Jovanovic          str::size                       i_nLength )
471*8a106958SDamjan Jovanovic { return strncmp( i_s1, i_s2, i_nLength ); }
472*8a106958SDamjan Jovanovic 
473*8a106958SDamjan Jovanovic inline int
compare(const CharOrder_Table & i_rOrder,const String & i_s1,const char * i_s2)474*8a106958SDamjan Jovanovic compare( const CharOrder_Table &            i_rOrder,
475*8a106958SDamjan Jovanovic          const String &                     i_s1,
476*8a106958SDamjan Jovanovic          const char *                       i_s2 )
477*8a106958SDamjan Jovanovic { return compare( i_rOrder, i_s1.c_str(), i_s2 ); }
478*8a106958SDamjan Jovanovic 
479*8a106958SDamjan Jovanovic inline int
compare(const CharOrder_Table & i_rOrder,const char * i_s1,const String & i_s2)480*8a106958SDamjan Jovanovic compare( const CharOrder_Table &            i_rOrder,
481*8a106958SDamjan Jovanovic          const char *                       i_s1,
482*8a106958SDamjan Jovanovic          const String &                     i_s2 )
483*8a106958SDamjan Jovanovic { return compare( i_rOrder, i_s1, i_s2.c_str() ); }
484*8a106958SDamjan Jovanovic 
485*8a106958SDamjan Jovanovic 
486*8a106958SDamjan Jovanovic }   // namespace csv
487*8a106958SDamjan Jovanovic 
488*8a106958SDamjan Jovanovic 
489*8a106958SDamjan Jovanovic inline bool
operator ==(const csv::String & i_s1,const char * i_s2)490*8a106958SDamjan Jovanovic operator==( const csv::String &         i_s1,
491*8a106958SDamjan Jovanovic             const char *                i_s2 )
492*8a106958SDamjan Jovanovic { return csv::compare( i_s1, i_s2 ) == 0; }
493*8a106958SDamjan Jovanovic 
494*8a106958SDamjan Jovanovic inline bool
operator !=(const csv::String & i_s1,const char * i_s2)495*8a106958SDamjan Jovanovic operator!=( const csv::String &         i_s1,
496*8a106958SDamjan Jovanovic             const char *                i_s2 )
497*8a106958SDamjan Jovanovic { return csv::compare( i_s1, i_s2 ) != 0; }
498*8a106958SDamjan Jovanovic 
499*8a106958SDamjan Jovanovic inline bool
operator <(const csv::String & i_s1,const char * i_s2)500*8a106958SDamjan Jovanovic operator<( const csv::String &         i_s1,
501*8a106958SDamjan Jovanovic            const char *                i_s2 )
502*8a106958SDamjan Jovanovic { return csv::compare( i_s1, i_s2 ) < 0; }
503*8a106958SDamjan Jovanovic 
504*8a106958SDamjan Jovanovic inline bool
operator >(const csv::String & i_s1,const char * i_s2)505*8a106958SDamjan Jovanovic operator>( const csv::String &         i_s1,
506*8a106958SDamjan Jovanovic            const char *                i_s2 )
507*8a106958SDamjan Jovanovic { return csv::compare( i_s1, i_s2 ) > 0; }
508*8a106958SDamjan Jovanovic 
509*8a106958SDamjan Jovanovic inline bool
operator <=(const csv::String & i_s1,const char * i_s2)510*8a106958SDamjan Jovanovic operator<=( const csv::String &         i_s1,
511*8a106958SDamjan Jovanovic             const char *                i_s2 )
512*8a106958SDamjan Jovanovic { return csv::compare( i_s1, i_s2 ) <= 0; }
513*8a106958SDamjan Jovanovic 
514*8a106958SDamjan Jovanovic inline bool
operator >=(const csv::String & i_s1,const char * i_s2)515*8a106958SDamjan Jovanovic operator>=( const csv::String &         i_s1,
516*8a106958SDamjan Jovanovic             const char *                i_s2 )
517*8a106958SDamjan Jovanovic { return csv::compare( i_s1, i_s2 ) >= 0; }
518*8a106958SDamjan Jovanovic 
519*8a106958SDamjan Jovanovic 
520*8a106958SDamjan Jovanovic inline bool
operator ==(const char * i_s1,const csv::String & i_s2)521*8a106958SDamjan Jovanovic operator==( const char *                i_s1,
522*8a106958SDamjan Jovanovic             const csv::String &         i_s2 )
523*8a106958SDamjan Jovanovic { return csv::compare( i_s1, i_s2 ) == 0; }
524*8a106958SDamjan Jovanovic 
525*8a106958SDamjan Jovanovic inline bool
operator !=(const char * i_s1,const csv::String & i_s2)526*8a106958SDamjan Jovanovic operator!=( const char *                i_s1,
527*8a106958SDamjan Jovanovic             const csv::String &         i_s2 )
528*8a106958SDamjan Jovanovic { return csv::compare( i_s1, i_s2 ) != 0; }
529*8a106958SDamjan Jovanovic 
530*8a106958SDamjan Jovanovic inline bool
operator <(const char * i_s1,const csv::String & i_s2)531*8a106958SDamjan Jovanovic operator<( const char *                i_s1,
532*8a106958SDamjan Jovanovic            const csv::String &         i_s2 )
533*8a106958SDamjan Jovanovic { return csv::compare( i_s1, i_s2 ) < 0; }
534*8a106958SDamjan Jovanovic 
535*8a106958SDamjan Jovanovic inline bool
operator >(const char * i_s1,const csv::String & i_s2)536*8a106958SDamjan Jovanovic operator>( const char *                i_s1,
537*8a106958SDamjan Jovanovic            const csv::String &         i_s2 )
538*8a106958SDamjan Jovanovic { return csv::compare( i_s1, i_s2 ) > 0; }
539*8a106958SDamjan Jovanovic 
540*8a106958SDamjan Jovanovic inline bool
operator <=(const char * i_s1,const csv::String & i_s2)541*8a106958SDamjan Jovanovic operator<=( const char *                i_s1,
542*8a106958SDamjan Jovanovic             const csv::String &         i_s2 )
543*8a106958SDamjan Jovanovic { return csv::compare( i_s1, i_s2 ) <= 0; }
544*8a106958SDamjan Jovanovic 
545*8a106958SDamjan Jovanovic inline bool
operator >=(const char * i_s1,const csv::String & i_s2)546*8a106958SDamjan Jovanovic operator>=( const char *                i_s1,
547*8a106958SDamjan Jovanovic             const csv::String &         i_s2 )
548*8a106958SDamjan Jovanovic { return csv::compare( i_s1, i_s2 ) >= 0; }
549*8a106958SDamjan Jovanovic 
550*8a106958SDamjan Jovanovic 
551*8a106958SDamjan Jovanovic     //************    global stream operators   **************//
552*8a106958SDamjan Jovanovic 
553*8a106958SDamjan Jovanovic 
554*8a106958SDamjan Jovanovic inline csv::ostream &
operator <<(csv::ostream & o_rOut,const csv::String & i_rSrc)555*8a106958SDamjan Jovanovic operator<<( csv::ostream &        o_rOut,
556*8a106958SDamjan Jovanovic             const csv::String &   i_rSrc )
557*8a106958SDamjan Jovanovic     { o_rOut << i_rSrc.c_str(); return o_rOut; }
558*8a106958SDamjan Jovanovic 
559*8a106958SDamjan Jovanovic 
560*8a106958SDamjan Jovanovic 
561*8a106958SDamjan Jovanovic 
562*8a106958SDamjan Jovanovic 
563*8a106958SDamjan Jovanovic //******************    typedefs   *********************//
564*8a106958SDamjan Jovanovic 
565*8a106958SDamjan Jovanovic namespace csv
566*8a106958SDamjan Jovanovic {
567*8a106958SDamjan Jovanovic 
568*8a106958SDamjan Jovanovic typedef std::vector<String>   StringVector;
569*8a106958SDamjan Jovanovic 
570*8a106958SDamjan Jovanovic }
571*8a106958SDamjan Jovanovic 
572*8a106958SDamjan Jovanovic 
573*8a106958SDamjan Jovanovic 
574*8a106958SDamjan Jovanovic 
575*8a106958SDamjan Jovanovic #endif
576