📄 memory
字号:
// memory standard header
#pragma once
#ifndef _MEMORY_
#define _MEMORY_
#ifndef RC_INVOKED
#include <xmemory>
#pragma pack(push,_CRT_PACKING)
#pragma warning(push,3)
#pragma push_macro("new")
#undef new
#pragma warning(disable: 4700)
_STD_BEGIN
// TEMPLATE FUNCTION get_temporary_buffer
template<class _Ty> inline
pair<_Ty _FARQ *, _PDFT>
get_temporary_buffer(_PDFT _Count)
{ // get raw temporary buffer of up to _Count elements
_Ty _FARQ *_Pbuf;
if (_Count < 0)
_Count = 0;
else if (((_SIZT)(-1) / sizeof (_Ty) < _Count))
_THROW_NCEE(bad_alloc, 0);
for (_Pbuf = 0; 0 < _Count; _Count /= 2)
if ((_Pbuf = (_Ty _FARQ *)operator new(
(_SIZT)_Count * sizeof (_Ty), nothrow)) != 0)
break;
return (pair<_Ty _FARQ *, _PDFT>(_Pbuf, _Count));
}
// TEMPLATE FUNCTION return_temporary_buffer
template<class _Ty> inline
void return_temporary_buffer(_Ty *_Pbuf)
{ // delete raw temporary buffer
operator delete(_Pbuf);
}
// TEMPLATE FUNCTION uninitialized_copy_n
template<class _InIt,
class _Diff,
class _FwdIt> inline
_FwdIt _Uninitialized_copy_n(_InIt _First, _Diff _Count,
_FwdIt _Dest, input_iterator_tag)
{ // copy [_First, _First + _Count) to [_Dest, ...), arbitrary input
_FwdIt _Next = _Dest;
_TRY_BEGIN
_Construct(&*_Dest, *_First); // 0 < _Count has been guaranteed
while (0 < --_Count)
_Construct(&*++_Dest, *++_First);
_CATCH_ALL
for (; _Next != _Dest; ++_Next)
_Destroy(&*_Next);
_RERAISE;
_CATCH_END
return (++_Dest);
}
template<class _InIt,
class _Diff,
class _FwdIt> inline
_FwdIt _Uninitialized_copy_n(_InIt _First, _Diff _Count,
_FwdIt _Dest, forward_iterator_tag)
{ // copy [_First, _First + _Count) to [_Dest, ...), forward input
_FwdIt _Next = _Dest;
_TRY_BEGIN
for (; 0 < _Count; --_Count, ++_Dest, ++_First)
_Construct(&*_Dest, *_First);
_CATCH_ALL
for (; _Next != _Dest; ++_Next)
_Destroy(&*_Next);
_RERAISE;
_CATCH_END
return (_Dest);
}
template<class _InIt,
class _Diff,
class _FwdIt> inline
_FwdIt _Uninitialized_copy_n(_InIt _First, _Diff _Count,
_FwdIt _Dest, _Nonscalar_ptr_iterator_tag)
{ // copy [_First, _First + _Count) to [_Dest, ...), arbitrary iterators
return (_Uninitialized_copy_n(_First, _Count,
_Dest, _Iter_cat(_First)));
}
template<class _InIt,
class _Diff,
class _FwdIt> inline
_FwdIt _Uninitialized_copy_n(_InIt _First, _Diff _Count,
_FwdIt _Dest, _Scalar_ptr_iterator_tag)
{ // copy [_First, _First + _Count) to [_Dest, ...), pointers to scalars
_CSTD memmove(&*_Dest, &*_First,
_Count * sizeof (*_First));
return (_Dest + _Count);
}
template<class _InIt,
class _Diff,
class _FwdIt> inline
_FwdIt _Uninitialized_copy_n(_InIt _First, _Diff _Count,
_FwdIt _Dest)
{ // copy [_First, _First + _Count) to [_Dest, ...), unchecked
return (_Uninitialized_copy_n(_First, _Count,
_Dest, _Ptr_cat(_First, _Dest)));
}
#if _ITERATOR_DEBUG_LEVEL == 0
template<class _InIt,
class _Diff,
class _FwdIt> inline
_FwdIt uninitialized_copy_n(_InIt _First, _Diff _Count,
_FwdIt _Dest)
{ // copy [_First, _First + _Count) to [_Dest, ...)
if (_Count <= 0)
return (_Dest);
else
return (_Rechecked(_Dest,
_Uninitialized_copy_n(_First, _Count,
_Unchecked(_Dest))));
}
#else /* _ITERATOR_DEBUG_LEVEL == 0 */
template<class _InIt,
class _Diff,
class _FwdIt> inline
_FwdIt _Uninitialized_copy_n2(_InIt _First, _Diff _Count,
_FwdIt _Dest, output_iterator_tag)
{ // copy [_First, _First + _Count) to [_Dest, ...), arbitrary dest
return (_Uninitialized_copy_n(_First, _Count,
_Dest));
}
template<class _InIt,
class _Diff,
class _FwdIt> inline
_FwdIt _Uninitialized_copy_n2(_InIt _First, _Diff _Count,
_FwdIt _Dest, random_access_iterator_tag)
{ // copy [_First, _First + _Count) to [_Dest, ...), random-access dest
_FwdIt _Ans = _Dest + _Count; // also checks range
_Uninitialized_copy_n(_First, _Count,
_Unchecked(_Dest));
return (_Ans);
}
template<class _InIt,
class _Diff,
class _FwdIt> inline
_FwdIt _Uninitialized_copy_n1(_InIt _First, _Diff _Count,
_FwdIt _Dest, input_iterator_tag)
{ // copy [_First, _First + _Count) to [_Dest, ...), arbitrary input
return (_Uninitialized_copy_n2(_First, _Count,
_Dest, _Iter_cat(_Dest)));
}
template<class _InIt,
class _Diff,
class _FwdIt> inline
_FwdIt _Uninitialized_copy_n1(_InIt _First, _Diff _Count,
_FwdIt _Dest, random_access_iterator_tag)
{ // copy [_First, _First + _Count) to [_Dest, ...), random-access input
_InIt _Last = _First + _Count; // also checks range
_Last = _Last; // to quiet diagnostics
return (_Uninitialized_copy_n2(_Unchecked(_First), _Count,
_Dest, _Iter_cat(_Dest)));
}
template<class _InIt,
class _Diff,
class _FwdIt> inline
_FwdIt _Uninitialized_copy_n(_InIt _First, _Diff _Count,
_FwdIt _Dest, _STD tr1::true_type)
{ // copy [_First, _First + _Count) to [_Dest, ...), checked dest
return (_Uninitialized_copy_n1(_First, _Count,
_Dest, _Iter_cat(_First)));
}
template<class _InIt,
class _Diff,
class _FwdIt> inline
_SCL_INSECURE_DEPRECATE
_FwdIt _Uninitialized_copy_n(_InIt _First, _Diff _Count,
_FwdIt _Dest, _STD tr1::false_type)
{ // copy [_First, _First + _Count) to [_Dest, ...), unchecked dest
return (_Uninitialized_copy_n1(_First, _Count,
_Dest, _Iter_cat(_First)));
}
template<class _InIt,
class _Diff,
class _FwdIt> inline
_FwdIt uninitialized_copy_n(_InIt _First, _Diff _Count,
_FwdIt _Dest)
{ // copy [_First, _First + _Count) to [_Dest, ...)
_DEBUG_POINTER(_First);
_DEBUG_POINTER(_Dest);
if (_Count <= 0)
return (_Dest);
else
return (_Uninitialized_copy_n(_First,
_Count, _Dest, _Is_checked(_Dest)));
}
template<class _InTy,
size_t _InSize,
class _Diff,
class _FwdIt> inline
_FwdIt uninitialized_copy_n(_InTy (&_First)[_InSize], _Diff _Count,
_FwdIt _Dest)
{ // copy [_First, _First + _Count) to [_Dest, ...), array input
return (_STD uninitialized_copy_n(_Array_iterator<_InTy, _InSize>(_First),
_Count, _Dest));
}
template<class _InIt,
class _Diff,
class _OutTy,
size_t _OutSize> inline
_OutTy *uninitialized_copy_n(_InIt _First, _Diff _Count,
_OutTy (&_Dest)[_OutSize])
{ // copy [_First, _First + _Count) to [_Dest, ...), array dest
return (_Unchecked(
_STD uninitialized_copy_n(_First,
_Count, _Array_iterator<_OutTy, _OutSize>(_Dest))));
}
template<class _InTy,
size_t _InSize,
class _Diff,
class _OutTy,
size_t _OutSize> inline
_OutTy *uninitialized_copy_n(_InTy (&_First)[_InSize], _Diff _Count,
_OutTy (&_Dest)[_OutSize])
{ // copy [_First, _First + _Count) to [_Dest, ...), array input/dest
return (_Unchecked(
_STD uninitialized_copy_n(_Array_iterator<_InTy, _InSize>(_First),
_Count, _Array_iterator<_OutTy, _OutSize>(_Dest))));
}
#endif /* _ITERATOR_DEBUG_LEVEL == 0 */
// TEMPLATE FUNCTION uninitialized_copy
template<class _InIt,
class _FwdIt> inline
_FwdIt _Uninitialized_copy0(_InIt _First, _InIt _Last,
_FwdIt _Dest, _Nonscalar_ptr_iterator_tag)
{ // copy [_First, _Last) to raw [_Dest, ...), arbitrary iterators
_FwdIt _Next = _Dest;
_TRY_BEGIN
for (; _First != _Last; ++_Dest, ++_First)
_Construct(&*_Dest, *_First);
_CATCH_ALL
for (; _Next != _Dest; ++_Next)
_Destroy(&*_Next);
_RERAISE;
_CATCH_END
return (_Dest);
}
template<class _InIt,
class _FwdIt> inline
_FwdIt _Uninitialized_copy0(_InIt _First, _InIt _Last,
_FwdIt _Dest, _Scalar_ptr_iterator_tag)
{ // copy [_First, _Last) to raw [_Dest, ...), pointers to scalars
ptrdiff_t _Count = _Last - _First;
_CSTD memmove(&*_Dest, &*_First,
_Count * sizeof (*_First));
return (_Dest + _Count);
}
template<class _InIt,
class _FwdIt> inline
_FwdIt _Uninitialized_copy0(_InIt _First, _InIt _Last,
_FwdIt _Dest)
{ // copy [_First, _Last) to raw [_Dest, ...)
return (_Uninitialized_copy0(_First, _Last,
_Dest, _Ptr_cat(_First, _Dest)));
}
#if _ITERATOR_DEBUG_LEVEL == 0
template<class _InIt,
class _FwdIt> inline
_FwdIt uninitialized_copy(_InIt _First, _InIt _Last,
_FwdIt _Dest)
{ // copy [_First, _Last) to raw [_Dest, ...)
return (_Rechecked(_Dest,
_Uninitialized_copy0(_Unchecked(_First), _Unchecked(_Last),
_Unchecked(_Dest))));
}
#else /* _ITERATOR_DEBUG_LEVEL == 0 */
template<class _InIt,
class _FwdIt> inline
_FwdIt _Uninitialized_copy0(_InIt _First, _InIt _Last,
_FwdIt _Dest, input_iterator_tag, forward_iterator_tag)
{ // copy [_First, _Last) to raw [_Dest, ...), arbitrary iterators
return (_Uninitialized_copy0(_First, _Last,
_Dest));
}
template<class _InIt,
class _FwdIt> inline
_FwdIt _Uninitialized_copy0(_InIt _First, _InIt _Last,
_FwdIt _Dest, random_access_iterator_tag, random_access_iterator_tag)
{ // copy [_First, _Last) to raw [_Dest, ...), random-access iterators
_FwdIt _Ans = _Dest + (_Last - _First); // also checks range
_Uninitialized_copy0(_First, _Last,
_Unchecked(_Dest));
return (_Ans);
}
template<class _InIt,
class _FwdIt> inline
_FwdIt _Uninitialized_copy0(_InIt _First, _InIt _Last,
_FwdIt _Dest, _STD tr1::true_type)
{ // copy [_First, _Last) to raw [_Dest, ...), checked dest
return (_Uninitialized_copy0(_First, _Last,
_Dest, _Iter_cat(_First), _Iter_cat(_Dest)));
}
template<class _InIt,
class _FwdIt> inline
_SCL_INSECURE_DEPRECATE
_FwdIt _Uninitialized_copy0(_InIt _First, _InIt _Last,
_FwdIt _Dest, _STD tr1::false_type)
{ // copy [_First, _Last) to raw [_Dest, ...), unchecked dest
return (_Uninitialized_copy0(_First, _Last,
_Dest, _Iter_cat(_First), _Iter_cat(_Dest)));
}
template<class _InIt,
class _FwdIt> inline
_FwdIt uninitialized_copy(_InIt _First, _InIt _Last,
_FwdIt _Dest)
{ // copy [_First, _Last) to raw [_Dest, ...)
_DEBUG_RANGE(_First, _Last);
_DEBUG_POINTER(_Dest);
return (_Uninitialized_copy0(_Unchecked(_First), _Unchecked(_Last),
_Dest, _Is_checked(_Dest)));
}
template<class _InIt,
class _OutTy,
size_t _OutSize> inline
_OutTy *uninitialized_copy(_InIt _First, _InIt _Last,
_OutTy (&_Dest)[_OutSize])
{ // copy [_First, _Last) to raw [_Dest, ...)
return (_Unchecked(
_STD uninitialized_copy(_First, _Last,
_Array_iterator<_OutTy, _OutSize>(_Dest))));
}
#endif /* _ITERATOR_DEBUG_LEVEL == 0 */
// TEMPLATE FUNCTION _Uninitialized_copy WITH ALLOCATOR
template<class _InIt,
class _FwdIt,
class _Alloc> inline
_FwdIt _Uninit_copy(_InIt _First, _InIt _Last, _FwdIt _Dest,
_Alloc& _Al, _Nonscalar_ptr_iterator_tag)
{ // copy [_First, _Last) to raw _Dest, using _Al, arbitrary type
_DEBUG_RANGE(_First, _Last);
_DEBUG_POINTER(_Dest);
_FwdIt _Next = _Dest;
_TRY_BEGIN
for (; _First != _Last; ++_Dest, ++_First)
_Cons_val(_Al, _Dest, *_First);
_CATCH_ALL
for (; _Next != _Dest; ++_Next)
_Dest_val(_Al, _Next);
_RERAISE;
_CATCH_END
return (_Dest);
}
template<class _InIt,
class _FwdIt,
class _Alloc> inline
_FwdIt _Uninit_copy(_InIt _First, _InIt _Last, _FwdIt _Dest,
_Alloc& _Al, _Scalar_ptr_iterator_tag)
{ // copy [_First, _Last) to raw _Dest, using _Al, scalar type
return (_Uninit_copy(_First, _Last, _Dest,
_Al, _Nonscalar_ptr_iterator_tag()));
}
template<class _Ty1,
class _Ty2> inline
_Ty2 *_Uninit_copy(_Ty1 *_First, _Ty1 *_Last, _Ty2 *_Dest,
allocator<_Ty2>&, _Scalar_ptr_iterator_tag)
{ // copy [_First, _Last) to raw _Dest, scalar type
_DEBUG_RANGE(_First, _Last);
_DEBUG_POINTER(_Dest);
size_t _Count = (size_t)(_Last - _First);
return ((_Ty2 *)_CSTD memmove(&*_Dest, &*_First,
_Count * sizeof (*_First)) + _Count); // NB: non-overlapping move
}
template<class _InIt,
class _FwdIt,
class _Alloc> inline
_FwdIt _Uninitialized_copy(_InIt _First, _InIt _Last, _FwdIt _Dest,
_Alloc& _Al)
{ // copy [_First, _Last) to raw _Dest, using _Al
return (_Uninit_copy(_First, _Last, _Dest, _Al,
_Ptr_cat(_First, _Dest)));
}
// TEMPLATE FUNCTION _Uninitialized_move WITH ALLOCATOR
template<class _InIt,
class _FwdIt,
class _Alloc,
class _Valty> inline
_FwdIt _Uninit_move(_InIt _First, _InIt _Last, _FwdIt _Dest,
_Alloc& _Al, _Valty *, _Nonscalar_ptr_iterator_tag)
{ // move [_First, _Last) to raw _Dest, using _Al, arbitrary type
_DEBUG_RANGE(_First, _Last);
_DEBUG_POINTER(_Dest);
_FwdIt _Next = _Dest;
_TRY_BEGIN
for (; _First != _Last; ++_Dest, ++_First)
_Cons_val(_Al, _Dest, (_Valty &&)*_First);
_CATCH_ALL
for (; _Next != _Dest; ++_Next)
_Dest_val(_Al, _Next);
_RERAISE;
_CATCH_END
return (_Dest);
}
template<class _InIt,
class _FwdIt,
class _Alloc,
class _Valty> inline
_FwdIt _Uninit_move(_InIt _First, _InIt _Last, _FwdIt _Dest,
_Alloc& _Al, _Valty *, _Scalar_ptr_iterator_tag)
{ // move [_First, _Last) to raw _Dest, using _Al, scalar type
return (_Uninit_move(_First, _Last, _Dest,
_Al, (_Valty *)0, _Nonscalar_ptr_iterator_tag()));
}
template<class _Ty1,
class _Ty2,
class _Valty> inline
_Ty2 *_Uninit_move(_Ty1 *_First, _Ty1 *_Last, _Ty2 *_Dest,
allocator<_Ty2>&, _Valty *, _Scalar_ptr_iterator_tag)
{ // move [_First, _Last) to raw _Dest, scalar type
_DEBUG_RANGE(_First, _Last);
_DEBUG_POINTER(_Dest);
size_t _Count = (size_t)(_Last - _First);
return ((_Ty2 *)_CSTD memmove(&*_Dest, &*_First,
_Count * sizeof (*_First)) + _Count); // NB: non-overlapping move
}
template<class _InIt,
class _FwdIt,
class _Alloc> inline
_FwdIt _Uninitialized_move(_InIt _First, _InIt _Last, _FwdIt _Dest,
_Alloc& _Al)
{ // move [_First, _Last) to raw _Dest, using _Al
return (_Uninit_move(_First, _Last, _Dest, _Al,
_Val_type(_First), _Ptr_cat(_First, _Dest)));
}
// TEMPLATE FUNCTION uninitialized_fill
template<class _FwdIt,
class _Tval> inline
void _Uninit_fill(_FwdIt _First, _FwdIt _Last, const _Tval& _Val,
_Nonscalar_ptr_iterator_tag)
{ // copy _Val throughout raw [_First, _Last), arbitrary type
_DEBUG_RANGE(_First, _Last);
_FwdIt _Next = _First;
_TRY_BEGIN
for (; _First != _Last; ++_First)
_Construct(&*_First, _Val);
_CATCH_ALL
for (; _Next != _First; ++_Next)
_Destroy(&*_Next);
_RERAISE;
_CATCH_END
}
template<class _Ty,
class _Tval> inline
void _Uninit_fill(_Ty *_First, _Ty *_Last, const _Tval& _Val,
_Scalar_ptr_iterator_tag)
{ // copy _Val throughout raw [_First, _Last), scalar type
_STD fill(_First, _Last, _Val);
}
template<class _FwdIt,
class _Tval> inline
void uninitialized_fill(_FwdIt _First, _FwdIt _Last, const _Tval& _Val)
{ // copy _Val throughout raw [_First, _Last)
_Uninit_fill(_First, _Last, _Val, _Ptr_cat(_First, _First));
}
// TEMPLATE FUNCTION uninitialized_fill_n
template<class _FwdIt,
class _Diff,
class _Tval> inline
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -