LCOV - code coverage report
Current view: top level - libreoffice/solver/unxlngi6.pro/inc/cosv - string.hxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 35 36 97.2 %
Date: 2012-12-27 Functions: 17 17 100.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #ifndef COSV_STRING_HXX
      21             : #define COSV_STRING_HXX
      22             : 
      23             : // USED SERVICES
      24             : #include <string.h>
      25             : #include <cosv/stringdata.hxx>
      26             : #include <cosv/str_types.hxx>
      27             : #include <cosv/csv_ostream.hxx>
      28             : #include <vector>
      29             : 
      30             : 
      31             : 
      32             : 
      33             : namespace csv
      34             : {
      35             : 
      36             : 
      37             : /** The Simple String:
      38             :         It is used to just hold short to middle long texts as
      39             :         data, which are constant at most times. They are reference
      40             :         counted, so they are space efficient and have constant time
      41             :         copy semantics.
      42             : 
      43             :     For all compare() functions the return value is like in strcmp().
      44             : 
      45             :     @attention
      46             :     The present version of this class is NOT thread safe.
      47             : */
      48             : 
      49             : 
      50             : class String
      51             : {
      52             :   public:
      53             :     typedef String              self;
      54             : 
      55             :     typedef str::size           size_type;
      56             :     typedef str::position       position_type;
      57             : 
      58             :     typedef const char *        const_iterator;
      59             : 
      60             :     // LIFECYCLE
      61             :                         String();
      62             : 
      63             :     /// Intentionally not explicit, smooth casting is intended.
      64             :                         String(
      65             :                             const char *        i_str );
      66             :     /// @precond i_nLength <= strlen(i_str) or i_nLength == str::maxsize.
      67             :                         String(
      68             :                             const char *        i_str,
      69             :                             size_type           i_nLength );
      70             : 
      71             :     /** @precond i_itBegin and i_itEnd are in the same valid
      72             :         memory-area, such that zero to finite times repetition of
      73             :         ++i_itBegin leads to i_itBegin == i_itEnd.
      74             :     */
      75             :                         String(
      76             :                             const_iterator      i_itBegin,
      77             :                             const_iterator      i_itEnd );
      78             : 
      79             :                         String(
      80             :                             const self &        i_rStr );
      81             : 
      82             :                         ~String();
      83             :     // OPERATORS
      84             :     self &              operator=(
      85             :                             const self &        i_rStr );
      86             :     self &              operator=(
      87             :                             const char *        i_str );
      88             : 
      89             :                         operator const char * () const;
      90             : 
      91             :     bool                operator==(
      92             :                             const self &        i_rStr ) const;
      93             :     bool                operator!=(
      94             :                             const self &        i_rStr ) const;
      95             :     bool                operator<(
      96             :                             const self &        i_rStr ) const;
      97             :     bool                operator>(
      98             :                             const self &        i_rStr ) const;
      99             :     bool                operator<=(
     100             :                             const self &        i_rStr ) const;
     101             :     bool                operator>=(
     102             :                             const self &        i_rStr ) const;
     103             : 
     104             :     // OPERATIONS
     105             :     void                clear();
     106             : 
     107             :     /// @precond i_nLength == str::maxsize OR i_nLength < strlen(i_str) .
     108             :     void                assign(
     109             :                             const char *        i_str,
     110             :                             size_type           i_nLength );
     111             :     /// Create a string consisting of a sequence of i_nCount times the same char.
     112             :     void                assign(
     113             :                             size_type           i_nCount,
     114             :                             char                i_c );
     115             : 
     116             :     // INQUIRY
     117             :     const char *        c_str() const;
     118             :     const char *        data() const;
     119             : 
     120             :     bool                empty() const;
     121             :     size_type           size() const;
     122             :     size_type           length() const;
     123             : 
     124             :     const char &        char_at(
     125             :                             position_type       i_nPosition ) const;
     126             : 
     127             :     const_iterator      begin() const;
     128             : 
     129             :     /// This is inefficient, so shouldn't be used within loops.
     130             :     const_iterator      end() const;
     131             : 
     132             :     int                 compare(
     133             :                             const self &        i_rStr ) const;
     134             :     int                 compare(
     135             :                             const CharOrder_Table &
     136             :                                                 i_rOrder,
     137             :                             const self &        i_rStr ) const;
     138             : 
     139             : //***********   Not yet implemented    *********************//
     140             :     position_type       rfind(
     141             :                             const char *        i_strToSearch,
     142             :                             position_type       i_nSearchStartPosition = str::npos ) const;
     143             :     position_type       rfind(
     144             :                             char                i_charToSearch,
     145             :                             position_type       i_nSearchStartPosition = str::npos ) const;
     146             : 
     147             :     position_type       find_first_not_of(
     148             :                             const char *        i_strToSearch,
     149             :                             position_type       i_nSearchStartPosition = 0 ) const;
     150             :     position_type       find_first_not_of(
     151             :                             char                i_charToSearch,
     152             :                             position_type       i_nSearchStartPosition = 0 ) const;
     153             : 
     154             :     position_type       find_last_not_of(
     155             :                             const char *        i_strToSearch,
     156             :                             position_type       i_nSearchStartPosition = str::npos ) const;
     157             :     position_type       find_last_not_of(
     158             :                             char                i_charToSearch,
     159             :                             position_type       i_nSearchStartPosition = str::npos ) const;
     160             : //***********   end - not yet implemented    *****************//
     161             : 
     162             :     static const self & Null_();
     163             :     static const char & Nulch_();
     164             : 
     165             :   private:
     166             :     struct S_Data
     167             :     {
     168             :                             S_Data();
     169             :         /// @precond i_nValidLength <= strlen(i_sData) or i_nValidLength == str::maxsize.
     170             :         explicit            S_Data(
     171             :                                 const char *        i_sData,
     172             :                                 size_type           i_nValidLength = str::maxsize );
     173             :                             ~S_Data();
     174             : 
     175             :         const S_Data *      Acquire() const;
     176             : 
     177             :         /// Deletes this, if nCount becomes 0.
     178             :         void                Release() const;
     179             : 
     180             :         StringData<char>    aStr;
     181             :         mutable UINT32      nCount;
     182             : 
     183             :       private:
     184             :         // Forbidden functions, because this is a refcounted structure.
     185             :                             S_Data(const S_Data&);
     186             :         S_Data &            operator=(const S_Data&);
     187             :     };
     188             : 
     189             :     // Locals
     190             :     const StringData<char> &
     191             :                         Str() const;
     192             : 
     193             :     // DATA
     194             :     const S_Data *      pd;
     195             : };
     196             : 
     197             : 
     198             : //**********            Global compare functions            ***************//
     199             : 
     200             :     //*** Natural order, no substrings
     201             : 
     202             : inline int          compare(
     203             :                         const String &          i_s1,
     204             :                         const String &          i_s2 );
     205             : inline int          compare(
     206             :                         const String &          i_s1,
     207             :                         const char *            i_s2 );
     208             : inline int          compare(
     209             :                         const char *            i_s1,
     210             :                         const String &          i_s2 );
     211             : inline int          compare(
     212             :                         const char *            i_s1,
     213             :                         const char *            i_s2 );
     214             : 
     215             :     //*** Natural order, substrings
     216             : 
     217             : int                 compare(
     218             :                         const String &          i_s1,
     219             :                         csv::str::position      i_nStartPosition1,
     220             :                         const char *            i_s2,
     221             :                         csv::str::size          i_nLength );
     222             : inline int          compare(
     223             :                         const char *            i_s1,
     224             :                         const char *            i_s2,
     225             :                         csv::str::size          i_nLength );
     226             : 
     227             :     //*** Defined order, no substrings
     228             : 
     229             : inline int          compare(
     230             :                         const CharOrder_Table & i_rOrder,
     231             :                         const String &          i_s1,
     232             :                         const char *            i_s2 );
     233             : inline int          compare(
     234             :                         const CharOrder_Table & i_rOrder,
     235             :                         const char *            i_s1,
     236             :                         const String &          i_s2 );
     237             : int                 compare(
     238             :                         const CharOrder_Table & i_rOrder,
     239             :                         const char *            i_s1,
     240             :                         const char *            i_s2 );
     241             : }   // namespace csv
     242             : 
     243             : 
     244             : 
     245             : 
     246             : //******************    global comparation operators   *********************//
     247             : 
     248             : inline bool         operator==(
     249             :                         const csv::String &         i_s1,
     250             :                         const char *                i_s2 );
     251             : inline bool         operator!=(
     252             :                         const csv::String &         i_s1,
     253             :                         const char *                i_s2 );
     254             : inline bool         operator<(
     255             :                         const csv::String &         i_s1,
     256             :                         const char *                i_s2 );
     257             : inline bool         operator>(
     258             :                         const csv::String &         i_s1,
     259             :                         const char *                i_s2 );
     260             : inline bool         operator<=(
     261             :                         const csv::String &         i_s1,
     262             :                         const char *                i_s2 );
     263             : inline bool         operator>=(
     264             :                         const csv::String &         i_s1,
     265             :                         const char *                i_s2 );
     266             : 
     267             : inline bool         operator==(
     268             :                         const char *                i_s1,
     269             :                         const csv::String &         i_s2 );
     270             : inline bool         operator!=(
     271             :                         const char *                i_s1,
     272             :                         const csv::String &         i_s2 );
     273             : inline bool         operator<(
     274             :                         const char *                i_s1,
     275             :                         const csv::String &         i_s2 );
     276             : inline bool         operator>(
     277             :                         const char *                i_s1,
     278             :                         const csv::String &         i_s2 );
     279             : inline bool         operator<=(
     280             :                         const char *                i_s1,
     281             :                         const csv::String &         i_s2 );
     282             : inline bool         operator>=(
     283             :                         const char *                i_s1,
     284             :                         const csv::String &         i_s2 );
     285             : 
     286             : 
     287             : //******************    global stream operators   *********************//
     288             : 
     289             : 
     290             : inline csv::ostream &
     291             : operator<<( csv::ostream &        o_rOut,
     292             :             const csv::String &   i_rSrc );
     293             : 
     294             : 
     295             : 
     296             : 
     297             : // IMPLEMENTATION
     298             : namespace csv
     299             : {
     300             : 
     301             : 
     302             : inline const StringData<char> &
     303    33900673 : String::Str() const
     304    33900673 : { return pd->aStr; }
     305             : 
     306             : 
     307             : inline const char &
     308           5 : String::char_at( position_type i_nPosition ) const
     309           5 : { if ( i_nPosition < Str().Size() )
     310           5 :       return Str().Data()[i_nPosition];
     311           0 :   return Nulch_();
     312             : }
     313             : 
     314             : inline bool
     315      402102 : String::operator==( const self &        i_rStr ) const
     316      402102 : { return compare(i_rStr) == 0; }
     317             : 
     318             : inline bool
     319        1239 : String::operator!=( const self &        i_rStr ) const
     320        1239 : { return compare(i_rStr) != 0; }
     321             : 
     322             : inline bool
     323     1897185 : String::operator<( const self &        i_rStr ) const
     324     1897185 : { return compare(i_rStr) < 0; }
     325             : 
     326             : inline bool
     327             : String::operator>( const self &        i_rStr ) const
     328             : { return compare(i_rStr) > 0; }
     329             : 
     330             : inline bool
     331             : String::operator<=( const self &        i_rStr ) const
     332             : { return compare(i_rStr) <= 0; }
     333             : 
     334             : inline bool
     335             : String::operator>=( const self &        i_rStr ) const
     336             : { return compare(i_rStr) >= 0; }
     337             : 
     338             : inline void
     339      264737 : String::clear()
     340      264737 : { operator=( String::Null_() ); }
     341             : 
     342             : inline const char *
     343    21021684 : String::c_str() const
     344    21021684 : { return Str().Data(); }
     345             : 
     346             : inline
     347     1589675 : String::operator const char * () const
     348     1589675 : { return c_str(); }
     349             : 
     350             : inline const char *
     351        2584 : String::data() const
     352        2584 : { return c_str(); }
     353             : 
     354             : inline String::size_type
     355    12878979 : String::size() const
     356    12878979 : { return Str().Size(); }
     357             : 
     358             : inline bool
     359      211504 : String::empty() const
     360      211504 : { return size() == 0; }
     361             : 
     362             : inline String::size_type
     363    12667470 : String::length() const
     364    12667470 : { return size(); }
     365             : 
     366             : inline String::const_iterator
     367        2584 : String::begin() const
     368        2584 : { return data(); }
     369             : 
     370             : inline String::const_iterator
     371             : String::end() const
     372             : { return data() + size(); }
     373             : 
     374             : 
     375             : 
     376             : //******************     global compare-functions      ********************//
     377             : inline int
     378       47236 : compare( const String &          i_s1,
     379             :          const String &          i_s2 )
     380       47236 : { return i_s1.compare(i_s2); }
     381             : 
     382             : inline int
     383        5220 : compare( const String &                     i_s1,
     384             :          const char *                       i_s2 )
     385        5220 : { return strcmp(i_s1.c_str(), i_s2); }
     386             : 
     387             : inline int
     388             : compare( const char *                       i_s1,
     389             :          const String &                     i_s2 )
     390             : { return strcmp(i_s1, i_s2.c_str()); }
     391             : 
     392             : inline int
     393             : compare( const char *            i_s1,
     394             :          const char *            i_s2 )
     395             : { return strcmp(i_s1, i_s2); }
     396             : 
     397             : inline int
     398             : compare( const char *                    i_s1,
     399             :          const char *                    i_s2,
     400             :          str::size                       i_nLength )
     401             : { return strncmp( i_s1, i_s2, i_nLength ); }
     402             : 
     403             : inline int
     404             : compare( const CharOrder_Table &            i_rOrder,
     405             :          const String &                     i_s1,
     406             :          const char *                       i_s2 )
     407             : { return compare( i_rOrder, i_s1.c_str(), i_s2 ); }
     408             : 
     409             : inline int
     410             : compare( const CharOrder_Table &            i_rOrder,
     411             :          const char *                       i_s1,
     412             :          const String &                     i_s2 )
     413             : { return compare( i_rOrder, i_s1, i_s2.c_str() ); }
     414             : 
     415             : 
     416             : }   // namespace csv
     417             : 
     418             : 
     419             : inline bool
     420        5220 : operator==( const csv::String &         i_s1,
     421             :             const char *                i_s2 )
     422        5220 : { return csv::compare( i_s1, i_s2 ) == 0; }
     423             : 
     424             : inline bool
     425             : operator!=( const csv::String &         i_s1,
     426             :             const char *                i_s2 )
     427             : { return csv::compare( i_s1, i_s2 ) != 0; }
     428             : 
     429             : inline bool
     430             : operator<( const csv::String &         i_s1,
     431             :            const char *                i_s2 )
     432             : { return csv::compare( i_s1, i_s2 ) < 0; }
     433             : 
     434             : inline bool
     435             : operator>( const csv::String &         i_s1,
     436             :            const char *                i_s2 )
     437             : { return csv::compare( i_s1, i_s2 ) > 0; }
     438             : 
     439             : inline bool
     440             : operator<=( const csv::String &         i_s1,
     441             :             const char *                i_s2 )
     442             : { return csv::compare( i_s1, i_s2 ) <= 0; }
     443             : 
     444             : inline bool
     445             : operator>=( const csv::String &         i_s1,
     446             :             const char *                i_s2 )
     447             : { return csv::compare( i_s1, i_s2 ) >= 0; }
     448             : 
     449             : 
     450             : inline bool
     451             : operator==( const char *                i_s1,
     452             :             const csv::String &         i_s2 )
     453             : { return csv::compare( i_s1, i_s2 ) == 0; }
     454             : 
     455             : inline bool
     456             : operator!=( const char *                i_s1,
     457             :             const csv::String &         i_s2 )
     458             : { return csv::compare( i_s1, i_s2 ) != 0; }
     459             : 
     460             : inline bool
     461             : operator<( const char *                i_s1,
     462             :            const csv::String &         i_s2 )
     463             : { return csv::compare( i_s1, i_s2 ) < 0; }
     464             : 
     465             : inline bool
     466             : operator>( const char *                i_s1,
     467             :            const csv::String &         i_s2 )
     468             : { return csv::compare( i_s1, i_s2 ) > 0; }
     469             : 
     470             : inline bool
     471             : operator<=( const char *                i_s1,
     472             :             const csv::String &         i_s2 )
     473             : { return csv::compare( i_s1, i_s2 ) <= 0; }
     474             : 
     475             : inline bool
     476             : operator>=( const char *                i_s1,
     477             :             const csv::String &         i_s2 )
     478             : { return csv::compare( i_s1, i_s2 ) >= 0; }
     479             : 
     480             : 
     481             :     //************    global stream operators   **************//
     482             : 
     483             : 
     484             : inline csv::ostream &
     485        4140 : operator<<( csv::ostream &        o_rOut,
     486             :             const csv::String &   i_rSrc )
     487        4140 :     { o_rOut << i_rSrc.c_str(); return o_rOut; }
     488             : 
     489             : 
     490             : //******************    typedefs   *********************//
     491             : 
     492             : namespace csv
     493             : {
     494             : 
     495             : typedef std::vector<String>   StringVector;
     496             : 
     497             : }
     498             : 
     499             : #endif
     500             : 
     501             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10