📄 xstring
字号:
// xstring internal header (from <string>)
#pragma once
#ifndef _XSTRING_
#define _XSTRING_
#ifndef RC_INVOKED
#include <xmemory>
#pragma pack(push,_CRT_PACKING)
#pragma warning(push,3)
_STD_BEGIN
#pragma warning(disable: 4251)
template<class _Elem,
class _Traits = char_traits<_Elem>,
class _Ax = allocator<_Elem> >
class basic_string;
#define _STRING_ITER_BASE(it) (it)._Ptr
#define _STRING_CONST_ITERATOR(ptr) const_iterator(ptr, this)
#define _STRING_ITERATOR(ptr) iterator(ptr, this)
// TEMPLATE CLASS _String_const_iterator
template<class _Elem,
class _Traits,
class _Alloc>
class _String_const_iterator
: public _Iterator012<random_access_iterator_tag,
typename _Alloc::value_type,
typename _Alloc::difference_type,
typename _Alloc::const_pointer,
typename _Alloc::const_reference,
_Iterator_base>
{ // iterator for nonmutable string
public:
typedef _String_const_iterator<_Elem, _Traits, _Alloc> _Myiter;
typedef basic_string<_Elem, _Traits, _Alloc> _Mystr;
typedef random_access_iterator_tag iterator_category;
typedef typename _Alloc::value_type value_type;
typedef typename _Alloc::difference_type difference_type;
typedef typename _Alloc::const_pointer pointer;
typedef typename _Alloc::const_reference reference;
_String_const_iterator()
{ // construct with null pointer
this->_Ptr = 0;
}
_String_const_iterator(pointer _Parg, const _Container_base *_Pstring)
{ // construct with pointer _Parg
this->_Adopt(_Pstring);
this->_Ptr = _Parg;
}
typedef pointer _Unchecked_type;
_Myiter& _Rechecked(_Unchecked_type _Right)
{ // reset from unchecked iterator
this->_Ptr = _Right;
return (*this);
}
_Unchecked_type _Unchecked() const
{ // make an unchecked iterator
return (_Unchecked_type(this->_Ptr));
}
reference operator*() const
{ // return designated object
#if _ITERATOR_DEBUG_LEVEL == 2
if (this->_Getcont() == 0
|| this->_Ptr == 0
|| this->_Ptr < ((_Mystr *)this->_Getcont())->_Myptr()
|| ((_Mystr *)this->_Getcont())->_Myptr()
+ ((_Mystr *)this->_Getcont())->_Mysize <= this->_Ptr)
{ // report error
_DEBUG_ERROR("string iterator not dereferencable");
_SCL_SECURE_OUT_OF_RANGE;
}
#elif _ITERATOR_DEBUG_LEVEL == 1
_SCL_SECURE_VALIDATE(this->_Getcont() != 0 && this->_Ptr != 0);
_SCL_SECURE_VALIDATE_RANGE(
((_Mystr *)this->_Getcont())->_Myptr() <= this->_Ptr
&& this->_Ptr < ((_Mystr *)this->_Getcont())->_Myptr()
+ ((_Mystr *)this->_Getcont())->_Mysize);
#endif /* _ITERATOR_DEBUG_LEVEL */
__analysis_assume(this->_Ptr != 0);
return (*this->_Ptr);
}
pointer operator->() const
{ // return pointer to class object
return (&**this);
}
_Myiter& operator++()
{ // preincrement
#if _ITERATOR_DEBUG_LEVEL == 2
if (this->_Getcont() == 0
|| this->_Ptr == 0
|| ((_Mystr *)this->_Getcont())->_Myptr()
+ ((_Mystr *)this->_Getcont())->_Mysize <= this->_Ptr)
{ // report error
_DEBUG_ERROR("string iterator not incrementable");
_SCL_SECURE_OUT_OF_RANGE;
}
#elif _ITERATOR_DEBUG_LEVEL == 1
_SCL_SECURE_VALIDATE(this->_Getcont() != 0 && this->_Ptr != 0);
_SCL_SECURE_VALIDATE_RANGE(
this->_Ptr < ((_Mystr *)this->_Getcont())->_Myptr()
+ ((_Mystr *)this->_Getcont())->_Mysize);
#endif /* _ITERATOR_DEBUG_LEVEL */
++this->_Ptr;
return (*this);
}
_Myiter operator++(int)
{ // postincrement
_Myiter _Tmp = *this;
++*this;
return (_Tmp);
}
_Myiter& operator--()
{ // predecrement
#if _ITERATOR_DEBUG_LEVEL == 2
if (this->_Getcont() == 0
|| this->_Ptr == 0
|| this->_Ptr <= ((_Mystr *)this->_Getcont())->_Myptr())
{ // report error
_DEBUG_ERROR("string iterator not decrementable");
_SCL_SECURE_OUT_OF_RANGE;
}
#elif _ITERATOR_DEBUG_LEVEL == 1
_SCL_SECURE_VALIDATE(this->_Getcont() != 0 && this->_Ptr != 0);
_SCL_SECURE_VALIDATE_RANGE(
((_Mystr *)this->_Getcont())->_Myptr() < this->_Ptr);
#endif /* _ITERATOR_DEBUG_LEVEL */
--this->_Ptr;
return (*this);
}
_Myiter operator--(int)
{ // postdecrement
_Myiter _Tmp = *this;
--*this;
return (_Tmp);
}
_Myiter& operator+=(difference_type _Off)
{ // increment by integer
#if _ITERATOR_DEBUG_LEVEL == 2
if (this->_Getcont() == 0
|| this->_Ptr == 0
|| this->_Ptr + _Off < ((_Mystr *)this->_Getcont())->_Myptr()
|| ((_Mystr *)this->_Getcont())->_Myptr()
+ ((_Mystr *)this->_Getcont())->_Mysize < this->_Ptr + _Off)
{ // report error
_DEBUG_ERROR("string iterator + offset out of range");
_SCL_SECURE_OUT_OF_RANGE;
}
#elif _ITERATOR_DEBUG_LEVEL == 1
_SCL_SECURE_VALIDATE(this->_Getcont() != 0 && this->_Ptr != 0);
_SCL_SECURE_VALIDATE_RANGE(
((_Mystr *)this->_Getcont())->_Myptr() <= this->_Ptr + _Off
&& this->_Ptr + _Off <= ((_Mystr *)this->_Getcont())->_Myptr()
+ ((_Mystr *)this->_Getcont())->_Mysize);
#endif /* _ITERATOR_DEBUG_LEVEL */
_Ptr += _Off;
return (*this);
}
_Myiter operator+(difference_type _Off) const
{ // return this + integer
_Myiter _Tmp = *this;
return (_Tmp += _Off);
}
_Myiter& operator-=(difference_type _Off)
{ // decrement by integer
return (*this += -_Off);
}
_Myiter operator-(difference_type _Off) const
{ // return this - integer
_Myiter _Tmp = *this;
return (_Tmp -= _Off);
}
difference_type operator-(const _Myiter& _Right) const
{ // return difference of iterators
_Compat(_Right);
return (this->_Ptr - _Right._Ptr);
}
reference operator[](difference_type _Off) const
{ // subscript
return (*(*this + _Off));
}
bool operator==(const _Myiter& _Right) const
{ // test for iterator equality
_Compat(_Right);
return (this->_Ptr == _Right._Ptr);
}
bool operator!=(const _Myiter& _Right) const
{ // test for iterator inequality
return (!(*this == _Right));
}
bool operator<(const _Myiter& _Right) const
{ // test if this < _Right
_Compat(_Right);
return (this->_Ptr < _Right._Ptr);
}
bool operator>(const _Myiter& _Right) const
{ // test if this > _Right
return (_Right < *this);
}
bool operator<=(const _Myiter& _Right) const
{ // test if this <= _Right
return (!(_Right < *this));
}
bool operator>=(const _Myiter& _Right) const
{ // test if this >= _Right
return (!(*this < _Right));
}
#if _ITERATOR_DEBUG_LEVEL == 2
void _Compat(const _Myiter& _Right) const
{ // test for compatible iterator pair
if (this->_Getcont() == 0
|| this->_Getcont() != _Right._Getcont())
{ // report error
_DEBUG_ERROR("string iterators incompatible");
_SCL_SECURE_INVALID_ARGUMENT;
}
}
#elif _ITERATOR_DEBUG_LEVEL == 1
void _Compat(const _Myiter& _Right) const
{ // test for compatible iterator pair
_SCL_SECURE_VALIDATE(this->_Getcont() != 0);
_SCL_SECURE_VALIDATE_RANGE(this->_Getcont() == _Right._Getcont());
}
#else /* _ITERATOR_DEBUG_LEVEL == 0 */
void _Compat(const _Myiter&) const
{ // test for compatible iterator pair
}
#endif /* _ITERATOR_DEBUG_LEVEL */
pointer _Ptr; // pointer to element in string
};
template<class _Elem,
class _Traits,
class _Alloc> inline
typename _String_const_iterator<_Elem, _Traits, _Alloc>::_Unchecked_type
_Unchecked(_String_const_iterator<_Elem, _Traits, _Alloc> _Iter)
{ // convert to unchecked
return (_Iter._Unchecked());
}
template<class _Elem,
class _Traits,
class _Alloc> inline
_String_const_iterator<_Elem, _Traits, _Alloc>
_Rechecked(_String_const_iterator<_Elem, _Traits, _Alloc>& _Iter,
typename _String_const_iterator<_Elem, _Traits, _Alloc>
::_Unchecked_type _Right)
{ // convert to checked
return (_Iter._Rechecked(_Right));
}
template<class _Elem,
class _Traits,
class _Alloc> inline
_String_const_iterator<_Elem, _Traits, _Alloc> operator+(
typename _String_const_iterator<_Elem, _Traits, _Alloc>
::difference_type _Off,
_String_const_iterator<_Elem, _Traits, _Alloc> _Next)
{ // add offset to iterator
return (_Next += _Off);
}
// TEMPLATE CLASS _String_iterator
template<class _Elem,
class _Traits,
class _Alloc>
class _String_iterator
: public _String_const_iterator<_Elem, _Traits, _Alloc>
{ // iterator for mutable string
public:
typedef _String_iterator<_Elem, _Traits, _Alloc> _Myiter;
typedef _String_const_iterator<_Elem, _Traits, _Alloc> _Mybase;
typedef basic_string<_Elem, _Traits, _Alloc> _Mystr;
typedef random_access_iterator_tag iterator_category;
typedef typename _Mystr::value_type value_type;
typedef typename _Mystr::difference_type difference_type;
typedef typename _Mystr::pointer pointer;
typedef typename _Mystr::reference reference;
_String_iterator()
{ // construct with null string pointer
}
_String_iterator(pointer _Parg, const _Container_base *_Pstring)
: _Mybase(_Parg, _Pstring)
{ // construct with pointer _Parg
}
typedef pointer _Unchecked_type;
_Myiter& _Rechecked(_Unchecked_type _Right)
{ // reset from unchecked iterator
this->_Ptr = _Right;
return (*this);
}
_Unchecked_type _Unchecked() const
{ // make an unchecked iterator
return (_Unchecked_type(this->_Ptr));
}
reference operator*() const
{ // return designated object
return ((reference)**(_Mybase *)this);
}
pointer operator->() const
{ // return pointer to class object
return (&**this);
}
_Myiter& operator++()
{ // preincrement
++*(_Mybase *)this;
return (*this);
}
_Myiter operator++(int)
{ // postincrement
_Myiter _Tmp = *this;
++*this;
return (_Tmp);
}
_Myiter& operator--()
{ // predecrement
--*(_Mybase *)this;
return (*this);
}
_Myiter operator--(int)
{ // postdecrement
_Myiter _Tmp = *this;
--*this;
return (_Tmp);
}
_Myiter& operator+=(difference_type _Off)
{ // increment by integer
*(_Mybase *)this += _Off;
return (*this);
}
_Myiter operator+(difference_type _Off) const
{ // return this + integer
_Myiter _Tmp = *this;
return (_Tmp += _Off);
}
_Myiter& operator-=(difference_type _Off)
{ // decrement by integer
return (*this += -_Off);
}
_Myiter operator-(difference_type _Off) const
{ // return this - integer
_Myiter _Tmp = *this;
return (_Tmp -= _Off);
}
difference_type operator-(const _Mybase& _Right) const
{ // return difference of iterators
return ((_Mybase)*this - _Right);
}
reference operator[](difference_type _Off) const
{ // subscript
return (*(*this + _Off));
}
};
template<class _Elem,
class _Traits,
class _Alloc> inline
typename _String_iterator<_Elem, _Traits, _Alloc>::_Unchecked_type
_Unchecked(_String_iterator<_Elem, _Traits, _Alloc> _Iter)
{ // convert to unchecked
return (_Iter._Unchecked());
}
template<class _Elem,
class _Traits,
class _Alloc> inline
_String_iterator<_Elem, _Traits, _Alloc>
_Rechecked(_String_iterator<_Elem, _Traits, _Alloc>& _Iter,
typename _String_iterator<_Elem, _Traits, _Alloc>
::_Unchecked_type _Right)
{ // convert to checked
return (_Iter._Rechecked(_Right));
}
template<class _Elem,
class _Traits,
class _Alloc> inline
_String_iterator<_Elem, _Traits, _Alloc> operator+(
typename _String_iterator<_Elem, _Traits, _Alloc>
::difference_type _Off,
_String_iterator<_Elem, _Traits, _Alloc> _Next)
{ // add offset to iterator
return (_Next += _Off);
}
// TEMPLATE CLASS _String_val
template<class _Elem,
class _Alloc>
class _String_val
: public _Container_base
{ // base class for basic_string to hold data
public:
#if _ITERATOR_DEBUG_LEVEL == 0
typedef typename _Alloc::template rebind<_Elem>::other _Alty;
_String_val(_Alty _Al = _Alty())
: _Alval(_Al)
{ // construct allocator from _Al
}
~_String_val()
{ // destroy the object
}
#else /* _ITERATOR_DEBUG_LEVEL == 0 */
typedef typename _Alloc::template rebind<_Elem>::other _Alty;
_String_val(_Alty _Al = _Alty())
: _Alval(_Al)
{ // construct allocator from _Al
typename _Alloc::template rebind<_Container_proxy>::other
_Alproxy(_Alval);
this->_Myproxy = _Alproxy.allocate(1);
_Cons_val(_Alproxy, this->_Myproxy, _Container_proxy());
this->_Myproxy->_Mycont = this;
}
~_String_val()
{ // destroy the object
typename _Alloc::template rebind<_Container_proxy>::other
_Alproxy(_Alval);
this->_Orphan_all();
_Dest_val(_Alproxy, this->_Myproxy);
_Alproxy.deallocate(this->_Myproxy, 1);
this->_Myproxy = 0;
}
#endif /* _ITERATOR_DEBUG_LEVEL == 0 */
typedef typename _Alty::size_type size_type;
typedef typename _Alty::difference_type difference_type;
typedef typename _Alty::pointer pointer;
typedef typename _Alty::const_pointer const_pointer;
typedef typename _Alty::reference reference;
typedef typename _Alty::const_reference const_reference;
typedef typename _Alty::value_type value_type;
enum
{ // length of internal buffer, [1, 16]
_BUF_SIZE = 16 / sizeof (_Elem) < 1 ? 1
: 16 / sizeof (_Elem)};
enum
{ // roundup mask for allocated buffers, [0, 15]
_ALLOC_MASK = sizeof (_Elem) <= 1 ? 15
: sizeof (_Elem) <= 2 ? 7
: sizeof (_Elem) <= 4 ? 3
: sizeof (_Elem) <= 8 ? 1 : 0};
union _Bxty
{ // storage for small buffer or pointer to larger one
_Elem _Buf[_BUF_SIZE];
_Elem *_Ptr;
char _Alias[_BUF_SIZE]; // to permit aliasing
} _Bx;
size_type _Mysize; // current length of string
size_type _Myres; // current storage reserved for string
_Alty _Alval; // allocator object for strings
};
// TEMPLATE CLASS basic_string
template<class _Elem,
class _Traits,
class _Ax>
class basic_string
: public _String_val<_Elem, _Ax>
{ // null-terminated transparent array of elements
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -