📄 xfunctional
字号:
// xfunctional internal header (pre-TR1 functional)
#pragma once
#ifndef _XFUNCTIONAL_
#define _XFUNCTIONAL_
#ifndef RC_INVOKED
#include <cstdlib>
#include <xstring>
#pragma pack(push,_CRT_PACKING)
#pragma warning(push,3)
#pragma warning(disable: 4100 4180 4244)
#ifndef _XSTD2
#define _XSTD2
#endif /* _XSTD2 */
_STD_BEGIN
// TEMPLATE STRUCT plus
template<class _Ty>
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<class _Ty>
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<class _Ty>
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<class _Ty>
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<class _Ty>
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<class _Ty>
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<class _Ty>
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<class _Ty>
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<class _Ty>
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<class _Ty>
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<class _Ty>
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<class _Ty>
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<class _Ty>
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<class _Ty>
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<class _Ty>
struct logical_not
: public unary_function<_Ty, bool>
{ // functor for unary operator!
bool operator()(const _Ty& _Left) const
{ // apply operator! to operand
return (!_Left);
}
};
#if _HAS_CPP0X
// TEMPLATE STRUCT bit_and
template<class _Ty>
struct bit_and
: 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 bit_or
template<class _Ty>
struct bit_or
: 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 bit_xor
template<class _Ty>
struct bit_xor
: 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);
}
};
#endif /* _HAS_CPP0X */
// TEMPLATE CLASS unary_negate
template<class _Fn1>
class unary_negate
: public unary_function<typename _Fn1::argument_type, bool>
{ // 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<class _Fn1> 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 _Fn2>
class binary_negate
: public binary_function<typename _Fn2::first_argument_type,
typename _Fn2::second_argument_type, bool>
{ // 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<class _Fn2> 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 _Fn2>
class binder1st
: public unary_function<typename _Fn2::second_argument_type,
typename _Fn2::result_type>
{ // functor adapter _Func(stored, right)
public:
typedef unary_function<typename _Fn2::second_argument_type,
typename _Fn2::result_type> _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));
}
result_type operator()(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<class _Fn2,
class _Ty> 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 _Fn2>
class binder2nd
: public unary_function<typename _Fn2::first_argument_type,
typename _Fn2::result_type>
{ // functor adapter _Func(left, stored)
public:
typedef unary_function<typename _Fn2::first_argument_type,
typename _Fn2::result_type> _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));
}
result_type operator()(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<class _Fn2,
class _Ty> 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 _Arg,
class _Result,
class _Fn = _Result (*)(_Arg)>
class pointer_to_unary_function
: public unary_function<_Arg, _Result>
{ // functor adapter (*pfunc)(left)
public:
explicit pointer_to_unary_function(_Fn _Left)
: _Pfun(_Left)
{ // construct from pointer
}
_Result operator()(_Arg _Left) const
{ // call function with operand
return (_Pfun(_Left));
}
protected:
_Fn _Pfun; // the function pointer
};
// TEMPLATE CLASS pointer_to_binary_function
template<class _Arg1,
class _Arg2,
class _Result,
class _Fn = _Result (*)(_Arg1, _Arg2)>
class pointer_to_binary_function
: public binary_function<_Arg1, _Arg2, _Result>
{ // functor adapter (*pfunc)(left, right)
public:
explicit pointer_to_binary_function(_Fn _Left)
: _Pfun(_Left)
{ // construct from pointer
}
_Result operator()(_Arg1 _Left, _Arg2 _Right) const
{ // call function with operands
return (_Pfun(_Left, _Right));
}
protected:
_Fn _Pfun; // the function pointer
};
// TEMPLATE FUNCTION ptr_fun
template<class _Arg,
class _Result> inline
pointer_to_unary_function<_Arg, _Result,
_Result (__cdecl *)(_Arg)>
ptr_fun(_Result (__cdecl *_Left)(_Arg))
{ // return pointer_to_unary_function functor adapter
return (pointer_to_unary_function<_Arg, _Result,
_Result (__cdecl *)(_Arg)>(_Left));
}
#ifdef _M_IX86
template<class _Arg,
class _Result> inline
pointer_to_unary_function<_Arg, _Result,
_Result (__stdcall *)(_Arg)>
ptr_fun(_Result (__stdcall *_Left)(_Arg))
{ // return pointer_to_unary_function functor adapter
return (pointer_to_unary_function<_Arg, _Result,
_Result (__stdcall *)(_Arg)>(_Left));
}
#ifndef _M_CEE
template<class _Arg,
class _Result> inline
pointer_to_unary_function<_Arg, _Result,
_Result (__fastcall *)(_Arg)>
ptr_fun(_Result (__fastcall *_Left)(_Arg))
{ // return pointer_to_unary_function functor adapter
return (pointer_to_unary_function<_Arg, _Result,
_Result (__fastcall *)(_Arg)>(_Left));
}
#endif /* _M_CEE */
#endif /* _M_IX86 */
#ifdef _M_CEE
template<class _Arg,
class _Result> inline
pointer_to_unary_function<_Arg, _Result,
_Result (__clrcall *)(_Arg)>
ptr_fun(_Result (__clrcall *_Left)(_Arg))
{ // return pointer_to_unary_function functor adapter
return (pointer_to_unary_function<_Arg, _Result,
_Result (__clrcall *)(_Arg)>(_Left));
}
#endif /* _M_CEE */
template<class _Arg1,
class _Arg2,
class _Result> inline
pointer_to_binary_function<_Arg1, _Arg2, _Result,
_Result (__cdecl *)(_Arg1, _Arg2)>
ptr_fun(_Result (__cdecl *_Left)(_Arg1, _Arg2))
{ // return pointer_to_binary_function functor adapter
return (pointer_to_binary_function<_Arg1, _Arg2, _Result,
_Result (__cdecl *)(_Arg1, _Arg2)>(_Left));
}
#ifdef _M_IX86
template<class _Arg1,
class _Arg2,
class _Result> inline
pointer_to_binary_function<_Arg1, _Arg2, _Result,
_Result(__stdcall *)(_Arg1, _Arg2)>
ptr_fun(_Result (__stdcall *_Left)(_Arg1, _Arg2))
{ // return pointer_to_binary_function functor adapter
return (pointer_to_binary_function<_Arg1, _Arg2, _Result,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -