williamr@2: /* williamr@2: * williamr@2: * Copyright (c) 1994 williamr@2: * Hewlett-Packard Company williamr@2: * williamr@2: * Copyright (c) 1996-1998 williamr@2: * Silicon Graphics Computer Systems, Inc. williamr@2: * williamr@2: * Copyright (c) 1997 williamr@2: * Moscow Center for SPARC Technology williamr@2: * williamr@2: * Copyright (c) 1999 williamr@2: * Boris Fomitchev williamr@2: * williamr@2: * This material is provided "as is", with absolutely no warranty expressed williamr@2: * or implied. Any use is at your own risk. williamr@2: * williamr@2: * Permission to use or copy this software for any purpose is hereby granted williamr@2: * without fee, provided the above notices are retained on all copies. williamr@2: * Permission to modify the code and to distribute modified code is granted, williamr@2: * provided the above notices are retained, and a notice that the code was williamr@2: * modified is included with the above copyright notice. williamr@2: * williamr@2: */ williamr@2: williamr@2: /* NOTE: This is an internal header file, included by other STL headers. williamr@2: * You should not attempt to use it directly. williamr@2: */ williamr@2: williamr@2: #ifndef _STLP_INTERNAL_FUNCTION_BASE_H williamr@2: #define _STLP_INTERNAL_FUNCTION_BASE_H williamr@2: williamr@2: #ifndef _STLP_CONFIG_H williamr@2: #include williamr@2: #endif williamr@2: williamr@2: _STLP_BEGIN_NAMESPACE williamr@2: williamr@2: template williamr@2: struct unary_function { williamr@2: typedef _Arg argument_type; williamr@2: typedef _Result result_type; williamr@2: }; williamr@2: williamr@2: template williamr@2: struct binary_function { williamr@2: typedef _Arg1 first_argument_type; williamr@2: typedef _Arg2 second_argument_type; williamr@2: typedef _Result result_type; williamr@2: }; williamr@2: williamr@2: template williamr@2: struct equal_to : public binary_function<_Tp,_Tp,bool> williamr@2: { williamr@2: bool operator()(const _Tp& __x, const _Tp& __y) const { return __x == __y; } williamr@2: }; williamr@2: williamr@2: template williamr@2: struct not_equal_to : public binary_function<_Tp,_Tp,bool> williamr@2: { williamr@2: bool operator()(const _Tp& __x, const _Tp& __y) const { return __x != __y; } williamr@2: }; williamr@2: williamr@2: template williamr@2: struct greater : public binary_function<_Tp,_Tp,bool> williamr@2: { williamr@2: bool operator()(const _Tp& __x, const _Tp& __y) const { return __x > __y; } williamr@2: }; williamr@2: williamr@2: template williamr@2: struct less : public binary_function<_Tp,_Tp,bool> williamr@2: { williamr@2: bool operator()(const _Tp& __x, const _Tp& __y) const { return __x < __y; } williamr@2: }; williamr@2: williamr@2: template williamr@2: struct greater_equal : public binary_function<_Tp,_Tp,bool> williamr@2: { williamr@2: bool operator()(const _Tp& __x, const _Tp& __y) const { return __x >= __y; } williamr@2: }; williamr@2: williamr@2: template williamr@2: struct less_equal : public binary_function<_Tp,_Tp,bool> williamr@2: { williamr@2: bool operator()(const _Tp& __x, const _Tp& __y) const { return __x <= __y; } williamr@2: }; williamr@2: williamr@2: template williamr@2: less<_Tp> __less(_Tp* ) { return less<_Tp>(); } williamr@2: williamr@2: template williamr@2: equal_to<_Tp> __equal_to(_Tp* ) { return equal_to<_Tp>(); } williamr@2: williamr@2: template williamr@2: struct plus : public binary_function<_Tp,_Tp,_Tp> { williamr@2: _Tp operator()(const _Tp& __x, const _Tp& __y) const { return __x + __y; } williamr@2: }; williamr@2: williamr@2: template williamr@2: struct minus : public binary_function<_Tp,_Tp,_Tp> { williamr@2: _Tp operator()(const _Tp& __x, const _Tp& __y) const { return __x - __y; } williamr@2: }; williamr@2: williamr@2: template williamr@2: plus<_Tp> __plus(_Tp* ) { return plus<_Tp>(); } williamr@2: williamr@2: template williamr@2: minus<_Tp> __minus(_Tp* ) { return minus<_Tp>(); } williamr@2: williamr@2: template williamr@2: struct multiplies : public binary_function<_Tp,_Tp,_Tp> { williamr@2: _Tp operator()(const _Tp& __x, const _Tp& __y) const { return __x * __y; } williamr@2: }; williamr@2: williamr@2: template williamr@2: struct divides : public binary_function<_Tp,_Tp,_Tp> { williamr@2: _Tp operator()(const _Tp& __x, const _Tp& __y) const { return __x / __y; } williamr@2: }; williamr@2: williamr@2: template williamr@2: struct modulus : public binary_function<_Tp,_Tp,_Tp> williamr@2: { williamr@2: _Tp operator()(const _Tp& __x, const _Tp& __y) const { return __x % __y; } williamr@2: }; williamr@2: williamr@2: template williamr@2: struct negate : public unary_function<_Tp,_Tp> williamr@2: { williamr@2: _Tp operator()(const _Tp& __x) const { return -__x; } williamr@2: }; williamr@2: williamr@2: template williamr@2: struct logical_and : public binary_function<_Tp,_Tp,bool> williamr@2: { williamr@2: bool operator()(const _Tp& __x, const _Tp& __y) const { return __x && __y; } williamr@2: }; williamr@2: williamr@2: template williamr@2: struct logical_or : public binary_function<_Tp,_Tp,bool> williamr@2: { williamr@2: bool operator()(const _Tp& __x, const _Tp& __y) const { return __x || __y; } williamr@2: }; williamr@2: williamr@2: template williamr@2: struct logical_not : public unary_function<_Tp,bool> williamr@2: { williamr@2: bool operator()(const _Tp& __x) const { return !__x; } williamr@2: }; williamr@2: williamr@2: template williamr@2: struct _Select1st : public unary_function<_Pair, typename _Pair::first_type> { williamr@2: const typename _Pair::first_type& operator()(const _Pair& __x) const { williamr@2: return __x.first; williamr@2: } williamr@2: }; williamr@2: williamr@2: template williamr@2: struct _Select2nd : public unary_function<_Pair, typename _Pair::second_type> williamr@2: { williamr@2: const typename _Pair::second_type& operator()(const _Pair& __x) const { williamr@2: return __x.second; williamr@2: } williamr@2: }; williamr@2: williamr@2: // project1st and project2nd are extensions: they are not part of the standard williamr@2: template williamr@2: struct _Project1st : public binary_function<_Arg1, _Arg2, _Arg1> { williamr@2: _Arg1 operator()(const _Arg1& __x, const _Arg2&) const { return __x; } williamr@2: }; williamr@2: williamr@2: template williamr@2: struct _Project2nd : public binary_function<_Arg1, _Arg2, _Arg2> { williamr@2: _Arg2 operator()(const _Arg1&, const _Arg2& __y) const { return __y; } williamr@2: }; williamr@2: williamr@2: #ifdef _STLP_MULTI_CONST_TEMPLATE_ARG_BUG williamr@2: // fbp : sort of select1st just for maps williamr@2: template williamr@2: // JDJ (CW Pro1 doesn't like const when first_type is also const) williamr@2: struct __Select1st_hint : public unary_function<_Pair, _Whatever> { williamr@2: const _Whatever& operator () (const _Pair& __x) const { return __x.first; } williamr@2: }; williamr@2: # define _STLP_SELECT1ST(__x,__y) __Select1st_hint< __x, __y > williamr@2: # else williamr@2: # define _STLP_SELECT1ST(__x, __y) _Select1st< __x > williamr@2: # endif williamr@2: williamr@2: template williamr@2: struct _Identity : public unary_function<_Tp,_Tp> { williamr@2: const _Tp& operator()(const _Tp& __x) const { return __x; } williamr@2: }; williamr@2: williamr@2: template williamr@2: struct _Constant_unary_fun { williamr@2: typedef _Argument argument_type; williamr@2: typedef _Result result_type; williamr@2: result_type _M_val; williamr@2: williamr@2: _Constant_unary_fun(const result_type& __v) : _M_val(__v) {} williamr@2: const result_type& operator()(const _Argument&) const { return _M_val; } williamr@2: }; williamr@2: williamr@2: template williamr@2: struct _Constant_binary_fun { williamr@2: typedef _Arg1 first_argument_type; williamr@2: typedef _Arg2 second_argument_type; williamr@2: typedef _Result result_type; williamr@2: _Result _M_val; williamr@2: williamr@2: _Constant_binary_fun(const _Result& __v) : _M_val(__v) {} williamr@2: const result_type& operator()(const _Arg1&, const _Arg2&) const { williamr@2: return _M_val; williamr@2: } williamr@2: }; williamr@2: williamr@2: // identity_element (not part of the C++ standard). williamr@2: template inline _Tp __identity_element(plus<_Tp>) { return _Tp(0); } williamr@2: template inline _Tp __identity_element(multiplies<_Tp>) { return _Tp(1); } williamr@2: williamr@2: _STLP_END_NAMESPACE williamr@2: williamr@2: #endif /* _STLP_INTERNAL_FUNCTION_BASE_H */ williamr@2: williamr@2: // Local Variables: williamr@2: // mode:C++ williamr@2: // End: