271 lines
5.9 KiB
C++
271 lines
5.9 KiB
C++
#pragma once
|
|
#ifndef _STLMEM_H_
|
|
#define _STLMEM_H_
|
|
//#include <memory>
|
|
|
|
#include <stlxmem.h>
|
|
|
|
#ifdef _MSC_VER
|
|
#pragma pack(push,8)
|
|
#endif /* _MSC_VER */
|
|
|
|
// TEMPLATE OPERATOR new
|
|
template<class _Ty> inline
|
|
void *operator new(size_t _N, std::allocator<_Ty>& _Al)
|
|
{
|
|
return (_Al._Charalloc(_N));
|
|
}
|
|
|
|
_STD_BEGIN
|
|
|
|
// TEMPLATE FUNCTION get_temporary_buffer
|
|
template<class _Ty> inline
|
|
pair<_Ty _FARQ *, _PDFT>
|
|
get_temporary_buffer(_PDFT _N, _Ty _FARQ *)
|
|
{
|
|
_Ty _FARQ *_P;
|
|
for (_P = 0; 0 < _N; _N /= 2)
|
|
if ((_P = (_Ty _FARQ *)operator new(
|
|
(_SIZT)_N * sizeof (_Ty), nothrow)) != 0)
|
|
break;
|
|
return (pair<_Ty _FARQ *, _PDFT>(_P, _N));
|
|
}
|
|
|
|
// TEMPLATE FUNCTION return_temporary_buffer
|
|
template<class _Ty> inline
|
|
void return_temporary_buffer(_Ty *_P)
|
|
{
|
|
operator delete(_P);
|
|
}
|
|
|
|
// TEMPLATE FUNCTION uninitialized_copy
|
|
template<class _II, class _FI> inline
|
|
_FI uninitialized_copy(_II _F, _II _L, _FI _X)
|
|
{
|
|
for (; _F != _L; ++_X, ++_F)
|
|
_Construct(&*_X, *_F);
|
|
return (_X);
|
|
}
|
|
|
|
// TEMPLATE FUNCTION uninitialized_fill
|
|
template<class _FI, class _Ty> inline
|
|
void uninitialized_fill(_FI _F, _FI _L, const _Ty& _X)
|
|
{
|
|
for (; _F != _L; ++_F)
|
|
_Construct(&*_F, _X);
|
|
}
|
|
|
|
// TEMPLATE FUNCTION uninitialized_fill_n
|
|
template<class _FI, class _S, class _Ty> inline
|
|
void uninitialized_fill_n(_FI _F, _S _N, const _Ty& _X)
|
|
{
|
|
for (; 0 < _N; --_N, ++_F)
|
|
_Construct(&*_F, _X);
|
|
}
|
|
|
|
// TEMPLATE CLASS raw_storage_iterator
|
|
template<class _OI, class _Ty>
|
|
class raw_storage_iterator : public iterator<output_iterator_tag, void, void>
|
|
{
|
|
public:
|
|
typedef _OI iterator_type;
|
|
typedef _Ty element_type;
|
|
explicit raw_storage_iterator(_OI _X) : _Next(_X)
|
|
{
|
|
}
|
|
raw_storage_iterator<_OI, _Ty>& operator*()
|
|
{
|
|
return (*this);
|
|
}
|
|
raw_storage_iterator<_OI, _Ty>& operator=(const _Ty& _X)
|
|
{
|
|
_Construct(&*_Next, _X);
|
|
return (*this);
|
|
}
|
|
raw_storage_iterator<_OI, _Ty>& operator++()
|
|
{
|
|
++_Next;
|
|
return (*this);
|
|
}
|
|
raw_storage_iterator<_OI, _Ty> operator++(int)
|
|
{
|
|
raw_storage_iterator<_OI, _Ty> _Ans = *this;
|
|
++_Next;
|
|
return (_Ans);
|
|
}
|
|
private:
|
|
_OI _Next;
|
|
};
|
|
|
|
// TEMPLATE CLASS _Temp_iterator
|
|
template<class _Ty>
|
|
class _Temp_iterator : public iterator<output_iterator_tag, void, void>
|
|
{
|
|
public:
|
|
typedef _Ty _FARQ *_Pty;
|
|
_Temp_iterator(_PDFT _N = 0)
|
|
{
|
|
pair<_Pty, _PDFT> _Pair =
|
|
get_temporary_buffer(_N, (_Pty)0);
|
|
_Buf._Begin = _Pair.first;
|
|
_Buf._Cur = _Pair.first;
|
|
_Buf._Hiwater = _Pair.first;
|
|
_Buf._Len = _Pair.second;
|
|
_Pb = &_Buf;
|
|
}
|
|
_Temp_iterator(const _Temp_iterator<_Ty>& _X)
|
|
{
|
|
_Buf._Begin = 0;
|
|
_Buf._Cur = 0;
|
|
_Buf._Hiwater = 0;
|
|
_Buf._Len = 0;
|
|
*this = _X;
|
|
}
|
|
~_Temp_iterator()
|
|
{
|
|
if (_Buf._Begin != 0)
|
|
{
|
|
for (_Pty _F = _Buf._Begin;
|
|
_F != _Buf._Hiwater; ++_F)
|
|
_Destroy(&*_F);
|
|
return_temporary_buffer(_Buf._Begin);
|
|
}
|
|
}
|
|
_Temp_iterator<_Ty>& operator=(const _Temp_iterator<_Ty>& _X)
|
|
{
|
|
_Pb = _X._Pb;
|
|
return (*this);
|
|
}
|
|
_Temp_iterator<_Ty>& operator=(const _Ty& _V)
|
|
{
|
|
if (_Pb->_Cur < _Pb->_Hiwater)
|
|
*_Pb->_Cur++ = _V;
|
|
else
|
|
{
|
|
_Construct(&*_Pb->_Cur, _V);
|
|
_Pb->_Hiwater = ++_Pb->_Cur;
|
|
}
|
|
return (*this);
|
|
}
|
|
_Temp_iterator<_Ty>& operator*()
|
|
{
|
|
return (*this);
|
|
}
|
|
_Temp_iterator<_Ty>& operator++()
|
|
{
|
|
return (*this);
|
|
}
|
|
_Temp_iterator<_Ty>& operator++(int)
|
|
{
|
|
return (*this);
|
|
}
|
|
_Temp_iterator<_Ty>& _Init()
|
|
{
|
|
_Pb->_Cur = _Pb->_Begin;
|
|
return (*this);
|
|
}
|
|
_Pty _First() const
|
|
{
|
|
return (_Pb->_Begin);
|
|
}
|
|
_Pty _Last() const
|
|
{
|
|
return (_Pb->_Cur);
|
|
}
|
|
_PDFT _Maxlen() const
|
|
{
|
|
return (_Pb->_Len);
|
|
}
|
|
private:
|
|
struct _Bufpar
|
|
{
|
|
_Pty _Begin;
|
|
_Pty _Cur;
|
|
_Pty _Hiwater;
|
|
_PDFT _Len;
|
|
} _Buf, *_Pb;
|
|
};
|
|
|
|
// TEMPLATE CLASS auto_ptr
|
|
template<class _Ty>
|
|
class auto_ptr
|
|
{
|
|
public:
|
|
typedef _Ty element_type;
|
|
explicit auto_ptr(_Ty *_P = 0) _THROW0() : _Owns(_P != 0), _Ptr(_P)
|
|
{
|
|
}
|
|
auto_ptr(const auto_ptr<_Ty>& _Y) _THROW0()
|
|
: _Owns(_Y._Owns), _Ptr(_Y.release())
|
|
{
|
|
}
|
|
auto_ptr<_Ty>& operator=(const auto_ptr<_Ty>& _Y) _THROW0()
|
|
{
|
|
if (_Ptr != _Y.get())
|
|
{
|
|
if (_Owns)
|
|
delete _Ptr;
|
|
_Owns = _Y._Owns;
|
|
_Ptr = _Y.release();
|
|
}
|
|
else if (_Y._Owns)
|
|
_Owns = true;
|
|
return (*this);
|
|
}
|
|
~auto_ptr()
|
|
{
|
|
if (_Owns)
|
|
delete _Ptr;
|
|
}
|
|
_Ty& operator*() const _THROW0()
|
|
{
|
|
return (*get());
|
|
}
|
|
_Ty *operator->() const _THROW0()
|
|
{
|
|
return (get());
|
|
}
|
|
_Ty *get() const _THROW0()
|
|
{
|
|
return (_Ptr);
|
|
}
|
|
_Ty *release() const _THROW0()
|
|
{
|
|
((auto_ptr<_Ty> *)this)->_Owns = false;
|
|
return (_Ptr);
|
|
}
|
|
private:
|
|
bool _Owns;
|
|
_Ty *_Ptr;
|
|
};
|
|
|
|
_STD_END
|
|
|
|
#ifdef _MSC_VER
|
|
#pragma pack(pop)
|
|
#endif /* _MSC_VER */
|
|
|
|
#endif /* _STLMEM_H_ */
|
|
|
|
/*
|
|
* Copyright (c) 1995 by P.J. Plauger. ALL RIGHTS RESERVED.
|
|
* Consult your license regarding permissions and restrictions.
|
|
*/
|
|
|
|
/*
|
|
* This file is derived from software bearing the following
|
|
* restrictions:
|
|
*
|
|
* Copyright (c) 1994
|
|
* Hewlett-Packard Company
|
|
*
|
|
* Permission to use, copy, modify, distribute and sell this
|
|
* software and its documentation for any purpose is hereby
|
|
* granted without fee, provided that the above copyright notice
|
|
* appear in all copies and that both that copyright notice and
|
|
* this permission notice appear in supporting documentation.
|
|
* Hewlett-Packard Company makes no representations about the
|
|
* suitability of this software for any purpose. It is provided
|
|
* "as is" without express or implied warranty.
|
|
*/
|