123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217 |
- /*
- *
- * Copyright (c) 1994
- * Hewlett-Packard Company
- *
- * Copyright (c) 1996-1998
- * Silicon Graphics Computer Systems, Inc.
- *
- * Copyright (c) 1997
- * Moscow Center for SPARC Technology
- *
- * Copyright (c) 1999
- * Boris Fomitchev
- *
- * This material is provided "as is", with absolutely no warranty expressed
- * or implied. Any use is at your own risk.
- *
- * Permission to use or copy this software for any purpose is hereby granted
- * without fee, provided the above notices are retained on all copies.
- * Permission to modify the code and to distribute modified code is granted,
- * provided the above notices are retained, and a notice that the code was
- * modified is included with the above copyright notice.
- *
- */
- /* NOTE: This is an internal header file, included by other STL headers.
- * You should not attempt to use it directly.
- */
- #ifndef _STLP_INTERNAL_FUNCTION_BASE_H
- #define _STLP_INTERNAL_FUNCTION_BASE_H
- #if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION) && !defined (_STLP_TYPE_TRAITS_H)
- # include <stl/type_traits.h>
- #endif
- _STLP_BEGIN_NAMESPACE
- template <class _Arg, class _Result>
- struct unary_function {
- typedef _Arg argument_type;
- typedef _Result result_type;
- #if !defined (__BORLANDC__) || (__BORLANDC__ < 0x580)
- protected:
- /* This class purpose is to be derived but it is not polymorphic so users should never try
- * to destroy an instance of it directly. The protected non-virtual destructor make this
- * fact obvious at compilation time. */
- ~unary_function() {}
- #endif
- };
- template <class _Arg1, class _Arg2, class _Result>
- struct binary_function {
- typedef _Arg1 first_argument_type;
- typedef _Arg2 second_argument_type;
- typedef _Result result_type;
- #if !defined (__BORLANDC__) || (__BORLANDC__ < 0x580)
- protected:
- /* See unary_function comment. */
- ~binary_function() {}
- #endif
- };
- template <class _Tp>
- struct equal_to : public binary_function<_Tp, _Tp, bool> {
- bool operator()(const _Tp& __x, const _Tp& __y) const { return __x == __y; }
- };
- template <class _Tp>
- struct less : public binary_function<_Tp,_Tp,bool>
- #if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION)
- /* less is the default template parameter for many STL containers, to fully use
- * the move constructor feature we need to know that the default less is just a
- * functor.
- */
- , public __stlport_class<less<_Tp> >
- #endif
- {
- bool operator()(const _Tp& __x, const _Tp& __y) const { return __x < __y; }
- #if defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND) && !defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER)
- void _M_swap_workaround(less<_Tp>& __x) {}
- #endif
- };
- #if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION)
- template <class _Tp>
- struct __type_traits<less<_Tp> > {
- #if !defined (__BORLANDC__)
- typedef typename _IsSTLportClass<less<_Tp> >::_Ret _STLportLess;
- #else
- enum { _Is = _IsSTLportClass<less<_Tp> >::_Is };
- typedef typename __bool2type<_Is>::_Ret _STLportLess;
- #endif
- typedef _STLportLess has_trivial_default_constructor;
- typedef _STLportLess has_trivial_copy_constructor;
- typedef _STLportLess has_trivial_assignment_operator;
- typedef _STLportLess has_trivial_destructor;
- typedef _STLportLess is_POD_type;
- };
- #endif
- _STLP_MOVE_TO_PRIV_NAMESPACE
- template <class _Tp>
- less<_Tp> __less(_Tp* ) { return less<_Tp>(); }
- template <class _Tp>
- equal_to<_Tp> __equal_to(_Tp* ) { return equal_to<_Tp>(); }
- _STLP_MOVE_TO_STD_NAMESPACE
- template <class _Tp>
- struct plus : public binary_function<_Tp, _Tp, _Tp> {
- _Tp operator()(const _Tp& __x, const _Tp& __y) const { return __x + __y; }
- };
- template <class _Tp>
- struct minus : public binary_function<_Tp, _Tp, _Tp> {
- _Tp operator()(const _Tp& __x, const _Tp& __y) const { return __x - __y; }
- };
- _STLP_MOVE_TO_PRIV_NAMESPACE
- template <class _Tp>
- plus<_Tp> __plus(_Tp* ) { return plus<_Tp>(); }
- template <class _Tp>
- minus<_Tp> __minus(_Tp* ) { return minus<_Tp>(); }
- _STLP_MOVE_TO_STD_NAMESPACE
- template <class _Tp>
- struct multiplies : public binary_function<_Tp, _Tp, _Tp> {
- _Tp operator()(const _Tp& __x, const _Tp& __y) const { return __x * __y; }
- };
- _STLP_MOVE_TO_PRIV_NAMESPACE
- template <class _Pair>
- struct _Select1st : public unary_function<_Pair, typename _Pair::first_type> {
- const typename _Pair::first_type& operator()(const _Pair& __x) const {
- return __x.first;
- }
- };
- template <class _Pair>
- struct _Select2nd : public unary_function<_Pair, typename _Pair::second_type> {
- const typename _Pair::second_type& operator()(const _Pair& __x) const {
- return __x.second;
- }
- };
- // project1st and project2nd are extensions: they are not part of the standard
- template <class _Arg1, class _Arg2>
- struct _Project1st : public binary_function<_Arg1, _Arg2, _Arg1> {
- _Arg1 operator()(const _Arg1& __x, const _Arg2&) const { return __x; }
- };
- template <class _Arg1, class _Arg2>
- struct _Project2nd : public binary_function<_Arg1, _Arg2, _Arg2> {
- _Arg2 operator()(const _Arg1&, const _Arg2& __y) const { return __y; }
- };
- #if defined (_STLP_MULTI_CONST_TEMPLATE_ARG_BUG)
- // fbp : sort of select1st just for maps
- template <class _Pair, class _Whatever>
- // JDJ (CW Pro1 doesn't like const when first_type is also const)
- struct __Select1st_hint : public unary_function<_Pair, _Whatever> {
- const _Whatever& operator () (const _Pair& __x) const { return __x.first; }
- };
- # define _STLP_SELECT1ST(__x,__y) _STLP_PRIV __Select1st_hint< __x, __y >
- #else
- # define _STLP_SELECT1ST(__x, __y) _STLP_PRIV _Select1st< __x >
- #endif
- template <class _Tp>
- struct _Identity : public unary_function<_Tp,_Tp> {
- const _Tp& operator()(const _Tp& __x) const { return __x; }
- };
- template <class _Result, class _Argument>
- struct _Constant_unary_fun {
- typedef _Argument argument_type;
- typedef _Result result_type;
- result_type _M_val;
- _Constant_unary_fun(const result_type& __v) : _M_val(__v) {}
- const result_type& operator()(const _Argument&) const { return _M_val; }
- };
- template <class _Result, class _Arg1, class _Arg2>
- struct _Constant_binary_fun {
- typedef _Arg1 first_argument_type;
- typedef _Arg2 second_argument_type;
- typedef _Result result_type;
- _Result _M_val;
- _Constant_binary_fun(const _Result& __v) : _M_val(__v) {}
- const result_type& operator()(const _Arg1&, const _Arg2&) const {
- return _M_val;
- }
- };
- // identity_element (not part of the C++ standard).
- template <class _Tp> inline _Tp __identity_element(plus<_Tp>) { return _Tp(0); }
- template <class _Tp> inline _Tp __identity_element(multiplies<_Tp>) { return _Tp(1); }
- _STLP_MOVE_TO_STD_NAMESPACE
- _STLP_END_NAMESPACE
- #endif /* _STLP_INTERNAL_FUNCTION_BASE_H */
- // Local Variables:
- // mode:C++
- // End:
|