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