• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //  (C) Copyright Gennadiy Rozental 2001-2014.
2 //  Distributed under the Boost Software License, Version 1.0.
3 //  (See accompanying file LICENSE_1_0.txt or copy at
4 //  http://www.boost.org/LICENSE_1_0.txt)
5 //
6 //  See http://www.boost.org/libs/test for the library home page.
7 //
8 //  Description : simple string class definition
9 // ***************************************************************************
10 
11 #ifndef  CONST_STRING_HPP
12 #define  CONST_STRING_HPP
13 
14 // STL
15 #include <string>
16 using std::string;
17 
18 namespace common_layer
19 {
20 
21   // ************************************************************************** //
22   // **************                 const_string                 ************** //
23   // ************************************************************************** //
24 
25   class const_string
26   {
27   public:
28     // Subtypes
29     typedef char const*                                 iterator;
30     typedef char const*                                 const_iterator;
31     typedef std::reverse_iterator<iterator,char, char const&> reverse_iterator;
32     typedef reverse_iterator                            const_reverse_iterator;
33 
34     // Constructor
const_string()35     const_string() :
36       m_begin( "" ),
37       m_end( m_begin )
38     {}
39 
40     // Copy constructor is generated by compiler
41 
const_string(const std::string & s)42     const_string( const std::string& s ) :
43       m_begin( s.c_str() ),
44       m_end( m_begin + s.length() )
45     {}
46 
47     const_string( char const* s );
48 
const_string(char const * s,size_t length)49     const_string( char const* s, size_t length ) :
50       m_begin( s ),
51       m_end( m_begin + length )
52     {
53       if(length == 0)
54         erase();
55     }
56 
const_string(char const * first,char const * last)57     const_string( char const* first, char const* last ) :
58       m_begin( first ),
59       m_end( last )
60     {}
61 
62     // data access methods
operator [](size_t index) const63     char operator[]( size_t index ) const { return m_begin[index]; }
at(size_t index) const64     char at( size_t index ) const         { return (*this)[index]; }
data() const65     char const* data() const              { return m_begin;}
66 
67     // length operators
length() const68     size_t length() const                 { return m_end - m_begin;}
is_empty() const69     bool is_empty() const                 { return m_end == m_begin;}
70 
erase()71     void erase()                          { m_begin = m_end = ""; }
resize(size_t new_len)72     void resize( size_t new_len )         { if( m_begin + new_len < m_end ) m_end = m_begin + new_len; }
rshorten(size_t shift=1)73     void rshorten( size_t shift = 1 )     { m_end  -= shift; if( m_end <= m_begin ) erase(); }
lshorten(size_t shift=1)74     void lshorten( size_t shift = 1 )     { m_begin += shift; if( m_end <= m_begin ) erase(); }
75 
76     // Assignment operators
77     const_string& operator=( const_string const& s );
operator =(string const & s)78     const_string& operator=( string const& s )            { return *this = const_string( s ); }
operator =(char const * s)79     const_string& operator=( char const* s )              { return *this = const_string( s ); }
80 
assign(const_string const & s)81     const_string& assign( const_string const& s )         { return *this = s; }
assign(string const & s,size_t len)82     const_string& assign( string const& s, size_t len )   { return *this = const_string( s.data(), len ); }
assign(string const & s)83     const_string& assign( string const& s )               { return *this = const_string( s ); }
assign(char const * s)84     const_string& assign( char const* s )                 { return *this = const_string( s ); }
assign(char const * s,size_t len)85     const_string& assign( char const* s, size_t len )     { return *this = const_string( s, len ); }
assign(char const * f,char const * l)86     const_string& assign( char const* f, char const* l )  { return *this = const_string( f, l ); }
87 
swap(const_string & s)88     void swap( const_string& s )
89     {
90       // do not want to include alogrithm
91       char const* tmp1 = m_begin;
92       char const* tmp2 = m_end;
93 
94       m_begin     = s.m_begin;
95       m_end       = s.m_end;
96 
97       s.m_begin   = tmp1;
98       s.m_end     = tmp2;
99     }
100 
101     // Comparison operators
102     friend bool     operator==( const_string const& s1, const_string const& s2 );
operator ==(const_string const & s1,char const * s2)103     friend bool     operator==( const_string const& s1, char const* s2 )            { return s1 == const_string( s2 ); }
operator ==(const_string const & s1,const string & s2)104     friend bool     operator==( const_string const& s1, const string& s2 )          { return s1 == const_string( s2 ); }
105 
operator !=(const_string const & s1,const_string const & s2)106     friend bool     operator!=( const_string const& s1, const_string const& s2 )    { return !(s1 == s2); }
operator !=(const_string const & s1,char const * s2)107     friend bool     operator!=( const_string const& s1, char const* s2 )            { return !(s1 == s2); }
operator !=(const_string const & s1,const string & s2)108     friend bool     operator!=( const_string const& s1, const string& s2 )          { return !(s1 == s2); }
109 
operator ==(char const * s2,const_string const & s1)110     friend bool     operator==( char const* s2,         const_string const& s1 )    { return s1 == s2; }
operator ==(const string & s2,const_string const & s1)111     friend bool     operator==( const string& s2,       const_string const& s1 )    { return s1 == s2; }
112 
operator !=(char const * s2,const_string const & s1)113     friend bool     operator!=( char const* s2,         const_string const& s1 )    { return !(s1 == s2); }
operator !=(const string & s2,const_string const & s1)114     friend bool     operator!=( const string& s2,       const_string const& s1 )    { return !(s1 == s2); }
115 
116     // Iterators
begin() const117     iterator        begin() const                           { return m_begin; }
end() const118     iterator        end() const                             { return m_end;   }
rbegin() const119     reverse_iterator rbegin() const                         { return m_end;   }
rend() const120     reverse_iterator rend() const                           { return m_begin; }
121 
122     // search operation
123     iterator        find_first_of( char c );
124     iterator        find_first_of( const_string cs );
125     iterator        find_last_of( char c );
126     iterator        find_last_of( const_string cs );
127 
128   private:
129 
130     // Data members
131     char const*     m_begin;
132     char const*     m_end;
133   };
134 
135   //____________________________________________________________________________//
136 
137   // first character
138   class first_char {
139   public:
operator ()(const_string source,char default_char='\\0') const140     char operator()( const_string source, char default_char = '\0' ) const {
141       return source.is_empty() ? default_char : *source.data();
142     }
143   };
144 
145   //____________________________________________________________________________//
146 
147   // last character
148   class last_char {
149   public:
operator ()(const_string source,char default_char='\\0') const150     char operator()( const_string source, char default_char = '\0' ) const {
151       return source.is_empty() ? default_char : *source.rbegin();
152     }
153   };
154 
155   //____________________________________________________________________________//
156 
157   inline const_string&
operator =(const_string const & s)158   const_string::operator=( const_string const& s ) {
159     if( &s != this ) {
160       m_begin = s.m_begin;
161       m_end  = s.m_end;
162     }
163 
164     return *this;
165   }
166 
167   //____________________________________________________________________________//
168 
169   typedef const_string const literal;
170 
171 }; // namespace common_layer
172 
173 #endif // CONST_STRING_HPP
174