libstdc++
stl_function.h
Go to the documentation of this file.
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>
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>
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>
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>
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
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>
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
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:
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>
839  ptr_fun(_Result (*__x)(_Arg))
841 
842  /// One of the @link pointer_adaptors adaptors for function pointers@endlink.
843  template<typename _Arg1, typename _Arg2, typename _Result>
845  : public binary_function<_Arg1, _Arg2, _Result>
846  {
847  protected:
848  _Result (*_M_ptr)(_Arg1, _Arg2);
849 
850  public:
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>
865  ptr_fun(_Result (*__x)(_Arg1, _Arg2))
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>
1089  mem_fun(_Ret (_Tp::*__f)() const)
1090  { return const_mem_fun_t<_Ret, _Tp>(__f); }
1091 
1092  template<typename _Ret, typename _Tp>
1094  mem_fun_ref(_Ret (_Tp::*__f)())
1095  { return mem_fun_ref_t<_Ret, _Tp>(__f); }
1096 
1097  template<typename _Ret, typename _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>
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>
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>
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>
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 */
_Arg argument_type
argument_type is the type of the argument
Definition: stl_function.h:108
One of the adaptors for function pointers.
Definition: stl_function.h:819
One of the adaptors for member pointers.
Definition: stl_function.h:975
One of the Boolean operations functors.
Definition: stl_function.h:514
_GLIBCXX14_CONSTEXPR binary_negate< _Predicate > not2(const _Predicate &__pred)
One of the negation functors.
Definition: stl_function.h:791
One of the comparison functors.
Definition: stl_function.h:344
One of the math functors.
Definition: stl_function.h:156
One of the math functors.
Definition: stl_function.h:162
One of the negation functors.
Definition: stl_function.h:742
_Arg2 second_argument_type
second_argument_type is the type of the second argument
Definition: stl_function.h:124
_Result result_type
result_type is the return type
Definition: stl_function.h:127
One of the negation functors.
Definition: stl_function.h:768
One of the adaptors for function pointers.
Definition: stl_function.h:844
constexpr _Tp && forward(typename std::remove_reference< _Tp >::type &__t) noexcept
Forward an lvalue.
Definition: move.h:76
One of the adaptors for member pointers.
One of the math functors.
Definition: stl_function.h:153
One of the adaptors for member pointers.
Definition: stl_function.h:993
pointer_to_unary_function< _Arg, _Result > ptr_fun(_Result(*__x)(_Arg))
One of the adaptors for function pointers.
Definition: stl_function.h:839
One of the adaptors for member pointers.
_Result result_type
result_type is the return type
Definition: stl_function.h:111
One of the math functors.
Definition: stl_function.h:159
One of the adaptors for member pointers.
One of the Boolean operations functors.
Definition: stl_function.h:520
One of the comparison functors.
Definition: stl_function.h:341
One of the comparison functors.
Definition: stl_function.h:332
One of the math functors.
Definition: stl_function.h:147
One of the adaptors for member pointers.
_GLIBCXX14_CONSTEXPR unary_negate< _Predicate > not1(const _Predicate &__pred)
One of the negation functors.
Definition: stl_function.h:763
_Arg1 first_argument_type
first_argument_type is the type of the first argument
Definition: stl_function.h:121
One of the comparison functors.
Definition: stl_function.h:338
One of the adaptors for member pointers.
Definition: stl_function.h:939
One of the Boolean operations functors.
Definition: stl_function.h:517
One of the comparison functors.
Definition: stl_function.h:335
ISO C++ entities toplevel namespace is std.
One of the adaptors for member pointers.
Definition: stl_function.h:957
One of the math functors.
Definition: stl_function.h:150
One of the comparison functors.
Definition: stl_function.h:347