111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/* 211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Copyright (c) 1994 411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Hewlett-Packard Company 511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Copyright (c) 1996-1998 711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Silicon Graphics Computer Systems, Inc. 811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Copyright (c) 1997 1011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Moscow Center for SPARC Technology 1111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 1211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Copyright (c) 1999 1311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Boris Fomitchev 1411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 1511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This material is provided "as is", with absolutely no warranty expressed 1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * or implied. Any use is at your own risk. 1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Permission to use or copy this software for any purpose is hereby granted 1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * without fee, provided the above notices are retained on all copies. 2011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Permission to modify the code and to distribute modified code is granted, 2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * provided the above notices are retained, and a notice that the code was 2211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * modified is included with the above copyright notice. 2311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 2411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 2511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 2611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/* NOTE: This is an internal header file, included by other STL headers. 2711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * You should not attempt to use it directly. 2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 3011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef _STLP_INTERNAL_FUNCTION_BASE_H 3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define _STLP_INTERNAL_FUNCTION_BASE_H 3211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 3311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION) && !defined (_STLP_TYPE_TRAITS_H) 3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# include <stl/type_traits.h> 3511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 3611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_BEGIN_NAMESPACE 3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 3911cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Arg, class _Result> 4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct unary_function { 4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef _Arg argument_type; 4211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef _Result result_type; 4311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if !defined (__BORLANDC__) || (__BORLANDC__ < 0x580) 4411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertprotected: 4511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /* This class purpose is to be derived but it is not polymorphic so users should never try 4611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * to destroy an instance of it directly. The protected non-virtual destructor make this 4711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * fact obvious at compilation time. */ 4811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ~unary_function() {} 4911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 5011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 5111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 5211cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Arg1, class _Arg2, class _Result> 5311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct binary_function { 5411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef _Arg1 first_argument_type; 5511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef _Arg2 second_argument_type; 5611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef _Result result_type; 5711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if !defined (__BORLANDC__) || (__BORLANDC__ < 0x580) 5811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertprotected: 5911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /* See unary_function comment. */ 6011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ~binary_function() {} 6111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 6211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 6311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 6411cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp> 6511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct equal_to : public binary_function<_Tp, _Tp, bool> { 6611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert bool operator()(const _Tp& __x, const _Tp& __y) const { return __x == __y; } 6711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 6811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 6911cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp> 7011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct less : public binary_function<_Tp,_Tp,bool> 7111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION) 7211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/* less is the default template parameter for many STL containers, to fully use 7311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * the move constructor feature we need to know that the default less is just a 7411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * functor. 7511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 7611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert , public __stlport_class<less<_Tp> > 7711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 7811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ 7911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert bool operator()(const _Tp& __x, const _Tp& __y) const { return __x < __y; } 8011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 8111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND) && !defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER) 8211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void _M_swap_workaround(less<_Tp>& __x) {} 8311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 8411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 8511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 8611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION) 8711cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp> 8811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct __type_traits<less<_Tp> > { 8911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if !defined (__BORLANDC__) 9011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename _IsSTLportClass<less<_Tp> >::_Ret _STLportLess; 9111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else 9211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert enum { _Is = _IsSTLportClass<less<_Tp> >::_Is }; 9311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename __bool2type<_Is>::_Ret _STLportLess; 9411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 9511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef _STLportLess has_trivial_default_constructor; 9611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef _STLportLess has_trivial_copy_constructor; 9711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef _STLportLess has_trivial_assignment_operator; 9811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef _STLportLess has_trivial_destructor; 9911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef _STLportLess is_POD_type; 10011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 10111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 10211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 10311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_MOVE_TO_PRIV_NAMESPACE 10411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 10511cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp> 10611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertless<_Tp> __less(_Tp* ) { return less<_Tp>(); } 10711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 10811cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp> 10911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertequal_to<_Tp> __equal_to(_Tp* ) { return equal_to<_Tp>(); } 11011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 11111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_MOVE_TO_STD_NAMESPACE 11211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 11311cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp> 11411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct plus : public binary_function<_Tp, _Tp, _Tp> { 11511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _Tp operator()(const _Tp& __x, const _Tp& __y) const { return __x + __y; } 11611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 11711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 11811cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp> 11911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct minus : public binary_function<_Tp, _Tp, _Tp> { 12011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _Tp operator()(const _Tp& __x, const _Tp& __y) const { return __x - __y; } 12111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 12211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 12311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_MOVE_TO_PRIV_NAMESPACE 12411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 12511cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp> 12611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertplus<_Tp> __plus(_Tp* ) { return plus<_Tp>(); } 12711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 12811cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp> 12911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertminus<_Tp> __minus(_Tp* ) { return minus<_Tp>(); } 13011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 13111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_MOVE_TO_STD_NAMESPACE 13211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 13311cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp> 13411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct multiplies : public binary_function<_Tp, _Tp, _Tp> { 13511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _Tp operator()(const _Tp& __x, const _Tp& __y) const { return __x * __y; } 13611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 13711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 13811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_MOVE_TO_PRIV_NAMESPACE 13911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 14011cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Pair> 14111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct _Select1st : public unary_function<_Pair, typename _Pair::first_type> { 14211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const typename _Pair::first_type& operator()(const _Pair& __x) const { 14311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return __x.first; 14411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 14511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 14611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 14711cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Pair> 14811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct _Select2nd : public unary_function<_Pair, typename _Pair::second_type> { 14911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const typename _Pair::second_type& operator()(const _Pair& __x) const { 15011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return __x.second; 15111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 15211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 15311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 15411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// project1st and project2nd are extensions: they are not part of the standard 15511cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Arg1, class _Arg2> 15611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct _Project1st : public binary_function<_Arg1, _Arg2, _Arg1> { 15711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _Arg1 operator()(const _Arg1& __x, const _Arg2&) const { return __x; } 15811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 15911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 16011cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Arg1, class _Arg2> 16111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct _Project2nd : public binary_function<_Arg1, _Arg2, _Arg2> { 16211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _Arg2 operator()(const _Arg1&, const _Arg2& __y) const { return __y; } 16311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 16411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 16511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if defined (_STLP_MULTI_CONST_TEMPLATE_ARG_BUG) 16611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// fbp : sort of select1st just for maps 16711cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Pair, class _Whatever> 16811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// JDJ (CW Pro1 doesn't like const when first_type is also const) 16911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct __Select1st_hint : public unary_function<_Pair, _Whatever> { 17011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _Whatever& operator () (const _Pair& __x) const { return __x.first; } 17111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 17211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# define _STLP_SELECT1ST(__x,__y) _STLP_PRIV __Select1st_hint< __x, __y > 17311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else 17411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# define _STLP_SELECT1ST(__x, __y) _STLP_PRIV _Select1st< __x > 17511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 17611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 17711cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp> 17811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct _Identity : public unary_function<_Tp,_Tp> { 17911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _Tp& operator()(const _Tp& __x) const { return __x; } 18011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 18111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 18211cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Result, class _Argument> 18311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct _Constant_unary_fun { 18411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef _Argument argument_type; 18511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef _Result result_type; 18611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert result_type _M_val; 18711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 18811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _Constant_unary_fun(const result_type& __v) : _M_val(__v) {} 18911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const result_type& operator()(const _Argument&) const { return _M_val; } 19011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 19111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 19211cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Result, class _Arg1, class _Arg2> 19311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct _Constant_binary_fun { 19411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef _Arg1 first_argument_type; 19511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef _Arg2 second_argument_type; 19611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef _Result result_type; 19711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _Result _M_val; 19811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 19911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _Constant_binary_fun(const _Result& __v) : _M_val(__v) {} 20011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const result_type& operator()(const _Arg1&, const _Arg2&) const { 20111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return _M_val; 20211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 20311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 20411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 20511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// identity_element (not part of the C++ standard). 20611cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp> inline _Tp __identity_element(plus<_Tp>) { return _Tp(0); } 20711cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp> inline _Tp __identity_element(multiplies<_Tp>) { return _Tp(1); } 20811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 20911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_MOVE_TO_STD_NAMESPACE 21011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 21111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_END_NAMESPACE 21211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 21311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif /* _STLP_INTERNAL_FUNCTION_BASE_H */ 21411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 21511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Local Variables: 21611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// mode:C++ 21711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// End: 218