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