Chris@16
|
1 // (C) Copyright Gennadiy Rozental 2004-2008.
|
Chris@16
|
2 // Distributed under the Boost Software License, Version 1.0.
|
Chris@16
|
3 // (See accompanying file LICENSE_1_0.txt or copy at
|
Chris@16
|
4 // http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
5
|
Chris@16
|
6 // See http://www.boost.org/libs/test for the library home page.
|
Chris@16
|
7 //
|
Chris@16
|
8 // File : $RCSfile$
|
Chris@16
|
9 //
|
Chris@101
|
10 // Version : $Revision$
|
Chris@16
|
11 //
|
Chris@16
|
12 // Description : class basic_cstring wraps C string and provide std_string like
|
Chris@16
|
13 // interface
|
Chris@16
|
14 // ***************************************************************************
|
Chris@16
|
15
|
Chris@16
|
16 #ifndef BOOST_TEST_BASIC_CSTRING_HPP_071894GER
|
Chris@16
|
17 #define BOOST_TEST_BASIC_CSTRING_HPP_071894GER
|
Chris@16
|
18
|
Chris@16
|
19 // Boost.Test
|
Chris@16
|
20 #include <boost/test/utils/basic_cstring/basic_cstring_fwd.hpp>
|
Chris@16
|
21 #include <boost/test/utils/basic_cstring/bcs_char_traits.hpp>
|
Chris@16
|
22
|
Chris@16
|
23 // STL
|
Chris@16
|
24 #include <string>
|
Chris@16
|
25
|
Chris@16
|
26 #include <boost/test/detail/suppress_warnings.hpp>
|
Chris@16
|
27
|
Chris@16
|
28 //____________________________________________________________________________//
|
Chris@16
|
29
|
Chris@16
|
30 namespace boost {
|
Chris@16
|
31
|
Chris@16
|
32 namespace unit_test {
|
Chris@16
|
33
|
Chris@16
|
34 // ************************************************************************** //
|
Chris@16
|
35 // ************** basic_cstring ************** //
|
Chris@16
|
36 // ************************************************************************** //
|
Chris@16
|
37
|
Chris@16
|
38 template<typename CharT>
|
Chris@16
|
39 class basic_cstring {
|
Chris@16
|
40 typedef basic_cstring<CharT> self_type;
|
Chris@16
|
41 public:
|
Chris@16
|
42 // Subtypes
|
Chris@16
|
43 typedef ut_detail::bcs_char_traits<CharT> traits_type;
|
Chris@16
|
44 typedef typename ut_detail::bcs_char_traits<CharT>::std_string std_string;
|
Chris@16
|
45
|
Chris@16
|
46 typedef CharT value_type;
|
Chris@16
|
47 typedef value_type* pointer;
|
Chris@16
|
48 typedef value_type const* const_pointer;
|
Chris@16
|
49 typedef value_type& reference;
|
Chris@16
|
50 typedef const value_type& const_reference;
|
Chris@16
|
51 typedef std::size_t size_type;
|
Chris@16
|
52 typedef std::ptrdiff_t difference_type;
|
Chris@16
|
53
|
Chris@16
|
54 typedef value_type const* const_iterator;
|
Chris@16
|
55 typedef value_type* iterator;
|
Chris@16
|
56
|
Chris@16
|
57 // !! should also present reverse_iterator, const_reverse_iterator
|
Chris@16
|
58
|
Chris@16
|
59 #if !BOOST_WORKAROUND(__IBMCPP__, BOOST_TESTED_AT(600))
|
Chris@16
|
60 enum npos_type { npos = static_cast<size_type>(-1) };
|
Chris@16
|
61 #else
|
Chris@16
|
62 // IBM/VisualAge version 6 is not able to handle enums larger than 4 bytes.
|
Chris@16
|
63 // But size_type is 8 bytes in 64bit mode.
|
Chris@16
|
64 static const size_type npos = -1 ;
|
Chris@16
|
65 #endif
|
Chris@16
|
66
|
Chris@16
|
67 static pointer null_str();
|
Chris@16
|
68
|
Chris@16
|
69 // Constructors; default copy constructor is generated by compiler
|
Chris@16
|
70 basic_cstring();
|
Chris@16
|
71 basic_cstring( std_string const& s );
|
Chris@16
|
72 basic_cstring( pointer s );
|
Chris@16
|
73 basic_cstring( pointer s, size_type arg_size );
|
Chris@16
|
74 basic_cstring( pointer first, pointer last );
|
Chris@16
|
75
|
Chris@16
|
76 // data access methods
|
Chris@16
|
77 value_type operator[]( size_type index ) const;
|
Chris@16
|
78 value_type at( size_type index ) const;
|
Chris@16
|
79
|
Chris@16
|
80 // size operators
|
Chris@16
|
81 size_type size() const;
|
Chris@16
|
82 bool is_empty() const;
|
Chris@16
|
83 void clear();
|
Chris@16
|
84 void resize( size_type new_len );
|
Chris@16
|
85
|
Chris@16
|
86 // !! only for STL container conformance use is_empty instead
|
Chris@16
|
87 bool empty() const;
|
Chris@16
|
88
|
Chris@16
|
89 // Trimming
|
Chris@16
|
90 self_type& trim_right( size_type trim_size );
|
Chris@16
|
91 self_type& trim_left( size_type trim_size );
|
Chris@16
|
92 self_type& trim_right( iterator it );
|
Chris@16
|
93 self_type& trim_left( iterator it );
|
Chris@16
|
94 #ifndef __IBMCPP__
|
Chris@16
|
95 self_type& trim_left( self_type exclusions = self_type() ) ;
|
Chris@16
|
96 self_type& trim_right( self_type exclusions = self_type() ) ;
|
Chris@16
|
97 self_type& trim( self_type exclusions = self_type() ) ;
|
Chris@16
|
98 #else
|
Chris@16
|
99 // VisualAge version 6 has in this case a problem with the default arguments.
|
Chris@16
|
100 self_type& trim_left( self_type exclusions ) ;
|
Chris@16
|
101 self_type& trim_right( self_type exclusions ) ;
|
Chris@16
|
102 self_type& trim( self_type exclusions ) ;
|
Chris@16
|
103 self_type& trim_left() { trim_left( self_type() ) ; }
|
Chris@16
|
104 self_type& trim_right() { trim_right( self_type() ) ; }
|
Chris@16
|
105 self_type& trim() { trim( self_type() ) ; }
|
Chris@16
|
106 #endif
|
Chris@16
|
107
|
Chris@16
|
108 // Assignment operators
|
Chris@16
|
109 basic_cstring& operator=( self_type const& s );
|
Chris@16
|
110 basic_cstring& operator=( std_string const& s );
|
Chris@16
|
111 basic_cstring& operator=( pointer s );
|
Chris@16
|
112
|
Chris@16
|
113 template<typename CharT2>
|
Chris@16
|
114 basic_cstring& assign( basic_cstring<CharT2> const& s ) { *this = basic_cstring<CharT>( s.begin(), s.end() ); return *this; }
|
Chris@16
|
115 basic_cstring& assign( self_type const& s, size_type pos, size_type len );
|
Chris@16
|
116 basic_cstring& assign( std_string const& s );
|
Chris@16
|
117 basic_cstring& assign( std_string const& s, size_type pos, size_type len );
|
Chris@16
|
118 basic_cstring& assign( pointer s );
|
Chris@16
|
119 basic_cstring& assign( pointer s, size_type len );
|
Chris@16
|
120 basic_cstring& assign( pointer f, pointer l );
|
Chris@16
|
121
|
Chris@16
|
122 // swapping
|
Chris@16
|
123 void swap( self_type& s );
|
Chris@16
|
124
|
Chris@16
|
125 // Iterators
|
Chris@16
|
126 iterator begin();
|
Chris@16
|
127 const_iterator begin() const;
|
Chris@16
|
128 iterator end();
|
Chris@16
|
129 const_iterator end() const;
|
Chris@16
|
130
|
Chris@16
|
131 // !! should have rbegin, rend
|
Chris@16
|
132
|
Chris@16
|
133 // substring search operation
|
Chris@16
|
134 size_type find( basic_cstring ) const;
|
Chris@16
|
135 size_type rfind( basic_cstring ) const;
|
Chris@16
|
136 self_type substr( size_type beg_index, size_type end_index = npos ) const;
|
Chris@16
|
137
|
Chris@16
|
138 private:
|
Chris@16
|
139 static self_type default_trim_ex();
|
Chris@16
|
140
|
Chris@16
|
141 // Data members
|
Chris@16
|
142 iterator m_begin;
|
Chris@16
|
143 iterator m_end;
|
Chris@16
|
144 };
|
Chris@16
|
145
|
Chris@16
|
146 //____________________________________________________________________________//
|
Chris@16
|
147
|
Chris@16
|
148 template<typename CharT>
|
Chris@16
|
149 inline typename basic_cstring<CharT>::pointer
|
Chris@16
|
150 basic_cstring<CharT>::null_str()
|
Chris@16
|
151 {
|
Chris@16
|
152 static CharT null = 0;
|
Chris@16
|
153 return &null;
|
Chris@16
|
154 }
|
Chris@16
|
155
|
Chris@16
|
156 //____________________________________________________________________________//
|
Chris@16
|
157
|
Chris@16
|
158 template<typename CharT>
|
Chris@16
|
159 inline
|
Chris@16
|
160 basic_cstring<CharT>::basic_cstring()
|
Chris@16
|
161 : m_begin( null_str() )
|
Chris@16
|
162 , m_end( m_begin )
|
Chris@16
|
163 {
|
Chris@16
|
164 }
|
Chris@16
|
165
|
Chris@16
|
166 //____________________________________________________________________________//
|
Chris@16
|
167
|
Chris@16
|
168 template<typename CharT>
|
Chris@16
|
169 inline
|
Chris@16
|
170 basic_cstring<CharT>::basic_cstring( std_string const& s )
|
Chris@16
|
171 : m_begin( s.c_str() )
|
Chris@16
|
172 , m_end( m_begin + s.size() )
|
Chris@16
|
173 {
|
Chris@16
|
174 }
|
Chris@16
|
175
|
Chris@16
|
176 //____________________________________________________________________________//
|
Chris@16
|
177
|
Chris@16
|
178 template<typename CharT>
|
Chris@16
|
179 inline
|
Chris@16
|
180 basic_cstring<CharT>::basic_cstring( pointer s )
|
Chris@16
|
181 : m_begin( s ? s : null_str() )
|
Chris@16
|
182 , m_end ( m_begin + (s ? traits_type::length( s ) : 0 ) )
|
Chris@16
|
183 {
|
Chris@16
|
184 }
|
Chris@16
|
185
|
Chris@16
|
186 //____________________________________________________________________________//
|
Chris@16
|
187
|
Chris@16
|
188 template<typename CharT>
|
Chris@16
|
189 inline
|
Chris@16
|
190 basic_cstring<CharT>::basic_cstring( pointer s, size_type arg_size )
|
Chris@16
|
191 : m_begin( s ), m_end( m_begin + arg_size )
|
Chris@16
|
192 {
|
Chris@16
|
193 }
|
Chris@16
|
194
|
Chris@16
|
195 //____________________________________________________________________________//
|
Chris@16
|
196
|
Chris@16
|
197 template<typename CharT>
|
Chris@16
|
198 inline
|
Chris@16
|
199 basic_cstring<CharT>::basic_cstring( pointer first, pointer last )
|
Chris@16
|
200 : m_begin( first )
|
Chris@16
|
201 , m_end( last )
|
Chris@16
|
202 {
|
Chris@16
|
203 }
|
Chris@16
|
204
|
Chris@16
|
205 //____________________________________________________________________________//
|
Chris@16
|
206
|
Chris@16
|
207 template<typename CharT>
|
Chris@16
|
208 inline typename basic_cstring<CharT>::value_type
|
Chris@16
|
209 basic_cstring<CharT>::operator[]( size_type index ) const
|
Chris@16
|
210 {
|
Chris@16
|
211 return m_begin[index];
|
Chris@16
|
212 }
|
Chris@16
|
213
|
Chris@16
|
214 //____________________________________________________________________________//
|
Chris@16
|
215
|
Chris@16
|
216 template<typename CharT>
|
Chris@16
|
217 inline typename basic_cstring<CharT>::value_type
|
Chris@16
|
218 basic_cstring<CharT>::at( size_type index ) const
|
Chris@16
|
219 {
|
Chris@16
|
220 if( m_begin + index >= m_end )
|
Chris@16
|
221 return static_cast<value_type>(0);
|
Chris@16
|
222
|
Chris@16
|
223 return m_begin[index];
|
Chris@16
|
224 }
|
Chris@16
|
225
|
Chris@16
|
226 //____________________________________________________________________________//
|
Chris@16
|
227
|
Chris@16
|
228 template<typename CharT>
|
Chris@16
|
229 inline typename basic_cstring<CharT>::size_type
|
Chris@16
|
230 basic_cstring<CharT>::size() const
|
Chris@16
|
231 {
|
Chris@16
|
232 return m_end - m_begin;
|
Chris@16
|
233 }
|
Chris@16
|
234
|
Chris@16
|
235 //____________________________________________________________________________//
|
Chris@16
|
236
|
Chris@16
|
237 template<typename CharT>
|
Chris@16
|
238 inline bool
|
Chris@16
|
239 basic_cstring<CharT>::is_empty() const
|
Chris@16
|
240 {
|
Chris@16
|
241 return m_end == m_begin;
|
Chris@16
|
242 }
|
Chris@16
|
243
|
Chris@16
|
244 //____________________________________________________________________________//
|
Chris@16
|
245
|
Chris@16
|
246 template<typename CharT>
|
Chris@16
|
247 inline bool
|
Chris@16
|
248 basic_cstring<CharT>::empty() const
|
Chris@16
|
249 {
|
Chris@16
|
250 return is_empty();
|
Chris@16
|
251 }
|
Chris@16
|
252
|
Chris@16
|
253 //____________________________________________________________________________//
|
Chris@16
|
254
|
Chris@16
|
255 template<typename CharT>
|
Chris@16
|
256 inline void
|
Chris@16
|
257 basic_cstring<CharT>::clear()
|
Chris@16
|
258 {
|
Chris@16
|
259 m_begin = m_end;
|
Chris@16
|
260 }
|
Chris@16
|
261
|
Chris@16
|
262 //____________________________________________________________________________//
|
Chris@16
|
263
|
Chris@16
|
264 template<typename CharT>
|
Chris@16
|
265 inline void
|
Chris@16
|
266 basic_cstring<CharT>::resize( size_type new_len )
|
Chris@16
|
267 {
|
Chris@16
|
268 if( m_begin + new_len < m_end )
|
Chris@16
|
269 m_end = m_begin + new_len;
|
Chris@16
|
270 }
|
Chris@16
|
271
|
Chris@16
|
272 //____________________________________________________________________________//
|
Chris@16
|
273
|
Chris@16
|
274 template<typename CharT>
|
Chris@16
|
275 inline basic_cstring<CharT>&
|
Chris@16
|
276 basic_cstring<CharT>::trim_left( size_type trim_size )
|
Chris@16
|
277 {
|
Chris@16
|
278 m_begin += trim_size;
|
Chris@16
|
279 if( m_end <= m_begin )
|
Chris@16
|
280 clear();
|
Chris@16
|
281
|
Chris@16
|
282 return *this;
|
Chris@16
|
283 }
|
Chris@16
|
284
|
Chris@16
|
285 //____________________________________________________________________________//
|
Chris@16
|
286
|
Chris@16
|
287 template<typename CharT>
|
Chris@16
|
288 inline basic_cstring<CharT>&
|
Chris@16
|
289 basic_cstring<CharT>::trim_left( iterator it )
|
Chris@16
|
290 {
|
Chris@16
|
291 m_begin = it;
|
Chris@16
|
292 if( m_end <= m_begin )
|
Chris@16
|
293 clear();
|
Chris@16
|
294
|
Chris@16
|
295 return *this;
|
Chris@16
|
296 }
|
Chris@16
|
297
|
Chris@16
|
298 //____________________________________________________________________________//
|
Chris@16
|
299
|
Chris@16
|
300 template<typename CharT>
|
Chris@16
|
301 inline basic_cstring<CharT>&
|
Chris@16
|
302 basic_cstring<CharT>::trim_left( basic_cstring exclusions )
|
Chris@16
|
303 {
|
Chris@16
|
304 if( exclusions.is_empty() )
|
Chris@16
|
305 exclusions = default_trim_ex();
|
Chris@16
|
306
|
Chris@16
|
307 iterator it;
|
Chris@16
|
308 for( it = begin(); it != end(); ++it ) {
|
Chris@16
|
309 if( traits_type::find( exclusions.begin(), exclusions.size(), *it ) == reinterpret_cast<pointer>(0) )
|
Chris@16
|
310 break;
|
Chris@16
|
311 }
|
Chris@16
|
312
|
Chris@16
|
313 return trim_left( it );
|
Chris@16
|
314 }
|
Chris@16
|
315
|
Chris@16
|
316 //____________________________________________________________________________//
|
Chris@16
|
317
|
Chris@16
|
318 template<typename CharT>
|
Chris@16
|
319 inline basic_cstring<CharT>&
|
Chris@16
|
320 basic_cstring<CharT>::trim_right( size_type trim_size )
|
Chris@16
|
321 {
|
Chris@16
|
322 m_end -= trim_size;
|
Chris@16
|
323 if( m_end <= m_begin )
|
Chris@16
|
324 clear();
|
Chris@16
|
325
|
Chris@16
|
326 return *this;
|
Chris@16
|
327 }
|
Chris@16
|
328
|
Chris@16
|
329 //____________________________________________________________________________//
|
Chris@16
|
330
|
Chris@16
|
331 template<typename CharT>
|
Chris@16
|
332 inline basic_cstring<CharT>&
|
Chris@16
|
333 basic_cstring<CharT>::trim_right( iterator it )
|
Chris@16
|
334 {
|
Chris@16
|
335 m_end = it;
|
Chris@16
|
336 if( m_end <= m_begin )
|
Chris@16
|
337 clear();
|
Chris@16
|
338
|
Chris@16
|
339 return *this;
|
Chris@16
|
340 }
|
Chris@16
|
341
|
Chris@16
|
342 //____________________________________________________________________________//
|
Chris@16
|
343
|
Chris@16
|
344 template<typename CharT>
|
Chris@16
|
345 inline basic_cstring<CharT>&
|
Chris@16
|
346 basic_cstring<CharT>::trim_right( basic_cstring exclusions )
|
Chris@16
|
347 {
|
Chris@16
|
348 if( exclusions.is_empty() )
|
Chris@16
|
349 exclusions = default_trim_ex();
|
Chris@16
|
350
|
Chris@16
|
351 iterator it;
|
Chris@16
|
352
|
Chris@16
|
353 for( it = end()-1; it != begin()-1; --it ) {
|
Chris@16
|
354 if( self_type::traits_type::find( exclusions.begin(), exclusions.size(), *it ) == reinterpret_cast<pointer>(0) )
|
Chris@16
|
355 break;
|
Chris@16
|
356 }
|
Chris@16
|
357
|
Chris@16
|
358 return trim_right( it+1 );
|
Chris@16
|
359 }
|
Chris@16
|
360
|
Chris@16
|
361 //____________________________________________________________________________//
|
Chris@16
|
362
|
Chris@16
|
363 template<typename CharT>
|
Chris@16
|
364 inline basic_cstring<CharT>&
|
Chris@16
|
365 basic_cstring<CharT>::trim( basic_cstring exclusions )
|
Chris@16
|
366 {
|
Chris@16
|
367 trim_left( exclusions );
|
Chris@16
|
368 trim_right( exclusions );
|
Chris@16
|
369
|
Chris@16
|
370 return *this;
|
Chris@16
|
371 }
|
Chris@16
|
372
|
Chris@16
|
373 //____________________________________________________________________________//
|
Chris@16
|
374
|
Chris@16
|
375 template<typename CharT>
|
Chris@16
|
376 inline basic_cstring<CharT>&
|
Chris@16
|
377 basic_cstring<CharT>::operator=( basic_cstring<CharT> const& s )
|
Chris@16
|
378 {
|
Chris@16
|
379 m_begin = s.m_begin;
|
Chris@16
|
380 m_end = s.m_end;
|
Chris@16
|
381
|
Chris@16
|
382 return *this;
|
Chris@16
|
383 }
|
Chris@16
|
384
|
Chris@16
|
385 //____________________________________________________________________________//
|
Chris@16
|
386
|
Chris@16
|
387 template<typename CharT>
|
Chris@16
|
388 inline basic_cstring<CharT>&
|
Chris@16
|
389 basic_cstring<CharT>::operator=( std_string const& s )
|
Chris@16
|
390 {
|
Chris@16
|
391 return *this = self_type( s );
|
Chris@16
|
392 }
|
Chris@16
|
393
|
Chris@16
|
394 //____________________________________________________________________________//
|
Chris@16
|
395
|
Chris@16
|
396 template<typename CharT>
|
Chris@16
|
397 inline basic_cstring<CharT>&
|
Chris@16
|
398 basic_cstring<CharT>::operator=( pointer s )
|
Chris@16
|
399 {
|
Chris@16
|
400 return *this = self_type( s );
|
Chris@16
|
401 }
|
Chris@16
|
402
|
Chris@16
|
403 //____________________________________________________________________________//
|
Chris@16
|
404
|
Chris@16
|
405 template<typename CharT>
|
Chris@16
|
406 inline basic_cstring<CharT>&
|
Chris@16
|
407 basic_cstring<CharT>::assign( basic_cstring<CharT> const& s, size_type pos, size_type len )
|
Chris@16
|
408 {
|
Chris@16
|
409 return *this = self_type( s.m_begin + pos, len );
|
Chris@16
|
410 }
|
Chris@16
|
411
|
Chris@16
|
412 //____________________________________________________________________________//
|
Chris@16
|
413
|
Chris@16
|
414 template<typename CharT>
|
Chris@16
|
415 inline basic_cstring<CharT>&
|
Chris@16
|
416 basic_cstring<CharT>::assign( std_string const& s )
|
Chris@16
|
417 {
|
Chris@16
|
418 return *this = self_type( s );
|
Chris@16
|
419 }
|
Chris@16
|
420
|
Chris@16
|
421 //____________________________________________________________________________//
|
Chris@16
|
422
|
Chris@16
|
423 template<typename CharT>
|
Chris@16
|
424 inline basic_cstring<CharT>&
|
Chris@16
|
425 basic_cstring<CharT>::assign( std_string const& s, size_type pos, size_type len )
|
Chris@16
|
426 {
|
Chris@16
|
427 return *this = self_type( s.c_str() + pos, len );
|
Chris@16
|
428 }
|
Chris@16
|
429
|
Chris@16
|
430 //____________________________________________________________________________//
|
Chris@16
|
431
|
Chris@16
|
432 template<typename CharT>
|
Chris@16
|
433 inline basic_cstring<CharT>&
|
Chris@16
|
434 basic_cstring<CharT>::assign( pointer s )
|
Chris@16
|
435 {
|
Chris@16
|
436 return *this = self_type( s );
|
Chris@16
|
437 }
|
Chris@16
|
438
|
Chris@16
|
439 //____________________________________________________________________________//
|
Chris@16
|
440
|
Chris@16
|
441 template<typename CharT>
|
Chris@16
|
442 inline basic_cstring<CharT>&
|
Chris@16
|
443 basic_cstring<CharT>::assign( pointer s, size_type len )
|
Chris@16
|
444 {
|
Chris@16
|
445 return *this = self_type( s, len );
|
Chris@16
|
446 }
|
Chris@16
|
447
|
Chris@16
|
448 //____________________________________________________________________________//
|
Chris@16
|
449
|
Chris@16
|
450 template<typename CharT>
|
Chris@16
|
451 inline basic_cstring<CharT>&
|
Chris@16
|
452 basic_cstring<CharT>::assign( pointer f, pointer l )
|
Chris@16
|
453 {
|
Chris@16
|
454 return *this = self_type( f, l );
|
Chris@16
|
455 }
|
Chris@16
|
456
|
Chris@16
|
457 //____________________________________________________________________________//
|
Chris@16
|
458
|
Chris@16
|
459 template<typename CharT>
|
Chris@16
|
460 inline void
|
Chris@16
|
461 basic_cstring<CharT>::swap( basic_cstring<CharT>& s )
|
Chris@16
|
462 {
|
Chris@16
|
463 // do not want to include alogrithm
|
Chris@16
|
464 pointer tmp1 = m_begin;
|
Chris@16
|
465 pointer tmp2 = m_end;
|
Chris@16
|
466
|
Chris@16
|
467 m_begin = s.m_begin;
|
Chris@16
|
468 m_end = s.m_end;
|
Chris@16
|
469
|
Chris@16
|
470 s.m_begin = tmp1;
|
Chris@16
|
471 s.m_end = tmp2;
|
Chris@16
|
472 }
|
Chris@16
|
473
|
Chris@16
|
474 //____________________________________________________________________________//
|
Chris@16
|
475
|
Chris@16
|
476 template<typename CharT>
|
Chris@16
|
477 inline typename basic_cstring<CharT>::iterator
|
Chris@16
|
478 basic_cstring<CharT>::begin()
|
Chris@16
|
479 {
|
Chris@16
|
480 return m_begin;
|
Chris@16
|
481 }
|
Chris@16
|
482
|
Chris@16
|
483 //____________________________________________________________________________//
|
Chris@16
|
484
|
Chris@16
|
485 template<typename CharT>
|
Chris@16
|
486 inline typename basic_cstring<CharT>::const_iterator
|
Chris@16
|
487 basic_cstring<CharT>::begin() const
|
Chris@16
|
488 {
|
Chris@16
|
489 return m_begin;
|
Chris@16
|
490 }
|
Chris@16
|
491
|
Chris@16
|
492 //____________________________________________________________________________//
|
Chris@16
|
493
|
Chris@16
|
494 template<typename CharT>
|
Chris@16
|
495 inline typename basic_cstring<CharT>::iterator
|
Chris@16
|
496 basic_cstring<CharT>::end()
|
Chris@16
|
497 {
|
Chris@16
|
498 return m_end;
|
Chris@16
|
499 }
|
Chris@16
|
500
|
Chris@16
|
501 //____________________________________________________________________________//
|
Chris@16
|
502
|
Chris@16
|
503 template<typename CharT>
|
Chris@16
|
504 inline typename basic_cstring<CharT>::const_iterator
|
Chris@16
|
505 basic_cstring<CharT>::end() const
|
Chris@16
|
506 {
|
Chris@16
|
507 return m_end;
|
Chris@16
|
508 }
|
Chris@16
|
509
|
Chris@16
|
510 //____________________________________________________________________________//
|
Chris@16
|
511
|
Chris@16
|
512 template<typename CharT>
|
Chris@16
|
513 inline typename basic_cstring<CharT>::size_type
|
Chris@16
|
514 basic_cstring<CharT>::find( basic_cstring<CharT> str ) const
|
Chris@16
|
515 {
|
Chris@16
|
516 if( str.is_empty() || str.size() > size() )
|
Chris@16
|
517 return static_cast<size_type>(npos);
|
Chris@16
|
518
|
Chris@16
|
519 const_iterator it = begin();
|
Chris@16
|
520 const_iterator last = end() - str.size() + 1;
|
Chris@16
|
521
|
Chris@16
|
522 while( it != last ) {
|
Chris@16
|
523 if( traits_type::compare( it, str.begin(), str.size() ) == 0 )
|
Chris@16
|
524 break;
|
Chris@16
|
525
|
Chris@16
|
526 ++it;
|
Chris@16
|
527 }
|
Chris@16
|
528
|
Chris@16
|
529 return it == last ? static_cast<size_type>(npos) : it - begin();
|
Chris@16
|
530 }
|
Chris@16
|
531
|
Chris@16
|
532 //____________________________________________________________________________//
|
Chris@16
|
533
|
Chris@16
|
534 template<typename CharT>
|
Chris@16
|
535 inline typename basic_cstring<CharT>::size_type
|
Chris@16
|
536 basic_cstring<CharT>::rfind( basic_cstring<CharT> str ) const
|
Chris@16
|
537 {
|
Chris@16
|
538 if( str.is_empty() || str.size() > size() )
|
Chris@16
|
539 return static_cast<size_type>(npos);
|
Chris@16
|
540
|
Chris@16
|
541 const_iterator it = end() - str.size();
|
Chris@16
|
542 const_iterator last = begin()-1;
|
Chris@16
|
543
|
Chris@16
|
544 while( it != last ) {
|
Chris@16
|
545 if( traits_type::compare( it, str.begin(), str.size() ) == 0 )
|
Chris@16
|
546 break;
|
Chris@16
|
547
|
Chris@16
|
548 --it;
|
Chris@16
|
549 }
|
Chris@16
|
550
|
Chris@16
|
551 return it == last ? static_cast<size_type>(npos) : static_cast<size_type>(it - begin());
|
Chris@16
|
552 }
|
Chris@16
|
553
|
Chris@16
|
554 //____________________________________________________________________________//
|
Chris@16
|
555
|
Chris@16
|
556 template<typename CharT>
|
Chris@16
|
557 inline basic_cstring<CharT>
|
Chris@16
|
558 basic_cstring<CharT>::substr( size_type beg_index, size_type end_index ) const
|
Chris@16
|
559 {
|
Chris@16
|
560 return beg_index > size()
|
Chris@16
|
561 ? self_type()
|
Chris@16
|
562 : end_index > size()
|
Chris@16
|
563 ? self_type( m_begin + beg_index, m_end )
|
Chris@16
|
564 : self_type( m_begin + beg_index, m_begin + end_index );
|
Chris@16
|
565 }
|
Chris@16
|
566
|
Chris@16
|
567 //____________________________________________________________________________//
|
Chris@16
|
568
|
Chris@16
|
569 template<typename CharT>
|
Chris@16
|
570 inline basic_cstring<CharT>
|
Chris@16
|
571 basic_cstring<CharT>::default_trim_ex()
|
Chris@16
|
572 {
|
Chris@16
|
573 static CharT ws[3] = { CharT(' '), CharT('\t'), CharT('\n') }; // !! wide case
|
Chris@16
|
574
|
Chris@16
|
575 return self_type( ws, 3 );
|
Chris@16
|
576 }
|
Chris@16
|
577
|
Chris@16
|
578 //____________________________________________________________________________//
|
Chris@16
|
579
|
Chris@16
|
580 // ************************************************************************** //
|
Chris@16
|
581 // ************** comparison operators ************** //
|
Chris@16
|
582 // ************************************************************************** //
|
Chris@16
|
583
|
Chris@16
|
584 template<typename CharT1,typename CharT2>
|
Chris@16
|
585 inline bool
|
Chris@16
|
586 operator==( basic_cstring<CharT1> const& s1, basic_cstring<CharT2> const& s2 )
|
Chris@16
|
587 {
|
Chris@16
|
588 typedef typename basic_cstring<CharT1>::traits_type traits_type;
|
Chris@16
|
589 return s1.size() == s2.size() &&
|
Chris@16
|
590 traits_type::compare( s1.begin(), s2.begin(), s1.size() ) == 0;
|
Chris@16
|
591 }
|
Chris@16
|
592
|
Chris@16
|
593 //____________________________________________________________________________//
|
Chris@16
|
594
|
Chris@16
|
595 template<typename CharT1,typename CharT2>
|
Chris@16
|
596 inline bool
|
Chris@16
|
597 operator==( basic_cstring<CharT1> const& s1, CharT2* s2 )
|
Chris@16
|
598 {
|
Chris@16
|
599 #if !defined(__DMC__)
|
Chris@16
|
600 return s1 == basic_cstring<CharT2>( s2 );
|
Chris@16
|
601 #else
|
Chris@16
|
602 return s1 == basic_cstring<CharT2 const>( s2 );
|
Chris@16
|
603 #endif
|
Chris@16
|
604 }
|
Chris@16
|
605
|
Chris@16
|
606 //____________________________________________________________________________//
|
Chris@16
|
607
|
Chris@16
|
608 template<typename CharT>
|
Chris@16
|
609 inline bool
|
Chris@16
|
610 operator==( basic_cstring<CharT> const& s1, typename basic_cstring<CharT>::std_string const& s2 )
|
Chris@16
|
611 {
|
Chris@16
|
612 return s1 == basic_cstring<CharT>( s2 );
|
Chris@16
|
613 }
|
Chris@16
|
614
|
Chris@16
|
615 //____________________________________________________________________________//
|
Chris@16
|
616
|
Chris@16
|
617 template<typename CharT1,typename CharT2>
|
Chris@16
|
618 inline bool
|
Chris@16
|
619 operator==( CharT1* s2, basic_cstring<CharT2> const& s1 )
|
Chris@16
|
620 {
|
Chris@16
|
621 return s1 == s2;
|
Chris@16
|
622 }
|
Chris@16
|
623
|
Chris@16
|
624 //____________________________________________________________________________//
|
Chris@16
|
625
|
Chris@16
|
626 template<typename CharT>
|
Chris@16
|
627 inline bool
|
Chris@16
|
628 operator==( typename basic_cstring<CharT>::std_string const& s2, basic_cstring<CharT> const& s1 )
|
Chris@16
|
629 {
|
Chris@16
|
630 return s1 == s2;
|
Chris@16
|
631 }
|
Chris@16
|
632
|
Chris@16
|
633 //____________________________________________________________________________//
|
Chris@16
|
634
|
Chris@16
|
635 template<typename CharT>
|
Chris@16
|
636 inline bool
|
Chris@16
|
637 operator!=( basic_cstring<CharT> const& s1, CharT* s2 )
|
Chris@16
|
638 {
|
Chris@16
|
639 return !(s1 == s2);
|
Chris@16
|
640 }
|
Chris@16
|
641
|
Chris@16
|
642 //____________________________________________________________________________//
|
Chris@16
|
643
|
Chris@16
|
644 template<typename CharT>
|
Chris@16
|
645 inline bool
|
Chris@16
|
646 operator!=( CharT* s2, basic_cstring<CharT> const& s1 )
|
Chris@16
|
647 {
|
Chris@16
|
648 return !(s1 == s2);
|
Chris@16
|
649 }
|
Chris@16
|
650
|
Chris@16
|
651 //____________________________________________________________________________//
|
Chris@16
|
652
|
Chris@16
|
653 template<typename CharT>
|
Chris@16
|
654 inline bool
|
Chris@16
|
655 operator!=( basic_cstring<CharT> const& s1, basic_cstring<CharT> const& s2 )
|
Chris@16
|
656 {
|
Chris@16
|
657 return !(s1 == s2);
|
Chris@16
|
658 }
|
Chris@16
|
659
|
Chris@16
|
660 //____________________________________________________________________________//
|
Chris@16
|
661
|
Chris@16
|
662 template<typename CharT>
|
Chris@16
|
663 inline bool
|
Chris@16
|
664 operator!=( basic_cstring<CharT> const& s1, typename basic_cstring<CharT>::std_string const& s2 )
|
Chris@16
|
665 {
|
Chris@16
|
666 return !(s1 == s2);
|
Chris@16
|
667 }
|
Chris@16
|
668
|
Chris@16
|
669 //____________________________________________________________________________//
|
Chris@16
|
670
|
Chris@16
|
671 template<typename CharT>
|
Chris@16
|
672 inline bool
|
Chris@16
|
673 operator!=( typename basic_cstring<CharT>::std_string const& s2, basic_cstring<CharT> const& s1 )
|
Chris@16
|
674 {
|
Chris@16
|
675 return !(s1 == s2);
|
Chris@16
|
676 }
|
Chris@16
|
677
|
Chris@16
|
678 //____________________________________________________________________________//
|
Chris@16
|
679
|
Chris@16
|
680 // ************************************************************************** //
|
Chris@16
|
681 // ************** first_char ************** //
|
Chris@16
|
682 // ************************************************************************** //
|
Chris@16
|
683
|
Chris@16
|
684 template<typename CharT>
|
Chris@16
|
685 inline typename basic_cstring<CharT>::value_type
|
Chris@16
|
686 first_char( basic_cstring<CharT> source )
|
Chris@16
|
687 {
|
Chris@16
|
688 typedef typename basic_cstring<CharT>::value_type string_value_type;
|
Chris@16
|
689
|
Chris@16
|
690 return source.is_empty() ? static_cast<string_value_type>(0) : *source.begin();
|
Chris@16
|
691 }
|
Chris@16
|
692
|
Chris@16
|
693 //____________________________________________________________________________//
|
Chris@16
|
694
|
Chris@16
|
695 // ************************************************************************** //
|
Chris@16
|
696 // ************** last_char ************** //
|
Chris@16
|
697 // ************************************************************************** //
|
Chris@16
|
698
|
Chris@16
|
699 template<typename CharT>
|
Chris@16
|
700 inline typename basic_cstring<CharT>::value_type
|
Chris@16
|
701 last_char( basic_cstring<CharT> source )
|
Chris@16
|
702 {
|
Chris@16
|
703 typedef typename basic_cstring<CharT>::value_type string_value_type;
|
Chris@16
|
704
|
Chris@16
|
705 return source.is_empty() ? static_cast<string_value_type>(0) : *(source.end()-1);
|
Chris@16
|
706 }
|
Chris@16
|
707
|
Chris@16
|
708 //____________________________________________________________________________//
|
Chris@16
|
709
|
Chris@16
|
710 // ************************************************************************** //
|
Chris@16
|
711 // ************** assign_op ************** //
|
Chris@16
|
712 // ************************************************************************** //
|
Chris@16
|
713
|
Chris@16
|
714 template<typename CharT1, typename CharT2>
|
Chris@16
|
715 inline void
|
Chris@16
|
716 assign_op( std::basic_string<CharT1>& target, basic_cstring<CharT2> src, int )
|
Chris@16
|
717 {
|
Chris@16
|
718 target.assign( src.begin(), src.size() );
|
Chris@16
|
719 }
|
Chris@16
|
720
|
Chris@16
|
721 //____________________________________________________________________________//
|
Chris@16
|
722
|
Chris@16
|
723 } // namespace unit_test
|
Chris@16
|
724
|
Chris@16
|
725 } // namespace boost
|
Chris@16
|
726
|
Chris@16
|
727 //____________________________________________________________________________//
|
Chris@16
|
728
|
Chris@16
|
729 #include <boost/test/detail/enable_warnings.hpp>
|
Chris@16
|
730
|
Chris@16
|
731 #endif // BOOST_TEST_BASIC_CSTRING_HPP_071894GER
|