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 
_GLIBCXX_VISIBILITY(default)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 */
1132