]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/test/doc/snippet/const_string.hpp
add subtree-ish sources for 12.0.3
[ceph.git] / ceph / src / boost / libs / test / doc / snippet / const_string.hpp
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
35 const_string() :
36 m_begin( "" ),
37 m_end( m_begin )
38 {}
39
40 // Copy constructor is generated by compiler
41
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
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
57 const_string( char const* first, char const* last ) :
58 m_begin( first ),
59 m_end( last )
60 {}
61
62 // data access methods
63 char operator[]( size_t index ) const { return m_begin[index]; }
64 char at( size_t index ) const { return (*this)[index]; }
65 char const* data() const { return m_begin;}
66
67 // length operators
68 size_t length() const { return m_end - m_begin;}
69 bool is_empty() const { return m_end == m_begin;}
70
71 void erase() { m_begin = m_end = ""; }
72 void resize( size_t new_len ) { if( m_begin + new_len < m_end ) m_end = m_begin + new_len; }
73 void rshorten( size_t shift = 1 ) { m_end -= shift; if( m_end <= m_begin ) erase(); }
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 );
78 const_string& operator=( string const& s ) { return *this = const_string( s ); }
79 const_string& operator=( char const* s ) { return *this = const_string( s ); }
80
81 const_string& assign( const_string const& s ) { return *this = s; }
82 const_string& assign( string const& s, size_t len ) { return *this = const_string( s.data(), len ); }
83 const_string& assign( string const& s ) { return *this = const_string( s ); }
84 const_string& assign( char const* s ) { return *this = const_string( s ); }
85 const_string& assign( char const* s, size_t len ) { return *this = const_string( s, len ); }
86 const_string& assign( char const* f, char const* l ) { return *this = const_string( f, l ); }
87
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 );
103 friend bool operator==( const_string const& s1, char const* s2 ) { return s1 == const_string( s2 ); }
104 friend bool operator==( const_string const& s1, const string& s2 ) { return s1 == const_string( s2 ); }
105
106 friend bool operator!=( const_string const& s1, const_string const& s2 ) { return !(s1 == s2); }
107 friend bool operator!=( const_string const& s1, char const* s2 ) { return !(s1 == s2); }
108 friend bool operator!=( const_string const& s1, const string& s2 ) { return !(s1 == s2); }
109
110 friend bool operator==( char const* s2, const_string const& s1 ) { return s1 == s2; }
111 friend bool operator==( const string& s2, const_string const& s1 ) { return s1 == s2; }
112
113 friend bool operator!=( char const* s2, const_string const& s1 ) { return !(s1 == s2); }
114 friend bool operator!=( const string& s2, const_string const& s1 ) { return !(s1 == s2); }
115
116 // Iterators
117 iterator begin() const { return m_begin; }
118 iterator end() const { return m_end; }
119 reverse_iterator rbegin() const { return m_end; }
120 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:
140 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:
150 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&
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