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