📄 basic_cstring.hpp
字号:
// (C) Copyright Gennadiy Rozental 2004.// Distributed under the Boost Software License, Version 1.0.// (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt)// See http://www.boost.org/libs/test for the library home page.//// File : $RCSfile: basic_cstring.hpp,v $//// Version : $Revision: 1.1.1.1 $//// Description : class basic_cstring wraps C string and provide std_string like // interface// ***************************************************************************#ifndef BASIC_CSTRING_HPP_071894GER#define BASIC_CSTRING_HPP_071894GER// Boost.Test#include <boost/test/detail/basic_cstring/basic_cstring_fwd.hpp>#include <boost/test/detail/basic_cstring/bcs_char_traits.hpp>// STL#include <string>namespace boost {namespace unit_test {// ************************************************************************** //// ************** basic_cstring ************** //// ************************************************************************** //template<typename CharT>class basic_cstring { typedef basic_cstring<CharT> self_type;public: // Subtypes typedef ut_detail::bcs_char_traits<CharT> traits_type; typedef typename ut_detail::bcs_char_traits<CharT>::std_string std_string; typedef CharT value_type; typedef value_type* pointer; typedef value_type const* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; typedef std::size_t size_type; typedef std::ptrdiff_t difference_type; typedef value_type const* const_iterator; typedef value_type* iterator; //!! should also present reverse_iterator, const_reverse_iterator#if !BOOST_WORKAROUND(__IBMCPP__, BOOST_TESTED_AT(600)) enum npos_type { npos = (size_type)-1 };#else // IBM/VisualAge version 6 is not able to handle enums larger than 4 bytes. // But size_type is 8 bytes in 64bit mode. static const size_type npos = -1 ;#endif static pointer null_str(); // Constructors; default copy constructor is generated by compiler basic_cstring(); basic_cstring( std_string const& s ); basic_cstring( pointer s ); basic_cstring( pointer s, size_type arg_size ); basic_cstring( pointer first, pointer last ); // data access methods value_type operator[]( size_type index ) const; value_type at( size_type index ) const; // size operators size_type size() const; bool is_empty() const; void clear(); void resize( size_type new_len ); //!! only for STL container conformance use is_empty instead bool empty() const; // Trimming self_type& trim_right( size_type trim_size ); self_type& trim_left( size_type trim_size ); self_type& trim_right( iterator it ); self_type& trim_left( iterator it );#ifndef __IBMCPP__ self_type& trim_left( self_type exclusions = self_type() ) ; self_type& trim_right( self_type exclusions = self_type() ) ; self_type& trim( self_type exclusions = self_type() ) ;#else // VisualAge version 6 has in this case a problem with the default arguments. self_type& trim_left( self_type exclusions ) ; self_type& trim_right( self_type exclusions ) ; self_type& trim( self_type exclusions ) ; self_type& trim_left() { trim_left( self_type() ) ; } self_type& trim_right() { trim_right( self_type() ) ; } self_type& trim() { trim( self_type() ) ; }#endif // Assignment operators basic_cstring& operator=( self_type const& s ); basic_cstring& operator=( std_string const& s ); basic_cstring& operator=( pointer s ); template<typename CharT2> basic_cstring& assign( basic_cstring<CharT2> const& s ) { *this = basic_cstring<CharT>( s.begin(), s.end() ); return *this; } basic_cstring& assign( self_type const& s, size_type pos, size_type len ); basic_cstring& assign( std_string const& s ); basic_cstring& assign( std_string const& s, size_type pos, size_type len ); basic_cstring& assign( pointer s ); basic_cstring& assign( pointer s, size_type len ); basic_cstring& assign( pointer f, pointer l ); void assign_to( std_string& target ) const; // swapping void swap( self_type& s ); // Iterators iterator begin(); const_iterator begin() const; iterator end(); const_iterator end() const; //!! should have rbegin, rend // substring search operation size_type find( basic_cstring ) const; size_type rfind( basic_cstring ) const; self_type substr( size_type beg_index, size_type end_index = npos ) const;private: static self_type default_trim_ex(); // Data members iterator m_begin; iterator m_end;};//____________________________________________________________________________//template<typename CharT>inline typename basic_cstring<CharT>::pointerbasic_cstring<CharT>::null_str(){ static CharT null = 0; return &null;}//____________________________________________________________________________//template<typename CharT>inlinebasic_cstring<CharT>::basic_cstring(): m_begin( null_str() ), m_end( m_begin ){}//____________________________________________________________________________//template<typename CharT>inlinebasic_cstring<CharT>::basic_cstring( std_string const& s ): m_begin( s.c_str() ), m_end( m_begin + s.size() ) {}//____________________________________________________________________________//template<typename CharT>inlinebasic_cstring<CharT>::basic_cstring( pointer s ): m_begin( s ? s : null_str() ), m_end ( m_begin + (s ? traits_type::length( s ) : 0 ) ) {}//____________________________________________________________________________//template<typename CharT>inlinebasic_cstring<CharT>::basic_cstring( pointer s, size_type arg_size ): m_begin( s ), m_end( m_begin + arg_size ){}//____________________________________________________________________________//template<typename CharT>inlinebasic_cstring<CharT>::basic_cstring( pointer first, pointer last ): m_begin( first ), m_end( last ){}//____________________________________________________________________________//template<typename CharT>inline typename basic_cstring<CharT>::value_typebasic_cstring<CharT>::operator[]( size_type index ) const{ return m_begin[index];}//____________________________________________________________________________//template<typename CharT>inline typename basic_cstring<CharT>::value_typebasic_cstring<CharT>::at( size_type index ) const{ if( m_begin + index >= m_end ) return (value_type)0; return m_begin[index];}//____________________________________________________________________________//template<typename CharT>inline typename basic_cstring<CharT>::size_typebasic_cstring<CharT>::size() const{ return m_end - m_begin;}//____________________________________________________________________________//template<typename CharT>inline boolbasic_cstring<CharT>::is_empty() const{ return m_end == m_begin;}//____________________________________________________________________________//template<typename CharT>inline boolbasic_cstring<CharT>::empty() const{ return is_empty();}//____________________________________________________________________________//template<typename CharT>inline voidbasic_cstring<CharT>::clear(){ m_begin = m_end;}//____________________________________________________________________________//template<typename CharT>inline voidbasic_cstring<CharT>::resize( size_type new_len ){ if( m_begin + new_len < m_end ) m_end = m_begin + new_len;}//____________________________________________________________________________//template<typename CharT>inline basic_cstring<CharT>&basic_cstring<CharT>::trim_left( size_type trim_size ){ m_begin += trim_size; if( m_end <= m_begin ) clear(); return *this;}//____________________________________________________________________________//template<typename CharT>inline basic_cstring<CharT>&basic_cstring<CharT>::trim_left( iterator it ){ m_begin = it; if( m_end <= m_begin ) clear(); return *this;}//____________________________________________________________________________//template<typename CharT>inline basic_cstring<CharT>&basic_cstring<CharT>::trim_left( basic_cstring exclusions ){ if( exclusions.is_empty() ) exclusions = default_trim_ex(); iterator it; for( it = begin(); it != end(); ++it ) { if( traits_type::find( exclusions.begin(), exclusions.size(), *it ) == (pointer)0 ) break; } return trim_left( it );}//____________________________________________________________________________//template<typename CharT>inline basic_cstring<CharT>&basic_cstring<CharT>::trim_right( size_type trim_size ){ m_end -= trim_size; if( m_end <= m_begin ) clear(); return *this;}//____________________________________________________________________________//template<typename CharT>inline basic_cstring<CharT>&basic_cstring<CharT>::trim_right( iterator it ){ m_end = it; if( m_end <= m_begin ) clear(); return *this;}//____________________________________________________________________________//template<typename CharT>inline basic_cstring<CharT>&basic_cstring<CharT>::trim_right( basic_cstring exclusions ){ if( exclusions.is_empty() ) exclusions = default_trim_ex(); iterator it; for( it = end()-1; it != begin()-1; --it ) { if( basic_cstring::traits_type::find( exclusions.begin(), exclusions.size(), *it ) == (pointer)0 ) break; } return trim_right( it+1 );}//____________________________________________________________________________//template<typename CharT>inline basic_cstring<CharT>&basic_cstring<CharT>::trim( basic_cstring exclusions ){ trim_left( exclusions ); trim_right( exclusions ); return *this;}//____________________________________________________________________________//template<typename CharT>inline basic_cstring<CharT>&basic_cstring<CharT>::operator=( basic_cstring<CharT> const& s ){ m_begin = s.m_begin; m_end = s.m_end; return *this;}//____________________________________________________________________________//
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -