#pragma once #ifndef _STLUTIL_H_ #define _STLUTIL_H_ #include #ifdef _MSC_VER #pragma pack(push,8) #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) { } _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 _It::iterator_category iterator_category; typedef _It::value_type value_type; typedef _It::distance_type distance_type; }; // TEMPLATE FUNCTION _Iter_cat (from ) #if _MSC_VER >= 1200 #pragma warning(push) #endif #pragma warning(disable:4700) template inline _C __cdecl _Iter_cat(const iterator<_C, _Ty, _D>&) { _C _X; return (_X); } template inline random_access_iterator_tag __cdecl _Iter_cat(const _Ty *) { random_access_iterator_tag _X; return (_X); } #if _MSC_VER >= 1200 #pragma warning(pop) #else #pragma warning(default:4700) #endif // 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 _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 #ifdef _MSC_VER #pragma pack(pop) #endif /* _MSC_VER */ #endif /* _STLUTIL_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. */