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

📄 xstring

📁 pwlib源码库
💻
📖 第 1 页 / 共 2 页
字号:
// xstring internal header (from <string>)#ifndef _XSTRING_#define _XSTRING_/* This file is for use only in conjunction with a valid license forMicrosoft Visual C++ V5.0. Microsoft Corporation is in no way involvedwith the production or release of this file. The file is offered on an``as is'' basis.DINKUMWARE, LTD. AND P.J. PLAUGER MAKE NO REPRESENTATIONS OR WARRANTIESABOUT THE SUITABILITY OF THIS FILE, EITHER EXPRESS OR IMPLIED,INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY,FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT. DINKUMWARE, LTD.AND P.J. PLAUGER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BYLICENSEE AS A RESULT OF USING THIS FILE.For additional information, contact Dinkumware, Ltd. (+1-888-4DINKUM orsupport@dinkumware.com).Version date: 25 May 1998 */#include <xmemory>#ifdef  _MSC_VER#pragma pack(push,8)#endif  /* _MSC_VER */ #include <xutility>_STD_BEGIN_CRTIMP void __cdecl _Xlen();_CRTIMP void __cdecl _Xran();		// TEMPLATE CLASS basic_stringtemplate<class _E,	class _Tr = char_traits<_E>,	class _A = allocator<_E> >	class basic_string {public:	typedef basic_string<_E, _Tr, _A> _Myt;	typedef _A::size_type size_type;	typedef _A::difference_type difference_type;	typedef _A::pointer pointer;	typedef _A::const_pointer const_pointer;	typedef _A::reference reference;	typedef _A::const_reference const_reference;	typedef _A::value_type value_type;	typedef _A::pointer iterator;	typedef _A::const_pointer const_iterator;	typedef reverse_iterator<const_iterator, value_type,		const_reference, const_pointer, difference_type>			const_reverse_iterator;	typedef reverse_iterator<iterator, value_type,		reference, pointer, difference_type>			reverse_iterator;	explicit basic_string(const _A& _Al = _A())		: allocator(_Al) {_Tidy(); }	basic_string(const _Myt& _X)		: allocator(_X.allocator)		{_Tidy(), assign(_X, 0, npos); }	basic_string(const _Myt& _X, size_type _P, size_type _M,		const _A& _Al = _A())		: allocator(_Al) {_Tidy(), assign(_X, _P, _M); }	basic_string(const _E *_S, size_type _N,		const _A& _Al = _A())		: allocator(_Al) {_Tidy(), assign(_S, _N); }	basic_string(const _E *_S, const _A& _Al = _A())		: allocator(_Al) {_Tidy(), assign(_S); }	basic_string(size_type _N, _E _C, const _A& _Al = _A())		: allocator(_Al) {_Tidy(), assign(_N, _C); }	typedef const_iterator _It;	basic_string(_It _F, _It _L, const _A& _Al = _A())		: allocator(_Al) {_Tidy(); assign(_F, _L); }	~basic_string()		{_Tidy(true); }	typedef _Tr traits_type;	typedef _A allocator_type;	enum _Mref {_FROZEN = 255};	static const size_type npos;	_Myt& operator=(const _Myt& _X)		{return (assign(_X)); }	_Myt& operator=(const _E *_S)		{return (assign(_S)); }	_Myt& operator=(_E _C)		{return (assign(1, _C)); }	_Myt& operator+=(const _Myt& _X)		{return (append(_X)); }	_Myt& operator+=(const _E *_S)		{return (append(_S)); }	_Myt& operator+=(_E _C)		{return (append(1, _C)); }	_Myt& append(const _Myt& _X)		{return (append(_X, 0, npos)); }	_Myt& append(const _Myt& _X, size_type _P, size_type _M)		{if (_X.size() < _P)			_Xran();		size_type _N = _X.size() - _P;		if (_N < _M)			_M = _N;		if (npos - _Len <= _M)			_Xlen();		if (0 < _M && _Grow(_N = _Len + _M))			{_Tr::copy(_Ptr + _Len, &_X.c_str()[_P], _M);			_Eos(_N); }		return (*this); }	_Myt& append(const _E *_S, size_type _M)		{if (npos - _Len <= _M)			_Xlen();		size_type _N;		if (0 < _M && _Grow(_N = _Len + _M))			{_Tr::copy(_Ptr + _Len, _S, _M);			_Eos(_N); }		return (*this); }	_Myt& append(const _E *_S)		{return (append(_S, _Tr::length(_S))); }	_Myt& append(size_type _M, _E _C)		{if (npos - _Len <= _M)			_Xlen();		size_type _N;		if (0 < _M && _Grow(_N = _Len + _M))			{_Tr::assign(_Ptr + _Len, _M, _C);			_Eos(_N); }		return (*this); }	_Myt& append(_It _F, _It _L)		{return (replace(end(), end(), _F, _L)); }	_Myt& assign(const _Myt& _X)		{return (assign(_X, 0, npos)); }	_Myt& assign(const _Myt& _X, size_type _P, size_type _M)		{if (_X.size() < _P)			_Xran();		size_type _N = _X.size() - _P;		if (_M < _N)			_N = _M;		if (this == &_X)			erase((size_type)(_P + _N)), erase(0, _P);		else if (0 < _N && _N == _X.size()			&& _Refcnt(_X.c_str()) < _FROZEN - 1			&& allocator == _X.allocator)			{_Tidy(true);			_Ptr = (_E *)_X.c_str();			_Len = _X.size();			_Res = _X.capacity();			++_Refcnt(_Ptr); }		else if (_Grow(_N, true))			{_Tr::copy(_Ptr, &_X.c_str()[_P], _N);			_Eos(_N); }		return (*this); }	_Myt& assign(const _E *_S, size_type _N)		{if (_Grow(_N, true))			{_Tr::copy(_Ptr, _S, _N);			_Eos(_N); }		return (*this); }	_Myt& assign(const _E *_S)		{return (assign(_S, _Tr::length(_S))); }	_Myt& assign(size_type _N, _E _C)		{if (_N == npos)			_Xlen();		if (_Grow(_N, true))			{_Tr::assign(_Ptr, _N, _C);			_Eos(_N); }		return (*this); }	_Myt& assign(_It _F, _It _L)		{return (replace(begin(), end(), _F, _L)); }	_Myt& insert(size_type _P0, const _Myt& _X)		{return (insert(_P0, _X, 0, npos)); }	_Myt& insert(size_type _P0, const _Myt& _X, size_type _P,		size_type _M)		{if (_Len < _P0 || _X.size() < _P)			_Xran();		size_type _N = _X.size() - _P;		if (_N < _M)			_M = _N;		if (npos - _Len <= _M)			_Xlen();		if (0 < _M && _Grow(_N = _Len + _M))			{_Tr::move(_Ptr + _P0 + _M, _Ptr + _P0, _Len - _P0);			_Tr::copy(_Ptr + _P0, &_X.c_str()[_P], _M);			_Eos(_N); }		return (*this); }	_Myt& insert(size_type _P0, const _E *_S, size_type _M)		{if (_Len < _P0)			_Xran();		if (npos - _Len <= _M)			_Xlen();		size_type _N;		if (0 < _M && _Grow(_N = _Len + _M))			{_Tr::move(_Ptr + _P0 + _M, _Ptr + _P0, _Len - _P0);			_Tr::copy(_Ptr + _P0, _S, _M);			_Eos(_N); }		return (*this); }	_Myt& insert(size_type _P0, const _E *_S)		{return (insert(_P0, _S, _Tr::length(_S))); }	_Myt& insert(size_type _P0, size_type _M, _E _C)		{if (_Len < _P0)			_Xran();		if (npos - _Len <= _M)			_Xlen();		size_type _N;		if (0 < _M && _Grow(_N = _Len + _M))			{_Tr::move(_Ptr + _P0 + _M, _Ptr + _P0, _Len - _P0);			_Tr::assign(_Ptr + _P0, _M, _C);			_Eos(_N); }		return (*this); }	iterator insert(iterator _P, _E _C)		{size_type _P0 = _Pdif(_P, begin());		insert(_P0, 1, _C);		return (begin() + _P0); }	void insert(iterator _P, size_type _M, _E _C)		{size_type _P0 = _Pdif(_P, begin());		insert(_P0, _M, _C); }	void insert(iterator _P, _It _F, _It _L)		{replace(_P, _P, _F, _L); }	_Myt& erase(size_type _P0 = 0, size_type _M = npos)		{if (_Len < _P0)			_Xran();		if (_Len - _P0 < _M)			_M = _Len - _P0;		if (0 < _M)			{_Freeze();			_Tr::move(_Ptr + _P0, _Ptr + _P0 + _M,				_Len - _P0 - _M);			size_type _N = _Len - _M;			if (_Grow(_N))				_Eos(_N); }		return (*this); }	iterator erase(iterator _P)		{size_t _M = _Pdif(_P, begin());		erase(_M, 1);		return (_Psum(_Ptr, _M)); }	iterator erase(iterator _F, iterator _L)		{size_t _M = _Pdif(_F, begin());		erase(_M, _Pdif(_L, _F));		return (_Psum(_Ptr, _M)); }	_Myt& replace(size_type _P0, size_type _N0, const _Myt& _X)		{return (replace(_P0, _N0, _X, 0, npos)); }	_Myt& replace(size_type _P0, size_type _N0, const _Myt& _X,		size_type _P, size_type _M)		{if (_Len < _P0 || _X.size() < _P)			_Xran();		if (_Len - _P0 < _N0)			_N0 = _Len - _P0;		size_type _N = _X.size() - _P;		if (_N < _M)			_M = _N;		if (npos - _M <= _Len - _N0)			_Xlen();		size_type _Nm = _Len - _N0 - _P0;		if (_M < _N0)			{_Freeze();			_Tr::move(_Ptr + _P0 + _M, _Ptr + _P0 + _N0, _Nm); }		if ((0 < _M || 0 < _N0) && _Grow(_N = _Len + _M - _N0))			{if (_N0 < _M)				_Tr::move(_Ptr + _P0 + _M, _Ptr + _P0 + _N0, _Nm);			_Tr::copy(_Ptr + _P0, &_X.c_str()[_P], _M);			_Eos(_N); }		return (*this); }	_Myt& replace(size_type _P0, size_type _N0, const _E *_S,		size_type _M)		{if (_Len < _P0)			_Xran();		if (_Len - _P0 < _N0)			_N0 = _Len - _P0;		if (npos - _M <= _Len - _N0)			_Xlen();		size_type _Nm = _Len - _N0 - _P0;		if (_M < _N0)			{_Freeze();			_Tr::move(_Ptr + _P0 + _M, _Ptr + _P0 + _N0, _Nm); }		size_type _N;		if ((0 < _M || 0 < _N0) && _Grow(_N = _Len + _M - _N0))			{if (_N0 < _M)				_Tr::move(_Ptr + _P0 + _M, _Ptr + _P0 + _N0, _Nm);			_Tr::copy(_Ptr + _P0, _S, _M);			_Eos(_N); }		return (*this); }	_Myt& replace(size_type _P0, size_type _N0, const _E *_S)		{return (replace(_P0, _N0, _S, _Tr::length(_S))); }	_Myt& replace(size_type _P0, size_type _N0,		size_type _M, _E _C)		{if (_Len < _P0)			_Xran();		if (_Len - _P0 < _N0)			_N0 = _Len - _P0;		if (npos - _M <= _Len - _N0)			_Xlen();		size_type _Nm = _Len - _N0 - _P0;		if (_M < _N0)			{_Freeze();			_Tr::move(_Ptr + _P0 + _M, _Ptr + _P0 + _N0, _Nm); }		size_type _N;		if ((0 < _M || 0 < _N0) && _Grow(_N = _Len + _M - _N0))			{if (_N0 < _M)				_Tr::move(_Ptr + _P0 + _M, _Ptr + _P0 + _N0,					_Nm);			_Tr::assign(_Ptr + _P0, _M, _C);			_Eos(_N); }		return (*this); }	_Myt& replace(iterator _F, iterator _L, const _Myt& _X)		{return (replace(			_Pdif(_F, begin()), _Pdif(_L, _F), _X)); }	_Myt& replace(iterator _F, iterator _L, const _E *_S,		size_type _M)		{return (replace(			_Pdif(_F, begin()), _Pdif(_L, _F), _S, _M)); }	_Myt& replace(iterator _F, iterator _L, const _E *_S)		{return (replace(			_Pdif(_F, begin()), _Pdif(_L, _F), _S)); }	_Myt& replace(iterator _F, iterator _L,	size_type _M, _E _C)		{return (replace(			_Pdif(_F, begin()), _Pdif(_L, _F), _M, _C)); }	_Myt& replace(iterator _F1, iterator _L1,		_It _F2, _It _L2)		{size_type _P0 = _Pdif(_F1, begin());		size_type _M = 0;		_Distance(_F2, _L2, _M);		replace(_P0, _Pdif(_L1, _F1), _M, _E(0));		for (_F1 = begin() + _P0; 0 < _M; ++_F1, ++_F2, --_M)			*_F1 = *_F2;		return (*this); }	iterator begin()		{_Freeze();		return (_Ptr); }

⌨️ 快捷键说明

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