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@4: * 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@4: * 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@4: #if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION) && !defined (_STLP_TYPE_TRAITS_H) williamr@4: # 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@4: }; williamr@2: williamr@2: template williamr@4: struct equal_to : public binary_function<_Tp, _Tp, bool> { williamr@2: bool operator()(const _Tp& __x, const _Tp& __y) const { return __x == __y; } williamr@2: }; williamr@2: williamr@2: template williamr@4: struct less : public binary_function<_Tp,_Tp,bool> williamr@4: #if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION) williamr@4: /* less is the default template parameter for many STL containers, to fully use williamr@4: * the move constructor feature we need to know that the default less is just a williamr@4: * functor. williamr@4: */ williamr@4: , public __stlport_class > williamr@4: #endif williamr@2: { williamr@4: bool operator()(const _Tp& __x, const _Tp& __y) const { return __x < __y; } williamr@4: williamr@4: #if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION) && defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND) williamr@4: //This is for a very special compiler config: partial template specialization williamr@4: //but no template function partial ordering. williamr@4: void swap(less<_Tp>&) {} williamr@4: #endif williamr@2: }; williamr@2: williamr@4: #if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION) williamr@2: template williamr@4: struct __type_traits > { williamr@4: #if !defined (__BORLANDC__) williamr@4: typedef typename _IsSTLportClass >::_Ret _STLportLess; williamr@4: #else williamr@4: enum { _Is = _IsSTLportClass >::_Is }; williamr@4: typedef typename __bool2type<_Is>::_Ret _STLportLess; williamr@4: #endif williamr@4: typedef _STLportLess has_trivial_default_constructor; williamr@4: typedef _STLportLess has_trivial_copy_constructor; williamr@4: typedef _STLportLess has_trivial_assignment_operator; williamr@4: typedef _STLportLess has_trivial_destructor; williamr@4: typedef _STLportLess is_POD_type; williamr@2: }; williamr@4: #endif williamr@2: williamr@4: _STLP_MOVE_TO_PRIV_NAMESPACE 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@4: _STLP_MOVE_TO_STD_NAMESPACE williamr@4: williamr@2: template williamr@4: 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@4: 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@4: _STLP_MOVE_TO_PRIV_NAMESPACE williamr@4: 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@4: _STLP_MOVE_TO_STD_NAMESPACE williamr@4: williamr@2: template williamr@4: 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@4: _STLP_MOVE_TO_PRIV_NAMESPACE 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@4: struct _Select2nd : public unary_function<_Pair, typename _Pair::second_type> { 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@4: #if defined (_STLP_MULTI_CONST_TEMPLATE_ARG_BUG) williamr@2: // fbp : sort of select1st just for maps williamr@4: 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@4: # define _STLP_SELECT1ST(__x,__y) _STLP_PRIV __Select1st_hint< __x, __y > williamr@4: #else williamr@4: # define _STLP_SELECT1ST(__x, __y) _STLP_PRIV _Select1st< __x > williamr@4: #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@4: _STLP_MOVE_TO_STD_NAMESPACE williamr@4: 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: