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

📄 sso_string_base.h

📁 linux下编程用 编译软件
💻 H
📖 第 1 页 / 共 2 页
字号:
// Short-string-optimized versatile string base -*- C++ -*-// Copyright (C) 2005, 2006 Free Software Foundation, Inc.//// This file is part of the GNU ISO C++ Library.  This library is free// software; you can redistribute it and/or modify it under the// terms of the GNU General Public License as published by the// Free Software Foundation; either version 2, or (at your option)// any later version.// This library is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the// GNU General Public License for more details.// You should have received a copy of the GNU General Public License along// with this library; see the file COPYING.  If not, write to the Free// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,// USA.// As a special exception, you may use this file as part of a free software// library without restriction.  Specifically, if other files instantiate// templates or use macros or inline functions from this file, or you compile// this file and link it with other files to produce an executable, this// file does not by itself cause the resulting executable to be covered by// the GNU General Public License.  This exception does not however// invalidate any other reasons why the executable file might be covered by// the GNU General Public License./** @file ext/sso_string_base.h *  This file is a GNU extension to the Standard C++ Library. *  This is an internal header file, included by other library headers. *  You should not attempt to use it directly. */#ifndef _SSO_STRING_BASE_H#define _SSO_STRING_BASE_H 1namespace __gnu_cxx{  template<typename _CharT, typename _Traits, typename _Alloc>    class __sso_string_base    : protected __vstring_utility<_CharT, _Traits, _Alloc>    {    public:      typedef _Traits					    traits_type;      typedef typename _Traits::char_type		    value_type;      typedef __vstring_utility<_CharT, _Traits, _Alloc>    _Util_Base;      typedef typename _Util_Base::_CharT_alloc_type        _CharT_alloc_type;      typedef typename _CharT_alloc_type::size_type	    size_type;          private:      // The maximum number of individual char_type elements of an      // individual string is determined by _S_max_size. This is the      // value that will be returned by max_size().  (Whereas npos      // is the maximum number of bytes the allocator can allocate.)      // If one was to divvy up the theoretical largest size string,      // with a terminating character and m _CharT elements, it'd      // look like this:      // npos = m * sizeof(_CharT) + sizeof(_CharT)      // Solving for m:      // m = npos / sizeof(_CharT) - 1      // In addition, this implementation quarters this amount.      enum { _S_max_size = (((static_cast<size_type>(-1)			      / sizeof(_CharT)) - 1) / 4) };      // Data Members (private):      typename _Util_Base::template _Alloc_hider<_CharT_alloc_type>                                                            _M_dataplus;      size_type                                             _M_string_length;      enum { _S_local_capacity = 15 };            union      {	_CharT           _M_local_data[_S_local_capacity + 1];	size_type        _M_allocated_capacity;      };      void      _M_data(_CharT* __p)      { _M_dataplus._M_p = __p; }      void      _M_length(size_type __length)      { _M_string_length = __length; }      void      _M_capacity(size_type __capacity)      { _M_allocated_capacity = __capacity; }      bool      _M_is_local() const      { return _M_data() == _M_local_data; }      // Create & Destroy      _CharT*      _M_create(size_type&, size_type);            void      _M_dispose()      {	if (!_M_is_local())	  _M_destroy(_M_allocated_capacity);      }      void      _M_destroy(size_type) throw();      // _M_construct_aux is used to implement the 21.3.1 para 15 which      // requires special behaviour if _InIterator is an integral type      template<typename _InIterator>        void        _M_construct_aux(_InIterator __beg, _InIterator __end, __false_type)	{          typedef typename iterator_traits<_InIterator>::iterator_category _Tag;          _M_construct(__beg, __end, _Tag());	}      template<typename _InIterator>        void        _M_construct_aux(_InIterator __beg, _InIterator __end, __true_type)	{ _M_construct(static_cast<size_type>(__beg),		       static_cast<value_type>(__end)); }      template<typename _InIterator>        void        _M_construct(_InIterator __beg, _InIterator __end)	{	  typedef typename std::__is_integer<_InIterator>::__type _Integral;	  _M_construct_aux(__beg, __end, _Integral());        }      // For Input Iterators, used in istreambuf_iterators, etc.      template<typename _InIterator>        void        _M_construct(_InIterator __beg, _InIterator __end,		     std::input_iterator_tag);            // For forward_iterators up to random_access_iterators, used for      // string::iterator, _CharT*, etc.      template<typename _FwdIterator>        void        _M_construct(_FwdIterator __beg, _FwdIterator __end,		     std::forward_iterator_tag);      void      _M_construct(size_type __req, _CharT __c);    public:      size_type      _M_max_size() const      { return size_type(_S_max_size); }      _CharT*      _M_data() const      { return _M_dataplus._M_p; }      size_type      _M_length() const      { return _M_string_length; }      size_type      _M_capacity() const      {	return _M_is_local() ? size_type(_S_local_capacity)	                     : _M_allocated_capacity;       }      bool      _M_is_shared() const      { return false; }      void      _M_set_leaked() { }      void      _M_leak() { }      void      _M_set_length(size_type __n)      {	_M_length(__n);	traits_type::assign(_M_data()[__n], _CharT());      }      __sso_string_base()      : _M_dataplus(_Alloc(), _M_local_data)      { _M_set_length(0); }      __sso_string_base(const _Alloc& __a);      __sso_string_base(const __sso_string_base& __rcs);      __sso_string_base(size_type __n, _CharT __c, const _Alloc& __a);      template<typename _InputIterator>        __sso_string_base(_InputIterator __beg, _InputIterator __end,			  const _Alloc& __a);      ~__sso_string_base()      { _M_dispose(); }      _CharT_alloc_type&      _M_get_allocator()      { return _M_dataplus; }      const _CharT_alloc_type&      _M_get_allocator() const      { return _M_dataplus; }      void      _M_swap(__sso_string_base& __rcs);      void      _M_assign(const __sso_string_base& __rcs);      void      _M_reserve(size_type __res);      void      _M_mutate(size_type __pos, size_type __len1, const _CharT* __s,		size_type __len2);      void      _M_erase(size_type __pos, size_type __n);      bool      _M_compare(const __sso_string_base&) const      { return false; }    };  template<typename _CharT, typename _Traits, typename _Alloc>    void    __sso_string_base<_CharT, _Traits, _Alloc>::    _M_destroy(size_type __size) throw()    { _M_dataplus._CharT_alloc_type::deallocate(_M_data(), __size + 1); }  template<typename _CharT, typename _Traits, typename _Alloc>    void    __sso_string_base<_CharT, _Traits, _Alloc>::    _M_swap(__sso_string_base& __rcs)    {      // NB: Implement Option 3 of DR 431 (see N1599).      std::__alloc_swap<_CharT_alloc_type>::_S_do_it(_M_get_allocator(),						     __rcs._M_get_allocator());      if (_M_is_local())	if (__rcs._M_is_local())	  {	    if (_M_length() && __rcs._M_length())	      {		_CharT __tmp_data[_S_local_capacity + 1];		traits_type::copy(__tmp_data, __rcs._M_local_data,				  _S_local_capacity + 1);		traits_type::copy(__rcs._M_local_data, _M_local_data,				  _S_local_capacity + 1);		traits_type::copy(_M_local_data, __tmp_data,				  _S_local_capacity + 1);	      }	    else if (__rcs._M_length())	      {		traits_type::copy(_M_local_data, __rcs._M_local_data,				  _S_local_capacity + 1);		_M_length(__rcs._M_length());		__rcs._M_set_length(0);		return;	      }	    else if (_M_length())	      {		traits_type::copy(__rcs._M_local_data, _M_local_data,				  _S_local_capacity + 1);		__rcs._M_length(_M_length());		_M_set_length(0);		return;	      }	  }	else	  {	    const size_type __tmp_capacity = __rcs._M_allocated_capacity;	    traits_type::copy(__rcs._M_local_data, _M_local_data,			      _S_local_capacity + 1);	    _M_data(__rcs._M_data());	    __rcs._M_data(__rcs._M_local_data);	    _M_capacity(__tmp_capacity);	  }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -