Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
6554 serge 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
// .
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 
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());
87
   *  \endcode
88
   *  To negate every element in @c a, use
89
   *  \code
90
   *  transform(a.begin(), a.end(), a.begin(), negate());
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
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
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
147
    struct plus;
148
 
149
  template
150
    struct minus;
151
 
152
  template
153
    struct multiplies;
154
 
155
  template
156
    struct divides;
157
 
158
  template
159
    struct modulus;
160
 
161
  template
162
    struct negate;
163
#endif
164
 
165
  /// One of the @link arithmetic_functors math functors@endlink.
166
  template
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
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
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
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
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
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
232
    {
233
      template 
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
247
    {
248
      template 
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
262
    {
263
      template 
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
277
    {
278
      template 
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
292
    {
293
      template 
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
307
    {
308
      template 
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
332
    struct equal_to;
333
 
334
  template
335
    struct not_equal_to;
336
 
337
  template
338
    struct greater;
339
 
340
  template
341
    struct less;
342
 
343
  template
344
    struct greater_equal;
345
 
346
  template
347
    struct less_equal;
348
#endif
349
 
350
  /// One of the @link comparison_functors comparison functors@endlink.
351
  template
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
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
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
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
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
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
414
    {
415
      template 
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
429
    {
430
      template 
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
444
    {
445
      template 
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
459
    {
460
      template 
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
474
    {
475
      template 
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
489
    {
490
      template 
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
514
    struct logical_and;
515
 
516
  template
517
    struct logical_or;
518
 
519
  template
520
    struct logical_not;
521
#endif
522
 
523
  /// One of the @link logical_functors Boolean operations functors@endlink.
524
  template
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
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
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
557
    {
558
      template 
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
572
    {
573
      template 
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
587
    {
588
      template 
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
603
    struct bit_and;
604
 
605
  template
606
    struct bit_or;
607
 
608
  template
609
    struct bit_xor;
610
 
611
  template
612
    struct bit_not;
613
#endif
614
 
615
  // _GLIBCXX_RESOLVE_LIB_DEFECTS
616
  // DR 660. Missing Bitwise Operations.
617
  template
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
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
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
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
656
    {
657
      template 
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
670
    {
671
      template 
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
684
    {
685
      template 
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
698
    {
699
      template 
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
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
   *  !(v[i] > 3) 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
742
    class unary_negate
743
    : public unary_function
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
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
768
    class binary_negate
769
    : public binary_function
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
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
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
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
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
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
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
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
896
        typename _Pair2::first_type&
897
        operator()(_Pair2& __x) const
898
        { return __x.first; }
899
 
900
      template
901
        const typename _Pair2::first_type&
902
        operator()(const _Pair2& __x) const
903
        { return __x.first; }
904
#endif
905
    };
906
 
907
  template
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
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
957
    class const_mem_fun_t : public unary_function
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
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
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
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
1029
    class const_mem_fun1_t : public binary_function
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
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
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
1083
    inline mem_fun_t<_Ret, _Tp>
1084
    mem_fun(_Ret (_Tp::*__f)())
1085
    { return mem_fun_t<_Ret, _Tp>(__f); }
1086
 
1087
  template
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
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
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
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
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
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
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 
1129
#endif
1130
 
1131
#endif /* _STL_FUNCTION_H */