home *** CD-ROM | disk | FTP | other *** search
- // memory standard header
-
- #if _MSC_VER > 1000
- #pragma once
- #endif
-
- #ifndef _MEMORY_
- #define _MEMORY_
- #include <xmemory>
-
- #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 (this != &_Y)
- {if (_Ptr != _Y.get())
- {if (_Owns)
- delete _Ptr;
- _Owns = _Y._Owns; }
- else if (_Y._Owns)
- _Owns = true;
- _Ptr = _Y.release(); }
- 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 /* _MEMORY_ */
-
- /*
- * 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.
- */
-