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

📄 sso_string_base.h

📁 linux下编程用 编译软件
💻 H
📖 第 1 页 / 共 2 页
字号:
      else	{	  const size_type __tmp_capacity = _M_allocated_capacity;	  if (__rcs._M_is_local())	    {	      traits_type::copy(_M_local_data, __rcs._M_local_data,				_S_local_capacity + 1);	      __rcs._M_data(_M_data());	      _M_data(_M_local_data);	    }	  else	    {	      _CharT* __tmp_ptr = _M_data();	      _M_data(__rcs._M_data());	      __rcs._M_data(__tmp_ptr);	      _M_capacity(__rcs._M_allocated_capacity);	    }	  __rcs._M_capacity(__tmp_capacity);	}      const size_type __tmp_length = _M_length();      _M_length(__rcs._M_length());      __rcs._M_length(__tmp_length);    }  template<typename _CharT, typename _Traits, typename _Alloc>    _CharT*    __sso_string_base<_CharT, _Traits, _Alloc>::    _M_create(size_type& __capacity, size_type __old_capacity)    {      // _GLIBCXX_RESOLVE_LIB_DEFECTS      // 83.  String::npos vs. string::max_size()      if (__capacity > size_type(_S_max_size))	std::__throw_length_error(__N("__sso_string_base::_M_create"));      // The below implements an exponential growth policy, necessary to      // meet amortized linear time requirements of the library: see      // http://gcc.gnu.org/ml/libstdc++/2001-07/msg00085.html.      if (__capacity > __old_capacity && __capacity < 2 * __old_capacity)	__capacity = 2 * __old_capacity;      // NB: Need an array of char_type[__capacity], plus a terminating      // null char_type() element.      return _M_dataplus._CharT_alloc_type::allocate(__capacity + 1);    }  template<typename _CharT, typename _Traits, typename _Alloc>    __sso_string_base<_CharT, _Traits, _Alloc>::    __sso_string_base(const _Alloc& __a)    : _M_dataplus(__a, _M_local_data)    { _M_set_length(0); }  template<typename _CharT, typename _Traits, typename _Alloc>    __sso_string_base<_CharT, _Traits, _Alloc>::    __sso_string_base(const __sso_string_base& __rcs)    : _M_dataplus(__rcs._M_get_allocator(), _M_local_data)    { _M_construct(__rcs._M_data(), __rcs._M_data() + __rcs._M_length()); }  template<typename _CharT, typename _Traits, typename _Alloc>    __sso_string_base<_CharT, _Traits, _Alloc>::    __sso_string_base(size_type __n, _CharT __c, const _Alloc& __a)    : _M_dataplus(__a, _M_local_data)    { _M_construct(__n, __c); }  template<typename _CharT, typename _Traits, typename _Alloc>    template<typename _InputIterator>    __sso_string_base<_CharT, _Traits, _Alloc>::    __sso_string_base(_InputIterator __beg, _InputIterator __end,		      const _Alloc& __a)    : _M_dataplus(__a, _M_local_data)    { _M_construct(__beg, __end); }  // 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>      void      __sso_string_base<_CharT, _Traits, _Alloc>::      _M_construct(_InIterator __beg, _InIterator __end,		   std::input_iterator_tag)      {	size_type __len = 0;	size_type __capacity = size_type(_S_local_capacity);	while (__beg != __end && __len < __capacity)	  {	    _M_data()[__len++] = *__beg;	    ++__beg;	  }		try	  {	    while (__beg != __end)	      {		if (__len == __capacity)		  {		    // Allocate more space.		    __capacity = __len + 1;		    _CharT* __another = _M_create(__capacity, __len);		    _S_copy(__another, _M_data(), __len);		    _M_dispose();		    _M_data(__another);		    _M_capacity(__capacity);		  }		_M_data()[__len++] = *__beg;		++__beg;	      }	  }	catch(...)	  {	    _M_dispose();	    __throw_exception_again;	  }	_M_set_length(__len);      }  template<typename _CharT, typename _Traits, typename _Alloc>    template<typename _InIterator>      void      __sso_string_base<_CharT, _Traits, _Alloc>::      _M_construct(_InIterator __beg, _InIterator __end,		   std::forward_iterator_tag)      {	// NB: Not required, but considered best practice.	if (__builtin_expect(_S_is_null_pointer(__beg) && __beg != __end, 0))	  std::__throw_logic_error(__N("__sso_string_base::"				       "_M_construct NULL not valid"));	size_type __dnew = static_cast<size_type>(std::distance(__beg, __end));	if (__dnew > size_type(_S_local_capacity))	  {	    _M_data(_M_create(__dnew, size_type(0)));	    _M_capacity(__dnew);	  }	// Check for out_of_range and length_error exceptions.	try	  { _S_copy_chars(_M_data(), __beg, __end); }	catch(...)	  {	    _M_dispose();	    __throw_exception_again;	  }	_M_set_length(__dnew);      }  template<typename _CharT, typename _Traits, typename _Alloc>    void    __sso_string_base<_CharT, _Traits, _Alloc>::    _M_construct(size_type __n, _CharT __c)    {      if (__n > size_type(_S_local_capacity))	{	  _M_data(_M_create(__n, size_type(0)));	  _M_capacity(__n);	}      if (__n)	_S_assign(_M_data(), __n, __c);      _M_set_length(__n);    }  template<typename _CharT, typename _Traits, typename _Alloc>    void    __sso_string_base<_CharT, _Traits, _Alloc>::    _M_assign(const __sso_string_base& __rcs)    {      if (this != &__rcs)	{	  const size_type __rsize = __rcs._M_length();	  const size_type __capacity = _M_capacity();	  if (__rsize > __capacity)	    {	      size_type __new_capacity = __rsize;	      _CharT* __tmp = _M_create(__new_capacity, __capacity);	      _M_dispose();	      _M_data(__tmp);	      _M_capacity(__new_capacity);	    }	  if (__rsize)	    _S_copy(_M_data(), __rcs._M_data(), __rsize);	  _M_set_length(__rsize);	}    }  template<typename _CharT, typename _Traits, typename _Alloc>    void    __sso_string_base<_CharT, _Traits, _Alloc>::    _M_reserve(size_type __res)    {      // Make sure we don't shrink below the current size.      if (__res < _M_length())	__res = _M_length();      const size_type __capacity = _M_capacity();      if (__res != __capacity)	{	  if (__res > __capacity	      || __res > size_type(_S_local_capacity))	    {	      _CharT* __tmp = _M_create(__res, __capacity);	      _S_copy(__tmp, _M_data(), _M_length() + 1);	      _M_dispose();	      _M_data(__tmp);	      _M_capacity(__res);	    }	  else if (!_M_is_local())	    {	      _S_copy(_M_local_data, _M_data(), _M_length() + 1);	      _M_destroy(__capacity);	      _M_data(_M_local_data);	    }	}    }  template<typename _CharT, typename _Traits, typename _Alloc>    void    __sso_string_base<_CharT, _Traits, _Alloc>::    _M_mutate(size_type __pos, size_type __len1, const _CharT* __s,	      const size_type __len2)    {      const size_type __how_much = _M_length() - __pos - __len1;            size_type __new_capacity = _M_length() + __len2 - __len1;      _CharT* __r = _M_create(__new_capacity, _M_capacity());      if (__pos)	_S_copy(__r, _M_data(), __pos);      if (__s && __len2)	_S_copy(__r + __pos, __s, __len2);      if (__how_much)	_S_copy(__r + __pos + __len2,		_M_data() + __pos + __len1, __how_much);            _M_dispose();      _M_data(__r);      _M_capacity(__new_capacity);    }  template<typename _CharT, typename _Traits, typename _Alloc>    void    __sso_string_base<_CharT, _Traits, _Alloc>::    _M_erase(size_type __pos, size_type __n)    {      const size_type __how_much = _M_length() - __pos - __n;      if (__how_much && __n)	_S_move(_M_data() + __pos, _M_data() + __pos + __n,		__how_much);      _M_set_length(_M_length() - __n);    }  template<>    inline bool    __sso_string_base<char, std::char_traits<char>,		      std::allocator<char> >::    _M_compare(const __sso_string_base& __rcs) const    {      if (this == &__rcs)	return true;      return false;    }  template<>    inline bool    __sso_string_base<wchar_t, std::char_traits<wchar_t>,		      std::allocator<wchar_t> >::    _M_compare(const __sso_string_base& __rcs) const    {      if (this == &__rcs)	return true;      return false;    }} // namespace __gnu_cxx#endif /* _SSO_STRING_BASE_H */

⌨️ 快捷键说明

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