gcc50: Disconnect from buildworld.
[dragonfly.git] / contrib / gcc-5.0 / libstdc++-v3 / include / bits / stl_function.h
1 // Functor implementations -*- C++ -*-
2
3 // Copyright (C) 2001-2015 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       operator()(const _Tp& __x, const _Tp& __y) const
172       { 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 201210
228 //#define __cpp_lib_generic_associative_lookup 201304
229
230   template<>
231     struct plus<void>
232     {
233       template <typename _Tp, typename _Up>
234         _GLIBCXX14_CONSTEXPR
235         auto
236         operator()(_Tp&& __t, _Up&& __u) const
237         noexcept(noexcept(std::forward<_Tp>(__t) + std::forward<_Up>(__u)))
238         -> decltype(std::forward<_Tp>(__t) + std::forward<_Up>(__u))
239         { return std::forward<_Tp>(__t) + std::forward<_Up>(__u); }
240
241       typedef __is_transparent is_transparent;
242     };
243
244   /// One of the @link arithmetic_functors math functors@endlink.
245   template<>
246     struct minus<void>
247     {
248       template <typename _Tp, typename _Up>
249         _GLIBCXX14_CONSTEXPR
250         auto
251         operator()(_Tp&& __t, _Up&& __u) const
252         noexcept(noexcept(std::forward<_Tp>(__t) - std::forward<_Up>(__u)))
253         -> decltype(std::forward<_Tp>(__t) - std::forward<_Up>(__u))
254         { return std::forward<_Tp>(__t) - std::forward<_Up>(__u); }
255
256       typedef __is_transparent is_transparent;
257     };
258
259   /// One of the @link arithmetic_functors math functors@endlink.
260   template<>
261     struct multiplies<void>
262     {
263       template <typename _Tp, typename _Up>
264         _GLIBCXX14_CONSTEXPR
265         auto
266         operator()(_Tp&& __t, _Up&& __u) const
267         noexcept(noexcept(std::forward<_Tp>(__t) * std::forward<_Up>(__u)))
268         -> decltype(std::forward<_Tp>(__t) * std::forward<_Up>(__u))
269         { return std::forward<_Tp>(__t) * std::forward<_Up>(__u); }
270
271       typedef __is_transparent is_transparent;
272     };
273
274   /// One of the @link arithmetic_functors math functors@endlink.
275   template<>
276     struct divides<void>
277     {
278       template <typename _Tp, typename _Up>
279         _GLIBCXX14_CONSTEXPR
280         auto
281         operator()(_Tp&& __t, _Up&& __u) const
282         noexcept(noexcept(std::forward<_Tp>(__t) / std::forward<_Up>(__u)))
283         -> decltype(std::forward<_Tp>(__t) / std::forward<_Up>(__u))
284         { return std::forward<_Tp>(__t) / std::forward<_Up>(__u); }
285
286       typedef __is_transparent is_transparent;
287     };
288
289   /// One of the @link arithmetic_functors math functors@endlink.
290   template<>
291     struct modulus<void>
292     {
293       template <typename _Tp, typename _Up>
294         _GLIBCXX14_CONSTEXPR
295         auto
296         operator()(_Tp&& __t, _Up&& __u) const
297         noexcept(noexcept(std::forward<_Tp>(__t) % std::forward<_Up>(__u)))
298         -> decltype(std::forward<_Tp>(__t) % std::forward<_Up>(__u))
299         { return std::forward<_Tp>(__t) % std::forward<_Up>(__u); }
300
301       typedef __is_transparent is_transparent;
302     };
303
304   /// One of the @link arithmetic_functors math functors@endlink.
305   template<>
306     struct negate<void>
307     {
308       template <typename _Tp>
309         _GLIBCXX14_CONSTEXPR
310         auto
311         operator()(_Tp&& __t) const
312         noexcept(noexcept(-std::forward<_Tp>(__t)))
313         -> decltype(-std::forward<_Tp>(__t))
314         { return -std::forward<_Tp>(__t); }
315
316       typedef __is_transparent is_transparent;
317     };
318 #endif
319   /** @}  */
320
321   // 20.3.3 comparisons
322   /** @defgroup comparison_functors Comparison Classes
323    * @ingroup functors
324    *
325    *  The library provides six wrapper functors for all the basic comparisons
326    *  in C++, like @c <.
327    *
328    *  @{
329    */
330 #if __cplusplus > 201103L
331   template<typename _Tp = void>
332     struct equal_to;
333
334   template<typename _Tp = void>
335     struct not_equal_to;
336
337   template<typename _Tp = void>
338     struct greater;
339
340   template<typename _Tp = void>
341     struct less;
342
343   template<typename _Tp = void>
344     struct greater_equal;
345
346   template<typename _Tp = void>
347     struct less_equal;
348 #endif
349
350   /// One of the @link comparison_functors comparison functors@endlink.
351   template<typename _Tp>
352     struct equal_to : public binary_function<_Tp, _Tp, bool>
353     {
354       _GLIBCXX14_CONSTEXPR
355       bool
356       operator()(const _Tp& __x, const _Tp& __y) const
357       { return __x == __y; }
358     };
359
360   /// One of the @link comparison_functors comparison functors@endlink.
361   template<typename _Tp>
362     struct not_equal_to : public binary_function<_Tp, _Tp, bool>
363     {
364       _GLIBCXX14_CONSTEXPR
365       bool
366       operator()(const _Tp& __x, const _Tp& __y) const
367       { return __x != __y; }
368     };
369
370   /// One of the @link comparison_functors comparison functors@endlink.
371   template<typename _Tp>
372     struct greater : public binary_function<_Tp, _Tp, bool>
373     {
374       _GLIBCXX14_CONSTEXPR
375       bool
376       operator()(const _Tp& __x, const _Tp& __y) const
377       { return __x > __y; }
378     };
379
380   /// One of the @link comparison_functors comparison functors@endlink.
381   template<typename _Tp>
382     struct less : public binary_function<_Tp, _Tp, bool>
383     {
384       _GLIBCXX14_CONSTEXPR
385       bool
386       operator()(const _Tp& __x, const _Tp& __y) const
387       { return __x < __y; }
388     };
389
390   /// One of the @link comparison_functors comparison functors@endlink.
391   template<typename _Tp>
392     struct greater_equal : public binary_function<_Tp, _Tp, bool>
393     {
394       _GLIBCXX14_CONSTEXPR
395       bool
396       operator()(const _Tp& __x, const _Tp& __y) const
397       { return __x >= __y; }
398     };
399
400   /// One of the @link comparison_functors comparison functors@endlink.
401   template<typename _Tp>
402     struct less_equal : public binary_function<_Tp, _Tp, bool>
403     {
404       _GLIBCXX14_CONSTEXPR
405       bool
406       operator()(const _Tp& __x, const _Tp& __y) const
407       { return __x <= __y; }
408     };
409
410 #if __cplusplus > 201103L
411   /// One of the @link comparison_functors comparison functors@endlink.
412   template<>
413     struct equal_to<void>
414     {
415       template <typename _Tp, typename _Up>
416         _GLIBCXX14_CONSTEXPR
417         auto
418         operator()(_Tp&& __t, _Up&& __u) const
419         noexcept(noexcept(std::forward<_Tp>(__t) == std::forward<_Up>(__u)))
420         -> decltype(std::forward<_Tp>(__t) == std::forward<_Up>(__u))
421         { return std::forward<_Tp>(__t) == std::forward<_Up>(__u); }
422
423       typedef __is_transparent is_transparent;
424     };
425
426   /// One of the @link comparison_functors comparison functors@endlink.
427   template<>
428     struct not_equal_to<void>
429     {
430       template <typename _Tp, typename _Up>
431         _GLIBCXX14_CONSTEXPR
432         auto
433         operator()(_Tp&& __t, _Up&& __u) const
434         noexcept(noexcept(std::forward<_Tp>(__t) != std::forward<_Up>(__u)))
435         -> decltype(std::forward<_Tp>(__t) != std::forward<_Up>(__u))
436         { return std::forward<_Tp>(__t) != std::forward<_Up>(__u); }
437
438       typedef __is_transparent is_transparent;
439     };
440
441   /// One of the @link comparison_functors comparison functors@endlink.
442   template<>
443     struct greater<void>
444     {
445       template <typename _Tp, typename _Up>
446         _GLIBCXX14_CONSTEXPR
447         auto
448         operator()(_Tp&& __t, _Up&& __u) const
449         noexcept(noexcept(std::forward<_Tp>(__t) > std::forward<_Up>(__u)))
450         -> decltype(std::forward<_Tp>(__t) > std::forward<_Up>(__u))
451         { return std::forward<_Tp>(__t) > std::forward<_Up>(__u); }
452
453       typedef __is_transparent is_transparent;
454     };
455
456   /// One of the @link comparison_functors comparison functors@endlink.
457   template<>
458     struct less<void>
459     {
460       template <typename _Tp, typename _Up>
461         _GLIBCXX14_CONSTEXPR
462         auto
463         operator()(_Tp&& __t, _Up&& __u) const
464         noexcept(noexcept(std::forward<_Tp>(__t) < std::forward<_Up>(__u)))
465         -> decltype(std::forward<_Tp>(__t) < std::forward<_Up>(__u))
466         { return std::forward<_Tp>(__t) < std::forward<_Up>(__u); }
467
468       typedef __is_transparent is_transparent;
469     };
470
471   /// One of the @link comparison_functors comparison functors@endlink.
472   template<>
473     struct greater_equal<void>
474     {
475       template <typename _Tp, typename _Up>
476         _GLIBCXX14_CONSTEXPR
477         auto
478         operator()(_Tp&& __t, _Up&& __u) const
479         noexcept(noexcept(std::forward<_Tp>(__t) >= std::forward<_Up>(__u)))
480         -> decltype(std::forward<_Tp>(__t) >= std::forward<_Up>(__u))
481         { return std::forward<_Tp>(__t) >= std::forward<_Up>(__u); }
482
483       typedef __is_transparent is_transparent;
484     };
485
486   /// One of the @link comparison_functors comparison functors@endlink.
487   template<>
488     struct less_equal<void>
489     {
490       template <typename _Tp, typename _Up>
491         _GLIBCXX14_CONSTEXPR
492         auto
493         operator()(_Tp&& __t, _Up&& __u) const
494         noexcept(noexcept(std::forward<_Tp>(__t) <= std::forward<_Up>(__u)))
495         -> decltype(std::forward<_Tp>(__t) <= std::forward<_Up>(__u))
496         { return std::forward<_Tp>(__t) <= std::forward<_Up>(__u); }
497
498       typedef __is_transparent is_transparent;
499     };
500 #endif
501   /** @}  */
502
503   // 20.3.4 logical operations
504   /** @defgroup logical_functors Boolean Operations Classes
505    * @ingroup functors
506    *
507    *  Here are wrapper functors for Boolean operations: @c &&, @c ||,
508    *  and @c !.
509    *
510    *  @{
511    */
512 #if __cplusplus > 201103L
513   template<typename _Tp = void>
514     struct logical_and;
515
516   template<typename _Tp = void>
517     struct logical_or;
518
519   template<typename _Tp = void>
520     struct logical_not;
521 #endif
522
523   /// One of the @link logical_functors Boolean operations functors@endlink.
524   template<typename _Tp>
525     struct logical_and : public binary_function<_Tp, _Tp, bool>
526     {
527       _GLIBCXX14_CONSTEXPR
528       bool
529       operator()(const _Tp& __x, const _Tp& __y) const
530       { return __x && __y; }
531     };
532
533   /// One of the @link logical_functors Boolean operations functors@endlink.
534   template<typename _Tp>
535     struct logical_or : public binary_function<_Tp, _Tp, bool>
536     {
537       _GLIBCXX14_CONSTEXPR
538       bool
539       operator()(const _Tp& __x, const _Tp& __y) const
540       { return __x || __y; }
541     };
542
543   /// One of the @link logical_functors Boolean operations functors@endlink.
544   template<typename _Tp>
545     struct logical_not : public unary_function<_Tp, bool>
546     {
547       _GLIBCXX14_CONSTEXPR
548       bool
549       operator()(const _Tp& __x) const
550       { return !__x; }
551     };
552
553 #if __cplusplus > 201103L
554   /// One of the @link logical_functors Boolean operations functors@endlink.
555   template<>
556     struct logical_and<void>
557     {
558       template <typename _Tp, typename _Up>
559         _GLIBCXX14_CONSTEXPR
560         auto
561         operator()(_Tp&& __t, _Up&& __u) const
562         noexcept(noexcept(std::forward<_Tp>(__t) && std::forward<_Up>(__u)))
563         -> decltype(std::forward<_Tp>(__t) && std::forward<_Up>(__u))
564         { return std::forward<_Tp>(__t) && std::forward<_Up>(__u); }
565
566       typedef __is_transparent is_transparent;
567     };
568
569   /// One of the @link logical_functors Boolean operations functors@endlink.
570   template<>
571     struct logical_or<void>
572     {
573       template <typename _Tp, typename _Up>
574         _GLIBCXX14_CONSTEXPR
575         auto
576         operator()(_Tp&& __t, _Up&& __u) const
577         noexcept(noexcept(std::forward<_Tp>(__t) || std::forward<_Up>(__u)))
578         -> decltype(std::forward<_Tp>(__t) || std::forward<_Up>(__u))
579         { return std::forward<_Tp>(__t) || std::forward<_Up>(__u); }
580
581       typedef __is_transparent is_transparent;
582     };
583
584   /// One of the @link logical_functors Boolean operations functors@endlink.
585   template<>
586     struct logical_not<void>
587     {
588       template <typename _Tp>
589         _GLIBCXX14_CONSTEXPR
590         auto
591         operator()(_Tp&& __t) const
592         noexcept(noexcept(!std::forward<_Tp>(__t)))
593         -> decltype(!std::forward<_Tp>(__t))
594         { return !std::forward<_Tp>(__t); }
595
596       typedef __is_transparent is_transparent;
597     };
598 #endif
599   /** @}  */
600
601 #if __cplusplus > 201103L
602   template<typename _Tp = void>
603     struct bit_and;
604
605   template<typename _Tp = void>
606     struct bit_or;
607
608   template<typename _Tp = void>
609     struct bit_xor;
610
611   template<typename _Tp = void>
612     struct bit_not;
613 #endif
614
615   // _GLIBCXX_RESOLVE_LIB_DEFECTS
616   // DR 660. Missing Bitwise Operations.
617   template<typename _Tp>
618     struct bit_and : public binary_function<_Tp, _Tp, _Tp>
619     {
620       _GLIBCXX14_CONSTEXPR
621       _Tp
622       operator()(const _Tp& __x, const _Tp& __y) const
623       { return __x & __y; }
624     };
625
626   template<typename _Tp>
627     struct bit_or : public binary_function<_Tp, _Tp, _Tp>
628     {
629       _GLIBCXX14_CONSTEXPR
630       _Tp
631       operator()(const _Tp& __x, const _Tp& __y) const
632       { return __x | __y; }
633     };
634
635   template<typename _Tp>
636     struct bit_xor : public binary_function<_Tp, _Tp, _Tp>
637     {
638       _GLIBCXX14_CONSTEXPR
639       _Tp
640       operator()(const _Tp& __x, const _Tp& __y) const
641       { return __x ^ __y; }
642     };
643
644   template<typename _Tp>
645     struct bit_not : public unary_function<_Tp, _Tp>
646     {
647     _GLIBCXX14_CONSTEXPR
648       _Tp
649       operator()(const _Tp& __x) const
650       { return ~__x; }
651     };
652
653 #if __cplusplus > 201103L
654   template <>
655     struct bit_and<void>
656     {
657       template <typename _Tp, typename _Up>
658         _GLIBCXX14_CONSTEXPR
659         auto
660         operator()(_Tp&& __t, _Up&& __u) const
661         noexcept(noexcept(std::forward<_Tp>(__t) & std::forward<_Up>(__u)))
662         -> decltype(std::forward<_Tp>(__t) & std::forward<_Up>(__u))
663         { return std::forward<_Tp>(__t) & std::forward<_Up>(__u); }
664
665       typedef __is_transparent is_transparent;
666     };
667
668   template <>
669     struct bit_or<void>
670     {
671       template <typename _Tp, typename _Up>
672         _GLIBCXX14_CONSTEXPR
673         auto
674         operator()(_Tp&& __t, _Up&& __u) const
675         noexcept(noexcept(std::forward<_Tp>(__t) | std::forward<_Up>(__u)))
676         -> decltype(std::forward<_Tp>(__t) | std::forward<_Up>(__u))
677         { return std::forward<_Tp>(__t) | std::forward<_Up>(__u); }
678
679       typedef __is_transparent is_transparent;
680     };
681
682   template <>
683     struct bit_xor<void>
684     {
685       template <typename _Tp, typename _Up>
686         _GLIBCXX14_CONSTEXPR
687         auto
688         operator()(_Tp&& __t, _Up&& __u) const
689         noexcept(noexcept(std::forward<_Tp>(__t) ^ std::forward<_Up>(__u)))
690         -> decltype(std::forward<_Tp>(__t) ^ std::forward<_Up>(__u))
691         { return std::forward<_Tp>(__t) ^ std::forward<_Up>(__u); }
692
693       typedef __is_transparent is_transparent;
694     };
695
696   template <>
697     struct bit_not<void>
698     {
699       template <typename _Tp>
700         _GLIBCXX14_CONSTEXPR
701         auto
702         operator()(_Tp&& __t) const
703         noexcept(noexcept(~std::forward<_Tp>(__t)))
704         -> decltype(~std::forward<_Tp>(__t))
705         { return ~std::forward<_Tp>(__t); }
706
707       typedef __is_transparent is_transparent;
708     };
709 #endif
710
711   // 20.3.5 negators
712   /** @defgroup negators Negators
713    * @ingroup functors
714    *
715    *  The functions @c not1 and @c not2 each take a predicate functor
716    *  and return an instance of @c unary_negate or
717    *  @c binary_negate, respectively.  These classes are functors whose
718    *  @c operator() performs the stored predicate function and then returns
719    *  the negation of the result.
720    *
721    *  For example, given a vector of integers and a trivial predicate,
722    *  \code
723    *  struct IntGreaterThanThree
724    *    : public std::unary_function<int, bool>
725    *  {
726    *      bool operator() (int x) { return x > 3; }
727    *  };
728    *
729    *  std::find_if (v.begin(), v.end(), not1(IntGreaterThanThree()));
730    *  \endcode
731    *  The call to @c find_if will locate the first index (i) of @c v for which
732    *  <code>!(v[i] > 3)</code> is true.
733    *
734    *  The not1/unary_negate combination works on predicates taking a single
735    *  argument.  The not2/binary_negate combination works on predicates which
736    *  take two arguments.
737    *
738    *  @{
739    */
740   /// One of the @link negators negation functors@endlink.
741   template<typename _Predicate>
742     class unary_negate
743     : public unary_function<typename _Predicate::argument_type, bool>
744     {
745     protected:
746       _Predicate _M_pred;
747
748     public:
749       _GLIBCXX14_CONSTEXPR
750       explicit
751       unary_negate(const _Predicate& __x) : _M_pred(__x) { }
752
753       _GLIBCXX14_CONSTEXPR
754       bool
755       operator()(const typename _Predicate::argument_type& __x) const
756       { return !_M_pred(__x); }
757     };
758
759   /// One of the @link negators negation functors@endlink.
760   template<typename _Predicate>
761     _GLIBCXX14_CONSTEXPR
762     inline unary_negate<_Predicate>
763     not1(const _Predicate& __pred)
764     { return unary_negate<_Predicate>(__pred); }
765
766   /// One of the @link negators negation functors@endlink.
767   template<typename _Predicate>
768     class binary_negate
769     : public binary_function<typename _Predicate::first_argument_type,
770                              typename _Predicate::second_argument_type, bool>
771     {
772     protected:
773       _Predicate _M_pred;
774
775     public:
776       _GLIBCXX14_CONSTEXPR
777       explicit
778       binary_negate(const _Predicate& __x) : _M_pred(__x) { }
779
780       _GLIBCXX14_CONSTEXPR
781       bool
782       operator()(const typename _Predicate::first_argument_type& __x,
783                  const typename _Predicate::second_argument_type& __y) const
784       { return !_M_pred(__x, __y); }
785     };
786
787   /// One of the @link negators negation functors@endlink.
788   template<typename _Predicate>
789     _GLIBCXX14_CONSTEXPR
790     inline binary_negate<_Predicate>
791     not2(const _Predicate& __pred)
792     { return binary_negate<_Predicate>(__pred); }
793   /** @}  */
794
795   // 20.3.7 adaptors pointers functions
796   /** @defgroup pointer_adaptors Adaptors for pointers to functions
797    * @ingroup functors
798    *
799    *  The advantage of function objects over pointers to functions is that
800    *  the objects in the standard library declare nested typedefs describing
801    *  their argument and result types with uniform names (e.g., @c result_type
802    *  from the base classes @c unary_function and @c binary_function).
803    *  Sometimes those typedefs are required, not just optional.
804    *
805    *  Adaptors are provided to turn pointers to unary (single-argument) and
806    *  binary (double-argument) functions into function objects.  The
807    *  long-winded functor @c pointer_to_unary_function is constructed with a
808    *  function pointer @c f, and its @c operator() called with argument @c x
809    *  returns @c f(x).  The functor @c pointer_to_binary_function does the same
810    *  thing, but with a double-argument @c f and @c operator().
811    *
812    *  The function @c ptr_fun takes a pointer-to-function @c f and constructs
813    *  an instance of the appropriate functor.
814    *
815    *  @{
816    */
817   /// One of the @link pointer_adaptors adaptors for function pointers@endlink.
818   template<typename _Arg, typename _Result>
819     class pointer_to_unary_function : public unary_function<_Arg, _Result>
820     {
821     protected:
822       _Result (*_M_ptr)(_Arg);
823
824     public:
825       pointer_to_unary_function() { }
826
827       explicit
828       pointer_to_unary_function(_Result (*__x)(_Arg))
829       : _M_ptr(__x) { }
830
831       _Result
832       operator()(_Arg __x) const
833       { return _M_ptr(__x); }
834     };
835
836   /// One of the @link pointer_adaptors adaptors for function pointers@endlink.
837   template<typename _Arg, typename _Result>
838     inline pointer_to_unary_function<_Arg, _Result>
839     ptr_fun(_Result (*__x)(_Arg))
840     { return pointer_to_unary_function<_Arg, _Result>(__x); }
841
842   /// One of the @link pointer_adaptors adaptors for function pointers@endlink.
843   template<typename _Arg1, typename _Arg2, typename _Result>
844     class pointer_to_binary_function
845     : public binary_function<_Arg1, _Arg2, _Result>
846     {
847     protected:
848       _Result (*_M_ptr)(_Arg1, _Arg2);
849
850     public:
851       pointer_to_binary_function() { }
852
853       explicit
854       pointer_to_binary_function(_Result (*__x)(_Arg1, _Arg2))
855       : _M_ptr(__x) { }
856
857       _Result
858       operator()(_Arg1 __x, _Arg2 __y) const
859       { return _M_ptr(__x, __y); }
860     };
861
862   /// One of the @link pointer_adaptors adaptors for function pointers@endlink.
863   template<typename _Arg1, typename _Arg2, typename _Result>
864     inline pointer_to_binary_function<_Arg1, _Arg2, _Result>
865     ptr_fun(_Result (*__x)(_Arg1, _Arg2))
866     { return pointer_to_binary_function<_Arg1, _Arg2, _Result>(__x); }
867   /** @}  */
868
869   template<typename _Tp>
870     struct _Identity
871     : public unary_function<_Tp,_Tp>
872     {
873       _Tp&
874       operator()(_Tp& __x) const
875       { return __x; }
876
877       const _Tp&
878       operator()(const _Tp& __x) const
879       { return __x; }
880     };
881
882   template<typename _Pair>
883     struct _Select1st
884     : public unary_function<_Pair, typename _Pair::first_type>
885     {
886       typename _Pair::first_type&
887       operator()(_Pair& __x) const
888       { return __x.first; }
889
890       const typename _Pair::first_type&
891       operator()(const _Pair& __x) const
892       { return __x.first; }
893
894 #if __cplusplus >= 201103L
895       template<typename _Pair2>
896         typename _Pair2::first_type&
897         operator()(_Pair2& __x) const
898         { return __x.first; }
899
900       template<typename _Pair2>
901         const typename _Pair2::first_type&
902         operator()(const _Pair2& __x) const
903         { return __x.first; }
904 #endif
905     };
906
907   template<typename _Pair>
908     struct _Select2nd
909     : public unary_function<_Pair, typename _Pair::second_type>
910     {
911       typename _Pair::second_type&
912       operator()(_Pair& __x) const
913       { return __x.second; }
914
915       const typename _Pair::second_type&
916       operator()(const _Pair& __x) const
917       { return __x.second; }
918     };
919
920   // 20.3.8 adaptors pointers members
921   /** @defgroup memory_adaptors Adaptors for pointers to members
922    * @ingroup functors
923    *
924    *  There are a total of 8 = 2^3 function objects in this family.
925    *   (1) Member functions taking no arguments vs member functions taking
926    *        one argument.
927    *   (2) Call through pointer vs call through reference.
928    *   (3) Const vs non-const member function.
929    *
930    *  All of this complexity is in the function objects themselves.  You can
931    *   ignore it by using the helper function mem_fun and mem_fun_ref,
932    *   which create whichever type of adaptor is appropriate.
933    *
934    *  @{
935    */
936   /// One of the @link memory_adaptors adaptors for member
937   /// pointers@endlink.
938   template<typename _Ret, typename _Tp>
939     class mem_fun_t : public unary_function<_Tp*, _Ret>
940     {
941     public:
942       explicit
943       mem_fun_t(_Ret (_Tp::*__pf)())
944       : _M_f(__pf) { }
945
946       _Ret
947       operator()(_Tp* __p) const
948       { return (__p->*_M_f)(); }
949
950     private:
951       _Ret (_Tp::*_M_f)();
952     };
953
954   /// One of the @link memory_adaptors adaptors for member
955   /// pointers@endlink.
956   template<typename _Ret, typename _Tp>
957     class const_mem_fun_t : public unary_function<const _Tp*, _Ret>
958     {
959     public:
960       explicit
961       const_mem_fun_t(_Ret (_Tp::*__pf)() const)
962       : _M_f(__pf) { }
963
964       _Ret
965       operator()(const _Tp* __p) const
966       { return (__p->*_M_f)(); }
967
968     private:
969       _Ret (_Tp::*_M_f)() const;
970     };
971
972   /// One of the @link memory_adaptors adaptors for member
973   /// pointers@endlink.
974   template<typename _Ret, typename _Tp>
975     class mem_fun_ref_t : public unary_function<_Tp, _Ret>
976     {
977     public:
978       explicit
979       mem_fun_ref_t(_Ret (_Tp::*__pf)())
980       : _M_f(__pf) { }
981
982       _Ret
983       operator()(_Tp& __r) const
984       { return (__r.*_M_f)(); }
985
986     private:
987       _Ret (_Tp::*_M_f)();
988   };
989
990   /// One of the @link memory_adaptors adaptors for member
991   /// pointers@endlink.
992   template<typename _Ret, typename _Tp>
993     class const_mem_fun_ref_t : public unary_function<_Tp, _Ret>
994     {
995     public:
996       explicit
997       const_mem_fun_ref_t(_Ret (_Tp::*__pf)() const)
998       : _M_f(__pf) { }
999
1000       _Ret
1001       operator()(const _Tp& __r) const
1002       { return (__r.*_M_f)(); }
1003
1004     private:
1005       _Ret (_Tp::*_M_f)() const;
1006     };
1007
1008   /// One of the @link memory_adaptors adaptors for member
1009   /// pointers@endlink.
1010   template<typename _Ret, typename _Tp, typename _Arg>
1011     class mem_fun1_t : public binary_function<_Tp*, _Arg, _Ret>
1012     {
1013     public:
1014       explicit
1015       mem_fun1_t(_Ret (_Tp::*__pf)(_Arg))
1016       : _M_f(__pf) { }
1017
1018       _Ret
1019       operator()(_Tp* __p, _Arg __x) const
1020       { return (__p->*_M_f)(__x); }
1021
1022     private:
1023       _Ret (_Tp::*_M_f)(_Arg);
1024     };
1025
1026   /// One of the @link memory_adaptors adaptors for member
1027   /// pointers@endlink.
1028   template<typename _Ret, typename _Tp, typename _Arg>
1029     class const_mem_fun1_t : public binary_function<const _Tp*, _Arg, _Ret>
1030     {
1031     public:
1032       explicit
1033       const_mem_fun1_t(_Ret (_Tp::*__pf)(_Arg) const)
1034       : _M_f(__pf) { }
1035
1036       _Ret
1037       operator()(const _Tp* __p, _Arg __x) const
1038       { return (__p->*_M_f)(__x); }
1039
1040     private:
1041       _Ret (_Tp::*_M_f)(_Arg) const;
1042     };
1043
1044   /// One of the @link memory_adaptors adaptors for member
1045   /// pointers@endlink.
1046   template<typename _Ret, typename _Tp, typename _Arg>
1047     class mem_fun1_ref_t : public binary_function<_Tp, _Arg, _Ret>
1048     {
1049     public:
1050       explicit
1051       mem_fun1_ref_t(_Ret (_Tp::*__pf)(_Arg))
1052       : _M_f(__pf) { }
1053
1054       _Ret
1055       operator()(_Tp& __r, _Arg __x) const
1056       { return (__r.*_M_f)(__x); }
1057
1058     private:
1059       _Ret (_Tp::*_M_f)(_Arg);
1060     };
1061
1062   /// One of the @link memory_adaptors adaptors for member
1063   /// pointers@endlink.
1064   template<typename _Ret, typename _Tp, typename _Arg>
1065     class const_mem_fun1_ref_t : public binary_function<_Tp, _Arg, _Ret>
1066     {
1067     public:
1068       explicit
1069       const_mem_fun1_ref_t(_Ret (_Tp::*__pf)(_Arg) const)
1070       : _M_f(__pf) { }
1071
1072       _Ret
1073       operator()(const _Tp& __r, _Arg __x) const
1074       { return (__r.*_M_f)(__x); }
1075
1076     private:
1077       _Ret (_Tp::*_M_f)(_Arg) const;
1078     };
1079
1080   // Mem_fun adaptor helper functions.  There are only two:
1081   // mem_fun and mem_fun_ref.
1082   template<typename _Ret, typename _Tp>
1083     inline mem_fun_t<_Ret, _Tp>
1084     mem_fun(_Ret (_Tp::*__f)())
1085     { return mem_fun_t<_Ret, _Tp>(__f); }
1086
1087   template<typename _Ret, typename _Tp>
1088     inline const_mem_fun_t<_Ret, _Tp>
1089     mem_fun(_Ret (_Tp::*__f)() const)
1090     { return const_mem_fun_t<_Ret, _Tp>(__f); }
1091
1092   template<typename _Ret, typename _Tp>
1093     inline mem_fun_ref_t<_Ret, _Tp>
1094     mem_fun_ref(_Ret (_Tp::*__f)())
1095     { return mem_fun_ref_t<_Ret, _Tp>(__f); }
1096
1097   template<typename _Ret, typename _Tp>
1098     inline const_mem_fun_ref_t<_Ret, _Tp>
1099     mem_fun_ref(_Ret (_Tp::*__f)() const)
1100     { return const_mem_fun_ref_t<_Ret, _Tp>(__f); }
1101
1102   template<typename _Ret, typename _Tp, typename _Arg>
1103     inline mem_fun1_t<_Ret, _Tp, _Arg>
1104     mem_fun(_Ret (_Tp::*__f)(_Arg))
1105     { return mem_fun1_t<_Ret, _Tp, _Arg>(__f); }
1106
1107   template<typename _Ret, typename _Tp, typename _Arg>
1108     inline const_mem_fun1_t<_Ret, _Tp, _Arg>
1109     mem_fun(_Ret (_Tp::*__f)(_Arg) const)
1110     { return const_mem_fun1_t<_Ret, _Tp, _Arg>(__f); }
1111
1112   template<typename _Ret, typename _Tp, typename _Arg>
1113     inline mem_fun1_ref_t<_Ret, _Tp, _Arg>
1114     mem_fun_ref(_Ret (_Tp::*__f)(_Arg))
1115     { return mem_fun1_ref_t<_Ret, _Tp, _Arg>(__f); }
1116
1117   template<typename _Ret, typename _Tp, typename _Arg>
1118     inline const_mem_fun1_ref_t<_Ret, _Tp, _Arg>
1119     mem_fun_ref(_Ret (_Tp::*__f)(_Arg) const)
1120     { return const_mem_fun1_ref_t<_Ret, _Tp, _Arg>(__f); }
1121
1122   /** @}  */
1123
1124 _GLIBCXX_END_NAMESPACE_VERSION
1125 } // namespace
1126
1127 #if (__cplusplus < 201103L) || _GLIBCXX_USE_DEPRECATED
1128 # include <backward/binders.h>
1129 #endif
1130
1131 #endif /* _STL_FUNCTION_H */