⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 basic_cstring.hpp

📁 CGAL is a collaborative effort of several sites in Europe and Israel. The goal is to make the most i
💻 HPP
📖 第 1 页 / 共 2 页
字号:
//  (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 + -