LCOV - code coverage report
Current view: top level - usr/include/c++/9/bits - stl_function.h (source / functions) Hit Total Coverage
Test: ROSE Lines: 9 32 28.1 %
Date: 2022-12-08 13:48:47 Functions: 0 2 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : // Functor implementations -*- C++ -*-
       2             : 
       3             : // Copyright (C) 2001-2019 Free Software Foundation, Inc.
       4             : //
       5             : // This file is part of the GNU ISO C++ Library.  This library is free
       6             : // software; you can redistribute it and/or modify it under the
       7             : // terms of the GNU General Public License as published by the
       8             : // Free Software Foundation; either version 3, or (at your option)
       9             : // any later version.
      10             : 
      11             : // This library is distributed in the hope that it will be useful,
      12             : // but WITHOUT ANY WARRANTY; without even the implied warranty of
      13             : // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      14             : // GNU General Public License for more details.
      15             : 
      16             : // Under Section 7 of GPL version 3, you are granted additional
      17             : // permissions described in the GCC Runtime Library Exception, version
      18             : // 3.1, as published by the Free Software Foundation.
      19             : 
      20             : // You should have received a copy of the GNU General Public License and
      21             : // a copy of the GCC Runtime Library Exception along with this program;
      22             : // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
      23             : // <http://www.gnu.org/licenses/>.
      24             : 
      25             : /*
      26             :  *
      27             :  * Copyright (c) 1994
      28             :  * Hewlett-Packard Company
      29             :  *
      30             :  * Permission to use, copy, modify, distribute and sell this software
      31             :  * and its documentation for any purpose is hereby granted without fee,
      32             :  * provided that the above copyright notice appear in all copies and
      33             :  * that both that copyright notice and this permission notice appear
      34             :  * in supporting documentation.  Hewlett-Packard Company makes no
      35             :  * representations about the suitability of this software for any
      36             :  * purpose.  It is provided "as is" without express or implied warranty.
      37             :  *
      38             :  *
      39             :  * Copyright (c) 1996-1998
      40             :  * Silicon Graphics Computer Systems, Inc.
      41             :  *
      42             :  * Permission to use, copy, modify, distribute and sell this software
      43             :  * and its documentation for any purpose is hereby granted without fee,
      44             :  * provided that the above copyright notice appear in all copies and
      45             :  * that both that copyright notice and this permission notice appear
      46             :  * in supporting documentation.  Silicon Graphics makes no
      47             :  * representations about the suitability of this software for any
      48             :  * purpose.  It is provided "as is" without express or implied warranty.
      49             :  */
      50             : 
      51             : /** @file bits/stl_function.h
      52             :  *  This is an internal header file, included by other library headers.
      53             :  *  Do not attempt to use it directly. @headername{functional}
      54             :  */
      55             : 
      56             : #ifndef _STL_FUNCTION_H
      57             : #define _STL_FUNCTION_H 1
      58             : 
      59             : #if __cplusplus > 201103L
      60             : #include <bits/move.h>
      61             : #endif
      62             : 
      63             : namespace std _GLIBCXX_VISIBILITY(default)
      64             : {
      65             : _GLIBCXX_BEGIN_NAMESPACE_VERSION
      66             : 
      67             :   // 20.3.1 base classes
      68             :   /** @defgroup functors Function Objects
      69             :    * @ingroup utilities
      70             :    *
      71             :    *  Function objects, or @e functors, are objects with an @c operator()
      72             :    *  defined and accessible.  They can be passed as arguments to algorithm
      73             :    *  templates and used in place of a function pointer.  Not only is the
      74             :    *  resulting expressiveness of the library increased, but the generated
      75             :    *  code can be more efficient than what you might write by hand.  When we
      76             :    *  refer to @a functors, then, generally we include function pointers in
      77             :    *  the description as well.
      78             :    *
      79             :    *  Often, functors are only created as temporaries passed to algorithm
      80             :    *  calls, rather than being created as named variables.
      81             :    *
      82             :    *  Two examples taken from the standard itself follow.  To perform a
      83             :    *  by-element addition of two vectors @c a and @c b containing @c double,
      84             :    *  and put the result in @c a, use
      85             :    *  \code
      86             :    *  transform (a.begin(), a.end(), b.begin(), a.begin(), plus<double>());
      87             :    *  \endcode
      88             :    *  To negate every element in @c a, use
      89             :    *  \code
      90             :    *  transform(a.begin(), a.end(), a.begin(), negate<double>());
      91             :    *  \endcode
      92             :    *  The addition and negation functions will be inlined directly.
      93             :    *
      94             :    *  The standard functors are derived from structs named @c unary_function
      95             :    *  and @c binary_function.  These two classes contain nothing but typedefs,
      96             :    *  to aid in generic (template) programming.  If you write your own
      97             :    *  functors, you might consider doing the same.
      98             :    *
      99             :    *  @{
     100             :    */
     101             :   /**
     102             :    *  This is one of the @link functors functor base classes@endlink.
     103             :    */
     104             :   template<typename _Arg, typename _Result>
     105             :     struct unary_function
     106             :     {
     107             :       /// @c argument_type is the type of the argument
     108             :       typedef _Arg      argument_type;   
     109             : 
     110             :       /// @c result_type is the return type
     111             :       typedef _Result   result_type;  
     112             :     };
     113             : 
     114             :   /**
     115             :    *  This is one of the @link functors functor base classes@endlink.
     116             :    */
     117             :   template<typename _Arg1, typename _Arg2, typename _Result>
     118             :     struct binary_function
     119             :     {
     120             :       /// @c first_argument_type is the type of the first argument
     121             :       typedef _Arg1     first_argument_type; 
     122             : 
     123             :       /// @c second_argument_type is the type of the second argument
     124             :       typedef _Arg2     second_argument_type;
     125             : 
     126             :       /// @c result_type is the return type
     127             :       typedef _Result   result_type;
     128             :     };
     129             :   /** @}  */
     130             : 
     131             :   // 20.3.2 arithmetic
     132             :   /** @defgroup arithmetic_functors Arithmetic Classes
     133             :    * @ingroup functors
     134             :    *
     135             :    *  Because basic math often needs to be done during an algorithm,
     136             :    *  the library provides functors for those operations.  See the
     137             :    *  documentation for @link functors the base classes@endlink
     138             :    *  for examples of their use.
     139             :    *
     140             :    *  @{
     141             :    */
     142             : 
     143             : #if __cplusplus > 201103L
     144             :   struct __is_transparent;  // undefined
     145             : 
     146             :   template<typename _Tp = void>
     147             :     struct plus;
     148             : 
     149             :   template<typename _Tp = void>
     150             :     struct minus;
     151             : 
     152             :   template<typename _Tp = void>
     153             :     struct multiplies;
     154             : 
     155             :   template<typename _Tp = void>
     156             :     struct divides;
     157             : 
     158             :   template<typename _Tp = void>
     159             :     struct modulus;
     160             : 
     161             :   template<typename _Tp = void>
     162             :     struct negate;
     163             : #endif
     164             : 
     165             :   /// One of the @link arithmetic_functors math functors@endlink.
     166             :   template<typename _Tp>
     167             :     struct plus : public binary_function<_Tp, _Tp, _Tp>
     168             :     {
     169             :       _GLIBCXX14_CONSTEXPR
     170             :       _Tp
     171           0 :       operator()(const _Tp& __x, const _Tp& __y) const
     172           0 :       { return __x + __y; }
     173             :     };
     174             : 
     175             :   /// One of the @link arithmetic_functors math functors@endlink.
     176             :   template<typename _Tp>
     177             :     struct minus : public binary_function<_Tp, _Tp, _Tp>
     178             :     {
     179             :       _GLIBCXX14_CONSTEXPR
     180             :       _Tp
     181             :       operator()(const _Tp& __x, const _Tp& __y) const
     182             :       { return __x - __y; }
     183             :     };
     184             : 
     185             :   /// One of the @link arithmetic_functors math functors@endlink.
     186             :   template<typename _Tp>
     187             :     struct multiplies : public binary_function<_Tp, _Tp, _Tp>
     188             :     {
     189             :       _GLIBCXX14_CONSTEXPR
     190             :       _Tp
     191             :       operator()(const _Tp& __x, const _Tp& __y) const
     192             :       { return __x * __y; }
     193             :     };
     194             : 
     195             :   /// One of the @link arithmetic_functors math functors@endlink.
     196             :   template<typename _Tp>
     197             :     struct divides : public binary_function<_Tp, _Tp, _Tp>
     198             :     {
     199             :       _GLIBCXX14_CONSTEXPR
     200             :       _Tp
     201             :       operator()(const _Tp& __x, const _Tp& __y) const
     202             :       { return __x / __y; }
     203             :     };
     204             : 
     205             :   /// One of the @link arithmetic_functors math functors@endlink.
     206             :   template<typename _Tp>
     207             :     struct modulus : public binary_function<_Tp, _Tp, _Tp>
     208             :     {
     209             :       _GLIBCXX14_CONSTEXPR
     210             :       _Tp
     211             :       operator()(const _Tp& __x, const _Tp& __y) const
     212             :       { return __x % __y; }
     213             :     };
     214             : 
     215             :   /// One of the @link arithmetic_functors math functors@endlink.
     216             :   template<typename _Tp>
     217             :     struct negate : public unary_function<_Tp, _Tp>
     218             :     {
     219             :       _GLIBCXX14_CONSTEXPR
     220             :       _Tp
     221             :       operator()(const _Tp& __x) const
     222             :       { return -__x; }
     223             :     };
     224             : 
     225             : #if __cplusplus > 201103L
     226             : 
     227             : #define __cpp_lib_transparent_operators 201510
     228             : 
     229             :   template<>
     230             :     struct plus<void>
     231             :     {
     232             :       template <typename _Tp, typename _Up>
     233             :         _GLIBCXX14_CONSTEXPR
     234             :         auto
     235             :         operator()(_Tp&& __t, _Up&& __u) const
     236             :         noexcept(noexcept(std::forward<_Tp>(__t) + std::forward<_Up>(__u)))
     237             :         -> decltype(std::forward<_Tp>(__t) + std::forward<_Up>(__u))
     238             :         { return std::forward<_Tp>(__t) + std::forward<_Up>(__u); }
     239             : 
     240             :       typedef __is_transparent is_transparent;
     241             :     };
     242             : 
     243             :   /// One of the @link arithmetic_functors math functors@endlink.
     244             :   template<>
     245             :     struct minus<void>
     246             :     {
     247             :       template <typename _Tp, typename _Up>
     248             :         _GLIBCXX14_CONSTEXPR
     249             :         auto
     250             :         operator()(_Tp&& __t, _Up&& __u) const
     251             :         noexcept(noexcept(std::forward<_Tp>(__t) - std::forward<_Up>(__u)))
     252             :         -> decltype(std::forward<_Tp>(__t) - std::forward<_Up>(__u))
     253             :         { return std::forward<_Tp>(__t) - std::forward<_Up>(__u); }
     254             : 
     255             :       typedef __is_transparent is_transparent;
     256             :     };
     257             : 
     258             :   /// One of the @link arithmetic_functors math functors@endlink.
     259             :   template<>
     260             :     struct multiplies<void>
     261             :     {
     262             :       template <typename _Tp, typename _Up>
     263             :         _GLIBCXX14_CONSTEXPR
     264             :         auto
     265             :         operator()(_Tp&& __t, _Up&& __u) const
     266             :         noexcept(noexcept(std::forward<_Tp>(__t) * std::forward<_Up>(__u)))
     267             :         -> decltype(std::forward<_Tp>(__t) * std::forward<_Up>(__u))
     268             :         { return std::forward<_Tp>(__t) * std::forward<_Up>(__u); }
     269             : 
     270             :       typedef __is_transparent is_transparent;
     271             :     };
     272             : 
     273             :   /// One of the @link arithmetic_functors math functors@endlink.
     274             :   template<>
     275             :     struct divides<void>
     276             :     {
     277             :       template <typename _Tp, typename _Up>
     278             :         _GLIBCXX14_CONSTEXPR
     279             :         auto
     280             :         operator()(_Tp&& __t, _Up&& __u) const
     281             :         noexcept(noexcept(std::forward<_Tp>(__t) / std::forward<_Up>(__u)))
     282             :         -> decltype(std::forward<_Tp>(__t) / std::forward<_Up>(__u))
     283             :         { return std::forward<_Tp>(__t) / std::forward<_Up>(__u); }
     284             : 
     285             :       typedef __is_transparent is_transparent;
     286             :     };
     287             : 
     288             :   /// One of the @link arithmetic_functors math functors@endlink.
     289             :   template<>
     290             :     struct modulus<void>
     291             :     {
     292             :       template <typename _Tp, typename _Up>
     293             :         _GLIBCXX14_CONSTEXPR
     294             :         auto
     295             :         operator()(_Tp&& __t, _Up&& __u) const
     296             :         noexcept(noexcept(std::forward<_Tp>(__t) % std::forward<_Up>(__u)))
     297             :         -> decltype(std::forward<_Tp>(__t) % std::forward<_Up>(__u))
     298             :         { return std::forward<_Tp>(__t) % std::forward<_Up>(__u); }
     299             : 
     300             :       typedef __is_transparent is_transparent;
     301             :     };
     302             : 
     303             :   /// One of the @link arithmetic_functors math functors@endlink.
     304             :   template<>
     305             :     struct negate<void>
     306             :     {
     307             :       template <typename _Tp>
     308             :         _GLIBCXX14_CONSTEXPR
     309             :         auto
     310             :         operator()(_Tp&& __t) const
     311             :         noexcept(noexcept(-std::forward<_Tp>(__t)))
     312             :         -> decltype(-std::forward<_Tp>(__t))
     313             :         { return -std::forward<_Tp>(__t); }
     314             : 
     315             :       typedef __is_transparent is_transparent;
     316             :     };
     317             : #endif
     318             :   /** @}  */
     319             : 
     320             :   // 20.3.3 comparisons
     321             :   /** @defgroup comparison_functors Comparison Classes
     322             :    * @ingroup functors
     323             :    *
     324             :    *  The library provides six wrapper functors for all the basic comparisons
     325             :    *  in C++, like @c <.
     326             :    *
     327             :    *  @{
     328             :    */
     329             : #if __cplusplus > 201103L
     330             :   template<typename _Tp = void>
     331             :     struct equal_to;
     332             : 
     333             :   template<typename _Tp = void>
     334             :     struct not_equal_to;
     335             : 
     336             :   template<typename _Tp = void>
     337             :     struct greater;
     338             : 
     339             :   template<typename _Tp = void>
     340             :     struct less;
     341             : 
     342             :   template<typename _Tp = void>
     343             :     struct greater_equal;
     344             : 
     345             :   template<typename _Tp = void>
     346             :     struct less_equal;
     347             : #endif
     348             : 
     349             :   /// One of the @link comparison_functors comparison functors@endlink.
     350             :   template<typename _Tp>
     351             :     struct equal_to : public binary_function<_Tp, _Tp, bool>
     352             :     {
     353             :       _GLIBCXX14_CONSTEXPR
     354             :       bool
     355           0 :       operator()(const _Tp& __x, const _Tp& __y) const
     356           0 :       { return __x == __y; }
     357             :     };
     358             : 
     359             :   /// One of the @link comparison_functors comparison functors@endlink.
     360             :   template<typename _Tp>
     361             :     struct not_equal_to : public binary_function<_Tp, _Tp, bool>
     362             :     {
     363             :       _GLIBCXX14_CONSTEXPR
     364             :       bool
     365             :       operator()(const _Tp& __x, const _Tp& __y) const
     366             :       { return __x != __y; }
     367             :     };
     368             : 
     369             :   /// One of the @link comparison_functors comparison functors@endlink.
     370             :   template<typename _Tp>
     371             :     struct greater : public binary_function<_Tp, _Tp, bool>
     372             :     {
     373             :       _GLIBCXX14_CONSTEXPR
     374             :       bool
     375             :       operator()(const _Tp& __x, const _Tp& __y) const
     376             :       { return __x > __y; }
     377             :     };
     378             : 
     379             :   /// One of the @link comparison_functors comparison functors@endlink.
     380             :   template<typename _Tp>
     381             :     struct less : public binary_function<_Tp, _Tp, bool>
     382             :     {
     383             :       _GLIBCXX14_CONSTEXPR
     384             :       bool
     385   884659871 :       operator()(const _Tp& __x, const _Tp& __y) const
     386   828933761 :       { return __x < __y; }
     387             :     };
     388             : 
     389             :   /// One of the @link comparison_functors comparison functors@endlink.
     390             :   template<typename _Tp>
     391             :     struct greater_equal : public binary_function<_Tp, _Tp, bool>
     392             :     {
     393             :       _GLIBCXX14_CONSTEXPR
     394             :       bool
     395             :       operator()(const _Tp& __x, const _Tp& __y) const
     396             :       { return __x >= __y; }
     397             :     };
     398             : 
     399             :   /// One of the @link comparison_functors comparison functors@endlink.
     400             :   template<typename _Tp>
     401             :     struct less_equal : public binary_function<_Tp, _Tp, bool>
     402             :     {
     403             :       _GLIBCXX14_CONSTEXPR
     404             :       bool
     405             :       operator()(const _Tp& __x, const _Tp& __y) const
     406             :       { return __x <= __y; }
     407             :     };
     408             : 
     409             :   // Partial specialization of std::greater for pointers.
     410             :   template<typename _Tp>
     411             :     struct greater<_Tp*> : public binary_function<_Tp*, _Tp*, bool>
     412             :     {
     413             :       _GLIBCXX14_CONSTEXPR bool
     414           0 :       operator()(_Tp* __x, _Tp* __y) const _GLIBCXX_NOTHROW
     415             :       {
     416             : #if __cplusplus >= 201402L
     417             : #ifdef _GLIBCXX_HAVE_BUILTIN_IS_CONSTANT_EVALUATED
     418             :         if (__builtin_is_constant_evaluated())
     419             : #else
     420             :         if (__builtin_constant_p(__x > __y))
     421             : #endif
     422             :           return __x > __y;
     423             : #endif
     424           0 :         return (__UINTPTR_TYPE__)__x > (__UINTPTR_TYPE__)__y;
     425             :       }
     426             :     };
     427             : 
     428             :   // Partial specialization of std::less for pointers.
     429             :   template<typename _Tp>
     430             :     struct less<_Tp*> : public binary_function<_Tp*, _Tp*, bool>
     431             :     {
     432             :       _GLIBCXX14_CONSTEXPR bool
     433   720116416 :       operator()(_Tp* __x, _Tp* __y) const _GLIBCXX_NOTHROW
     434             :       {
     435             : #if __cplusplus >= 201402L
     436             : #ifdef _GLIBCXX_HAVE_BUILTIN_IS_CONSTANT_EVALUATED
     437             :         if (__builtin_is_constant_evaluated())
     438             : #else
     439             :         if (__builtin_constant_p(__x < __y))
     440             : #endif
     441             :           return __x < __y;
     442             : #endif
     443   450041832 :         return (__UINTPTR_TYPE__)__x < (__UINTPTR_TYPE__)__y;
     444             :       }
     445             :     };
     446             : 
     447             :   // Partial specialization of std::greater_equal for pointers.
     448             :   template<typename _Tp>
     449             :     struct greater_equal<_Tp*> : public binary_function<_Tp*, _Tp*, bool>
     450             :     {
     451             :       _GLIBCXX14_CONSTEXPR bool
     452             :       operator()(_Tp* __x, _Tp* __y) const _GLIBCXX_NOTHROW
     453             :       {
     454             : #if __cplusplus >= 201402L
     455             : #ifdef _GLIBCXX_HAVE_BUILTIN_IS_CONSTANT_EVALUATED
     456             :         if (__builtin_is_constant_evaluated())
     457             : #else
     458             :         if (__builtin_constant_p(__x >= __y))
     459             : #endif
     460             :           return __x >= __y;
     461             : #endif
     462             :         return (__UINTPTR_TYPE__)__x >= (__UINTPTR_TYPE__)__y;
     463             :       }
     464             :     };
     465             : 
     466             :   // Partial specialization of std::less_equal for pointers.
     467             :   template<typename _Tp>
     468             :     struct less_equal<_Tp*> : public binary_function<_Tp*, _Tp*, bool>
     469             :     {
     470             :       _GLIBCXX14_CONSTEXPR bool
     471           0 :       operator()(_Tp* __x, _Tp* __y) const _GLIBCXX_NOTHROW
     472             :       {
     473             : #if __cplusplus >= 201402L
     474             : #ifdef _GLIBCXX_HAVE_BUILTIN_IS_CONSTANT_EVALUATED
     475             :         if (__builtin_is_constant_evaluated())
     476             : #else
     477             :         if (__builtin_constant_p(__x <= __y))
     478             : #endif
     479             :           return __x <= __y;
     480             : #endif
     481           0 :         return (__UINTPTR_TYPE__)__x <= (__UINTPTR_TYPE__)__y;
     482             :       }
     483             :     };
     484             : 
     485             : #if __cplusplus >= 201402L
     486             :   /// One of the @link comparison_functors comparison functors@endlink.
     487             :   template<>
     488             :     struct equal_to<void>
     489             :     {
     490             :       template <typename _Tp, typename _Up>
     491             :         constexpr auto
     492             :         operator()(_Tp&& __t, _Up&& __u) const
     493             :         noexcept(noexcept(std::forward<_Tp>(__t) == std::forward<_Up>(__u)))
     494             :         -> decltype(std::forward<_Tp>(__t) == std::forward<_Up>(__u))
     495             :         { return std::forward<_Tp>(__t) == std::forward<_Up>(__u); }
     496             : 
     497             :       typedef __is_transparent is_transparent;
     498             :     };
     499             : 
     500             :   /// One of the @link comparison_functors comparison functors@endlink.
     501             :   template<>
     502             :     struct not_equal_to<void>
     503             :     {
     504             :       template <typename _Tp, typename _Up>
     505             :         constexpr auto
     506             :         operator()(_Tp&& __t, _Up&& __u) const
     507             :         noexcept(noexcept(std::forward<_Tp>(__t) != std::forward<_Up>(__u)))
     508             :         -> decltype(std::forward<_Tp>(__t) != std::forward<_Up>(__u))
     509             :         { return std::forward<_Tp>(__t) != std::forward<_Up>(__u); }
     510             : 
     511             :       typedef __is_transparent is_transparent;
     512             :     };
     513             : 
     514             :   /// One of the @link comparison_functors comparison functors@endlink.
     515             :   template<>
     516             :     struct greater<void>
     517             :     {
     518             :       template <typename _Tp, typename _Up>
     519             :         constexpr auto
     520             :         operator()(_Tp&& __t, _Up&& __u) const
     521             :         noexcept(noexcept(std::forward<_Tp>(__t) > std::forward<_Up>(__u)))
     522             :         -> decltype(std::forward<_Tp>(__t) > std::forward<_Up>(__u))
     523             :         {
     524             :           return _S_cmp(std::forward<_Tp>(__t), std::forward<_Up>(__u),
     525             :                         __ptr_cmp<_Tp, _Up>{});
     526             :         }
     527             : 
     528             :       template<typename _Tp, typename _Up>
     529             :         constexpr bool
     530             :         operator()(_Tp* __t, _Up* __u) const noexcept
     531             :         { return greater<common_type_t<_Tp*, _Up*>>{}(__t, __u); }
     532             : 
     533             :       typedef __is_transparent is_transparent;
     534             : 
     535             :     private:
     536             :       template <typename _Tp, typename _Up>
     537             :         static constexpr decltype(auto)
     538             :         _S_cmp(_Tp&& __t, _Up&& __u, false_type)
     539             :         { return std::forward<_Tp>(__t) > std::forward<_Up>(__u); }
     540             : 
     541             :       template <typename _Tp, typename _Up>
     542             :         static constexpr bool
     543             :         _S_cmp(_Tp&& __t, _Up&& __u, true_type) noexcept
     544             :         {
     545             :           return greater<const volatile void*>{}(
     546             :               static_cast<const volatile void*>(std::forward<_Tp>(__t)),
     547             :               static_cast<const volatile void*>(std::forward<_Up>(__u)));
     548             :         }
     549             : 
     550             :       // True if there is no viable operator> member function.
     551             :       template<typename _Tp, typename _Up, typename = void>
     552             :         struct __not_overloaded2 : true_type { };
     553             : 
     554             :       // False if we can call T.operator>(U)
     555             :       template<typename _Tp, typename _Up>
     556             :         struct __not_overloaded2<_Tp, _Up, __void_t<
     557             :           decltype(std::declval<_Tp>().operator>(std::declval<_Up>()))>>
     558             :         : false_type { };
     559             : 
     560             :       // True if there is no overloaded operator> for these operands.
     561             :       template<typename _Tp, typename _Up, typename = void>
     562             :         struct __not_overloaded : __not_overloaded2<_Tp, _Up> { };
     563             : 
     564             :       // False if we can call operator>(T,U)
     565             :       template<typename _Tp, typename _Up>
     566             :         struct __not_overloaded<_Tp, _Up, __void_t<
     567             :           decltype(operator>(std::declval<_Tp>(), std::declval<_Up>()))>>
     568             :         : false_type { };
     569             : 
     570             :       template<typename _Tp, typename _Up>
     571             :         using __ptr_cmp = __and_<__not_overloaded<_Tp, _Up>,
     572             :               is_convertible<_Tp, const volatile void*>,
     573             :               is_convertible<_Up, const volatile void*>>;
     574             :     };
     575             : 
     576             :   /// One of the @link comparison_functors comparison functors@endlink.
     577             :   template<>
     578             :     struct less<void>
     579             :     {
     580             :       template <typename _Tp, typename _Up>
     581             :         constexpr auto
     582             :         operator()(_Tp&& __t, _Up&& __u) const
     583             :         noexcept(noexcept(std::forward<_Tp>(__t) < std::forward<_Up>(__u)))
     584             :         -> decltype(std::forward<_Tp>(__t) < std::forward<_Up>(__u))
     585             :         {
     586             :           return _S_cmp(std::forward<_Tp>(__t), std::forward<_Up>(__u),
     587             :                         __ptr_cmp<_Tp, _Up>{});
     588             :         }
     589             : 
     590             :       template<typename _Tp, typename _Up>
     591             :         constexpr bool
     592             :         operator()(_Tp* __t, _Up* __u) const noexcept
     593             :         { return less<common_type_t<_Tp*, _Up*>>{}(__t, __u); }
     594             : 
     595             :       typedef __is_transparent is_transparent;
     596             : 
     597             :     private:
     598             :       template <typename _Tp, typename _Up>
     599             :         static constexpr decltype(auto)
     600             :         _S_cmp(_Tp&& __t, _Up&& __u, false_type)
     601             :         { return std::forward<_Tp>(__t) < std::forward<_Up>(__u); }
     602             : 
     603             :       template <typename _Tp, typename _Up>
     604             :         static constexpr bool
     605             :         _S_cmp(_Tp&& __t, _Up&& __u, true_type) noexcept
     606             :         {
     607             :           return less<const volatile void*>{}(
     608             :               static_cast<const volatile void*>(std::forward<_Tp>(__t)),
     609             :               static_cast<const volatile void*>(std::forward<_Up>(__u)));
     610             :         }
     611             : 
     612             :       // True if there is no viable operator< member function.
     613             :       template<typename _Tp, typename _Up, typename = void>
     614             :         struct __not_overloaded2 : true_type { };
     615             : 
     616             :       // False if we can call T.operator<(U)
     617             :       template<typename _Tp, typename _Up>
     618             :         struct __not_overloaded2<_Tp, _Up, __void_t<
     619             :           decltype(std::declval<_Tp>().operator<(std::declval<_Up>()))>>
     620             :         : false_type { };
     621             : 
     622             :       // True if there is no overloaded operator< for these operands.
     623             :       template<typename _Tp, typename _Up, typename = void>
     624             :         struct __not_overloaded : __not_overloaded2<_Tp, _Up> { };
     625             : 
     626             :       // False if we can call operator<(T,U)
     627             :       template<typename _Tp, typename _Up>
     628             :         struct __not_overloaded<_Tp, _Up, __void_t<
     629             :           decltype(operator<(std::declval<_Tp>(), std::declval<_Up>()))>>
     630             :         : false_type { };
     631             : 
     632             :       template<typename _Tp, typename _Up>
     633             :         using __ptr_cmp = __and_<__not_overloaded<_Tp, _Up>,
     634             :               is_convertible<_Tp, const volatile void*>,
     635             :               is_convertible<_Up, const volatile void*>>;
     636             :     };
     637             : 
     638             :   /// One of the @link comparison_functors comparison functors@endlink.
     639             :   template<>
     640             :     struct greater_equal<void>
     641             :     {
     642             :       template <typename _Tp, typename _Up>
     643             :         constexpr auto
     644             :         operator()(_Tp&& __t, _Up&& __u) const
     645             :         noexcept(noexcept(std::forward<_Tp>(__t) >= std::forward<_Up>(__u)))
     646             :         -> decltype(std::forward<_Tp>(__t) >= std::forward<_Up>(__u))
     647             :         {
     648             :           return _S_cmp(std::forward<_Tp>(__t), std::forward<_Up>(__u),
     649             :                         __ptr_cmp<_Tp, _Up>{});
     650             :         }
     651             : 
     652             :       template<typename _Tp, typename _Up>
     653             :         constexpr bool
     654             :         operator()(_Tp* __t, _Up* __u) const noexcept
     655             :         { return greater_equal<common_type_t<_Tp*, _Up*>>{}(__t, __u); }
     656             : 
     657             :       typedef __is_transparent is_transparent;
     658             : 
     659             :     private:
     660             :       template <typename _Tp, typename _Up>
     661             :         static constexpr decltype(auto)
     662             :         _S_cmp(_Tp&& __t, _Up&& __u, false_type)
     663             :         { return std::forward<_Tp>(__t) >= std::forward<_Up>(__u); }
     664             : 
     665             :       template <typename _Tp, typename _Up>
     666             :         static constexpr bool
     667             :         _S_cmp(_Tp&& __t, _Up&& __u, true_type) noexcept
     668             :         {
     669             :           return greater_equal<const volatile void*>{}(
     670             :               static_cast<const volatile void*>(std::forward<_Tp>(__t)),
     671             :               static_cast<const volatile void*>(std::forward<_Up>(__u)));
     672             :         }
     673             : 
     674             :       // True if there is no viable operator>= member function.
     675             :       template<typename _Tp, typename _Up, typename = void>
     676             :         struct __not_overloaded2 : true_type { };
     677             : 
     678             :       // False if we can call T.operator>=(U)
     679             :       template<typename _Tp, typename _Up>
     680             :         struct __not_overloaded2<_Tp, _Up, __void_t<
     681             :           decltype(std::declval<_Tp>().operator>=(std::declval<_Up>()))>>
     682             :         : false_type { };
     683             : 
     684             :       // True if there is no overloaded operator>= for these operands.
     685             :       template<typename _Tp, typename _Up, typename = void>
     686             :         struct __not_overloaded : __not_overloaded2<_Tp, _Up> { };
     687             : 
     688             :       // False if we can call operator>=(T,U)
     689             :       template<typename _Tp, typename _Up>
     690             :         struct __not_overloaded<_Tp, _Up, __void_t<
     691             :           decltype(operator>=(std::declval<_Tp>(), std::declval<_Up>()))>>
     692             :         : false_type { };
     693             : 
     694             :       template<typename _Tp, typename _Up>
     695             :         using __ptr_cmp = __and_<__not_overloaded<_Tp, _Up>,
     696             :               is_convertible<_Tp, const volatile void*>,
     697             :               is_convertible<_Up, const volatile void*>>;
     698             :     };
     699             : 
     700             :   /// One of the @link comparison_functors comparison functors@endlink.
     701             :   template<>
     702             :     struct less_equal<void>
     703             :     {
     704             :       template <typename _Tp, typename _Up>
     705             :         constexpr auto
     706             :         operator()(_Tp&& __t, _Up&& __u) const
     707             :         noexcept(noexcept(std::forward<_Tp>(__t) <= std::forward<_Up>(__u)))
     708             :         -> decltype(std::forward<_Tp>(__t) <= std::forward<_Up>(__u))
     709             :         {
     710             :           return _S_cmp(std::forward<_Tp>(__t), std::forward<_Up>(__u),
     711             :                         __ptr_cmp<_Tp, _Up>{});
     712             :         }
     713             : 
     714             :       template<typename _Tp, typename _Up>
     715             :         constexpr bool
     716             :         operator()(_Tp* __t, _Up* __u) const noexcept
     717             :         { return less_equal<common_type_t<_Tp*, _Up*>>{}(__t, __u); }
     718             : 
     719             :       typedef __is_transparent is_transparent;
     720             : 
     721             :     private:
     722             :       template <typename _Tp, typename _Up>
     723             :         static constexpr decltype(auto)
     724             :         _S_cmp(_Tp&& __t, _Up&& __u, false_type)
     725             :         { return std::forward<_Tp>(__t) <= std::forward<_Up>(__u); }
     726             : 
     727             :       template <typename _Tp, typename _Up>
     728             :         static constexpr bool
     729             :         _S_cmp(_Tp&& __t, _Up&& __u, true_type) noexcept
     730             :         {
     731             :           return less_equal<const volatile void*>{}(
     732             :               static_cast<const volatile void*>(std::forward<_Tp>(__t)),
     733             :               static_cast<const volatile void*>(std::forward<_Up>(__u)));
     734             :         }
     735             : 
     736             :       // True if there is no viable operator<= member function.
     737             :       template<typename _Tp, typename _Up, typename = void>
     738             :         struct __not_overloaded2 : true_type { };
     739             : 
     740             :       // False if we can call T.operator<=(U)
     741             :       template<typename _Tp, typename _Up>
     742             :         struct __not_overloaded2<_Tp, _Up, __void_t<
     743             :           decltype(std::declval<_Tp>().operator<=(std::declval<_Up>()))>>
     744             :         : false_type { };
     745             : 
     746             :       // True if there is no overloaded operator<= for these operands.
     747             :       template<typename _Tp, typename _Up, typename = void>
     748             :         struct __not_overloaded : __not_overloaded2<_Tp, _Up> { };
     749             : 
     750             :       // False if we can call operator<=(T,U)
     751             :       template<typename _Tp, typename _Up>
     752             :         struct __not_overloaded<_Tp, _Up, __void_t<
     753             :           decltype(operator<=(std::declval<_Tp>(), std::declval<_Up>()))>>
     754             :         : false_type { };
     755             : 
     756             :       template<typename _Tp, typename _Up>
     757             :         using __ptr_cmp = __and_<__not_overloaded<_Tp, _Up>,
     758             :               is_convertible<_Tp, const volatile void*>,
     759             :               is_convertible<_Up, const volatile void*>>;
     760             :     };
     761             : #endif // C++14
     762             :   /** @}  */
     763             : 
     764             :   // 20.3.4 logical operations
     765             :   /** @defgroup logical_functors Boolean Operations Classes
     766             :    * @ingroup functors
     767             :    *
     768             :    *  Here are wrapper functors for Boolean operations: @c &&, @c ||,
     769             :    *  and @c !.
     770             :    *
     771             :    *  @{
     772             :    */
     773             : #if __cplusplus > 201103L
     774             :   template<typename _Tp = void>
     775             :     struct logical_and;
     776             : 
     777             :   template<typename _Tp = void>
     778             :     struct logical_or;
     779             : 
     780             :   template<typename _Tp = void>
     781             :     struct logical_not;
     782             : #endif
     783             : 
     784             :   /// One of the @link logical_functors Boolean operations functors@endlink.
     785             :   template<typename _Tp>
     786             :     struct logical_and : public binary_function<_Tp, _Tp, bool>
     787             :     {
     788             :       _GLIBCXX14_CONSTEXPR
     789             :       bool
     790           0 :       operator()(const _Tp& __x, const _Tp& __y) const
     791           0 :       { return __x && __y; }
     792             :     };
     793             : 
     794             :   /// One of the @link logical_functors Boolean operations functors@endlink.
     795             :   template<typename _Tp>
     796             :     struct logical_or : public binary_function<_Tp, _Tp, bool>
     797             :     {
     798             :       _GLIBCXX14_CONSTEXPR
     799             :       bool
     800           0 :       operator()(const _Tp& __x, const _Tp& __y) const
     801           0 :       { return __x || __y; }
     802             :     };
     803             : 
     804             :   /// One of the @link logical_functors Boolean operations functors@endlink.
     805             :   template<typename _Tp>
     806             :     struct logical_not : public unary_function<_Tp, bool>
     807             :     {
     808             :       _GLIBCXX14_CONSTEXPR
     809             :       bool
     810             :       operator()(const _Tp& __x) const
     811             :       { return !__x; }
     812             :     };
     813             : 
     814             : #if __cplusplus > 201103L
     815             :   /// One of the @link logical_functors Boolean operations functors@endlink.
     816             :   template<>
     817             :     struct logical_and<void>
     818             :     {
     819             :       template <typename _Tp, typename _Up>
     820             :         _GLIBCXX14_CONSTEXPR
     821             :         auto
     822             :         operator()(_Tp&& __t, _Up&& __u) const
     823             :         noexcept(noexcept(std::forward<_Tp>(__t) && std::forward<_Up>(__u)))
     824             :         -> decltype(std::forward<_Tp>(__t) && std::forward<_Up>(__u))
     825             :         { return std::forward<_Tp>(__t) && std::forward<_Up>(__u); }
     826             : 
     827             :       typedef __is_transparent is_transparent;
     828             :     };
     829             : 
     830             :   /// One of the @link logical_functors Boolean operations functors@endlink.
     831             :   template<>
     832             :     struct logical_or<void>
     833             :     {
     834             :       template <typename _Tp, typename _Up>
     835             :         _GLIBCXX14_CONSTEXPR
     836             :         auto
     837             :         operator()(_Tp&& __t, _Up&& __u) const
     838             :         noexcept(noexcept(std::forward<_Tp>(__t) || std::forward<_Up>(__u)))
     839             :         -> decltype(std::forward<_Tp>(__t) || std::forward<_Up>(__u))
     840             :         { return std::forward<_Tp>(__t) || std::forward<_Up>(__u); }
     841             : 
     842             :       typedef __is_transparent is_transparent;
     843             :     };
     844             : 
     845             :   /// One of the @link logical_functors Boolean operations functors@endlink.
     846             :   template<>
     847             :     struct logical_not<void>
     848             :     {
     849             :       template <typename _Tp>
     850             :         _GLIBCXX14_CONSTEXPR
     851             :         auto
     852             :         operator()(_Tp&& __t) const
     853             :         noexcept(noexcept(!std::forward<_Tp>(__t)))
     854             :         -> decltype(!std::forward<_Tp>(__t))
     855             :         { return !std::forward<_Tp>(__t); }
     856             : 
     857             :       typedef __is_transparent is_transparent;
     858             :     };
     859             : #endif
     860             :   /** @}  */
     861             : 
     862             : #if __cplusplus > 201103L
     863             :   template<typename _Tp = void>
     864             :     struct bit_and;
     865             : 
     866             :   template<typename _Tp = void>
     867             :     struct bit_or;
     868             : 
     869             :   template<typename _Tp = void>
     870             :     struct bit_xor;
     871             : 
     872             :   template<typename _Tp = void>
     873             :     struct bit_not;
     874             : #endif
     875             : 
     876             :   // _GLIBCXX_RESOLVE_LIB_DEFECTS
     877             :   // DR 660. Missing Bitwise Operations.
     878             :   template<typename _Tp>
     879             :     struct bit_and : public binary_function<_Tp, _Tp, _Tp>
     880             :     {
     881             :       _GLIBCXX14_CONSTEXPR
     882             :       _Tp
     883             :       operator()(const _Tp& __x, const _Tp& __y) const
     884             :       { return __x & __y; }
     885             :     };
     886             : 
     887             :   template<typename _Tp>
     888             :     struct bit_or : public binary_function<_Tp, _Tp, _Tp>
     889             :     {
     890             :       _GLIBCXX14_CONSTEXPR
     891             :       _Tp
     892             :       operator()(const _Tp& __x, const _Tp& __y) const
     893             :       { return __x | __y; }
     894             :     };
     895             : 
     896             :   template<typename _Tp>
     897             :     struct bit_xor : public binary_function<_Tp, _Tp, _Tp>
     898             :     {
     899             :       _GLIBCXX14_CONSTEXPR
     900             :       _Tp
     901             :       operator()(const _Tp& __x, const _Tp& __y) const
     902             :       { return __x ^ __y; }
     903             :     };
     904             : 
     905             :   template<typename _Tp>
     906             :     struct bit_not : public unary_function<_Tp, _Tp>
     907             :     {
     908             :     _GLIBCXX14_CONSTEXPR
     909             :       _Tp
     910             :       operator()(const _Tp& __x) const
     911             :       { return ~__x; }
     912             :     };
     913             : 
     914             : #if __cplusplus > 201103L
     915             :   template <>
     916             :     struct bit_and<void>
     917             :     {
     918             :       template <typename _Tp, typename _Up>
     919             :         _GLIBCXX14_CONSTEXPR
     920             :         auto
     921             :         operator()(_Tp&& __t, _Up&& __u) const
     922             :         noexcept(noexcept(std::forward<_Tp>(__t) & std::forward<_Up>(__u)))
     923             :         -> decltype(std::forward<_Tp>(__t) & std::forward<_Up>(__u))
     924             :         { return std::forward<_Tp>(__t) & std::forward<_Up>(__u); }
     925             : 
     926             :       typedef __is_transparent is_transparent;
     927             :     };
     928             : 
     929             :   template <>
     930             :     struct bit_or<void>
     931             :     {
     932             :       template <typename _Tp, typename _Up>
     933             :         _GLIBCXX14_CONSTEXPR
     934             :         auto
     935             :         operator()(_Tp&& __t, _Up&& __u) const
     936             :         noexcept(noexcept(std::forward<_Tp>(__t) | std::forward<_Up>(__u)))
     937             :         -> decltype(std::forward<_Tp>(__t) | std::forward<_Up>(__u))
     938             :         { return std::forward<_Tp>(__t) | std::forward<_Up>(__u); }
     939             : 
     940             :       typedef __is_transparent is_transparent;
     941             :     };
     942             : 
     943             :   template <>
     944             :     struct bit_xor<void>
     945             :     {
     946             :       template <typename _Tp, typename _Up>
     947             :         _GLIBCXX14_CONSTEXPR
     948             :         auto
     949             :         operator()(_Tp&& __t, _Up&& __u) const
     950             :         noexcept(noexcept(std::forward<_Tp>(__t) ^ std::forward<_Up>(__u)))
     951             :         -> decltype(std::forward<_Tp>(__t) ^ std::forward<_Up>(__u))
     952             :         { return std::forward<_Tp>(__t) ^ std::forward<_Up>(__u); }
     953             : 
     954             :       typedef __is_transparent is_transparent;
     955             :     };
     956             : 
     957             :   template <>
     958             :     struct bit_not<void>
     959             :     {
     960             :       template <typename _Tp>
     961             :         _GLIBCXX14_CONSTEXPR
     962             :         auto
     963             :         operator()(_Tp&& __t) const
     964             :         noexcept(noexcept(~std::forward<_Tp>(__t)))
     965             :         -> decltype(~std::forward<_Tp>(__t))
     966             :         { return ~std::forward<_Tp>(__t); }
     967             : 
     968             :       typedef __is_transparent is_transparent;
     969             :     };
     970             : #endif
     971             : 
     972             :   // 20.3.5 negators
     973             :   /** @defgroup negators Negators
     974             :    * @ingroup functors
     975             :    *
     976             :    *  The functions @c not1 and @c not2 each take a predicate functor
     977             :    *  and return an instance of @c unary_negate or
     978             :    *  @c binary_negate, respectively.  These classes are functors whose
     979             :    *  @c operator() performs the stored predicate function and then returns
     980             :    *  the negation of the result.
     981             :    *
     982             :    *  For example, given a vector of integers and a trivial predicate,
     983             :    *  \code
     984             :    *  struct IntGreaterThanThree
     985             :    *    : public std::unary_function<int, bool>
     986             :    *  {
     987             :    *      bool operator() (int x) { return x > 3; }
     988             :    *  };
     989             :    *
     990             :    *  std::find_if (v.begin(), v.end(), not1(IntGreaterThanThree()));
     991             :    *  \endcode
     992             :    *  The call to @c find_if will locate the first index (i) of @c v for which
     993             :    *  <code>!(v[i] > 3)</code> is true.
     994             :    *
     995             :    *  The not1/unary_negate combination works on predicates taking a single
     996             :    *  argument.  The not2/binary_negate combination works on predicates which
     997             :    *  take two arguments.
     998             :    *
     999             :    *  @{
    1000             :    */
    1001             :   /// One of the @link negators negation functors@endlink.
    1002             :   template<typename _Predicate>
    1003             :     class unary_negate
    1004             :     : public unary_function<typename _Predicate::argument_type, bool>
    1005             :     {
    1006             :     protected:
    1007             :       _Predicate _M_pred;
    1008             : 
    1009             :     public:
    1010             :       _GLIBCXX14_CONSTEXPR
    1011             :       explicit
    1012             :       unary_negate(const _Predicate& __x) : _M_pred(__x) { }
    1013             : 
    1014             :       _GLIBCXX14_CONSTEXPR
    1015             :       bool
    1016             :       operator()(const typename _Predicate::argument_type& __x) const
    1017             :       { return !_M_pred(__x); }
    1018             :     };
    1019             : 
    1020             :   /// One of the @link negators negation functors@endlink.
    1021             :   template<typename _Predicate>
    1022             :     _GLIBCXX14_CONSTEXPR
    1023             :     inline unary_negate<_Predicate>
    1024             :     not1(const _Predicate& __pred)
    1025             :     { return unary_negate<_Predicate>(__pred); }
    1026             : 
    1027             :   /// One of the @link negators negation functors@endlink.
    1028             :   template<typename _Predicate>
    1029             :     class binary_negate
    1030             :     : public binary_function<typename _Predicate::first_argument_type,
    1031             :                              typename _Predicate::second_argument_type, bool>
    1032             :     {
    1033             :     protected:
    1034             :       _Predicate _M_pred;
    1035             : 
    1036             :     public:
    1037             :       _GLIBCXX14_CONSTEXPR
    1038             :       explicit
    1039             :       binary_negate(const _Predicate& __x) : _M_pred(__x) { }
    1040             : 
    1041             :       _GLIBCXX14_CONSTEXPR
    1042             :       bool
    1043             :       operator()(const typename _Predicate::first_argument_type& __x,
    1044             :                  const typename _Predicate::second_argument_type& __y) const
    1045             :       { return !_M_pred(__x, __y); }
    1046             :     };
    1047             : 
    1048             :   /// One of the @link negators negation functors@endlink.
    1049             :   template<typename _Predicate>
    1050             :     _GLIBCXX14_CONSTEXPR
    1051             :     inline binary_negate<_Predicate>
    1052             :     not2(const _Predicate& __pred)
    1053             :     { return binary_negate<_Predicate>(__pred); }
    1054             :   /** @}  */
    1055             : 
    1056             :   // 20.3.7 adaptors pointers functions
    1057             :   /** @defgroup pointer_adaptors Adaptors for pointers to functions
    1058             :    * @ingroup functors
    1059             :    *
    1060             :    *  The advantage of function objects over pointers to functions is that
    1061             :    *  the objects in the standard library declare nested typedefs describing
    1062             :    *  their argument and result types with uniform names (e.g., @c result_type
    1063             :    *  from the base classes @c unary_function and @c binary_function).
    1064             :    *  Sometimes those typedefs are required, not just optional.
    1065             :    *
    1066             :    *  Adaptors are provided to turn pointers to unary (single-argument) and
    1067             :    *  binary (double-argument) functions into function objects.  The
    1068             :    *  long-winded functor @c pointer_to_unary_function is constructed with a
    1069             :    *  function pointer @c f, and its @c operator() called with argument @c x
    1070             :    *  returns @c f(x).  The functor @c pointer_to_binary_function does the same
    1071             :    *  thing, but with a double-argument @c f and @c operator().
    1072             :    *
    1073             :    *  The function @c ptr_fun takes a pointer-to-function @c f and constructs
    1074             :    *  an instance of the appropriate functor.
    1075             :    *
    1076             :    *  @{
    1077             :    */
    1078             :   /// One of the @link pointer_adaptors adaptors for function pointers@endlink.
    1079             :   template<typename _Arg, typename _Result>
    1080             :     class pointer_to_unary_function : public unary_function<_Arg, _Result>
    1081             :     {
    1082             :     protected:
    1083             :       _Result (*_M_ptr)(_Arg);
    1084             : 
    1085             :     public:
    1086             :       pointer_to_unary_function() { }
    1087             : 
    1088             :       explicit
    1089           0 :       pointer_to_unary_function(_Result (*__x)(_Arg))
    1090             :       : _M_ptr(__x) { }
    1091             : 
    1092             :       _Result
    1093           0 :       operator()(_Arg __x) const
    1094           0 :       { return _M_ptr(__x); }
    1095             :     };
    1096             : 
    1097             :   /// One of the @link pointer_adaptors adaptors for function pointers@endlink.
    1098             :   template<typename _Arg, typename _Result>
    1099             :     inline pointer_to_unary_function<_Arg, _Result>
    1100           0 :     ptr_fun(_Result (*__x)(_Arg))
    1101           0 :     { return pointer_to_unary_function<_Arg, _Result>(__x); }
    1102             : 
    1103             :   /// One of the @link pointer_adaptors adaptors for function pointers@endlink.
    1104             :   template<typename _Arg1, typename _Arg2, typename _Result>
    1105             :     class pointer_to_binary_function
    1106             :     : public binary_function<_Arg1, _Arg2, _Result>
    1107             :     {
    1108             :     protected:
    1109             :       _Result (*_M_ptr)(_Arg1, _Arg2);
    1110             : 
    1111             :     public:
    1112             :       pointer_to_binary_function() { }
    1113             : 
    1114             :       explicit
    1115           0 :       pointer_to_binary_function(_Result (*__x)(_Arg1, _Arg2))
    1116             :       : _M_ptr(__x) { }
    1117             : 
    1118             :       _Result
    1119           0 :       operator()(_Arg1 __x, _Arg2 __y) const
    1120           0 :       { return _M_ptr(__x, __y); }
    1121             :     };
    1122             : 
    1123             :   /// One of the @link pointer_adaptors adaptors for function pointers@endlink.
    1124             :   template<typename _Arg1, typename _Arg2, typename _Result>
    1125             :     inline pointer_to_binary_function<_Arg1, _Arg2, _Result>
    1126           0 :     ptr_fun(_Result (*__x)(_Arg1, _Arg2))
    1127           0 :     { return pointer_to_binary_function<_Arg1, _Arg2, _Result>(__x); }
    1128             :   /** @}  */
    1129             : 
    1130             :   template<typename _Tp>
    1131             :     struct _Identity
    1132             :     : public unary_function<_Tp, _Tp>
    1133             :     {
    1134             :       _Tp&
    1135     2776845 :       operator()(_Tp& __x) const
    1136             :       { return __x; }
    1137             : 
    1138             :       const _Tp&
    1139  1197649932 :       operator()(const _Tp& __x) const
    1140             :       { return __x; }
    1141             :     };
    1142             : 
    1143             :   // Partial specialization, avoids confusing errors in e.g. std::set<const T>.
    1144             :   template<typename _Tp> struct _Identity<const _Tp> : _Identity<_Tp> { };
    1145             : 
    1146             :   template<typename _Pair>
    1147             :     struct _Select1st
    1148             :     : public unary_function<_Pair, typename _Pair::first_type>
    1149             :     {
    1150             :       typename _Pair::first_type&
    1151           0 :       operator()(_Pair& __x) const
    1152       20950 :       { return __x.first; }
    1153             : 
    1154             :       const typename _Pair::first_type&
    1155  4351199837 :       operator()(const _Pair& __x) const
    1156  6389588213 :       { return __x.first; }
    1157             : 
    1158             : #if __cplusplus >= 201103L
    1159             :       template<typename _Pair2>
    1160             :         typename _Pair2::first_type&
    1161             :         operator()(_Pair2& __x) const
    1162             :         { return __x.first; }
    1163             : 
    1164             :       template<typename _Pair2>
    1165             :         const typename _Pair2::first_type&
    1166             :         operator()(const _Pair2& __x) const
    1167             :         { return __x.first; }
    1168             : #endif
    1169             :     };
    1170             : 
    1171             :   template<typename _Pair>
    1172             :     struct _Select2nd
    1173             :     : public unary_function<_Pair, typename _Pair::second_type>
    1174             :     {
    1175             :       typename _Pair::second_type&
    1176             :       operator()(_Pair& __x) const
    1177             :       { return __x.second; }
    1178             : 
    1179             :       const typename _Pair::second_type&
    1180             :       operator()(const _Pair& __x) const
    1181             :       { return __x.second; }
    1182             :     };
    1183             : 
    1184             :   // 20.3.8 adaptors pointers members
    1185             :   /** @defgroup memory_adaptors Adaptors for pointers to members
    1186             :    * @ingroup functors
    1187             :    *
    1188             :    *  There are a total of 8 = 2^3 function objects in this family.
    1189             :    *   (1) Member functions taking no arguments vs member functions taking
    1190             :    *        one argument.
    1191             :    *   (2) Call through pointer vs call through reference.
    1192             :    *   (3) Const vs non-const member function.
    1193             :    *
    1194             :    *  All of this complexity is in the function objects themselves.  You can
    1195             :    *   ignore it by using the helper function mem_fun and mem_fun_ref,
    1196             :    *   which create whichever type of adaptor is appropriate.
    1197             :    *
    1198             :    *  @{
    1199             :    */
    1200             :   /// One of the @link memory_adaptors adaptors for member
    1201             :   /// pointers@endlink.
    1202             :   template<typename _Ret, typename _Tp>
    1203             :     class mem_fun_t : public unary_function<_Tp*, _Ret>
    1204             :     {
    1205             :     public:
    1206             :       explicit
    1207             :       mem_fun_t(_Ret (_Tp::*__pf)())
    1208             :       : _M_f(__pf) { }
    1209             : 
    1210             :       _Ret
    1211             :       operator()(_Tp* __p) const
    1212             :       { return (__p->*_M_f)(); }
    1213             : 
    1214             :     private:
    1215             :       _Ret (_Tp::*_M_f)();
    1216             :     };
    1217             : 
    1218             :   /// One of the @link memory_adaptors adaptors for member
    1219             :   /// pointers@endlink.
    1220             :   template<typename _Ret, typename _Tp>
    1221             :     class const_mem_fun_t : public unary_function<const _Tp*, _Ret>
    1222             :     {
    1223             :     public:
    1224             :       explicit
    1225             :       const_mem_fun_t(_Ret (_Tp::*__pf)() const)
    1226             :       : _M_f(__pf) { }
    1227             : 
    1228             :       _Ret
    1229             :       operator()(const _Tp* __p) const
    1230             :       { return (__p->*_M_f)(); }
    1231             : 
    1232             :     private:
    1233             :       _Ret (_Tp::*_M_f)() const;
    1234             :     };
    1235             : 
    1236             :   /// One of the @link memory_adaptors adaptors for member
    1237             :   /// pointers@endlink.
    1238             :   template<typename _Ret, typename _Tp>
    1239             :     class mem_fun_ref_t : public unary_function<_Tp, _Ret>
    1240             :     {
    1241             :     public:
    1242             :       explicit
    1243             :       mem_fun_ref_t(_Ret (_Tp::*__pf)())
    1244             :       : _M_f(__pf) { }
    1245             : 
    1246             :       _Ret
    1247             :       operator()(_Tp& __r) const
    1248             :       { return (__r.*_M_f)(); }
    1249             : 
    1250             :     private:
    1251             :       _Ret (_Tp::*_M_f)();
    1252             :   };
    1253             : 
    1254             :   /// One of the @link memory_adaptors adaptors for member
    1255             :   /// pointers@endlink.
    1256             :   template<typename _Ret, typename _Tp>
    1257             :     class const_mem_fun_ref_t : public unary_function<_Tp, _Ret>
    1258             :     {
    1259             :     public:
    1260             :       explicit
    1261             :       const_mem_fun_ref_t(_Ret (_Tp::*__pf)() const)
    1262             :       : _M_f(__pf) { }
    1263             : 
    1264             :       _Ret
    1265             :       operator()(const _Tp& __r) const
    1266             :       { return (__r.*_M_f)(); }
    1267             : 
    1268             :     private:
    1269             :       _Ret (_Tp::*_M_f)() const;
    1270             :     };
    1271             : 
    1272             :   /// One of the @link memory_adaptors adaptors for member
    1273             :   /// pointers@endlink.
    1274             :   template<typename _Ret, typename _Tp, typename _Arg>
    1275             :     class mem_fun1_t : public binary_function<_Tp*, _Arg, _Ret>
    1276             :     {
    1277             :     public:
    1278             :       explicit
    1279             :       mem_fun1_t(_Ret (_Tp::*__pf)(_Arg))
    1280             :       : _M_f(__pf) { }
    1281             : 
    1282             :       _Ret
    1283             :       operator()(_Tp* __p, _Arg __x) const
    1284             :       { return (__p->*_M_f)(__x); }
    1285             : 
    1286             :     private:
    1287             :       _Ret (_Tp::*_M_f)(_Arg);
    1288             :     };
    1289             : 
    1290             :   /// One of the @link memory_adaptors adaptors for member
    1291             :   /// pointers@endlink.
    1292             :   template<typename _Ret, typename _Tp, typename _Arg>
    1293             :     class const_mem_fun1_t : public binary_function<const _Tp*, _Arg, _Ret>
    1294             :     {
    1295             :     public:
    1296             :       explicit
    1297             :       const_mem_fun1_t(_Ret (_Tp::*__pf)(_Arg) const)
    1298             :       : _M_f(__pf) { }
    1299             : 
    1300             :       _Ret
    1301             :       operator()(const _Tp* __p, _Arg __x) const
    1302             :       { return (__p->*_M_f)(__x); }
    1303             : 
    1304             :     private:
    1305             :       _Ret (_Tp::*_M_f)(_Arg) const;
    1306             :     };
    1307             : 
    1308             :   /// One of the @link memory_adaptors adaptors for member
    1309             :   /// pointers@endlink.
    1310             :   template<typename _Ret, typename _Tp, typename _Arg>
    1311             :     class mem_fun1_ref_t : public binary_function<_Tp, _Arg, _Ret>
    1312             :     {
    1313             :     public:
    1314             :       explicit
    1315             :       mem_fun1_ref_t(_Ret (_Tp::*__pf)(_Arg))
    1316             :       : _M_f(__pf) { }
    1317             : 
    1318             :       _Ret
    1319             :       operator()(_Tp& __r, _Arg __x) const
    1320             :       { return (__r.*_M_f)(__x); }
    1321             : 
    1322             :     private:
    1323             :       _Ret (_Tp::*_M_f)(_Arg);
    1324             :     };
    1325             : 
    1326             :   /// One of the @link memory_adaptors adaptors for member
    1327             :   /// pointers@endlink.
    1328             :   template<typename _Ret, typename _Tp, typename _Arg>
    1329             :     class const_mem_fun1_ref_t : public binary_function<_Tp, _Arg, _Ret>
    1330             :     {
    1331             :     public:
    1332             :       explicit
    1333             :       const_mem_fun1_ref_t(_Ret (_Tp::*__pf)(_Arg) const)
    1334             :       : _M_f(__pf) { }
    1335             : 
    1336             :       _Ret
    1337             :       operator()(const _Tp& __r, _Arg __x) const
    1338             :       { return (__r.*_M_f)(__x); }
    1339             : 
    1340             :     private:
    1341             :       _Ret (_Tp::*_M_f)(_Arg) const;
    1342             :     };
    1343             : 
    1344             :   // Mem_fun adaptor helper functions.  There are only two:
    1345             :   // mem_fun and mem_fun_ref.
    1346             :   template<typename _Ret, typename _Tp>
    1347             :     inline mem_fun_t<_Ret, _Tp>
    1348             :     mem_fun(_Ret (_Tp::*__f)())
    1349             :     { return mem_fun_t<_Ret, _Tp>(__f); }
    1350             : 
    1351             :   template<typename _Ret, typename _Tp>
    1352             :     inline const_mem_fun_t<_Ret, _Tp>
    1353             :     mem_fun(_Ret (_Tp::*__f)() const)
    1354             :     { return const_mem_fun_t<_Ret, _Tp>(__f); }
    1355             : 
    1356             :   template<typename _Ret, typename _Tp>
    1357             :     inline mem_fun_ref_t<_Ret, _Tp>
    1358             :     mem_fun_ref(_Ret (_Tp::*__f)())
    1359             :     { return mem_fun_ref_t<_Ret, _Tp>(__f); }
    1360             : 
    1361             :   template<typename _Ret, typename _Tp>
    1362             :     inline const_mem_fun_ref_t<_Ret, _Tp>
    1363             :     mem_fun_ref(_Ret (_Tp::*__f)() const)
    1364             :     { return const_mem_fun_ref_t<_Ret, _Tp>(__f); }
    1365             : 
    1366             :   template<typename _Ret, typename _Tp, typename _Arg>
    1367             :     inline mem_fun1_t<_Ret, _Tp, _Arg>
    1368             :     mem_fun(_Ret (_Tp::*__f)(_Arg))
    1369             :     { return mem_fun1_t<_Ret, _Tp, _Arg>(__f); }
    1370             : 
    1371             :   template<typename _Ret, typename _Tp, typename _Arg>
    1372             :     inline const_mem_fun1_t<_Ret, _Tp, _Arg>
    1373             :     mem_fun(_Ret (_Tp::*__f)(_Arg) const)
    1374             :     { return const_mem_fun1_t<_Ret, _Tp, _Arg>(__f); }
    1375             : 
    1376             :   template<typename _Ret, typename _Tp, typename _Arg>
    1377             :     inline mem_fun1_ref_t<_Ret, _Tp, _Arg>
    1378             :     mem_fun_ref(_Ret (_Tp::*__f)(_Arg))
    1379             :     { return mem_fun1_ref_t<_Ret, _Tp, _Arg>(__f); }
    1380             : 
    1381             :   template<typename _Ret, typename _Tp, typename _Arg>
    1382             :     inline const_mem_fun1_ref_t<_Ret, _Tp, _Arg>
    1383             :     mem_fun_ref(_Ret (_Tp::*__f)(_Arg) const)
    1384             :     { return const_mem_fun1_ref_t<_Ret, _Tp, _Arg>(__f); }
    1385             : 
    1386             :   /** @}  */
    1387             : 
    1388             : _GLIBCXX_END_NAMESPACE_VERSION
    1389             : } // namespace
    1390             : 
    1391             : #if (__cplusplus < 201103L) || _GLIBCXX_USE_DEPRECATED
    1392             : # include <backward/binders.h>
    1393             : #endif
    1394             : 
    1395             : #endif /* _STL_FUNCTION_H */

Generated by: LCOV version 1.14