111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Functor implementations -*- C++ -*-
211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Copyright (C) 2001-2014 Free Software Foundation, Inc.
411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//
511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// This file is part of the GNU ISO C++ Library.  This library is free
611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// software; you can redistribute it and/or modify it under the
711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// terms of the GNU General Public License as published by the
811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Free Software Foundation; either version 3, or (at your option)
911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// any later version.
1011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
1111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// This library is distributed in the hope that it will be useful,
1211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// but WITHOUT ANY WARRANTY; without even the implied warranty of
1311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// GNU General Public License for more details.
1511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Under Section 7 of GPL version 3, you are granted additional
1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// permissions described in the GCC Runtime Library Exception, version
1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 3.1, as published by the Free Software Foundation.
1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// You should have received a copy of the GNU General Public License and
2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// a copy of the GCC Runtime Library Exception along with this program;
2211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
2311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// <http://www.gnu.org/licenses/>.
2411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/*
2611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
2711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Copyright (c) 1994
2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Hewlett-Packard Company
2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
3011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Permission to use, copy, modify, distribute and sell this software
3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * and its documentation for any purpose is hereby granted without fee,
3211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * provided that the above copyright notice appear in all copies and
3311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * that both that copyright notice and this permission notice appear
3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * in supporting documentation.  Hewlett-Packard Company makes no
3511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * representations about the suitability of this software for any
3611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * purpose.  It is provided "as is" without express or implied warranty.
3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
3911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Copyright (c) 1996-1998
4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Silicon Graphics Computer Systems, Inc.
4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
4211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Permission to use, copy, modify, distribute and sell this software
4311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * and its documentation for any purpose is hereby granted without fee,
4411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * provided that the above copyright notice appear in all copies and
4511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * that both that copyright notice and this permission notice appear
4611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * in supporting documentation.  Silicon Graphics makes no
4711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * representations about the suitability of this software for any
4811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * purpose.  It is provided "as is" without express or implied warranty.
4911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
5011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
5111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/** @file bits/stl_function.h
5211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *  This is an internal header file, included by other library headers.
5311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *  Do not attempt to use it directly. @headername{functional}
5411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
5511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
5611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef _STL_FUNCTION_H
5711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define _STL_FUNCTION_H 1
5811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
5911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if __cplusplus > 201103L
6011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <bits/move.h>
6111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
6211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
6311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertnamespace std _GLIBCXX_VISIBILITY(default)
6411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
6511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_GLIBCXX_BEGIN_NAMESPACE_VERSION
6611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
6711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // 20.3.1 base classes
6811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /** @defgroup functors Function Objects
6911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @ingroup utilities
7011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
7111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  Function objects, or @e functors, are objects with an @c operator()
7211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  defined and accessible.  They can be passed as arguments to algorithm
7311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  templates and used in place of a function pointer.  Not only is the
7411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  resulting expressiveness of the library increased, but the generated
7511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  code can be more efficient than what you might write by hand.  When we
7611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  refer to @a functors, then, generally we include function pointers in
7711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  the description as well.
7811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
7911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  Often, functors are only created as temporaries passed to algorithm
8011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  calls, rather than being created as named variables.
8111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
8211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  Two examples taken from the standard itself follow.  To perform a
8311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  by-element addition of two vectors @c a and @c b containing @c double,
8411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  and put the result in @c a, use
8511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  \code
8611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  transform (a.begin(), a.end(), b.begin(), a.begin(), plus<double>());
8711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  \endcode
8811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  To negate every element in @c a, use
8911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  \code
9011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  transform(a.begin(), a.end(), a.begin(), negate<double>());
9111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  \endcode
9211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  The addition and negation functions will be inlined directly.
9311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
9411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  The standard functors are derived from structs named @c unary_function
9511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  and @c binary_function.  These two classes contain nothing but typedefs,
9611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  to aid in generic (template) programming.  If you write your own
9711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  functors, you might consider doing the same.
9811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
9911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  @{
10011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
10111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
10211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  This is one of the @link functors functor base classes@endlink.
10311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
10411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Arg, typename _Result>
10511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct unary_function
10611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
10711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /// @c argument_type is the type of the argument
10811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef _Arg 	argument_type;
10911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
11011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /// @c result_type is the return type
11111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef _Result 	result_type;
11211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
11311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
11411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
11511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  This is one of the @link functors functor base classes@endlink.
11611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
11711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Arg1, typename _Arg2, typename _Result>
11811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct binary_function
11911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
12011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /// @c first_argument_type is the type of the first argument
12111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef _Arg1 	first_argument_type;
12211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
12311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /// @c second_argument_type is the type of the second argument
12411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef _Arg2 	second_argument_type;
12511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
12611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /// @c result_type is the return type
12711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef _Result 	result_type;
12811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
12911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /** @}  */
13011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
13111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // 20.3.2 arithmetic
13211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /** @defgroup arithmetic_functors Arithmetic Classes
13311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @ingroup functors
13411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
13511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  Because basic math often needs to be done during an algorithm,
13611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  the library provides functors for those operations.  See the
13711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  documentation for @link functors the base classes@endlink
13811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  for examples of their use.
13911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
14011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  @{
14111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
14211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
14311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if __cplusplus > 201103L
14411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  struct __is_transparent;  // undefined
14511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
14611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp = void>
14711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct plus;
14811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
14911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp = void>
15011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct minus;
15111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
15211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp = void>
15311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct multiplies;
15411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
15511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp = void>
15611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct divides;
15711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
15811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp = void>
15911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct modulus;
16011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
16111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp = void>
16211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct negate;
16311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
16411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
16511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /// One of the @link arithmetic_functors math functors@endlink.
16611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp>
16711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct plus : public binary_function<_Tp, _Tp, _Tp>
16811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
16911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _Tp
17011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator()(const _Tp& __x, const _Tp& __y) const
17111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return __x + __y; }
17211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
17311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
17411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /// One of the @link arithmetic_functors math functors@endlink.
17511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp>
17611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct minus : public binary_function<_Tp, _Tp, _Tp>
17711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
17811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _Tp
17911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator()(const _Tp& __x, const _Tp& __y) const
18011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return __x - __y; }
18111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
18211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
18311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /// One of the @link arithmetic_functors math functors@endlink.
18411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp>
18511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct multiplies : public binary_function<_Tp, _Tp, _Tp>
18611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
18711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _Tp
18811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator()(const _Tp& __x, const _Tp& __y) const
18911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return __x * __y; }
19011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
19111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
19211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /// One of the @link arithmetic_functors math functors@endlink.
19311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp>
19411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct divides : public binary_function<_Tp, _Tp, _Tp>
19511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
19611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _Tp
19711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator()(const _Tp& __x, const _Tp& __y) const
19811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return __x / __y; }
19911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
20011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
20111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /// One of the @link arithmetic_functors math functors@endlink.
20211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp>
20311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct modulus : public binary_function<_Tp, _Tp, _Tp>
20411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
20511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _Tp
20611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator()(const _Tp& __x, const _Tp& __y) const
20711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return __x % __y; }
20811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
20911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
21011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /// One of the @link arithmetic_functors math functors@endlink.
21111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp>
21211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct negate : public unary_function<_Tp, _Tp>
21311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
21411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _Tp
21511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator()(const _Tp& __x) const
21611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return -__x; }
21711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
21811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
21911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if __cplusplus > 201103L
22011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<>
22111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct plus<void>
22211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
22311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template <typename _Tp, typename _Up>
22411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	auto
22511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator()(_Tp&& __t, _Up&& __u) const
22611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	noexcept(noexcept(std::forward<_Tp>(__t) + std::forward<_Up>(__u)))
22711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	-> decltype(std::forward<_Tp>(__t) + std::forward<_Up>(__u))
22811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return std::forward<_Tp>(__t) + std::forward<_Up>(__u); }
22911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
23011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef __is_transparent is_transparent;
23111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
23211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
23311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /// One of the @link arithmetic_functors math functors@endlink.
23411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<>
23511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct minus<void>
23611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
23711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template <typename _Tp, typename _Up>
23811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	auto
23911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator()(_Tp&& __t, _Up&& __u) const
24011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	noexcept(noexcept(std::forward<_Tp>(__t) - std::forward<_Up>(__u)))
24111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	-> decltype(std::forward<_Tp>(__t) - std::forward<_Up>(__u))
24211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return std::forward<_Tp>(__t) - std::forward<_Up>(__u); }
24311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
24411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef __is_transparent is_transparent;
24511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
24611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
24711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /// One of the @link arithmetic_functors math functors@endlink.
24811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<>
24911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct multiplies<void>
25011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
25111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template <typename _Tp, typename _Up>
25211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	auto
25311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator()(_Tp&& __t, _Up&& __u) const
25411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	noexcept(noexcept(std::forward<_Tp>(__t) * std::forward<_Up>(__u)))
25511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	-> decltype(std::forward<_Tp>(__t) * std::forward<_Up>(__u))
25611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return std::forward<_Tp>(__t) * std::forward<_Up>(__u); }
25711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
25811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef __is_transparent is_transparent;
25911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
26011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
26111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /// One of the @link arithmetic_functors math functors@endlink.
26211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<>
26311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct divides<void>
26411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
26511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template <typename _Tp, typename _Up>
26611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	auto
26711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator()(_Tp&& __t, _Up&& __u) const
26811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	noexcept(noexcept(std::forward<_Tp>(__t) / std::forward<_Up>(__u)))
26911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	-> decltype(std::forward<_Tp>(__t) / std::forward<_Up>(__u))
27011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return std::forward<_Tp>(__t) / std::forward<_Up>(__u); }
27111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
27211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef __is_transparent is_transparent;
27311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
27411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
27511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /// One of the @link arithmetic_functors math functors@endlink.
27611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<>
27711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct modulus<void>
27811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
27911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template <typename _Tp, typename _Up>
28011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	auto
28111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator()(_Tp&& __t, _Up&& __u) const
28211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	noexcept(noexcept(std::forward<_Tp>(__t) % std::forward<_Up>(__u)))
28311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	-> decltype(std::forward<_Tp>(__t) % std::forward<_Up>(__u))
28411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return std::forward<_Tp>(__t) % std::forward<_Up>(__u); }
28511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
28611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef __is_transparent is_transparent;
28711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
28811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
28911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /// One of the @link arithmetic_functors math functors@endlink.
29011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<>
29111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct negate<void>
29211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
29311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template <typename _Tp>
29411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	auto
29511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator()(_Tp&& __t) const
29611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	noexcept(noexcept(-std::forward<_Tp>(__t)))
29711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	-> decltype(-std::forward<_Tp>(__t))
29811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return -std::forward<_Tp>(__t); }
29911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
30011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef __is_transparent is_transparent;
30111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
30211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
30311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /** @}  */
30411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
30511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // 20.3.3 comparisons
30611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /** @defgroup comparison_functors Comparison Classes
30711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @ingroup functors
30811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
30911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  The library provides six wrapper functors for all the basic comparisons
31011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  in C++, like @c <.
31111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
31211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  @{
31311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
31411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if __cplusplus > 201103L
31511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp = void>
31611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct equal_to;
31711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
31811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp = void>
31911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct not_equal_to;
32011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
32111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp = void>
32211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct greater;
32311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
32411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp = void>
32511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct less;
32611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
32711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp = void>
32811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct greater_equal;
32911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
33011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp = void>
33111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct less_equal;
33211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
33311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
33411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /// One of the @link comparison_functors comparison functors@endlink.
33511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp>
33611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct equal_to : public binary_function<_Tp, _Tp, bool>
33711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
33811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      bool
33911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator()(const _Tp& __x, const _Tp& __y) const
34011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return __x == __y; }
34111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
34211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
34311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /// One of the @link comparison_functors comparison functors@endlink.
34411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp>
34511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct not_equal_to : public binary_function<_Tp, _Tp, bool>
34611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
34711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      bool
34811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator()(const _Tp& __x, const _Tp& __y) const
34911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return __x != __y; }
35011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
35111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
35211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /// One of the @link comparison_functors comparison functors@endlink.
35311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp>
35411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct greater : public binary_function<_Tp, _Tp, bool>
35511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
35611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      bool
35711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator()(const _Tp& __x, const _Tp& __y) const
35811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return __x > __y; }
35911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
36011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
36111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /// One of the @link comparison_functors comparison functors@endlink.
36211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp>
36311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct less : public binary_function<_Tp, _Tp, bool>
36411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
36511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      bool
36611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator()(const _Tp& __x, const _Tp& __y) const
36711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return __x < __y; }
36811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
36911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
37011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /// One of the @link comparison_functors comparison functors@endlink.
37111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp>
37211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct greater_equal : public binary_function<_Tp, _Tp, bool>
37311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
37411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      bool
37511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator()(const _Tp& __x, const _Tp& __y) const
37611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return __x >= __y; }
37711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
37811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
37911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /// One of the @link comparison_functors comparison functors@endlink.
38011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp>
38111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct less_equal : public binary_function<_Tp, _Tp, bool>
38211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
38311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      bool
38411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator()(const _Tp& __x, const _Tp& __y) const
38511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return __x <= __y; }
38611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
38711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
38811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if __cplusplus > 201103L
38911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /// One of the @link comparison_functors comparison functors@endlink.
39011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<>
39111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct equal_to<void>
39211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
39311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template <typename _Tp, typename _Up>
39411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	auto
39511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator()(_Tp&& __t, _Up&& __u) const
39611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	noexcept(noexcept(std::forward<_Tp>(__t) == std::forward<_Up>(__u)))
39711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	-> decltype(std::forward<_Tp>(__t) == std::forward<_Up>(__u))
39811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return std::forward<_Tp>(__t) == std::forward<_Up>(__u); }
39911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
40011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef __is_transparent is_transparent;
40111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
40211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
40311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /// One of the @link comparison_functors comparison functors@endlink.
40411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<>
40511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct not_equal_to<void>
40611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
40711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template <typename _Tp, typename _Up>
40811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	auto
40911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator()(_Tp&& __t, _Up&& __u) const
41011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	noexcept(noexcept(std::forward<_Tp>(__t) != std::forward<_Up>(__u)))
41111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	-> decltype(std::forward<_Tp>(__t) != std::forward<_Up>(__u))
41211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return std::forward<_Tp>(__t) != std::forward<_Up>(__u); }
41311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
41411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef __is_transparent is_transparent;
41511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
41611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
41711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /// One of the @link comparison_functors comparison functors@endlink.
41811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<>
41911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct greater<void>
42011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
42111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template <typename _Tp, typename _Up>
42211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	auto
42311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator()(_Tp&& __t, _Up&& __u) const
42411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	noexcept(noexcept(std::forward<_Tp>(__t) > std::forward<_Up>(__u)))
42511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	-> decltype(std::forward<_Tp>(__t) > std::forward<_Up>(__u))
42611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return std::forward<_Tp>(__t) > std::forward<_Up>(__u); }
42711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
42811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef __is_transparent is_transparent;
42911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
43011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
43111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /// One of the @link comparison_functors comparison functors@endlink.
43211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<>
43311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct less<void>
43411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
43511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template <typename _Tp, typename _Up>
43611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	auto
43711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator()(_Tp&& __t, _Up&& __u) const
43811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	noexcept(noexcept(std::forward<_Tp>(__t) < std::forward<_Up>(__u)))
43911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	-> decltype(std::forward<_Tp>(__t) < std::forward<_Up>(__u))
44011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return std::forward<_Tp>(__t) < std::forward<_Up>(__u); }
44111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
44211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef __is_transparent is_transparent;
44311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
44411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
44511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /// One of the @link comparison_functors comparison functors@endlink.
44611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<>
44711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct greater_equal<void>
44811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
44911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template <typename _Tp, typename _Up>
45011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	auto
45111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator()(_Tp&& __t, _Up&& __u) const
45211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	noexcept(noexcept(std::forward<_Tp>(__t) >= std::forward<_Up>(__u)))
45311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	-> decltype(std::forward<_Tp>(__t) >= std::forward<_Up>(__u))
45411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return std::forward<_Tp>(__t) >= std::forward<_Up>(__u); }
45511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
45611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef __is_transparent is_transparent;
45711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
45811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
45911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /// One of the @link comparison_functors comparison functors@endlink.
46011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<>
46111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct less_equal<void>
46211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
46311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template <typename _Tp, typename _Up>
46411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	auto
46511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator()(_Tp&& __t, _Up&& __u) const
46611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	noexcept(noexcept(std::forward<_Tp>(__t) <= std::forward<_Up>(__u)))
46711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	-> decltype(std::forward<_Tp>(__t) <= std::forward<_Up>(__u))
46811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return std::forward<_Tp>(__t) <= std::forward<_Up>(__u); }
46911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
47011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef __is_transparent is_transparent;
47111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
47211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
47311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /** @}  */
47411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
47511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // 20.3.4 logical operations
47611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /** @defgroup logical_functors Boolean Operations Classes
47711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @ingroup functors
47811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
47911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  Here are wrapper functors for Boolean operations: @c &&, @c ||,
48011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  and @c !.
48111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
48211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  @{
48311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
48411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if __cplusplus > 201103L
48511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp = void>
48611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct logical_and;
48711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
48811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp = void>
48911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct logical_or;
49011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
49111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp = void>
49211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct logical_not;
49311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
49411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
49511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /// One of the @link logical_functors Boolean operations functors@endlink.
49611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp>
49711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct logical_and : public binary_function<_Tp, _Tp, bool>
49811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
49911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      bool
50011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator()(const _Tp& __x, const _Tp& __y) const
50111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return __x && __y; }
50211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
50311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
50411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /// One of the @link logical_functors Boolean operations functors@endlink.
50511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp>
50611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct logical_or : public binary_function<_Tp, _Tp, bool>
50711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
50811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      bool
50911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator()(const _Tp& __x, const _Tp& __y) const
51011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return __x || __y; }
51111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
51211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
51311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /// One of the @link logical_functors Boolean operations functors@endlink.
51411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp>
51511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct logical_not : public unary_function<_Tp, bool>
51611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
51711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      bool
51811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator()(const _Tp& __x) const
51911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return !__x; }
52011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
52111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
52211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if __cplusplus > 201103L
52311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /// One of the @link logical_functors Boolean operations functors@endlink.
52411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<>
52511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct logical_and<void>
52611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
52711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template <typename _Tp, typename _Up>
52811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	auto
52911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator()(_Tp&& __t, _Up&& __u) const
53011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	noexcept(noexcept(std::forward<_Tp>(__t) && std::forward<_Up>(__u)))
53111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	-> decltype(std::forward<_Tp>(__t) && std::forward<_Up>(__u))
53211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return std::forward<_Tp>(__t) && std::forward<_Up>(__u); }
53311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
53411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef __is_transparent is_transparent;
53511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
53611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
53711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /// One of the @link logical_functors Boolean operations functors@endlink.
53811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<>
53911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct logical_or<void>
54011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
54111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template <typename _Tp, typename _Up>
54211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	auto
54311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator()(_Tp&& __t, _Up&& __u) const
54411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	noexcept(noexcept(std::forward<_Tp>(__t) || std::forward<_Up>(__u)))
54511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	-> decltype(std::forward<_Tp>(__t) || std::forward<_Up>(__u))
54611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return std::forward<_Tp>(__t) || std::forward<_Up>(__u); }
54711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
54811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef __is_transparent is_transparent;
54911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
55011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
55111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /// One of the @link logical_functors Boolean operations functors@endlink.
55211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<>
55311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct logical_not<void>
55411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
55511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template <typename _Tp>
55611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	auto
55711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator()(_Tp&& __t) const
55811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	noexcept(noexcept(!std::forward<_Tp>(__t)))
55911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	-> decltype(!std::forward<_Tp>(__t))
56011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return !std::forward<_Tp>(__t); }
56111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
56211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef __is_transparent is_transparent;
56311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
56411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
56511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /** @}  */
56611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
56711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if __cplusplus > 201103L
56811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp = void>
56911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct bit_and;
57011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
57111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp = void>
57211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct bit_or;
57311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
57411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp = void>
57511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct bit_xor;
57611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
57711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp = void>
57811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct bit_not;
57911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
58011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
58111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // _GLIBCXX_RESOLVE_LIB_DEFECTS
58211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // DR 660. Missing Bitwise Operations.
58311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp>
58411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct bit_and : public binary_function<_Tp, _Tp, _Tp>
58511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
58611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _Tp
58711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator()(const _Tp& __x, const _Tp& __y) const
58811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return __x & __y; }
58911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
59011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
59111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp>
59211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct bit_or : public binary_function<_Tp, _Tp, _Tp>
59311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
59411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _Tp
59511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator()(const _Tp& __x, const _Tp& __y) const
59611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return __x | __y; }
59711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
59811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
59911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp>
60011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct bit_xor : public binary_function<_Tp, _Tp, _Tp>
60111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
60211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _Tp
60311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator()(const _Tp& __x, const _Tp& __y) const
60411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return __x ^ __y; }
60511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
60611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
60711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp>
60811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct bit_not : public unary_function<_Tp, _Tp>
60911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
61011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _Tp
61111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator()(const _Tp& __x) const
61211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return ~__x; }
61311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
61411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
61511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if __cplusplus > 201103L
61611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template <>
61711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct bit_and<void>
61811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
61911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template <typename _Tp, typename _Up>
62011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	auto
62111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator()(_Tp&& __t, _Up&& __u) const
62211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	noexcept(noexcept(std::forward<_Tp>(__t) & std::forward<_Up>(__u)))
62311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	-> decltype(std::forward<_Tp>(__t) & std::forward<_Up>(__u))
62411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return std::forward<_Tp>(__t) & std::forward<_Up>(__u); }
62511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
62611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef __is_transparent is_transparent;
62711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
62811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
62911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template <>
63011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct bit_or<void>
63111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
63211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template <typename _Tp, typename _Up>
63311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	auto
63411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator()(_Tp&& __t, _Up&& __u) const
63511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	noexcept(noexcept(std::forward<_Tp>(__t) | std::forward<_Up>(__u)))
63611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	-> decltype(std::forward<_Tp>(__t) | std::forward<_Up>(__u))
63711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return std::forward<_Tp>(__t) | std::forward<_Up>(__u); }
63811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
63911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef __is_transparent is_transparent;
64011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
64111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
64211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template <>
64311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct bit_xor<void>
64411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
64511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template <typename _Tp, typename _Up>
64611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	auto
64711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator()(_Tp&& __t, _Up&& __u) const
64811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	noexcept(noexcept(std::forward<_Tp>(__t) ^ std::forward<_Up>(__u)))
64911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	-> decltype(std::forward<_Tp>(__t) ^ std::forward<_Up>(__u))
65011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return std::forward<_Tp>(__t) ^ std::forward<_Up>(__u); }
65111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
65211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef __is_transparent is_transparent;
65311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
65411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
65511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template <>
65611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct bit_not<void>
65711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
65811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template <typename _Tp>
65911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	auto
66011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator()(_Tp&& __t) const
66111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	noexcept(noexcept(~std::forward<_Tp>(__t)))
66211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	-> decltype(~std::forward<_Tp>(__t))
66311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return ~std::forward<_Tp>(__t); }
66411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
66511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef __is_transparent is_transparent;
66611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
66711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
66811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
66911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // 20.3.5 negators
67011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /** @defgroup negators Negators
67111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @ingroup functors
67211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
67311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  The functions @c not1 and @c not2 each take a predicate functor
67411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  and return an instance of @c unary_negate or
67511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  @c binary_negate, respectively.  These classes are functors whose
67611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  @c operator() performs the stored predicate function and then returns
67711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  the negation of the result.
67811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
67911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  For example, given a vector of integers and a trivial predicate,
68011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  \code
68111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  struct IntGreaterThanThree
68211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *    : public std::unary_function<int, bool>
68311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  {
68411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *      bool operator() (int x) { return x > 3; }
68511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  };
68611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
68711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  std::find_if (v.begin(), v.end(), not1(IntGreaterThanThree()));
68811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  \endcode
68911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  The call to @c find_if will locate the first index (i) of @c v for which
69011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  <code>!(v[i] > 3)</code> is true.
69111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
69211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  The not1/unary_negate combination works on predicates taking a single
69311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  argument.  The not2/binary_negate combination works on predicates which
69411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  take two arguments.
69511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
69611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  @{
69711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
69811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /// One of the @link negators negation functors@endlink.
69911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Predicate>
70011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    class unary_negate
70111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    : public unary_function<typename _Predicate::argument_type, bool>
70211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
70311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    protected:
70411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _Predicate _M_pred;
70511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
70611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    public:
70711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
70811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      unary_negate(const _Predicate& __x) : _M_pred(__x) { }
70911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
71011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      bool
71111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator()(const typename _Predicate::argument_type& __x) const
71211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return !_M_pred(__x); }
71311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
71411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
71511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /// One of the @link negators negation functors@endlink.
71611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Predicate>
71711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline unary_negate<_Predicate>
71811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    not1(const _Predicate& __pred)
71911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { return unary_negate<_Predicate>(__pred); }
72011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
72111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /// One of the @link negators negation functors@endlink.
72211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Predicate>
72311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    class binary_negate
72411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    : public binary_function<typename _Predicate::first_argument_type,
72511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			     typename _Predicate::second_argument_type, bool>
72611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
72711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    protected:
72811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _Predicate _M_pred;
72911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
73011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    public:
73111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
73211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      binary_negate(const _Predicate& __x) : _M_pred(__x) { }
73311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
73411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      bool
73511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator()(const typename _Predicate::first_argument_type& __x,
73611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		 const typename _Predicate::second_argument_type& __y) const
73711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return !_M_pred(__x, __y); }
73811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
73911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
74011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /// One of the @link negators negation functors@endlink.
74111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Predicate>
74211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline binary_negate<_Predicate>
74311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    not2(const _Predicate& __pred)
74411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { return binary_negate<_Predicate>(__pred); }
74511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /** @}  */
74611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
74711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // 20.3.7 adaptors pointers functions
74811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /** @defgroup pointer_adaptors Adaptors for pointers to functions
74911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @ingroup functors
75011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
75111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  The advantage of function objects over pointers to functions is that
75211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  the objects in the standard library declare nested typedefs describing
75311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  their argument and result types with uniform names (e.g., @c result_type
75411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  from the base classes @c unary_function and @c binary_function).
75511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  Sometimes those typedefs are required, not just optional.
75611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
75711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  Adaptors are provided to turn pointers to unary (single-argument) and
75811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  binary (double-argument) functions into function objects.  The
75911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  long-winded functor @c pointer_to_unary_function is constructed with a
76011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  function pointer @c f, and its @c operator() called with argument @c x
76111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  returns @c f(x).  The functor @c pointer_to_binary_function does the same
76211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  thing, but with a double-argument @c f and @c operator().
76311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
76411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  The function @c ptr_fun takes a pointer-to-function @c f and constructs
76511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  an instance of the appropriate functor.
76611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
76711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  @{
76811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
76911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /// One of the @link pointer_adaptors adaptors for function pointers@endlink.
77011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Arg, typename _Result>
77111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    class pointer_to_unary_function : public unary_function<_Arg, _Result>
77211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
77311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    protected:
77411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _Result (*_M_ptr)(_Arg);
77511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
77611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    public:
77711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      pointer_to_unary_function() { }
77811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
77911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
78011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      pointer_to_unary_function(_Result (*__x)(_Arg))
78111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : _M_ptr(__x) { }
78211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
78311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _Result
78411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator()(_Arg __x) const
78511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_ptr(__x); }
78611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
78711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
78811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /// One of the @link pointer_adaptors adaptors for function pointers@endlink.
78911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Arg, typename _Result>
79011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline pointer_to_unary_function<_Arg, _Result>
79111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    ptr_fun(_Result (*__x)(_Arg))
79211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { return pointer_to_unary_function<_Arg, _Result>(__x); }
79311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
79411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /// One of the @link pointer_adaptors adaptors for function pointers@endlink.
79511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Arg1, typename _Arg2, typename _Result>
79611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    class pointer_to_binary_function
79711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    : public binary_function<_Arg1, _Arg2, _Result>
79811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
79911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    protected:
80011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _Result (*_M_ptr)(_Arg1, _Arg2);
80111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
80211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    public:
80311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      pointer_to_binary_function() { }
80411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
80511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
80611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      pointer_to_binary_function(_Result (*__x)(_Arg1, _Arg2))
80711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : _M_ptr(__x) { }
80811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
80911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _Result
81011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator()(_Arg1 __x, _Arg2 __y) const
81111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_ptr(__x, __y); }
81211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
81311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
81411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /// One of the @link pointer_adaptors adaptors for function pointers@endlink.
81511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Arg1, typename _Arg2, typename _Result>
81611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline pointer_to_binary_function<_Arg1, _Arg2, _Result>
81711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    ptr_fun(_Result (*__x)(_Arg1, _Arg2))
81811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { return pointer_to_binary_function<_Arg1, _Arg2, _Result>(__x); }
81911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /** @}  */
82011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
82111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp>
82211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct _Identity
82311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    : public unary_function<_Tp,_Tp>
82411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
82511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _Tp&
82611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator()(_Tp& __x) const
82711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return __x; }
82811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
82911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const _Tp&
83011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator()(const _Tp& __x) const
83111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return __x; }
83211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
83311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
83411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Pair>
83511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct _Select1st
83611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    : public unary_function<_Pair, typename _Pair::first_type>
83711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
83811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typename _Pair::first_type&
83911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator()(_Pair& __x) const
84011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return __x.first; }
84111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
84211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const typename _Pair::first_type&
84311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator()(const _Pair& __x) const
84411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return __x.first; }
84511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
84611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if __cplusplus >= 201103L
84711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _Pair2>
84811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        typename _Pair2::first_type&
84911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        operator()(_Pair2& __x) const
85011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        { return __x.first; }
85111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
85211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _Pair2>
85311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        const typename _Pair2::first_type&
85411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        operator()(const _Pair2& __x) const
85511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        { return __x.first; }
85611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
85711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
85811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
85911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Pair>
86011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct _Select2nd
86111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    : public unary_function<_Pair, typename _Pair::second_type>
86211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
86311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typename _Pair::second_type&
86411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator()(_Pair& __x) const
86511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return __x.second; }
86611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
86711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const typename _Pair::second_type&
86811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator()(const _Pair& __x) const
86911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return __x.second; }
87011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
87111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
87211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // 20.3.8 adaptors pointers members
87311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /** @defgroup memory_adaptors Adaptors for pointers to members
87411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @ingroup functors
87511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
87611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  There are a total of 8 = 2^3 function objects in this family.
87711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *   (1) Member functions taking no arguments vs member functions taking
87811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *        one argument.
87911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *   (2) Call through pointer vs call through reference.
88011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *   (3) Const vs non-const member function.
88111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
88211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  All of this complexity is in the function objects themselves.  You can
88311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *   ignore it by using the helper function mem_fun and mem_fun_ref,
88411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *   which create whichever type of adaptor is appropriate.
88511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
88611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  @{
88711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
88811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /// One of the @link memory_adaptors adaptors for member
88911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /// pointers@endlink.
89011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Ret, typename _Tp>
89111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    class mem_fun_t : public unary_function<_Tp*, _Ret>
89211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
89311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    public:
89411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
89511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      mem_fun_t(_Ret (_Tp::*__pf)())
89611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : _M_f(__pf) { }
89711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
89811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _Ret
89911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator()(_Tp* __p) const
90011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return (__p->*_M_f)(); }
90111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
90211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    private:
90311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _Ret (_Tp::*_M_f)();
90411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
90511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
90611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /// One of the @link memory_adaptors adaptors for member
90711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /// pointers@endlink.
90811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Ret, typename _Tp>
90911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    class const_mem_fun_t : public unary_function<const _Tp*, _Ret>
91011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
91111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    public:
91211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
91311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const_mem_fun_t(_Ret (_Tp::*__pf)() const)
91411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : _M_f(__pf) { }
91511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
91611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _Ret
91711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator()(const _Tp* __p) const
91811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return (__p->*_M_f)(); }
91911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
92011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    private:
92111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _Ret (_Tp::*_M_f)() const;
92211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
92311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
92411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /// One of the @link memory_adaptors adaptors for member
92511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /// pointers@endlink.
92611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Ret, typename _Tp>
92711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    class mem_fun_ref_t : public unary_function<_Tp, _Ret>
92811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
92911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    public:
93011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
93111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      mem_fun_ref_t(_Ret (_Tp::*__pf)())
93211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : _M_f(__pf) { }
93311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
93411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _Ret
93511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator()(_Tp& __r) const
93611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return (__r.*_M_f)(); }
93711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
93811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    private:
93911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _Ret (_Tp::*_M_f)();
94011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  };
94111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
94211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /// One of the @link memory_adaptors adaptors for member
94311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /// pointers@endlink.
94411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Ret, typename _Tp>
94511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    class const_mem_fun_ref_t : public unary_function<_Tp, _Ret>
94611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
94711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    public:
94811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
94911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const_mem_fun_ref_t(_Ret (_Tp::*__pf)() const)
95011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : _M_f(__pf) { }
95111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
95211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _Ret
95311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator()(const _Tp& __r) const
95411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return (__r.*_M_f)(); }
95511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
95611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    private:
95711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _Ret (_Tp::*_M_f)() const;
95811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
95911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
96011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /// One of the @link memory_adaptors adaptors for member
96111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /// pointers@endlink.
96211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Ret, typename _Tp, typename _Arg>
96311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    class mem_fun1_t : public binary_function<_Tp*, _Arg, _Ret>
96411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
96511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    public:
96611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
96711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      mem_fun1_t(_Ret (_Tp::*__pf)(_Arg))
96811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : _M_f(__pf) { }
96911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
97011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _Ret
97111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator()(_Tp* __p, _Arg __x) const
97211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return (__p->*_M_f)(__x); }
97311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
97411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    private:
97511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _Ret (_Tp::*_M_f)(_Arg);
97611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
97711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
97811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /// One of the @link memory_adaptors adaptors for member
97911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /// pointers@endlink.
98011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Ret, typename _Tp, typename _Arg>
98111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    class const_mem_fun1_t : public binary_function<const _Tp*, _Arg, _Ret>
98211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
98311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    public:
98411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
98511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const_mem_fun1_t(_Ret (_Tp::*__pf)(_Arg) const)
98611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : _M_f(__pf) { }
98711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
98811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _Ret
98911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator()(const _Tp* __p, _Arg __x) const
99011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return (__p->*_M_f)(__x); }
99111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
99211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    private:
99311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _Ret (_Tp::*_M_f)(_Arg) const;
99411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
99511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
99611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /// One of the @link memory_adaptors adaptors for member
99711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /// pointers@endlink.
99811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Ret, typename _Tp, typename _Arg>
99911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    class mem_fun1_ref_t : public binary_function<_Tp, _Arg, _Ret>
100011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
100111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    public:
100211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
100311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      mem_fun1_ref_t(_Ret (_Tp::*__pf)(_Arg))
100411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : _M_f(__pf) { }
100511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
100611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _Ret
100711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator()(_Tp& __r, _Arg __x) const
100811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return (__r.*_M_f)(__x); }
100911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
101011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    private:
101111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _Ret (_Tp::*_M_f)(_Arg);
101211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
101311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
101411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /// One of the @link memory_adaptors adaptors for member
101511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /// pointers@endlink.
101611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Ret, typename _Tp, typename _Arg>
101711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    class const_mem_fun1_ref_t : public binary_function<_Tp, _Arg, _Ret>
101811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
101911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    public:
102011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
102111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const_mem_fun1_ref_t(_Ret (_Tp::*__pf)(_Arg) const)
102211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : _M_f(__pf) { }
102311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
102411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _Ret
102511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator()(const _Tp& __r, _Arg __x) const
102611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return (__r.*_M_f)(__x); }
102711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
102811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    private:
102911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _Ret (_Tp::*_M_f)(_Arg) const;
103011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
103111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
103211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // Mem_fun adaptor helper functions.  There are only two:
103311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // mem_fun and mem_fun_ref.
103411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Ret, typename _Tp>
103511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline mem_fun_t<_Ret, _Tp>
103611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    mem_fun(_Ret (_Tp::*__f)())
103711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { return mem_fun_t<_Ret, _Tp>(__f); }
103811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
103911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Ret, typename _Tp>
104011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline const_mem_fun_t<_Ret, _Tp>
104111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    mem_fun(_Ret (_Tp::*__f)() const)
104211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { return const_mem_fun_t<_Ret, _Tp>(__f); }
104311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
104411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Ret, typename _Tp>
104511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline mem_fun_ref_t<_Ret, _Tp>
104611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    mem_fun_ref(_Ret (_Tp::*__f)())
104711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { return mem_fun_ref_t<_Ret, _Tp>(__f); }
104811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
104911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Ret, typename _Tp>
105011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline const_mem_fun_ref_t<_Ret, _Tp>
105111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    mem_fun_ref(_Ret (_Tp::*__f)() const)
105211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { return const_mem_fun_ref_t<_Ret, _Tp>(__f); }
105311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
105411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Ret, typename _Tp, typename _Arg>
105511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline mem_fun1_t<_Ret, _Tp, _Arg>
105611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    mem_fun(_Ret (_Tp::*__f)(_Arg))
105711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { return mem_fun1_t<_Ret, _Tp, _Arg>(__f); }
105811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
105911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Ret, typename _Tp, typename _Arg>
106011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline const_mem_fun1_t<_Ret, _Tp, _Arg>
106111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    mem_fun(_Ret (_Tp::*__f)(_Arg) const)
106211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { return const_mem_fun1_t<_Ret, _Tp, _Arg>(__f); }
106311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
106411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Ret, typename _Tp, typename _Arg>
106511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline mem_fun1_ref_t<_Ret, _Tp, _Arg>
106611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    mem_fun_ref(_Ret (_Tp::*__f)(_Arg))
106711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { return mem_fun1_ref_t<_Ret, _Tp, _Arg>(__f); }
106811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
106911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Ret, typename _Tp, typename _Arg>
107011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline const_mem_fun1_ref_t<_Ret, _Tp, _Arg>
107111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    mem_fun_ref(_Ret (_Tp::*__f)(_Arg) const)
107211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { return const_mem_fun1_ref_t<_Ret, _Tp, _Arg>(__f); }
107311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
107411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /** @}  */
107511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
107611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_GLIBCXX_END_NAMESPACE_VERSION
107711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} // namespace
107811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
107911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if (__cplusplus < 201103L) || _GLIBCXX_USE_DEPRECATED
108011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# include <backward/binders.h>
108111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
108211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
108311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif /* _STL_FUNCTION_H */
1084