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> & 373*11c03c6dSDamjan Jovanovic String::Str() const 374*11c03c6dSDamjan Jovanovic { return pd->aStr; } 375*11c03c6dSDamjan Jovanovic 376*11c03c6dSDamjan Jovanovic 377*11c03c6dSDamjan Jovanovic inline const char & 378*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 385*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 389*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 393*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 397*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 401*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 405*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 409*11c03c6dSDamjan Jovanovic String::clear() 410*11c03c6dSDamjan Jovanovic { operator=( String::Null_() ); } 411*11c03c6dSDamjan Jovanovic 412*11c03c6dSDamjan Jovanovic inline const char * 413*11c03c6dSDamjan Jovanovic String::c_str() const 414*11c03c6dSDamjan Jovanovic { return Str().Data(); } 415*11c03c6dSDamjan Jovanovic 416*11c03c6dSDamjan Jovanovic inline 417*11c03c6dSDamjan Jovanovic String::operator const char * () const 418*11c03c6dSDamjan Jovanovic { return c_str(); } 419*11c03c6dSDamjan Jovanovic 420*11c03c6dSDamjan Jovanovic inline const char * 421*11c03c6dSDamjan Jovanovic String::data() const 422*11c03c6dSDamjan Jovanovic { return c_str(); } 423*11c03c6dSDamjan Jovanovic 424*11c03c6dSDamjan Jovanovic inline String::size_type 425*11c03c6dSDamjan Jovanovic String::size() const 426*11c03c6dSDamjan Jovanovic { return Str().Size(); } 427*11c03c6dSDamjan Jovanovic 428*11c03c6dSDamjan Jovanovic inline bool 429*11c03c6dSDamjan Jovanovic String::empty() const 430*11c03c6dSDamjan Jovanovic { return size() == 0; } 431*11c03c6dSDamjan Jovanovic 432*11c03c6dSDamjan Jovanovic inline String::size_type 433*11c03c6dSDamjan Jovanovic String::length() const 434*11c03c6dSDamjan Jovanovic { return size(); } 435*11c03c6dSDamjan Jovanovic 436*11c03c6dSDamjan Jovanovic inline String::const_iterator 437*11c03c6dSDamjan Jovanovic String::begin() const 438*11c03c6dSDamjan Jovanovic { return data(); } 439*11c03c6dSDamjan Jovanovic 440*11c03c6dSDamjan Jovanovic inline String::const_iterator 441*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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 & 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