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