const_string.hpp 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  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. #ifndef CONST_STRING_HPP
  11. #define CONST_STRING_HPP
  12. // STL
  13. #include <string>
  14. using std::string;
  15. namespace common_layer
  16. {
  17. // ************************************************************************** //
  18. // ************** const_string ************** //
  19. // ************************************************************************** //
  20. class const_string
  21. {
  22. public:
  23. // Subtypes
  24. typedef char const* iterator;
  25. typedef char const* const_iterator;
  26. typedef std::reverse_iterator<iterator,char, char const&> reverse_iterator;
  27. typedef reverse_iterator const_reverse_iterator;
  28. // Constructor
  29. const_string() :
  30. m_begin( "" ),
  31. m_end( m_begin )
  32. {}
  33. // Copy constructor is generated by compiler
  34. const_string( const std::string& s ) :
  35. m_begin( s.c_str() ),
  36. m_end( m_begin + s.length() )
  37. {}
  38. const_string( char const* s );
  39. const_string( char const* s, size_t length ) :
  40. m_begin( s ),
  41. m_end( m_begin + length )
  42. {
  43. if(length == 0)
  44. erase();
  45. }
  46. const_string( char const* first, char const* last ) :
  47. m_begin( first ),
  48. m_end( last )
  49. {}
  50. // data access methods
  51. char operator[]( size_t index ) const { return m_begin[index]; }
  52. char at( size_t index ) const { return (*this)[index]; }
  53. char const* data() const { return m_begin;}
  54. // length operators
  55. size_t length() const { return m_end - m_begin;}
  56. bool is_empty() const { return m_end == m_begin;}
  57. void erase() { m_begin = m_end = ""; }
  58. void resize( size_t new_len ) { if( m_begin + new_len < m_end ) m_end = m_begin + new_len; }
  59. void rshorten( size_t shift = 1 ) { m_end -= shift; if( m_end <= m_begin ) erase(); }
  60. void lshorten( size_t shift = 1 ) { m_begin += shift; if( m_end <= m_begin ) erase(); }
  61. // Assignment operators
  62. const_string& operator=( const_string const& s );
  63. const_string& operator=( string const& s ) { return *this = const_string( s ); }
  64. const_string& operator=( char const* s ) { return *this = const_string( s ); }
  65. const_string& assign( const_string const& s ) { return *this = s; }
  66. const_string& assign( string const& s, size_t len ) { return *this = const_string( s.data(), len ); }
  67. const_string& assign( string const& s ) { return *this = const_string( s ); }
  68. const_string& assign( char const* s ) { return *this = const_string( s ); }
  69. const_string& assign( char const* s, size_t len ) { return *this = const_string( s, len ); }
  70. const_string& assign( char const* f, char const* l ) { return *this = const_string( f, l ); }
  71. void swap( const_string& s )
  72. {
  73. // do not want to include alogrithm
  74. char const* tmp1 = m_begin;
  75. char const* tmp2 = m_end;
  76. m_begin = s.m_begin;
  77. m_end = s.m_end;
  78. s.m_begin = tmp1;
  79. s.m_end = tmp2;
  80. }
  81. // Comparison operators
  82. friend bool operator==( const_string const& s1, const_string const& s2 );
  83. friend bool operator==( const_string const& s1, char const* s2 ) { return s1 == const_string( s2 ); }
  84. friend bool operator==( const_string const& s1, const string& s2 ) { return s1 == const_string( s2 ); }
  85. friend bool operator!=( const_string const& s1, const_string const& s2 ) { return !(s1 == s2); }
  86. friend bool operator!=( const_string const& s1, char const* s2 ) { return !(s1 == s2); }
  87. friend bool operator!=( const_string const& s1, const string& s2 ) { return !(s1 == s2); }
  88. friend bool operator==( char const* s2, const_string const& s1 ) { return s1 == s2; }
  89. friend bool operator==( const string& s2, const_string const& s1 ) { return s1 == s2; }
  90. friend bool operator!=( char const* s2, const_string const& s1 ) { return !(s1 == s2); }
  91. friend bool operator!=( const string& s2, const_string const& s1 ) { return !(s1 == s2); }
  92. // Iterators
  93. iterator begin() const { return m_begin; }
  94. iterator end() const { return m_end; }
  95. reverse_iterator rbegin() const { return m_end; }
  96. reverse_iterator rend() const { return m_begin; }
  97. // search operation
  98. iterator find_first_of( char c );
  99. iterator find_first_of( const_string cs );
  100. iterator find_last_of( char c );
  101. iterator find_last_of( const_string cs );
  102. private:
  103. // Data members
  104. char const* m_begin;
  105. char const* m_end;
  106. };
  107. //____________________________________________________________________________//
  108. // first character
  109. class first_char {
  110. public:
  111. char operator()( const_string source, char default_char = '\0' ) const {
  112. return source.is_empty() ? default_char : *source.data();
  113. }
  114. };
  115. //____________________________________________________________________________//
  116. // last character
  117. class last_char {
  118. public:
  119. char operator()( const_string source, char default_char = '\0' ) const {
  120. return source.is_empty() ? default_char : *source.rbegin();
  121. }
  122. };
  123. //____________________________________________________________________________//
  124. inline const_string&
  125. const_string::operator=( const_string const& s ) {
  126. if( &s != this ) {
  127. m_begin = s.m_begin;
  128. m_end = s.m_end;
  129. }
  130. return *this;
  131. }
  132. //____________________________________________________________________________//
  133. typedef const_string const literal;
  134. }; // namespace common_layer
  135. #endif // CONST_STRING_HPP