// functional standard header #pragma once #ifndef _FUNCTIONAL_ #define _FUNCTIONAL_ #include #pragma pack(push,8) #pragma warning(push,3) #pragma warning(disable: 4244) _STD_BEGIN // TEMPLATE STRUCT unary_function template struct unary_function { // base class for unary functions typedef _Arg argument_type; typedef _Result result_type; }; // TEMPLATE STRUCT binary_function template struct binary_function { // base class for binary functions typedef _Arg1 first_argument_type; typedef _Arg2 second_argument_type; typedef _Result result_type; }; // TEMPLATE STRUCT plus template struct plus : public binary_function<_Ty, _Ty, _Ty> { // functor for operator+ _Ty operator()(const _Ty& _Left, const _Ty& _Right) const { // apply operator+ to operands return (_Left + _Right); } }; // TEMPLATE STRUCT minus template struct minus : public binary_function<_Ty, _Ty, _Ty> { // functor for operator- _Ty operator()(const _Ty& _Left, const _Ty& _Right) const { // apply operator- to operands return (_Left - _Right); } }; // TEMPLATE STRUCT multiplies template struct multiplies : public binary_function<_Ty, _Ty, _Ty> { // functor for operator* _Ty operator()(const _Ty& _Left, const _Ty& _Right) const { // apply operator* to operands return (_Left * _Right); } }; // TEMPLATE STRUCT divides template struct divides : public binary_function<_Ty, _Ty, _Ty> { // functor for operator/ _Ty operator()(const _Ty& _Left, const _Ty& _Right) const { // apply operator/ to operands return (_Left / _Right); } }; // TEMPLATE STRUCT modulus template struct modulus : public binary_function<_Ty, _Ty, _Ty> { // functor for operator% _Ty operator()(const _Ty& _Left, const _Ty& _Right) const { // apply operator% to operands return (_Left % _Right); } }; // TEMPLATE STRUCT negate template struct negate : public unary_function<_Ty, _Ty> { // functor for unary operator- _Ty operator()(const _Ty& _Left) const { // apply operator- to operand return (-_Left); } }; // TEMPLATE STRUCT equal_to template struct equal_to : public binary_function<_Ty, _Ty, bool> { // functor for operator== bool operator()(const _Ty& _Left, const _Ty& _Right) const { // apply operator== to operands return (_Left == _Right); } }; // TEMPLATE STRUCT not_equal_to template struct not_equal_to : public binary_function<_Ty, _Ty, bool> { // functor for operator!= bool operator()(const _Ty& _Left, const _Ty& _Right) const { // apply operator= to operands return (_Left != _Right); } }; // TEMPLATE STRUCT greater template struct greater : public binary_function<_Ty, _Ty, bool> { // functor for operator> bool operator()(const _Ty& _Left, const _Ty& _Right) const { // apply operator> to operands return (_Left > _Right); } }; // TEMPLATE STRUCT less template struct less : public binary_function<_Ty, _Ty, bool> { // functor for operator< bool operator()(const _Ty& _Left, const _Ty& _Right) const { // apply operator< to operands return (_Left < _Right); } }; // TEMPLATE STRUCT greater_equal template struct greater_equal : public binary_function<_Ty, _Ty, bool> { // functor for operator>= bool operator()(const _Ty& _Left, const _Ty& _Right) const { // apply operator>= to operands return (_Left >= _Right); } }; // TEMPLATE STRUCT less_equal template struct less_equal : public binary_function<_Ty, _Ty, bool> { // functor for operator<= bool operator()(const _Ty& _Left, const _Ty& _Right) const { // apply operator<= to operands return (_Left <= _Right); } }; // TEMPLATE STRUCT logical_and template struct logical_and : public binary_function<_Ty, _Ty, bool> { // functor for operator&& bool operator()(const _Ty& _Left, const _Ty& _Right) const { // apply operator&& to operands return (_Left && _Right); } }; // TEMPLATE STRUCT logical_or template struct logical_or : public binary_function<_Ty, _Ty, bool> { // functor for operator|| bool operator()(const _Ty& _Left, const _Ty& _Right) const { // apply operator|| to operands return (_Left || _Right); } }; // TEMPLATE STRUCT logical_not template struct logical_not : public unary_function<_Ty, bool> { // functor for unary operator! bool operator()(const _Ty& _Left) const { // apply operator! to operand return (!_Left); } }; // TEMPLATE CLASS unary_negate template class unary_negate : public unary_function { // functor adapter !_Func(left) public: explicit unary_negate(const _Fn1& _Func) : _Functor(_Func) { // construct from functor } bool operator()(const typename _Fn1::argument_type& _Left) const { // apply functor to operand return (!_Functor(_Left)); } protected: _Fn1 _Functor; // the functor to apply }; // TEMPLATE FUNCTION not1 template inline unary_negate<_Fn1> not1(const _Fn1& _Func) { // return a unary_negate functor adapter return (std::unary_negate<_Fn1>(_Func)); } // TEMPLATE CLASS binary_negate template class binary_negate : public binary_function { // functor adapter !_Func(left, right) public: explicit binary_negate(const _Fn2& _Func) : _Functor(_Func) { // construct from functor } bool operator()(const typename _Fn2::first_argument_type& _Left, const typename _Fn2::second_argument_type& _Right) const { // apply functor to operands return (!_Functor(_Left, _Right)); } protected: _Fn2 _Functor; // the functor to apply }; // TEMPLATE FUNCTION not2 template inline binary_negate<_Fn2> not2(const _Fn2& _Func) { // return a binary_negate functor adapter return (std::binary_negate<_Fn2>(_Func)); } // TEMPLATE CLASS binder1st template class binder1st : public unary_function { // functor adapter _Func(stored, right) public: typedef unary_function _Base; typedef typename _Base::argument_type argument_type; typedef typename _Base::result_type result_type; binder1st(const _Fn2& _Func, const typename _Fn2::first_argument_type& _Left) : op(_Func), value(_Left) { // construct from functor and left operand } result_type operator()(const argument_type& _Right) const { // apply functor to operands return (op(value, _Right)); } protected: _Fn2 op; // the functor to apply typename _Fn2::first_argument_type value; // the left operand }; // TEMPLATE FUNCTION bind1st template inline binder1st<_Fn2> bind1st(const _Fn2& _Func, const _Ty& _Left) { // return a binder1st functor adapter typename _Fn2::first_argument_type _Val(_Left); return (std::binder1st<_Fn2>(_Func, _Val)); } // TEMPLATE CLASS binder2nd template class binder2nd : public unary_function { // functor adapter _Func(left, stored) public: typedef unary_function _Base; typedef typename _Base::argument_type argument_type; typedef typename _Base::result_type result_type; binder2nd(const _Fn2& _Func, const typename _Fn2::second_argument_type& _Right) : op(_Func), value(_Right) { // construct from functor and right operand } result_type operator()(const argument_type& _Left) const { // apply functor to operands return (op(_Left, value)); } protected: _Fn2 op; // the functor to apply typename _Fn2::second_argument_type value; // the right operand }; // TEMPLATE FUNCTION bind2nd template inline binder2nd<_Fn2> bind2nd(const _Fn2& _Func, const _Ty& _Right) { // return a binder2nd functor adapter typename _Fn2::second_argument_type _Val(_Right); return (std::binder2nd<_Fn2>(_Func, _Val)); } // TEMPLATE CLASS pointer_to_unary_function template class pointer_to_unary_function : public unary_function<_Arg, _Result> { // functor adapter (*pfunc)(left) public: explicit pointer_to_unary_function(_Result (__cdecl *_Left)(_Arg)) : _Pfun(_Left) { // construct from pointer } _Result operator()(_Arg _Left) const { // call function with operand return (_Pfun(_Left)); } protected: _Result (__cdecl *_Pfun)(_Arg); // the function pointer }; // TEMPLATE CLASS pointer_to_binary_function template class pointer_to_binary_function : public binary_function<_Arg1, _Arg2, _Result> { // functor adapter (*pfunc)(left, right) public: explicit pointer_to_binary_function( _Result (__cdecl *_Left)(_Arg1, _Arg2)) : _Pfun(_Left) { // construct from pointer } _Result operator()(_Arg1 _Left, _Arg2 _Right) const { // call function with operands return (_Pfun(_Left, _Right)); } protected: _Result (__cdecl *_Pfun)(_Arg1, _Arg2); // the function pointer }; // TEMPLATE FUNCTION ptr_fun template inline pointer_to_unary_function<_Arg, _Result> ptr_fun(_Result (__cdecl *_Left)(_Arg)) { // return pointer_to_unary_function functor adapter return (std::pointer_to_unary_function<_Arg, _Result>(_Left)); } template inline pointer_to_binary_function<_Arg1, _Arg2, _Result> ptr_fun(_Result (__cdecl *_Left)(_Arg1, _Arg2)) { // return pointer_to_binary_function functor adapter return (std::pointer_to_binary_function<_Arg1, _Arg2, _Result>(_Left)); } // TEMPLATE CLASS mem_fun_t template class mem_fun_t : public unary_function<_Ty *, _Result> { // functor adapter (*p->*pfunc)(), non-const *pfunc public: explicit mem_fun_t(_Result (_Ty::*_Pm)()) : _Pmemfun(_Pm) { // construct from pointer } _Result operator()(_Ty *_Pleft) const { // call function return ((_Pleft->*_Pmemfun)()); } private: _Result (_Ty::*_Pmemfun)(); // the member function pointer }; // TEMPLATE CLASS mem_fun1_t template class mem_fun1_t : public binary_function<_Ty *, _Arg, _Result> { // functor adapter (*p->*pfunc)(val), non-const *pfunc public: explicit mem_fun1_t(_Result (_Ty::*_Pm)(_Arg)) : _Pmemfun(_Pm) { // construct from pointer } _Result operator()(_Ty *_Pleft, _Arg _Right) const { // call function with operand return ((_Pleft->*_Pmemfun)(_Right)); } private: _Result (_Ty::*_Pmemfun)(_Arg); // the member function pointer }; // TEMPLATE CLASS const_mem_fun_t template class const_mem_fun_t : public unary_function { // functor adapter (*p->*pfunc)(), const *pfunc public: explicit const_mem_fun_t(_Result (_Ty::*_Pm)() const) : _Pmemfun(_Pm) { // construct from pointer } _Result operator()(const _Ty *_Pleft) const { // call function return ((_Pleft->*_Pmemfun)()); } private: _Result (_Ty::*_Pmemfun)() const; // the member function pointer }; // TEMPLATE CLASS const_mem_fun1_t template class const_mem_fun1_t : public binary_function<_Ty *, _Arg, _Result> { // functor adapter (*p->*pfunc)(val), const *pfunc public: explicit const_mem_fun1_t(_Result (_Ty::*_Pm)(_Arg) const) : _Pmemfun(_Pm) { // construct from pointer } _Result operator()(const _Ty *_Pleft, _Arg _Right) const { // call function with operand return ((_Pleft->*_Pmemfun)(_Right)); } private: _Result (_Ty::*_Pmemfun)(_Arg) const; // the member function pointer }; // TEMPLATE FUNCTION mem_fun template inline mem_fun_t<_Result, _Ty> mem_fun(_Result (_Ty::*_Pm)()) { // return a mem_fun_t functor adapter return (std::mem_fun_t<_Result, _Ty>(_Pm)); } template inline mem_fun1_t<_Result, _Ty, _Arg> mem_fun(_Result (_Ty::*_Pm)(_Arg)) { // return a mem_fun1_t functor adapter return (std::mem_fun1_t<_Result, _Ty, _Arg>(_Pm)); } template inline const_mem_fun_t<_Result, _Ty> mem_fun(_Result (_Ty::*_Pm)() const) { // return a const_mem_fun_t functor adapter return (std::const_mem_fun_t<_Result, _Ty>(_Pm)); } template inline const_mem_fun1_t<_Result, _Ty, _Arg> mem_fun(_Result (_Ty::*_Pm)(_Arg) const) { // return a const_mem_fun1_t functor adapter return (std::const_mem_fun1_t<_Result, _Ty, _Arg>(_Pm)); } // TEMPLATE FUNCTION mem_fun1 (retained) template inline mem_fun1_t<_Result, _Ty, _Arg> mem_fun1(_Result (_Ty::*_Pm)(_Arg)) { // return a mem_fun1_t functor adapter return (std::mem_fun1_t<_Result, _Ty, _Arg>(_Pm)); } // TEMPLATE CLASS mem_fun_ref_t template class mem_fun_ref_t : public unary_function<_Ty, _Result> { // functor adapter (*left.*pfunc)(), non-const *pfunc public: explicit mem_fun_ref_t(_Result (_Ty::*_Pm)()) : _Pmemfun(_Pm) { // construct from pointer } _Result operator()(_Ty& _Left) const { // call function return ((_Left.*_Pmemfun)()); } private: _Result (_Ty::*_Pmemfun)(); // the member function pointer }; // TEMPLATE CLASS mem_fun1_ref_t template class mem_fun1_ref_t : public binary_function<_Ty, _Arg, _Result> { // functor adapter (*left.*pfunc)(val), non-const *pfunc public: explicit mem_fun1_ref_t(_Result (_Ty::*_Pm)(_Arg)) : _Pmemfun(_Pm) { // construct from pointer } _Result operator()(_Ty& _Left, _Arg _Right) const { // call function with operand return ((_Left.*_Pmemfun)(_Right)); } private: _Result (_Ty::*_Pmemfun)(_Arg); // the member function pointer }; // TEMPLATE CLASS const_mem_fun_ref_t template class const_mem_fun_ref_t : public unary_function<_Ty, _Result> { // functor adapter (*left.*pfunc)(), const *pfunc public: explicit const_mem_fun_ref_t(_Result (_Ty::*_Pm)() const) : _Pmemfun(_Pm) { // construct from pointer } _Result operator()(const _Ty& _Left) const { // call function return ((_Left.*_Pmemfun)()); } private: _Result (_Ty::*_Pmemfun)() const; // the member function pointer }; // TEMPLATE CLASS const_mem_fun1_ref_t template class const_mem_fun1_ref_t : public binary_function<_Ty, _Arg, _Result> { // functor adapter (*left.*pfunc)(val), const *pfunc public: explicit const_mem_fun1_ref_t(_Result (_Ty::*_Pm)(_Arg) const) : _Pmemfun(_Pm) { // construct from pointer } _Result operator()(const _Ty& _Left, _Arg _Right) const { // call function with operand return ((_Left.*_Pmemfun)(_Right)); } private: _Result (_Ty::*_Pmemfun)(_Arg) const; // the member function pointer }; // TEMPLATE FUNCTION mem_fun_ref template inline mem_fun_ref_t<_Result, _Ty> mem_fun_ref(_Result (_Ty::*_Pm)()) { // return a mem_fun_ref_t functor adapter return (std::mem_fun_ref_t<_Result, _Ty>(_Pm)); } template inline mem_fun1_ref_t<_Result, _Ty, _Arg> mem_fun_ref(_Result (_Ty::*_Pm)(_Arg)) { // return a mem_fun1_ref_t functor adapter return (std::mem_fun1_ref_t<_Result, _Ty, _Arg>(_Pm)); } template inline const_mem_fun_ref_t<_Result, _Ty> mem_fun_ref(_Result (_Ty::*_Pm)() const) { // return a const_mem_fun_ref_t functor adapter return (std::const_mem_fun_ref_t<_Result, _Ty>(_Pm)); } template inline const_mem_fun1_ref_t<_Result, _Ty, _Arg> mem_fun_ref(_Result (_Ty::*_Pm)(_Arg) const) { // return a const_mem_fun1_ref_t functor adapter return (std::const_mem_fun1_ref_t<_Result, _Ty, _Arg>(_Pm)); } // TEMPLATE FUNCTION mem_fun1_ref (retained) template inline mem_fun1_ref_t<_Result, _Ty, _Arg> mem_fun1_ref(_Result (_Ty::*_Pm)(_Arg)) { // return a mem_fun1_ref_t functor adapter return (std::mem_fun1_ref_t<_Result, _Ty, _Arg>(_Pm)); } _STD_END #pragma warning(default: 4244) #pragma warning(pop) #pragma pack(pop) #endif /* _FUNCTIONAL_ */ /* * Copyright (c) 1992-2001 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. V3.10:0009 */