// utility standard header #ifndef _UTILITY_ #define _UTILITY_ #include #ifdef _MSC_VER #pragma pack(push,8) #if 1200 <= _MSC_VER #pragma warning(push,3) #pragma warning(disable:4786) #endif #endif /* _MSC_VER */ _STD_BEGIN // TEMPLATE STRUCT pair template struct pair { typedef _T1 first_type; typedef _T2 second_type; pair() : first(_T1()), second(_T2()) {} pair(const _T1& _V1, const _T2& _V2) : first(_V1), second(_V2) {} template pair(const pair &p) : first(p.first), second(p.second) {} _T1 first; _T2 second; }; template inline bool __cdecl operator==(const pair<_T1, _T2>& _X, const pair<_T1, _T2>& _Y) {return (_X.first == _Y.first && _X.second == _Y.second); } template inline bool __cdecl operator!=(const pair<_T1, _T2>& _X, const pair<_T1, _T2>& _Y) {return (!(_X == _Y)); } template inline bool __cdecl operator<(const pair<_T1, _T2>& _X, const pair<_T1, _T2>& _Y) {return (_X.first < _Y.first || !(_Y.first < _X.first) && _X.second < _Y.second); } template inline bool __cdecl operator>(const pair<_T1, _T2>& _X, const pair<_T1, _T2>& _Y) {return (_Y < _X); } template inline bool __cdecl operator<=(const pair<_T1, _T2>& _X, const pair<_T1, _T2>& _Y) {return (!(_Y < _X)); } template inline bool __cdecl operator>=(const pair<_T1, _T2>& _X, const pair<_T1, _T2>& _Y) {return (!(_X < _Y)); } template inline pair<_T1, _T2> __cdecl make_pair(const _T1& _X, const _T2& _Y) {return (pair<_T1, _T2>(_X, _Y)); } // ITERATOR TAGS (from ) struct input_iterator_tag {}; struct output_iterator_tag {}; struct forward_iterator_tag : public input_iterator_tag {}; struct bidirectional_iterator_tag : public forward_iterator_tag {}; struct random_access_iterator_tag : public bidirectional_iterator_tag {}; // TEMPLATE CLASS iterator (from ) template struct iterator { typedef _C iterator_category; typedef _Ty value_type; typedef _D distance_type; }; template struct _Bidit : public iterator {}; template struct _Ranit : public iterator {}; // TEMPLATE CLASS iterator_traits (from ) template struct iterator_traits { typedef typename _It::iterator_category iterator_category; typedef typename _It::value_type value_type; typedef typename _It::distance_type distance_type; }; // TEMPLATE FUNCTION _Iter_cat (from ) template inline _C __cdecl _Iter_cat(const iterator<_C, _Ty, _D>&) {_C _IterCatTag; _C* _pIterCatTag; _pIterCatTag = &_IterCatTag; // Workaround for C4700 warning return (_IterCatTag); } template inline random_access_iterator_tag __cdecl _Iter_cat(const _Ty *) {random_access_iterator_tag _RandIterTag; random_access_iterator_tag* _pRandIterTag; _pRandIterTag = &_RandIterTag; // Workaround for C4700 warning return (_RandIterTag); } // TEMPLATE FUNCTION _Distance template inline _CNTSIZ(_II) __cdecl distance(_II _F, _II _L) {_CNTSIZ(_II) _N = 0; _Distance(_F, _L, _N, _Iter_cat(_F)); return (_N); } template inline void __cdecl _Distance(_II _F, _II _L, _D& _N) {_Distance(_F, _L, _N, _Iter_cat(_F)); } template inline void __cdecl _Distance(_II _F, _II _L, _D& _N, input_iterator_tag) {for (; _F != _L; ++_F) ++_N; } template inline void __cdecl _Distance(_II _F, _II _L, _D& _N, forward_iterator_tag) {for (; _F != _L; ++_F) ++_N; } template inline void __cdecl _Distance(_II _F, _II _L, _D& _N, bidirectional_iterator_tag) {for (; _F != _L; ++_F) ++_N; } template inline void __cdecl _Distance(_RI _F, _RI _L, _D& _N, random_access_iterator_tag) {_N += (_D) (_L - _F); } // TEMPLATE CLASS reverse_iterator (from ) template class reverse_iterator : public _Ranit<_Ty, _D> { public: typedef reverse_iterator<_RI, _Ty, _Rt, _Pt, _D> _Myt; typedef _RI iter_type; typedef _Rt reference_type; typedef _Pt pointer_type; reverse_iterator() {} explicit reverse_iterator(_RI _X) : current(_X) {} _RI base() const {return (current); } _Rt operator*() const {return (*(current - 1)); } _Pt operator->() const {return (&**this); } _Myt& operator++() {--current; return (*this); } _Myt operator++(int) {_Myt _Tmp = *this; --current; return (_Tmp); } _Myt& operator--() {++current; return (*this); } _Myt operator--(int) {_Myt _Tmp = *this; ++current; return (_Tmp); } _Myt& operator+=(_D _N) {current -= _N; return (*this); } _Myt operator+(_D _N) const {return (_Myt(current - _N)); } _Myt& operator-=(_D _N) {current += _N; return (*this); } _Myt operator-(_D _N) const {return (_Myt(current + _N)); } _Rt operator[](_D _N) const {return (*(*this + _N)); } protected: _RI current; }; template inline bool __cdecl operator==( const reverse_iterator<_RI, _Ty, _Rt, _Pt, _D>& _X, const reverse_iterator<_RI, _Ty, _Rt, _Pt, _D>& _Y) {return (_X.base() == _Y.base()); } template inline bool __cdecl operator!=( const reverse_iterator<_RI, _Ty, _Rt, _Pt, _D>& _X, const reverse_iterator<_RI, _Ty, _Rt, _Pt, _D>& _Y) {return (!(_X == _Y)); } template inline bool __cdecl operator<( const reverse_iterator<_RI, _Ty, _Rt, _Pt, _D>& _X, const reverse_iterator<_RI, _Ty, _Rt, _Pt, _D>& _Y) {return (_Y.base() < _X.base()); } template inline bool __cdecl operator>( const reverse_iterator<_RI, _Ty, _Rt, _Pt, _D>& _X, const reverse_iterator<_RI, _Ty, _Rt, _Pt, _D>& _Y) {return (_Y < _X); } template inline bool __cdecl operator<=( const reverse_iterator<_RI, _Ty, _Rt, _Pt, _D>& _X, const reverse_iterator<_RI, _Ty, _Rt, _Pt, _D>& _Y) {return (!(_Y < _X)); } template inline bool __cdecl operator>=( const reverse_iterator<_RI, _Ty, _Rt, _Pt, _D>& _X, const reverse_iterator<_RI, _Ty, _Rt, _Pt, _D>& _Y) {return (!(_X < _Y)); } template inline _D __cdecl operator-( const reverse_iterator<_RI, _Ty, _Rt, _Pt, _D>& _X, const reverse_iterator<_RI, _Ty, _Rt, _Pt, _D>& _Y) {return (_Y.base() - _X.base()); } template inline reverse_iterator<_RI, _Ty, _Rt, _Pt, _D> __cdecl operator+(_D _N, const reverse_iterator<_RI, _Ty, _Rt, _Pt, _D>& _Y) {return (reverse_iterator<_RI, _Ty, _Rt, _Pt, _D>( _Y.base() - _N)); } // TEMPLATE CLASS istreambuf_iterator (from ) template */ > class istreambuf_iterator : public iterator { public: typedef istreambuf_iterator<_E, _Tr> _Myt; typedef _E char_type; typedef _Tr traits_type; typedef typename _Tr::int_type int_type; typedef basic_streambuf<_E, _Tr> streambuf_type; typedef basic_istream<_E, _Tr> istream_type; istreambuf_iterator(streambuf_type *_Sb = 0) _THROW0() : _Sbuf(_Sb), _Got(_Sb == 0) {} istreambuf_iterator(istream_type& _I) _THROW0() : _Sbuf(_I.rdbuf()), _Got(_I.rdbuf() == 0) {} const _E& operator*() const {if (!_Got) ((_Myt *)this)->_Peek(); return (_Val); } const _E *operator->() const {return (&**this); } _Myt& operator++() {_Inc(); return (*this); } _Myt operator++(int) {if (!_Got) _Peek(); _Myt _Tmp = *this; _Inc(); return (_Tmp); } bool equal(const _Myt& _X) const {if (!_Got) ((_Myt *)this)->_Peek(); if (!_X._Got) ((_Myt *)&_X)->_Peek(); return (_Sbuf == 0 && _X._Sbuf == 0 || _Sbuf != 0 && _X._Sbuf != 0); } private: void _Inc() {if (_Sbuf == 0 || _Tr::eq_int_type(_Tr::eof(), _Sbuf->sbumpc())) _Sbuf = 0, _Got = true; else _Got = false; } _E _Peek() {int_type _C; if (_Sbuf == 0 || _Tr::eq_int_type(_Tr::eof(), _C = _Sbuf->sgetc())) _Sbuf = 0; else _Val = _Tr::to_char_type(_C); _Got = true; return (_Val); } streambuf_type *_Sbuf; bool _Got; _E _Val; }; template inline bool __cdecl operator==(const istreambuf_iterator<_E, _Tr>& _X, const istreambuf_iterator<_E, _Tr>& _Y) {return (_X.equal(_Y)); } template inline bool __cdecl operator!=(const istreambuf_iterator<_E, _Tr>& _X, const istreambuf_iterator<_E, _Tr>& _Y) {return (!(_X == _Y)); } // TEMPLATE CLASS ostreambuf_iterator (from ) template */ > class ostreambuf_iterator : public iterator { typedef ostreambuf_iterator<_E, _Tr> _Myt; public: typedef _E char_type; typedef _Tr traits_type; typedef basic_streambuf<_E, _Tr> streambuf_type; typedef basic_ostream<_E, _Tr> ostream_type; ostreambuf_iterator(streambuf_type *_Sb) _THROW0() : _Failed(false), _Sbuf(_Sb) {} ostreambuf_iterator(ostream_type& _O) _THROW0() : _Failed(false), _Sbuf(_O.rdbuf()) {} _Myt& operator=(_E _X) {if (_Sbuf == 0 || _Tr::eq_int_type(_Tr::eof(), _Sbuf->sputc(_X))) _Failed = true; return (*this); } _Myt& operator*() {return (*this); } _Myt& operator++() {return (*this); } _Myt& operator++(int) {return (*this); } bool failed() const _THROW0() {return (_Failed); } private: bool _Failed; streambuf_type *_Sbuf; }; // TEMPLATE OPERATORS namespace rel_ops { template inline bool __cdecl operator!=(const _Ty& _X, const _Ty& _Y) {return (!(_X == _Y)); } template inline bool __cdecl operator>(const _Ty& _X, const _Ty& _Y) {return (_Y < _X); } template inline bool __cdecl operator<=(const _Ty& _X, const _Ty& _Y) {return (!(_Y < _X)); } template inline bool __cdecl operator>=(const _Ty& _X, const _Ty& _Y) {return (!(_X < _Y)); } _STD_END _STD_END #ifdef _MSC_VER #if 1200 <= _MSC_VER #pragma warning(pop) #endif #pragma pack(pop) #endif /* _MSC_VER */ #endif /* _UTILITY_ */ /* * 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. */