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

📄 basic_string.tcc

📁 linux下编程用 编译软件
💻 TCC
📖 第 1 页 / 共 3 页
字号:
// Components for manipulating sequences of characters -*- C++ -*-// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005// 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 basic_string.tcc *  This is an internal header file, included by other library headers. *  You should not attempt to use it directly. *///// ISO C++ 14882: 21  Strings library//// Written by Jason Merrill based upon the specification by Takanori Adachi// in ANSI X3J16/94-0013R2.  Rewritten by Nathan Myers to ISO-14882.#ifndef _BASIC_STRING_TCC#define _BASIC_STRING_TCC 1#pragma GCC system_headernamespace std{  template<typename _Type>    inline bool    __is_null_pointer(_Type* __ptr)    { return __ptr == 0; }  template<typename _Type>    inline bool    __is_null_pointer(_Type)    { return false; }  template<typename _CharT, typename _Traits, typename _Alloc>    const typename basic_string<_CharT, _Traits, _Alloc>::size_type    basic_string<_CharT, _Traits, _Alloc>::    _Rep::_S_max_size = (((npos - sizeof(_Rep_base))/sizeof(_CharT)) - 1) / 4;  template<typename _CharT, typename _Traits, typename _Alloc>    const _CharT    basic_string<_CharT, _Traits, _Alloc>::    _Rep::_S_terminal = _CharT();  template<typename _CharT, typename _Traits, typename _Alloc>    const typename basic_string<_CharT, _Traits, _Alloc>::size_type    basic_string<_CharT, _Traits, _Alloc>::npos;  // Linker sets _S_empty_rep_storage to all 0s (one reference, empty string)  // at static init time (before static ctors are run).  template<typename _CharT, typename _Traits, typename _Alloc>    typename basic_string<_CharT, _Traits, _Alloc>::size_type    basic_string<_CharT, _Traits, _Alloc>::_Rep::_S_empty_rep_storage[    (sizeof(_Rep_base) + sizeof(_CharT) + sizeof(size_type) - 1) /      sizeof(size_type)];  // NB: This is the special case for Input Iterators, used in  // istreambuf_iterators, etc.  // Input Iterators have a cost structure very different from  // pointers, calling for a different coding style.  template<typename _CharT, typename _Traits, typename _Alloc>    template<typename _InIterator>      _CharT*      basic_string<_CharT, _Traits, _Alloc>::      _S_construct(_InIterator __beg, _InIterator __end, const _Alloc& __a,		   input_iterator_tag)      {#ifndef _GLIBCXX_FULLY_DYNAMIC_STRING	if (__beg == __end && __a == _Alloc())	  return _S_empty_rep()._M_refdata();#endif	// Avoid reallocation for common case.	_CharT __buf[128];	size_type __len = 0;	while (__beg != __end && __len < sizeof(__buf) / sizeof(_CharT))	  {	    __buf[__len++] = *__beg;	    ++__beg;	  }	_Rep* __r = _Rep::_S_create(__len, size_type(0), __a);	_M_copy(__r->_M_refdata(), __buf, __len);	try	  {	    while (__beg != __end)	      {		if (__len == __r->_M_capacity)		  {		    // Allocate more space.		    _Rep* __another = _Rep::_S_create(__len + 1, __len, __a);		    _M_copy(__another->_M_refdata(), __r->_M_refdata(), __len);		    __r->_M_destroy(__a);		    __r = __another;		  }		__r->_M_refdata()[__len++] = *__beg;		++__beg;	      }	  }	catch(...)	  {	    __r->_M_destroy(__a);	    __throw_exception_again;	  }	__r->_M_set_length_and_sharable(__len);	return __r->_M_refdata();      }  template<typename _CharT, typename _Traits, typename _Alloc>    template <typename _InIterator>      _CharT*      basic_string<_CharT, _Traits, _Alloc>::      _S_construct(_InIterator __beg, _InIterator __end, const _Alloc& __a,		   forward_iterator_tag)      {#ifndef _GLIBCXX_FULLY_DYNAMIC_STRING	if (__beg == __end && __a == _Alloc())	  return _S_empty_rep()._M_refdata();#endif	// NB: Not required, but considered best practice.	if (__builtin_expect(__is_null_pointer(__beg) && __beg != __end, 0))	  __throw_logic_error(__N("basic_string::_S_construct NULL not valid"));	const size_type __dnew = static_cast<size_type>(std::distance(__beg,								      __end));	// Check for out_of_range and length_error exceptions.	_Rep* __r = _Rep::_S_create(__dnew, size_type(0), __a);	try	  { _S_copy_chars(__r->_M_refdata(), __beg, __end); }	catch(...)	  {	    __r->_M_destroy(__a);	    __throw_exception_again;	  }	__r->_M_set_length_and_sharable(__dnew);	return __r->_M_refdata();      }  template<typename _CharT, typename _Traits, typename _Alloc>    _CharT*    basic_string<_CharT, _Traits, _Alloc>::    _S_construct(size_type __n, _CharT __c, const _Alloc& __a)    {#ifndef _GLIBCXX_FULLY_DYNAMIC_STRING      if (__n == 0 && __a == _Alloc())	return _S_empty_rep()._M_refdata();#endif      // Check for out_of_range and length_error exceptions.      _Rep* __r = _Rep::_S_create(__n, size_type(0), __a);      if (__n)	_M_assign(__r->_M_refdata(), __n, __c);      __r->_M_set_length_and_sharable(__n);      return __r->_M_refdata();    }  template<typename _CharT, typename _Traits, typename _Alloc>    basic_string<_CharT, _Traits, _Alloc>::    basic_string(const basic_string& __str)    : _M_dataplus(__str._M_rep()->_M_grab(_Alloc(__str.get_allocator()),					  __str.get_allocator()),		  __str.get_allocator())    { }  template<typename _CharT, typename _Traits, typename _Alloc>    basic_string<_CharT, _Traits, _Alloc>::    basic_string(const _Alloc& __a)    : _M_dataplus(_S_construct(size_type(), _CharT(), __a), __a)    { }  template<typename _CharT, typename _Traits, typename _Alloc>    basic_string<_CharT, _Traits, _Alloc>::    basic_string(const basic_string& __str, size_type __pos, size_type __n)    : _M_dataplus(_S_construct(__str._M_data()			       + __str._M_check(__pos,						"basic_string::basic_string"),			       __str._M_data() + __str._M_limit(__pos, __n)			       + __pos, _Alloc()), _Alloc())    { }  template<typename _CharT, typename _Traits, typename _Alloc>    basic_string<_CharT, _Traits, _Alloc>::    basic_string(const basic_string& __str, size_type __pos,		 size_type __n, const _Alloc& __a)    : _M_dataplus(_S_construct(__str._M_data()			       + __str._M_check(__pos,						"basic_string::basic_string"),			       __str._M_data() + __str._M_limit(__pos, __n)			       + __pos, __a), __a)    { }  // TBD: DPG annotate  template<typename _CharT, typename _Traits, typename _Alloc>    basic_string<_CharT, _Traits, _Alloc>::    basic_string(const _CharT* __s, size_type __n, const _Alloc& __a)    : _M_dataplus(_S_construct(__s, __s + __n, __a), __a)    { }  // TBD: DPG annotate  template<typename _CharT, typename _Traits, typename _Alloc>    basic_string<_CharT, _Traits, _Alloc>::    basic_string(const _CharT* __s, const _Alloc& __a)    : _M_dataplus(_S_construct(__s, __s ? __s + traits_type::length(__s) :			       __s + npos, __a), __a)    { }  template<typename _CharT, typename _Traits, typename _Alloc>    basic_string<_CharT, _Traits, _Alloc>::    basic_string(size_type __n, _CharT __c, const _Alloc& __a)    : _M_dataplus(_S_construct(__n, __c, __a), __a)    { }  // TBD: DPG annotate  template<typename _CharT, typename _Traits, typename _Alloc>    template<typename _InputIterator>    basic_string<_CharT, _Traits, _Alloc>::    basic_string(_InputIterator __beg, _InputIterator __end, const _Alloc& __a)    : _M_dataplus(_S_construct(__beg, __end, __a), __a)    { }  template<typename _CharT, typename _Traits, typename _Alloc>    basic_string<_CharT, _Traits, _Alloc>&    basic_string<_CharT, _Traits, _Alloc>::    assign(const basic_string& __str)    {      if (_M_rep() != __str._M_rep())	{	  // XXX MT	  const allocator_type __a = this->get_allocator();	  _CharT* __tmp = __str._M_rep()->_M_grab(__a, __str.get_allocator());	  _M_rep()->_M_dispose(__a);	  _M_data(__tmp);	}      return *this;    }  template<typename _CharT, typename _Traits, typename _Alloc>    basic_string<_CharT, _Traits, _Alloc>&    basic_string<_CharT, _Traits, _Alloc>::    assign(const _CharT* __s, size_type __n)    {      __glibcxx_requires_string_len(__s, __n);      _M_check_length(this->size(), __n, "basic_string::assign");      if (_M_disjunct(__s) || _M_rep()->_M_is_shared())	return _M_replace_safe(size_type(0), this->size(), __s, __n);      else	{	  // Work in-place.	  const size_type __pos = __s - _M_data();	  if (__pos >= __n)	    _M_copy(_M_data(), __s, __n);	  else if (__pos)	    _M_move(_M_data(), __s, __n);	  _M_rep()->_M_set_length_and_sharable(__n);	  return *this;	}     }  template<typename _CharT, typename _Traits, typename _Alloc>    basic_string<_CharT, _Traits, _Alloc>&    basic_string<_CharT, _Traits, _Alloc>::    append(size_type __n, _CharT __c)    {      if (__n)	{	  _M_check_length(size_type(0), __n, "basic_string::append");	  	  const size_type __len = __n + this->size();	  if (__len > this->capacity() || _M_rep()->_M_is_shared())	    this->reserve(__len);	  _M_assign(_M_data() + this->size(), __n, __c);	  _M_rep()->_M_set_length_and_sharable(__len);	}      return *this;    }  template<typename _CharT, typename _Traits, typename _Alloc>    basic_string<_CharT, _Traits, _Alloc>&    basic_string<_CharT, _Traits, _Alloc>::    append(const _CharT* __s, size_type __n)    {      __glibcxx_requires_string_len(__s, __n);      if (__n)	{	  _M_check_length(size_type(0), __n, "basic_string::append");	  const size_type __len = __n + this->size();	  if (__len > this->capacity() || _M_rep()->_M_is_shared())	    {	      if (_M_disjunct(__s))		this->reserve(__len);	      else		{		  const size_type __off = __s - _M_data();		  this->reserve(__len);		  __s = _M_data() + __off;		}	    }	  _M_copy(_M_data() + this->size(), __s, __n);	  _M_rep()->_M_set_length_and_sharable(__len);	}      return *this;    }  template<typename _CharT, typename _Traits, typename _Alloc>    basic_string<_CharT, _Traits, _Alloc>&    basic_string<_CharT, _Traits, _Alloc>::    append(const basic_string& __str)    {      const size_type __size = __str.size();      if (__size)	{

⌨️ 快捷键说明

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