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