Project

General

Profile

Statistics
| Revision:

root / lab4 / .minix-src / include / c++ / functional @ 13

History | View | Annotate | Download (72.4 KB)

1
// -*- C++ -*-
2
//===------------------------ functional ----------------------------------===//
3
//
4
//                     The LLVM Compiler Infrastructure
5
//
6
// This file is dual licensed under the MIT and the University of Illinois Open
7
// Source Licenses. See LICENSE.TXT for details.
8
//
9
//===----------------------------------------------------------------------===//
10

    
11
#ifndef _LIBCPP_FUNCTIONAL
12
#define _LIBCPP_FUNCTIONAL
13

    
14
/*
15
    functional synopsis
16

    
17
namespace std
18
{
19

    
20
template <class Arg, class Result>
21
struct unary_function
22
{
23
    typedef Arg    argument_type;
24
    typedef Result result_type;
25
};
26

    
27
template <class Arg1, class Arg2, class Result>
28
struct binary_function
29
{
30
    typedef Arg1   first_argument_type;
31
    typedef Arg2   second_argument_type;
32
    typedef Result result_type;
33
};
34

    
35
template <class T>
36
class reference_wrapper
37
    : public unary_function<T1, R> // if wrapping a unary functor
38
    : public binary_function<T1, T2, R> // if wraping a binary functor
39
{
40
public:
41
    // types
42
    typedef T type;
43
    typedef see below result_type; // Not always defined
44

    
45
    // construct/copy/destroy
46
    reference_wrapper(T&) noexcept;
47
    reference_wrapper(T&&) = delete; // do not bind to temps
48
    reference_wrapper(const reference_wrapper<T>& x) noexcept;
49

    
50
    // assignment
51
    reference_wrapper& operator=(const reference_wrapper<T>& x) noexcept;
52

    
53
    // access
54
    operator T& () const noexcept;
55
    T& get() const noexcept;
56

    
57
    // invoke
58
    template <class... ArgTypes>
59
      typename result_of<T&(ArgTypes&&...)>::type
60
          operator() (ArgTypes&&...) const;
61
};
62

    
63
template <class T> reference_wrapper<T> ref(T& t) noexcept;
64
template <class T> void ref(const T&& t) = delete;
65
template <class T> reference_wrapper<T> ref(reference_wrapper<T>t) noexcept;
66

    
67
template <class T> reference_wrapper<const T> cref(const T& t) noexcept;
68
template <class T> void cref(const T&& t) = delete;
69
template <class T> reference_wrapper<const T> cref(reference_wrapper<T> t) noexcept;
70

    
71
template <class T> // <class T=void> in C++14
72
struct plus : binary_function<T, T, T>
73
{
74
    T operator()(const T& x, const T& y) const;
75
};
76

    
77
template <class T> // <class T=void> in C++14
78
struct minus : binary_function<T, T, T>
79
{
80
    T operator()(const T& x, const T& y) const;
81
};
82

    
83
template <class T> // <class T=void> in C++14
84
struct multiplies : binary_function<T, T, T>
85
{
86
    T operator()(const T& x, const T& y) const;
87
};
88

    
89
template <class T> // <class T=void> in C++14
90
struct divides : binary_function<T, T, T>
91
{
92
    T operator()(const T& x, const T& y) const;
93
};
94

    
95
template <class T> // <class T=void> in C++14
96
struct modulus : binary_function<T, T, T>
97
{
98
    T operator()(const T& x, const T& y) const;
99
};
100

    
101
template <class T> // <class T=void> in C++14
102
struct negate : unary_function<T, T>
103
{
104
    T operator()(const T& x) const;
105
};
106

    
107
template <class T> // <class T=void> in C++14
108
struct equal_to : binary_function<T, T, bool>
109
{
110
    bool operator()(const T& x, const T& y) const;
111
};
112

    
113
template <class T> // <class T=void> in C++14
114
struct not_equal_to : binary_function<T, T, bool>
115
{
116
    bool operator()(const T& x, const T& y) const;
117
};
118

    
119
template <class T> // <class T=void> in C++14
120
struct greater : binary_function<T, T, bool>
121
{
122
    bool operator()(const T& x, const T& y) const;
123
};
124

    
125
template <class T> // <class T=void> in C++14
126
struct less : binary_function<T, T, bool>
127
{
128
    bool operator()(const T& x, const T& y) const;
129
};
130

    
131
template <class T> // <class T=void> in C++14
132
struct greater_equal : binary_function<T, T, bool>
133
{
134
    bool operator()(const T& x, const T& y) const;
135
};
136

    
137
template <class T> // <class T=void> in C++14
138
struct less_equal : binary_function<T, T, bool>
139
{
140
    bool operator()(const T& x, const T& y) const;
141
};
142

    
143
template <class T> // <class T=void> in C++14
144
struct logical_and : binary_function<T, T, bool>
145
{
146
    bool operator()(const T& x, const T& y) const;
147
};
148

    
149
template <class T> // <class T=void> in C++14
150
struct logical_or : binary_function<T, T, bool>
151
{
152
    bool operator()(const T& x, const T& y) const;
153
};
154

    
155
template <class T> // <class T=void> in C++14
156
struct logical_not : unary_function<T, bool>
157
{
158
    bool operator()(const T& x) const;
159
};
160

    
161
template <class T> // <class T=void> in C++14
162
struct bit_and : unary_function<T, bool>
163
{
164
    bool operator()(const T& x, const T& y) const;
165
};
166

    
167
template <class T> // <class T=void> in C++14
168
struct bit_or : unary_function<T, bool>
169
{
170
    bool operator()(const T& x, const T& y) const;
171
};
172

    
173
template <class T> // <class T=void> in C++14
174
struct bit_xor : unary_function<T, bool>
175
{
176
    bool operator()(const T& x, const T& y) const;
177
};
178

    
179
template <class T=void> // C++14
180
struct bit_xor : unary_function<T, bool>
181
{
182
    bool operator()(const T& x) const;
183
};
184

    
185
template <class Predicate>
186
class unary_negate
187
    : public unary_function<typename Predicate::argument_type, bool>
188
{
189
public:
190
    explicit unary_negate(const Predicate& pred);
191
    bool operator()(const typename Predicate::argument_type& x) const;
192
};
193

    
194
template <class Predicate> unary_negate<Predicate> not1(const Predicate& pred);
195

    
196
template <class Predicate>
197
class binary_negate
198
    : public binary_function<typename Predicate::first_argument_type,
199
                             typename Predicate::second_argument_type,
200
                             bool>
201
{
202
public:
203
    explicit binary_negate(const Predicate& pred);
204
    bool operator()(const typename Predicate::first_argument_type& x,
205
                    const typename Predicate::second_argument_type& y) const;
206
};
207

    
208
template <class Predicate> binary_negate<Predicate> not2(const Predicate& pred);
209

    
210
template<class T> struct is_bind_expression;
211
template<class T> struct is_placeholder;
212

    
213
template<class Fn, class... BoundArgs>
214
  unspecified bind(Fn&&, BoundArgs&&...);
215
template<class R, class Fn, class... BoundArgs>
216
  unspecified bind(Fn&&, BoundArgs&&...);
217

    
218
namespace placeholders {
219
  // M is the implementation-defined number of placeholders
220
  extern unspecified _1;
221
  extern unspecified _2;
222
  .
223
  .
224
  .
225
  extern unspecified _Mp;
226
}
227

    
228
template <class Operation>
229
class binder1st
230
    : public unary_function<typename Operation::second_argument_type,
231
                            typename Operation::result_type>
232
{
233
protected:
234
    Operation                               op;
235
    typename Operation::first_argument_type value;
236
public:
237
    binder1st(const Operation& x, const typename Operation::first_argument_type y);
238
    typename Operation::result_type operator()(      typename Operation::second_argument_type& x) const;
239
    typename Operation::result_type operator()(const typename Operation::second_argument_type& x) const;
240
};
241

    
242
template <class Operation, class T>
243
binder1st<Operation> bind1st(const Operation& op, const T& x);
244

    
245
template <class Operation>
246
class binder2nd
247
    : public unary_function<typename Operation::first_argument_type,
248
                            typename Operation::result_type>
249
{
250
protected:
251
    Operation                                op;
252
    typename Operation::second_argument_type value;
253
public:
254
    binder2nd(const Operation& x, const typename Operation::second_argument_type y);
255
    typename Operation::result_type operator()(      typename Operation::first_argument_type& x) const;
256
    typename Operation::result_type operator()(const typename Operation::first_argument_type& x) const;
257
};
258

    
259
template <class Operation, class T>
260
binder2nd<Operation> bind2nd(const Operation& op, const T& x);
261

    
262
template <class Arg, class Result>
263
class pointer_to_unary_function : public unary_function<Arg, Result>
264
{
265
public:
266
    explicit pointer_to_unary_function(Result (*f)(Arg));
267
    Result operator()(Arg x) const;
268
};
269

    
270
template <class Arg, class Result>
271
pointer_to_unary_function<Arg,Result> ptr_fun(Result (*f)(Arg));
272

    
273
template <class Arg1, class Arg2, class Result>
274
class pointer_to_binary_function : public binary_function<Arg1, Arg2, Result>
275
{
276
public:
277
    explicit pointer_to_binary_function(Result (*f)(Arg1, Arg2));
278
    Result operator()(Arg1 x, Arg2 y) const;
279
};
280

    
281
template <class Arg1, class Arg2, class Result>
282
pointer_to_binary_function<Arg1,Arg2,Result> ptr_fun(Result (*f)(Arg1,Arg2));
283

    
284
template<class S, class T>
285
class mem_fun_t : public unary_function<T*, S>
286
{
287
public:
288
    explicit mem_fun_t(S (T::*p)());
289
    S operator()(T* p) const;
290
};
291

    
292
template<class S, class T, class A>
293
class mem_fun1_t : public binary_function<T*, A, S>
294
{
295
public:
296
    explicit mem_fun1_t(S (T::*p)(A));
297
    S operator()(T* p, A x) const;
298
};
299

    
300
template<class S, class T>          mem_fun_t<S,T>    mem_fun(S (T::*f)());
301
template<class S, class T, class A> mem_fun1_t<S,T,A> mem_fun(S (T::*f)(A));
302

    
303
template<class S, class T>
304
class mem_fun_ref_t : public unary_function<T, S>
305
{
306
public:
307
    explicit mem_fun_ref_t(S (T::*p)());
308
    S operator()(T& p) const;
309
};
310

    
311
template<class S, class T, class A>
312
class mem_fun1_ref_t : public binary_function<T, A, S>
313
{
314
public:
315
    explicit mem_fun1_ref_t(S (T::*p)(A));
316
    S operator()(T& p, A x) const;
317
};
318

    
319
template<class S, class T>          mem_fun_ref_t<S,T>    mem_fun_ref(S (T::*f)());
320
template<class S, class T, class A> mem_fun1_ref_t<S,T,A> mem_fun_ref(S (T::*f)(A));
321

    
322
template <class S, class T>
323
class const_mem_fun_t : public unary_function<const T*, S>
324
{
325
public:
326
    explicit const_mem_fun_t(S (T::*p)() const);
327
    S operator()(const T* p) const;
328
};
329

    
330
template <class S, class T, class A>
331
class const_mem_fun1_t : public binary_function<const T*, A, S>
332
{
333
public:
334
    explicit const_mem_fun1_t(S (T::*p)(A) const);
335
    S operator()(const T* p, A x) const;
336
};
337

    
338
template <class S, class T>          const_mem_fun_t<S,T>    mem_fun(S (T::*f)() const);
339
template <class S, class T, class A> const_mem_fun1_t<S,T,A> mem_fun(S (T::*f)(A) const);
340

    
341
template <class S, class T>
342
class const_mem_fun_ref_t : public unary_function<T, S>
343
{
344
public:
345
    explicit const_mem_fun_ref_t(S (T::*p)() const);
346
    S operator()(const T& p) const;
347
};
348

    
349
template <class S, class T, class A>
350
class const_mem_fun1_ref_t : public binary_function<T, A, S>
351
{
352
public:
353
    explicit const_mem_fun1_ref_t(S (T::*p)(A) const);
354
    S operator()(const T& p, A x) const;
355
};
356

    
357
template <class S, class T>          const_mem_fun_ref_t<S,T>    mem_fun_ref(S (T::*f)() const);
358
template <class S, class T, class A> const_mem_fun1_ref_t<S,T,A> mem_fun_ref(S (T::*f)(A) const);
359

    
360
template<class R, class T> unspecified mem_fn(R T::*);
361

    
362
class bad_function_call
363
    : public exception
364
{
365
};
366

    
367
template<class> class function; // undefined
368

    
369
template<class R, class... ArgTypes>
370
class function<R(ArgTypes...)>
371
  : public unary_function<T1, R>      // iff sizeof...(ArgTypes) == 1 and
372
                                      // ArgTypes contains T1
373
  : public binary_function<T1, T2, R> // iff sizeof...(ArgTypes) == 2 and
374
                                      // ArgTypes contains T1 and T2
375
{
376
public:
377
    typedef R result_type;
378

    
379
    // construct/copy/destroy:
380
    function() noexcept;
381
    function(nullptr_t) noexcept;
382
    function(const function&);
383
    function(function&&) noexcept;
384
    template<class F>
385
      function(F);
386
    template<Allocator Alloc>
387
      function(allocator_arg_t, const Alloc&) noexcept;
388
    template<Allocator Alloc>
389
      function(allocator_arg_t, const Alloc&, nullptr_t) noexcept;
390
    template<Allocator Alloc>
391
      function(allocator_arg_t, const Alloc&, const function&);
392
    template<Allocator Alloc>
393
      function(allocator_arg_t, const Alloc&, function&&);
394
    template<class F, Allocator Alloc>
395
      function(allocator_arg_t, const Alloc&, F);
396

    
397
    function& operator=(const function&);
398
    function& operator=(function&&) noexcept;
399
    function& operator=(nullptr_t) noexcept;
400
    template<class F>
401
      function& operator=(F&&);
402
    template<class F>
403
      function& operator=(reference_wrapper<F>) noexcept;
404

    
405
    ~function();
406

    
407
    // function modifiers:
408
    void swap(function&) noexcept;
409
    template<class F, class Alloc>
410
      void assign(F&&, const Alloc&);
411

    
412
    // function capacity:
413
    explicit operator bool() const noexcept;
414

    
415
    // function invocation:
416
    R operator()(ArgTypes...) const;
417

    
418
    // function target access:
419
    const std::type_info& target_type() const noexcept;
420
    template <typename T>       T* target() noexcept;
421
    template <typename T> const T* target() const noexcept;
422
};
423

    
424
// Null pointer comparisons:
425
template <class R, class ... ArgTypes>
426
  bool operator==(const function<R(ArgTypes...)>&, nullptr_t) noexcept;
427

    
428
template <class R, class ... ArgTypes>
429
  bool operator==(nullptr_t, const function<R(ArgTypes...)>&) noexcept;
430

    
431
template <class R, class ... ArgTypes>
432
  bool operator!=(const function<R(ArgTypes...)>&, nullptr_t) noexcept;
433

    
434
template <class  R, class ... ArgTypes>
435
  bool operator!=(nullptr_t, const function<R(ArgTypes...)>&) noexcept;
436

    
437
// specialized algorithms:
438
template <class  R, class ... ArgTypes>
439
  void swap(function<R(ArgTypes...)>&, function<R(ArgTypes...)>&) noexcept;
440

    
441
template <class T> struct hash;
442

    
443
template <> struct hash<bool>;
444
template <> struct hash<char>;
445
template <> struct hash<signed char>;
446
template <> struct hash<unsigned char>;
447
template <> struct hash<char16_t>;
448
template <> struct hash<char32_t>;
449
template <> struct hash<wchar_t>;
450
template <> struct hash<short>;
451
template <> struct hash<unsigned short>;
452
template <> struct hash<int>;
453
template <> struct hash<unsigned int>;
454
template <> struct hash<long>;
455
template <> struct hash<long long>;
456
template <> struct hash<unsigned long>;
457
template <> struct hash<unsigned long long>;
458

    
459
template <> struct hash<float>;
460
template <> struct hash<double>;
461
template <> struct hash<long double>;
462

    
463
template<class T> struct hash<T*>;
464

    
465
}  // std
466

    
467
POLICY:  For non-variadic implementations, the number of arguments is limited
468
         to 3.  It is hoped that the need for non-variadic implementations
469
         will be minimal.
470

    
471
*/
472

    
473
#include <__config>
474
#include <type_traits>
475
#include <typeinfo>
476
#include <exception>
477
#include <memory>
478
#include <tuple>
479

    
480
#include <__functional_base>
481

    
482
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
483
#pragma GCC system_header
484
#endif
485

    
486
_LIBCPP_BEGIN_NAMESPACE_STD
487

    
488
#if _LIBCPP_STD_VER > 11
489
template <class _Tp = void>
490
#else
491
template <class _Tp>
492
#endif
493
struct _LIBCPP_TYPE_VIS_ONLY plus : binary_function<_Tp, _Tp, _Tp>
494
{
495
    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
496
    _Tp operator()(const _Tp& __x, const _Tp& __y) const
497
        {return __x + __y;}
498
};
499

    
500
#if _LIBCPP_STD_VER > 11
501
template <>
502
struct _LIBCPP_TYPE_VIS_ONLY plus<void>
503
{
504
    template <class _T1, class _T2>
505
    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
506
    auto operator()(_T1&& __t, _T2&& __u) const
507
    _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) + _VSTD::forward<_T2>(__u)))
508
    -> decltype        (_VSTD::forward<_T1>(__t) + _VSTD::forward<_T2>(__u))
509
        { return        _VSTD::forward<_T1>(__t) + _VSTD::forward<_T2>(__u); }
510
    typedef void is_transparent;
511
};
512
#endif
513

    
514

    
515
#if _LIBCPP_STD_VER > 11
516
template <class _Tp = void>
517
#else
518
template <class _Tp>
519
#endif
520
struct _LIBCPP_TYPE_VIS_ONLY minus : binary_function<_Tp, _Tp, _Tp>
521
{
522
    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
523
    _Tp operator()(const _Tp& __x, const _Tp& __y) const
524
        {return __x - __y;}
525
};
526

    
527
#if _LIBCPP_STD_VER > 11
528
template <>
529
struct _LIBCPP_TYPE_VIS_ONLY minus<void>
530
{
531
    template <class _T1, class _T2>
532
    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
533
    auto operator()(_T1&& __t, _T2&& __u) const
534
    _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) - _VSTD::forward<_T2>(__u)))
535
    -> decltype        (_VSTD::forward<_T1>(__t) - _VSTD::forward<_T2>(__u))
536
        { return        _VSTD::forward<_T1>(__t) - _VSTD::forward<_T2>(__u); }
537
    typedef void is_transparent;
538
};
539
#endif
540

    
541

    
542
#if _LIBCPP_STD_VER > 11
543
template <class _Tp = void>
544
#else
545
template <class _Tp>
546
#endif
547
struct _LIBCPP_TYPE_VIS_ONLY multiplies : binary_function<_Tp, _Tp, _Tp>
548
{
549
    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
550
    _Tp operator()(const _Tp& __x, const _Tp& __y) const
551
        {return __x * __y;}
552
};
553

    
554
#if _LIBCPP_STD_VER > 11
555
template <>
556
struct _LIBCPP_TYPE_VIS_ONLY multiplies<void>
557
{
558
    template <class _T1, class _T2>
559
    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
560
    auto operator()(_T1&& __t, _T2&& __u) const
561
    _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) * _VSTD::forward<_T2>(__u)))
562
    -> decltype        (_VSTD::forward<_T1>(__t) * _VSTD::forward<_T2>(__u))
563
        { return        _VSTD::forward<_T1>(__t) * _VSTD::forward<_T2>(__u); }
564
    typedef void is_transparent;
565
};
566
#endif
567

    
568

    
569
#if _LIBCPP_STD_VER > 11
570
template <class _Tp = void>
571
#else
572
template <class _Tp>
573
#endif
574
struct _LIBCPP_TYPE_VIS_ONLY divides : binary_function<_Tp, _Tp, _Tp>
575
{
576
    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
577
    _Tp operator()(const _Tp& __x, const _Tp& __y) const
578
        {return __x / __y;}
579
};
580

    
581
#if _LIBCPP_STD_VER > 11
582
template <>
583
struct _LIBCPP_TYPE_VIS_ONLY divides<void>
584
{
585
    template <class _T1, class _T2>
586
    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
587
    auto operator()(_T1&& __t, _T2&& __u) const
588
    _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) / _VSTD::forward<_T2>(__u)))
589
    -> decltype        (_VSTD::forward<_T1>(__t) / _VSTD::forward<_T2>(__u))
590
        { return        _VSTD::forward<_T1>(__t) / _VSTD::forward<_T2>(__u); }
591
    typedef void is_transparent;
592
};
593
#endif
594

    
595

    
596
#if _LIBCPP_STD_VER > 11
597
template <class _Tp = void>
598
#else
599
template <class _Tp>
600
#endif
601
struct _LIBCPP_TYPE_VIS_ONLY modulus : binary_function<_Tp, _Tp, _Tp>
602
{
603
    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
604
    _Tp operator()(const _Tp& __x, const _Tp& __y) const
605
        {return __x % __y;}
606
};
607

    
608
#if _LIBCPP_STD_VER > 11
609
template <>
610
struct _LIBCPP_TYPE_VIS_ONLY modulus<void>
611
{
612
    template <class _T1, class _T2>
613
    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
614
    auto operator()(_T1&& __t, _T2&& __u) const
615
    _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) % _VSTD::forward<_T2>(__u)))
616
    -> decltype        (_VSTD::forward<_T1>(__t) % _VSTD::forward<_T2>(__u))
617
        { return        _VSTD::forward<_T1>(__t) % _VSTD::forward<_T2>(__u); }
618
    typedef void is_transparent;
619
};
620
#endif
621

    
622

    
623
#if _LIBCPP_STD_VER > 11
624
template <class _Tp = void>
625
#else
626
template <class _Tp>
627
#endif
628
struct _LIBCPP_TYPE_VIS_ONLY negate : unary_function<_Tp, _Tp>
629
{
630
    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
631
    _Tp operator()(const _Tp& __x) const
632
        {return -__x;}
633
};
634

    
635
#if _LIBCPP_STD_VER > 11
636
template <>
637
struct _LIBCPP_TYPE_VIS_ONLY negate<void>
638
{
639
    template <class _Tp>
640
    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
641
    auto operator()(_Tp&& __x) const
642
    _NOEXCEPT_(noexcept(- _VSTD::forward<_Tp>(__x)))
643
    -> decltype        (- _VSTD::forward<_Tp>(__x))
644
        { return        - _VSTD::forward<_Tp>(__x); }
645
    typedef void is_transparent;
646
};
647
#endif
648

    
649

    
650
#if _LIBCPP_STD_VER > 11
651
template <class _Tp = void>
652
#else
653
template <class _Tp>
654
#endif
655
struct _LIBCPP_TYPE_VIS_ONLY equal_to : binary_function<_Tp, _Tp, bool>
656
{
657
    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
658
    bool operator()(const _Tp& __x, const _Tp& __y) const
659
        {return __x == __y;}
660
};
661

    
662
#if _LIBCPP_STD_VER > 11
663
template <>
664
struct _LIBCPP_TYPE_VIS_ONLY equal_to<void>
665
{
666
    template <class _T1, class _T2>
667
    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
668
    auto operator()(_T1&& __t, _T2&& __u) const
669
    _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) == _VSTD::forward<_T2>(__u)))
670
    -> decltype        (_VSTD::forward<_T1>(__t) == _VSTD::forward<_T2>(__u))
671
        { return        _VSTD::forward<_T1>(__t) == _VSTD::forward<_T2>(__u); }
672
    typedef void is_transparent;
673
};
674
#endif
675

    
676

    
677
#if _LIBCPP_STD_VER > 11
678
template <class _Tp = void>
679
#else
680
template <class _Tp>
681
#endif
682
struct _LIBCPP_TYPE_VIS_ONLY not_equal_to : binary_function<_Tp, _Tp, bool>
683
{
684
    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
685
    bool operator()(const _Tp& __x, const _Tp& __y) const
686
        {return __x != __y;}
687
};
688

    
689
#if _LIBCPP_STD_VER > 11
690
template <>
691
struct _LIBCPP_TYPE_VIS_ONLY not_equal_to<void>
692
{
693
    template <class _T1, class _T2>
694
    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
695
    auto operator()(_T1&& __t, _T2&& __u) const
696
    _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) != _VSTD::forward<_T2>(__u)))
697
    -> decltype        (_VSTD::forward<_T1>(__t) != _VSTD::forward<_T2>(__u))
698
        { return        _VSTD::forward<_T1>(__t) != _VSTD::forward<_T2>(__u); }
699
    typedef void is_transparent;
700
};
701
#endif
702

    
703

    
704
#if _LIBCPP_STD_VER > 11
705
template <class _Tp = void>
706
#else
707
template <class _Tp>
708
#endif
709
struct _LIBCPP_TYPE_VIS_ONLY greater : binary_function<_Tp, _Tp, bool>
710
{
711
    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
712
    bool operator()(const _Tp& __x, const _Tp& __y) const
713
        {return __x > __y;}
714
};
715

    
716
#if _LIBCPP_STD_VER > 11
717
template <>
718
struct _LIBCPP_TYPE_VIS_ONLY greater<void>
719
{
720
    template <class _T1, class _T2>
721
    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
722
    auto operator()(_T1&& __t, _T2&& __u) const
723
    _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) > _VSTD::forward<_T2>(__u)))
724
    -> decltype        (_VSTD::forward<_T1>(__t) > _VSTD::forward<_T2>(__u))
725
        { return        _VSTD::forward<_T1>(__t) > _VSTD::forward<_T2>(__u); }
726
    typedef void is_transparent;
727
};
728
#endif
729

    
730

    
731
// less in <__functional_base>
732

    
733
#if _LIBCPP_STD_VER > 11
734
template <class _Tp = void>
735
#else
736
template <class _Tp>
737
#endif
738
struct _LIBCPP_TYPE_VIS_ONLY greater_equal : binary_function<_Tp, _Tp, bool>
739
{
740
    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
741
    bool operator()(const _Tp& __x, const _Tp& __y) const
742
        {return __x >= __y;}
743
};
744

    
745
#if _LIBCPP_STD_VER > 11
746
template <>
747
struct _LIBCPP_TYPE_VIS_ONLY greater_equal<void>
748
{
749
    template <class _T1, class _T2>
750
    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
751
    auto operator()(_T1&& __t, _T2&& __u) const
752
    _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) >= _VSTD::forward<_T2>(__u)))
753
    -> decltype        (_VSTD::forward<_T1>(__t) >= _VSTD::forward<_T2>(__u))
754
        { return        _VSTD::forward<_T1>(__t) >= _VSTD::forward<_T2>(__u); }
755
    typedef void is_transparent;
756
};
757
#endif
758

    
759

    
760
#if _LIBCPP_STD_VER > 11
761
template <class _Tp = void>
762
#else
763
template <class _Tp>
764
#endif
765
struct _LIBCPP_TYPE_VIS_ONLY less_equal : binary_function<_Tp, _Tp, bool>
766
{
767
    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
768
    bool operator()(const _Tp& __x, const _Tp& __y) const
769
        {return __x <= __y;}
770
};
771

    
772
#if _LIBCPP_STD_VER > 11
773
template <>
774
struct _LIBCPP_TYPE_VIS_ONLY less_equal<void>
775
{
776
    template <class _T1, class _T2>
777
    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
778
    auto operator()(_T1&& __t, _T2&& __u) const
779
    _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) <= _VSTD::forward<_T2>(__u)))
780
    -> decltype        (_VSTD::forward<_T1>(__t) <= _VSTD::forward<_T2>(__u))
781
        { return        _VSTD::forward<_T1>(__t) <= _VSTD::forward<_T2>(__u); }
782
    typedef void is_transparent;
783
};
784
#endif
785

    
786

    
787
#if _LIBCPP_STD_VER > 11
788
template <class _Tp = void>
789
#else
790
template <class _Tp>
791
#endif
792
struct _LIBCPP_TYPE_VIS_ONLY logical_and : binary_function<_Tp, _Tp, bool>
793
{
794
    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
795
    bool operator()(const _Tp& __x, const _Tp& __y) const
796
        {return __x && __y;}
797
};
798

    
799
#if _LIBCPP_STD_VER > 11
800
template <>
801
struct _LIBCPP_TYPE_VIS_ONLY logical_and<void>
802
{
803
    template <class _T1, class _T2>
804
    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
805
    auto operator()(_T1&& __t, _T2&& __u) const
806
    _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) && _VSTD::forward<_T2>(__u)))
807
    -> decltype        (_VSTD::forward<_T1>(__t) && _VSTD::forward<_T2>(__u))
808
        { return        _VSTD::forward<_T1>(__t) && _VSTD::forward<_T2>(__u); }
809
    typedef void is_transparent;
810
};
811
#endif
812

    
813

    
814
#if _LIBCPP_STD_VER > 11
815
template <class _Tp = void>
816
#else
817
template <class _Tp>
818
#endif
819
struct _LIBCPP_TYPE_VIS_ONLY logical_or : binary_function<_Tp, _Tp, bool>
820
{
821
    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
822
    bool operator()(const _Tp& __x, const _Tp& __y) const
823
        {return __x || __y;}
824
};
825

    
826
#if _LIBCPP_STD_VER > 11
827
template <>
828
struct _LIBCPP_TYPE_VIS_ONLY logical_or<void>
829
{
830
    template <class _T1, class _T2>
831
    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
832
    auto operator()(_T1&& __t, _T2&& __u) const
833
    _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) || _VSTD::forward<_T2>(__u)))
834
    -> decltype        (_VSTD::forward<_T1>(__t) || _VSTD::forward<_T2>(__u))
835
        { return        _VSTD::forward<_T1>(__t) || _VSTD::forward<_T2>(__u); }
836
    typedef void is_transparent;
837
};
838
#endif
839

    
840

    
841
#if _LIBCPP_STD_VER > 11
842
template <class _Tp = void>
843
#else
844
template <class _Tp>
845
#endif
846
struct _LIBCPP_TYPE_VIS_ONLY logical_not : unary_function<_Tp, bool>
847
{
848
    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
849
    bool operator()(const _Tp& __x) const
850
        {return !__x;}
851
};
852

    
853
#if _LIBCPP_STD_VER > 11
854
template <>
855
struct _LIBCPP_TYPE_VIS_ONLY logical_not<void>
856
{
857
    template <class _Tp>
858
    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
859
    auto operator()(_Tp&& __x) const
860
    _NOEXCEPT_(noexcept(!_VSTD::forward<_Tp>(__x)))
861
    -> decltype        (!_VSTD::forward<_Tp>(__x))
862
        { return        !_VSTD::forward<_Tp>(__x); }
863
    typedef void is_transparent;
864
};
865
#endif
866

    
867

    
868
#if _LIBCPP_STD_VER > 11
869
template <class _Tp = void>
870
#else
871
template <class _Tp>
872
#endif
873
struct _LIBCPP_TYPE_VIS_ONLY bit_and : binary_function<_Tp, _Tp, _Tp>
874
{
875
    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
876
    _Tp operator()(const _Tp& __x, const _Tp& __y) const
877
        {return __x & __y;}
878
};
879

    
880
#if _LIBCPP_STD_VER > 11
881
template <>
882
struct _LIBCPP_TYPE_VIS_ONLY bit_and<void>
883
{
884
    template <class _T1, class _T2>
885
    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
886
    auto operator()(_T1&& __t, _T2&& __u) const
887
    _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) & _VSTD::forward<_T2>(__u)))
888
    -> decltype        (_VSTD::forward<_T1>(__t) & _VSTD::forward<_T2>(__u))
889
        { return        _VSTD::forward<_T1>(__t) & _VSTD::forward<_T2>(__u); }
890
    typedef void is_transparent;
891
};
892
#endif
893

    
894

    
895
#if _LIBCPP_STD_VER > 11
896
template <class _Tp = void>
897
#else
898
template <class _Tp>
899
#endif
900
struct _LIBCPP_TYPE_VIS_ONLY bit_or : binary_function<_Tp, _Tp, _Tp>
901
{
902
    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
903
    _Tp operator()(const _Tp& __x, const _Tp& __y) const
904
        {return __x | __y;}
905
};
906

    
907
#if _LIBCPP_STD_VER > 11
908
template <>
909
struct _LIBCPP_TYPE_VIS_ONLY bit_or<void>
910
{
911
    template <class _T1, class _T2>
912
    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
913
    auto operator()(_T1&& __t, _T2&& __u) const
914
    _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) | _VSTD::forward<_T2>(__u)))
915
    -> decltype        (_VSTD::forward<_T1>(__t) | _VSTD::forward<_T2>(__u))
916
        { return        _VSTD::forward<_T1>(__t) | _VSTD::forward<_T2>(__u); }
917
    typedef void is_transparent;
918
};
919
#endif
920

    
921

    
922
#if _LIBCPP_STD_VER > 11
923
template <class _Tp = void>
924
#else
925
template <class _Tp>
926
#endif
927
struct _LIBCPP_TYPE_VIS_ONLY bit_xor : binary_function<_Tp, _Tp, _Tp>
928
{
929
    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
930
    _Tp operator()(const _Tp& __x, const _Tp& __y) const
931
        {return __x ^ __y;}
932
};
933

    
934
#if _LIBCPP_STD_VER > 11
935
template <>
936
struct _LIBCPP_TYPE_VIS_ONLY bit_xor<void>
937
{
938
    template <class _T1, class _T2>
939
    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
940
    auto operator()(_T1&& __t, _T2&& __u) const
941
    _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) ^ _VSTD::forward<_T2>(__u)))
942
    -> decltype        (_VSTD::forward<_T1>(__t) ^ _VSTD::forward<_T2>(__u))
943
        { return        _VSTD::forward<_T1>(__t) ^ _VSTD::forward<_T2>(__u); }
944
    typedef void is_transparent;
945
};
946
#endif
947

    
948

    
949
#if _LIBCPP_STD_VER > 11
950
template <class _Tp = void>
951
struct _LIBCPP_TYPE_VIS_ONLY bit_not : unary_function<_Tp, _Tp>
952
{
953
    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
954
    _Tp operator()(const _Tp& __x) const
955
        {return ~__x;}
956
};
957

    
958
template <>
959
struct _LIBCPP_TYPE_VIS_ONLY bit_not<void>
960
{
961
    template <class _Tp>
962
    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
963
    auto operator()(_Tp&& __x) const
964
    _NOEXCEPT_(noexcept(~_VSTD::forward<_Tp>(__x)))
965
    -> decltype        (~_VSTD::forward<_Tp>(__x))
966
        { return        ~_VSTD::forward<_Tp>(__x); }
967
    typedef void is_transparent;
968
};
969
#endif
970

    
971
template <class _Predicate>
972
class _LIBCPP_TYPE_VIS_ONLY unary_negate
973
    : public unary_function<typename _Predicate::argument_type, bool>
974
{
975
    _Predicate __pred_;
976
public:
977
    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
978
    explicit unary_negate(const _Predicate& __pred)
979
        : __pred_(__pred) {}
980
    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
981
    bool operator()(const typename _Predicate::argument_type& __x) const
982
        {return !__pred_(__x);}
983
};
984

    
985
template <class _Predicate>
986
inline _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
987
unary_negate<_Predicate>
988
not1(const _Predicate& __pred) {return unary_negate<_Predicate>(__pred);}
989

    
990
template <class _Predicate>
991
class _LIBCPP_TYPE_VIS_ONLY binary_negate
992
    : public binary_function<typename _Predicate::first_argument_type,
993
                             typename _Predicate::second_argument_type,
994
                             bool>
995
{
996
    _Predicate __pred_;
997
public:
998
    _LIBCPP_INLINE_VISIBILITY explicit _LIBCPP_CONSTEXPR_AFTER_CXX11 
999
    binary_negate(const _Predicate& __pred) : __pred_(__pred) {}
1000

    
1001
    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
1002
    bool operator()(const typename _Predicate::first_argument_type& __x,
1003
                    const typename _Predicate::second_argument_type& __y) const
1004
        {return !__pred_(__x, __y);}
1005
};
1006

    
1007
template <class _Predicate>
1008
inline _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
1009
binary_negate<_Predicate>
1010
not2(const _Predicate& __pred) {return binary_negate<_Predicate>(__pred);}
1011

    
1012
template <class __Operation>
1013
class _LIBCPP_TYPE_VIS_ONLY binder1st
1014
    : public unary_function<typename __Operation::second_argument_type,
1015
                            typename __Operation::result_type>
1016
{
1017
protected:
1018
    __Operation                               op;
1019
    typename __Operation::first_argument_type value;
1020
public:
1021
    _LIBCPP_INLINE_VISIBILITY binder1st(const __Operation& __x,
1022
                               const typename __Operation::first_argument_type __y)
1023
        : op(__x), value(__y) {}
1024
    _LIBCPP_INLINE_VISIBILITY typename __Operation::result_type operator()
1025
        (typename __Operation::second_argument_type& __x) const
1026
            {return op(value, __x);}
1027
    _LIBCPP_INLINE_VISIBILITY typename __Operation::result_type operator()
1028
        (const typename __Operation::second_argument_type& __x) const
1029
            {return op(value, __x);}
1030
};
1031

    
1032
template <class __Operation, class _Tp>
1033
inline _LIBCPP_INLINE_VISIBILITY
1034
binder1st<__Operation>
1035
bind1st(const __Operation& __op, const _Tp& __x)
1036
    {return binder1st<__Operation>(__op, __x);}
1037

    
1038
template <class __Operation>
1039
class _LIBCPP_TYPE_VIS_ONLY binder2nd
1040
    : public unary_function<typename __Operation::first_argument_type,
1041
                            typename __Operation::result_type>
1042
{
1043
protected:
1044
    __Operation                                op;
1045
    typename __Operation::second_argument_type value;
1046
public:
1047
    _LIBCPP_INLINE_VISIBILITY
1048
    binder2nd(const __Operation& __x, const typename __Operation::second_argument_type __y)
1049
        : op(__x), value(__y) {}
1050
    _LIBCPP_INLINE_VISIBILITY typename __Operation::result_type operator()
1051
        (      typename __Operation::first_argument_type& __x) const
1052
            {return op(__x, value);}
1053
    _LIBCPP_INLINE_VISIBILITY typename __Operation::result_type operator()
1054
        (const typename __Operation::first_argument_type& __x) const
1055
            {return op(__x, value);}
1056
};
1057

    
1058
template <class __Operation, class _Tp>
1059
inline _LIBCPP_INLINE_VISIBILITY
1060
binder2nd<__Operation>
1061
bind2nd(const __Operation& __op, const _Tp& __x)
1062
    {return binder2nd<__Operation>(__op, __x);}
1063

    
1064
template <class _Arg, class _Result>
1065
class _LIBCPP_TYPE_VIS_ONLY pointer_to_unary_function
1066
    : public unary_function<_Arg, _Result>
1067
{
1068
    _Result (*__f_)(_Arg);
1069
public:
1070
    _LIBCPP_INLINE_VISIBILITY explicit pointer_to_unary_function(_Result (*__f)(_Arg))
1071
        : __f_(__f) {}
1072
    _LIBCPP_INLINE_VISIBILITY _Result operator()(_Arg __x) const
1073
        {return __f_(__x);}
1074
};
1075

    
1076
template <class _Arg, class _Result>
1077
inline _LIBCPP_INLINE_VISIBILITY
1078
pointer_to_unary_function<_Arg,_Result>
1079
ptr_fun(_Result (*__f)(_Arg))
1080
    {return pointer_to_unary_function<_Arg,_Result>(__f);}
1081

    
1082
template <class _Arg1, class _Arg2, class _Result>
1083
class _LIBCPP_TYPE_VIS_ONLY pointer_to_binary_function
1084
    : public binary_function<_Arg1, _Arg2, _Result>
1085
{
1086
    _Result (*__f_)(_Arg1, _Arg2);
1087
public:
1088
    _LIBCPP_INLINE_VISIBILITY explicit pointer_to_binary_function(_Result (*__f)(_Arg1, _Arg2))
1089
        : __f_(__f) {}
1090
    _LIBCPP_INLINE_VISIBILITY _Result operator()(_Arg1 __x, _Arg2 __y) const
1091
        {return __f_(__x, __y);}
1092
};
1093

    
1094
template <class _Arg1, class _Arg2, class _Result>
1095
inline _LIBCPP_INLINE_VISIBILITY
1096
pointer_to_binary_function<_Arg1,_Arg2,_Result>
1097
ptr_fun(_Result (*__f)(_Arg1,_Arg2))
1098
    {return pointer_to_binary_function<_Arg1,_Arg2,_Result>(__f);}
1099

    
1100
template<class _Sp, class _Tp>
1101
class _LIBCPP_TYPE_VIS_ONLY mem_fun_t : public unary_function<_Tp*, _Sp>
1102
{
1103
    _Sp (_Tp::*__p_)();
1104
public:
1105
    _LIBCPP_INLINE_VISIBILITY explicit mem_fun_t(_Sp (_Tp::*__p)())
1106
        : __p_(__p) {}
1107
    _LIBCPP_INLINE_VISIBILITY _Sp operator()(_Tp* __p) const
1108
        {return (__p->*__p_)();}
1109
};
1110

    
1111
template<class _Sp, class _Tp, class _Ap>
1112
class _LIBCPP_TYPE_VIS_ONLY mem_fun1_t : public binary_function<_Tp*, _Ap, _Sp>
1113
{
1114
    _Sp (_Tp::*__p_)(_Ap);
1115
public:
1116
    _LIBCPP_INLINE_VISIBILITY explicit mem_fun1_t(_Sp (_Tp::*__p)(_Ap))
1117
        : __p_(__p) {}
1118
    _LIBCPP_INLINE_VISIBILITY _Sp operator()(_Tp* __p, _Ap __x) const
1119
        {return (__p->*__p_)(__x);}
1120
};
1121

    
1122
template<class _Sp, class _Tp>
1123
inline _LIBCPP_INLINE_VISIBILITY
1124
mem_fun_t<_Sp,_Tp>
1125
mem_fun(_Sp (_Tp::*__f)())
1126
    {return mem_fun_t<_Sp,_Tp>(__f);}
1127

    
1128
template<class _Sp, class _Tp, class _Ap>
1129
inline _LIBCPP_INLINE_VISIBILITY
1130
mem_fun1_t<_Sp,_Tp,_Ap>
1131
mem_fun(_Sp (_Tp::*__f)(_Ap))
1132
    {return mem_fun1_t<_Sp,_Tp,_Ap>(__f);}
1133

    
1134
template<class _Sp, class _Tp>
1135
class _LIBCPP_TYPE_VIS_ONLY mem_fun_ref_t : public unary_function<_Tp, _Sp>
1136
{
1137
    _Sp (_Tp::*__p_)();
1138
public:
1139
    _LIBCPP_INLINE_VISIBILITY explicit mem_fun_ref_t(_Sp (_Tp::*__p)())
1140
        : __p_(__p) {}
1141
    _LIBCPP_INLINE_VISIBILITY _Sp operator()(_Tp& __p) const
1142
        {return (__p.*__p_)();}
1143
};
1144

    
1145
template<class _Sp, class _Tp, class _Ap>
1146
class _LIBCPP_TYPE_VIS_ONLY mem_fun1_ref_t : public binary_function<_Tp, _Ap, _Sp>
1147
{
1148
    _Sp (_Tp::*__p_)(_Ap);
1149
public:
1150
    _LIBCPP_INLINE_VISIBILITY explicit mem_fun1_ref_t(_Sp (_Tp::*__p)(_Ap))
1151
        : __p_(__p) {}
1152
    _LIBCPP_INLINE_VISIBILITY _Sp operator()(_Tp& __p, _Ap __x) const
1153
        {return (__p.*__p_)(__x);}
1154
};
1155

    
1156
template<class _Sp, class _Tp>
1157
inline _LIBCPP_INLINE_VISIBILITY
1158
mem_fun_ref_t<_Sp,_Tp>
1159
mem_fun_ref(_Sp (_Tp::*__f)())
1160
    {return mem_fun_ref_t<_Sp,_Tp>(__f);}
1161

    
1162
template<class _Sp, class _Tp, class _Ap>
1163
inline _LIBCPP_INLINE_VISIBILITY
1164
mem_fun1_ref_t<_Sp,_Tp,_Ap>
1165
mem_fun_ref(_Sp (_Tp::*__f)(_Ap))
1166
    {return mem_fun1_ref_t<_Sp,_Tp,_Ap>(__f);}
1167

    
1168
template <class _Sp, class _Tp>
1169
class _LIBCPP_TYPE_VIS_ONLY const_mem_fun_t : public unary_function<const _Tp*, _Sp>
1170
{
1171
    _Sp (_Tp::*__p_)() const;
1172
public:
1173
    _LIBCPP_INLINE_VISIBILITY explicit const_mem_fun_t(_Sp (_Tp::*__p)() const)
1174
        : __p_(__p) {}
1175
    _LIBCPP_INLINE_VISIBILITY _Sp operator()(const _Tp* __p) const
1176
        {return (__p->*__p_)();}
1177
};
1178

    
1179
template <class _Sp, class _Tp, class _Ap>
1180
class _LIBCPP_TYPE_VIS_ONLY const_mem_fun1_t : public binary_function<const _Tp*, _Ap, _Sp>
1181
{
1182
    _Sp (_Tp::*__p_)(_Ap) const;
1183
public:
1184
    _LIBCPP_INLINE_VISIBILITY explicit const_mem_fun1_t(_Sp (_Tp::*__p)(_Ap) const)
1185
        : __p_(__p) {}
1186
    _LIBCPP_INLINE_VISIBILITY _Sp operator()(const _Tp* __p, _Ap __x) const
1187
        {return (__p->*__p_)(__x);}
1188
};
1189

    
1190
template <class _Sp, class _Tp>
1191
inline _LIBCPP_INLINE_VISIBILITY
1192
const_mem_fun_t<_Sp,_Tp>
1193
mem_fun(_Sp (_Tp::*__f)() const)
1194
    {return const_mem_fun_t<_Sp,_Tp>(__f);}
1195

    
1196
template <class _Sp, class _Tp, class _Ap>
1197
inline _LIBCPP_INLINE_VISIBILITY
1198
const_mem_fun1_t<_Sp,_Tp,_Ap>
1199
mem_fun(_Sp (_Tp::*__f)(_Ap) const)
1200
    {return const_mem_fun1_t<_Sp,_Tp,_Ap>(__f);}
1201

    
1202
template <class _Sp, class _Tp>
1203
class _LIBCPP_TYPE_VIS_ONLY const_mem_fun_ref_t : public unary_function<_Tp, _Sp>
1204
{
1205
    _Sp (_Tp::*__p_)() const;
1206
public:
1207
    _LIBCPP_INLINE_VISIBILITY explicit const_mem_fun_ref_t(_Sp (_Tp::*__p)() const)
1208
        : __p_(__p) {}
1209
    _LIBCPP_INLINE_VISIBILITY _Sp operator()(const _Tp& __p) const
1210
        {return (__p.*__p_)();}
1211
};
1212

    
1213
template <class _Sp, class _Tp, class _Ap>
1214
class _LIBCPP_TYPE_VIS_ONLY const_mem_fun1_ref_t
1215
    : public binary_function<_Tp, _Ap, _Sp>
1216
{
1217
    _Sp (_Tp::*__p_)(_Ap) const;
1218
public:
1219
    _LIBCPP_INLINE_VISIBILITY explicit const_mem_fun1_ref_t(_Sp (_Tp::*__p)(_Ap) const)
1220
        : __p_(__p) {}
1221
    _LIBCPP_INLINE_VISIBILITY _Sp operator()(const _Tp& __p, _Ap __x) const
1222
        {return (__p.*__p_)(__x);}
1223
};
1224

    
1225
template <class _Sp, class _Tp>
1226
inline _LIBCPP_INLINE_VISIBILITY
1227
const_mem_fun_ref_t<_Sp,_Tp>
1228
mem_fun_ref(_Sp (_Tp::*__f)() const)
1229
    {return const_mem_fun_ref_t<_Sp,_Tp>(__f);}
1230

    
1231
template <class _Sp, class _Tp, class _Ap>
1232
inline _LIBCPP_INLINE_VISIBILITY
1233
const_mem_fun1_ref_t<_Sp,_Tp,_Ap>
1234
mem_fun_ref(_Sp (_Tp::*__f)(_Ap) const)
1235
    {return const_mem_fun1_ref_t<_Sp,_Tp,_Ap>(__f);}
1236

    
1237
////////////////////////////////////////////////////////////////////////////////
1238
//                                MEMFUN
1239
//==============================================================================
1240

    
1241
template <class _Tp>
1242
class __mem_fn
1243
    : public __weak_result_type<_Tp>
1244
{
1245
public:
1246
    // types
1247
    typedef _Tp type;
1248
private:
1249
    type __f_;
1250

    
1251
public:
1252
    _LIBCPP_INLINE_VISIBILITY __mem_fn(type __f) : __f_(__f) {}
1253

    
1254
#ifndef _LIBCPP_HAS_NO_VARIADICS
1255
    // invoke
1256
    template <class... _ArgTypes>
1257
    _LIBCPP_INLINE_VISIBILITY
1258
    typename __invoke_return<type, _ArgTypes...>::type
1259
    operator() (_ArgTypes&&... __args) const {
1260
        return __invoke(__f_, _VSTD::forward<_ArgTypes>(__args)...);
1261
    }
1262
#else
1263

    
1264
    template <class _A0>
1265
    typename __invoke_return0<type, _A0>::type
1266
    operator() (_A0& __a0) const {
1267
        return __invoke(__f_, __a0);
1268
    }
1269

    
1270
    template <class _A0, class _A1>
1271
    typename __invoke_return1<type, _A0, _A1>::type
1272
    operator() (_A0& __a0, _A1& __a1) const {
1273
        return __invoke(__f_, __a0, __a1);
1274
    }
1275

    
1276
    template <class _A0, class _A1, class _A2>
1277
    typename __invoke_return2<type, _A0, _A1, _A2>::type
1278
    operator() (_A0& __a0, _A1& __a1, _A2& __a2) const {
1279
        return __invoke(__f_, __a0, __a1, __a2);
1280
    }
1281
#endif
1282
};
1283

    
1284
template<class _Rp, class _Tp>
1285
inline _LIBCPP_INLINE_VISIBILITY
1286
__mem_fn<_Rp _Tp::*>
1287
mem_fn(_Rp _Tp::* __pm)
1288
{
1289
    return __mem_fn<_Rp _Tp::*>(__pm);
1290
}
1291

    
1292
////////////////////////////////////////////////////////////////////////////////
1293
//                                FUNCTION
1294
//==============================================================================
1295

    
1296
// bad_function_call
1297

    
1298
class _LIBCPP_EXCEPTION_ABI bad_function_call
1299
    : public exception
1300
{
1301
};
1302

    
1303
template<class _Fp> class _LIBCPP_TYPE_VIS_ONLY function; // undefined
1304

    
1305
namespace __function
1306
{
1307

    
1308
template<class _Rp>
1309
struct __maybe_derive_from_unary_function
1310
{
1311
};
1312

    
1313
template<class _Rp, class _A1>
1314
struct __maybe_derive_from_unary_function<_Rp(_A1)>
1315
    : public unary_function<_A1, _Rp>
1316
{
1317
};
1318

    
1319
template<class _Rp>
1320
struct __maybe_derive_from_binary_function
1321
{
1322
};
1323

    
1324
template<class _Rp, class _A1, class _A2>
1325
struct __maybe_derive_from_binary_function<_Rp(_A1, _A2)>
1326
    : public binary_function<_A1, _A2, _Rp>
1327
{
1328
};
1329

    
1330
template <class _Fp>
1331
_LIBCPP_INLINE_VISIBILITY
1332
bool __not_null(_Fp const&) { return true; }
1333

    
1334
template <class _Fp>
1335
_LIBCPP_INLINE_VISIBILITY
1336
bool __not_null(_Fp* __ptr) { return __ptr; }
1337

    
1338
template <class _Ret, class _Class>
1339
_LIBCPP_INLINE_VISIBILITY
1340
bool __not_null(_Ret _Class::*__ptr) { return __ptr; }
1341

    
1342
template <class _Fp>
1343
_LIBCPP_INLINE_VISIBILITY
1344
bool __not_null(function<_Fp> const& __f) { return !!__f; }
1345

    
1346
} // namespace __function
1347

    
1348
#ifndef _LIBCPP_HAS_NO_VARIADICS
1349

    
1350
namespace __function {
1351

    
1352
template<class _Fp> class __base;
1353

    
1354
template<class _Rp, class ..._ArgTypes>
1355
class __base<_Rp(_ArgTypes...)>
1356
{
1357
    __base(const __base&);
1358
    __base& operator=(const __base&);
1359
public:
1360
    _LIBCPP_INLINE_VISIBILITY __base() {}
1361
    _LIBCPP_INLINE_VISIBILITY virtual ~__base() {}
1362
    virtual __base* __clone() const = 0;
1363
    virtual void __clone(__base*) const = 0;
1364
    virtual void destroy() _NOEXCEPT = 0;
1365
    virtual void destroy_deallocate() _NOEXCEPT = 0;
1366
    virtual _Rp operator()(_ArgTypes&& ...) = 0;
1367
#ifndef _LIBCPP_NO_RTTI
1368
    virtual const void* target(const type_info&) const _NOEXCEPT = 0;
1369
    virtual const std::type_info& target_type() const _NOEXCEPT = 0;
1370
#endif  // _LIBCPP_NO_RTTI
1371
};
1372

    
1373
template<class _FD, class _Alloc, class _FB> class __func;
1374

    
1375
template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
1376
class __func<_Fp, _Alloc, _Rp(_ArgTypes...)>
1377
    : public  __base<_Rp(_ArgTypes...)>
1378
{
1379
    __compressed_pair<_Fp, _Alloc> __f_;
1380
public:
1381
    _LIBCPP_INLINE_VISIBILITY
1382
    explicit __func(_Fp&& __f)
1383
        : __f_(piecewise_construct, _VSTD::forward_as_tuple(_VSTD::move(__f)),
1384
                                    _VSTD::forward_as_tuple()) {}
1385
    _LIBCPP_INLINE_VISIBILITY
1386
    explicit __func(const _Fp& __f, const _Alloc& __a)
1387
        : __f_(piecewise_construct, _VSTD::forward_as_tuple(__f),
1388
                                    _VSTD::forward_as_tuple(__a)) {}
1389

    
1390
    _LIBCPP_INLINE_VISIBILITY
1391
    explicit __func(const _Fp& __f, _Alloc&& __a)
1392
        : __f_(piecewise_construct, _VSTD::forward_as_tuple(__f),
1393
                                    _VSTD::forward_as_tuple(_VSTD::move(__a))) {}
1394

    
1395
    _LIBCPP_INLINE_VISIBILITY
1396
    explicit __func(_Fp&& __f, _Alloc&& __a)
1397
        : __f_(piecewise_construct, _VSTD::forward_as_tuple(_VSTD::move(__f)),
1398
                                    _VSTD::forward_as_tuple(_VSTD::move(__a))) {}
1399
    virtual __base<_Rp(_ArgTypes...)>* __clone() const;
1400
    virtual void __clone(__base<_Rp(_ArgTypes...)>*) const;
1401
    virtual void destroy() _NOEXCEPT;
1402
    virtual void destroy_deallocate() _NOEXCEPT;
1403
    virtual _Rp operator()(_ArgTypes&& ... __arg);
1404
#ifndef _LIBCPP_NO_RTTI
1405
    virtual const void* target(const type_info&) const _NOEXCEPT;
1406
    virtual const std::type_info& target_type() const _NOEXCEPT;
1407
#endif  // _LIBCPP_NO_RTTI
1408
};
1409

    
1410
template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
1411
__base<_Rp(_ArgTypes...)>*
1412
__func<_Fp, _Alloc, _Rp(_ArgTypes...)>::__clone() const
1413
{
1414
    typedef allocator_traits<_Alloc> __alloc_traits;
1415
    typedef typename __rebind_alloc_helper<__alloc_traits, __func>::type _Ap;
1416
    _Ap __a(__f_.second());
1417
    typedef __allocator_destructor<_Ap> _Dp;
1418
    unique_ptr<__func, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
1419
    ::new (__hold.get()) __func(__f_.first(), _Alloc(__a));
1420
    return __hold.release();
1421
}
1422

    
1423
template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
1424
void
1425
__func<_Fp, _Alloc, _Rp(_ArgTypes...)>::__clone(__base<_Rp(_ArgTypes...)>* __p) const
1426
{
1427
    ::new (__p) __func(__f_.first(), __f_.second());
1428
}
1429

    
1430
template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
1431
void
1432
__func<_Fp, _Alloc, _Rp(_ArgTypes...)>::destroy() _NOEXCEPT
1433
{
1434
    __f_.~__compressed_pair<_Fp, _Alloc>();
1435
}
1436

    
1437
template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
1438
void
1439
__func<_Fp, _Alloc, _Rp(_ArgTypes...)>::destroy_deallocate() _NOEXCEPT
1440
{
1441
    typedef allocator_traits<_Alloc> __alloc_traits;
1442
    typedef typename __rebind_alloc_helper<__alloc_traits, __func>::type _Ap;
1443
    _Ap __a(__f_.second());
1444
    __f_.~__compressed_pair<_Fp, _Alloc>();
1445
    __a.deallocate(this, 1);
1446
}
1447

    
1448
template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
1449
_Rp
1450
__func<_Fp, _Alloc, _Rp(_ArgTypes...)>::operator()(_ArgTypes&& ... __arg)
1451
{
1452
    typedef __invoke_void_return_wrapper<_Rp> _Invoker;
1453
    return _Invoker::__call(__f_.first(), _VSTD::forward<_ArgTypes>(__arg)...);
1454
}
1455

    
1456
#ifndef _LIBCPP_NO_RTTI
1457

    
1458
template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
1459
const void*
1460
__func<_Fp, _Alloc, _Rp(_ArgTypes...)>::target(const type_info& __ti) const _NOEXCEPT
1461
{
1462
    if (__ti == typeid(_Fp))
1463
        return &__f_.first();
1464
    return (const void*)0;
1465
}
1466

    
1467
template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
1468
const std::type_info&
1469
__func<_Fp, _Alloc, _Rp(_ArgTypes...)>::target_type() const _NOEXCEPT
1470
{
1471
    return typeid(_Fp);
1472
}
1473

    
1474
#endif  // _LIBCPP_NO_RTTI
1475

    
1476
}  // __function
1477

    
1478
template<class _Rp, class ..._ArgTypes>
1479
class _LIBCPP_TYPE_VIS_ONLY function<_Rp(_ArgTypes...)>
1480
    : public __function::__maybe_derive_from_unary_function<_Rp(_ArgTypes...)>,
1481
      public __function::__maybe_derive_from_binary_function<_Rp(_ArgTypes...)>
1482
{
1483
    typedef __function::__base<_Rp(_ArgTypes...)> __base;
1484
    typename aligned_storage<3*sizeof(void*)>::type __buf_;
1485
    __base* __f_;
1486

    
1487
    template <class _Fp, bool = !is_same<_Fp, function>::value &&
1488
                                __invokable<_Fp&, _ArgTypes...>::value>
1489
        struct __callable;
1490
    template <class _Fp>
1491
        struct __callable<_Fp, true>
1492
        {
1493
            static const bool value = is_same<void, _Rp>::value ||
1494
                is_convertible<typename __invoke_of<_Fp&, _ArgTypes...>::type,
1495
                               _Rp>::value;
1496
        };
1497
    template <class _Fp>
1498
        struct __callable<_Fp, false>
1499
        {
1500
            static const bool value = false;
1501
        };
1502
public:
1503
    typedef _Rp result_type;
1504

    
1505
    // construct/copy/destroy:
1506
    _LIBCPP_INLINE_VISIBILITY
1507
    function() _NOEXCEPT : __f_(0) {}
1508
    _LIBCPP_INLINE_VISIBILITY
1509
    function(nullptr_t) _NOEXCEPT : __f_(0) {}
1510
    function(const function&);
1511
    function(function&&) _NOEXCEPT;
1512
    template<class _Fp>
1513
      function(_Fp, typename enable_if
1514
                                     <
1515
                                        __callable<_Fp>::value &&
1516
                                        !is_same<_Fp, function>::value
1517
                                      >::type* = 0);
1518

    
1519
    template<class _Alloc>
1520
      _LIBCPP_INLINE_VISIBILITY
1521
      function(allocator_arg_t, const _Alloc&) _NOEXCEPT : __f_(0) {}
1522
    template<class _Alloc>
1523
      _LIBCPP_INLINE_VISIBILITY
1524
      function(allocator_arg_t, const _Alloc&, nullptr_t) _NOEXCEPT : __f_(0) {}
1525
    template<class _Alloc>
1526
      function(allocator_arg_t, const _Alloc&, const function&);
1527
    template<class _Alloc>
1528
      function(allocator_arg_t, const _Alloc&, function&&);
1529
    template<class _Fp, class _Alloc>
1530
      function(allocator_arg_t, const _Alloc& __a, _Fp __f,
1531
               typename enable_if<__callable<_Fp>::value>::type* = 0);
1532

    
1533
    function& operator=(const function&);
1534
    function& operator=(function&&) _NOEXCEPT;
1535
    function& operator=(nullptr_t) _NOEXCEPT;
1536
    template<class _Fp>
1537
      typename enable_if
1538
      <
1539
        __callable<typename decay<_Fp>::type>::value &&
1540
        !is_same<typename remove_reference<_Fp>::type, function>::value,
1541
        function&
1542
      >::type
1543
      operator=(_Fp&&);
1544

    
1545
    ~function();
1546

    
1547
    // function modifiers:
1548
    void swap(function&) _NOEXCEPT;
1549
    template<class _Fp, class _Alloc>
1550
      _LIBCPP_INLINE_VISIBILITY
1551
      void assign(_Fp&& __f, const _Alloc& __a)
1552
        {function(allocator_arg, __a, _VSTD::forward<_Fp>(__f)).swap(*this);}
1553

    
1554
    // function capacity:
1555
    _LIBCPP_INLINE_VISIBILITY
1556
        _LIBCPP_EXPLICIT operator bool() const _NOEXCEPT {return __f_;}
1557

    
1558
    // deleted overloads close possible hole in the type system
1559
    template<class _R2, class... _ArgTypes2>
1560
      bool operator==(const function<_R2(_ArgTypes2...)>&) const = delete;
1561
    template<class _R2, class... _ArgTypes2>
1562
      bool operator!=(const function<_R2(_ArgTypes2...)>&) const = delete;
1563
public:
1564
    // function invocation:
1565
    _Rp operator()(_ArgTypes...) const;
1566

    
1567
#ifndef _LIBCPP_NO_RTTI
1568
    // function target access:
1569
    const std::type_info& target_type() const _NOEXCEPT;
1570
    template <typename _Tp> _Tp* target() _NOEXCEPT;
1571
    template <typename _Tp> const _Tp* target() const _NOEXCEPT;
1572
#endif  // _LIBCPP_NO_RTTI
1573
};
1574

    
1575
template<class _Rp, class ..._ArgTypes>
1576
function<_Rp(_ArgTypes...)>::function(const function& __f)
1577
{
1578
    if (__f.__f_ == 0)
1579
        __f_ = 0;
1580
    else if (__f.__f_ == (const __base*)&__f.__buf_)
1581
    {
1582
        __f_ = (__base*)&__buf_;
1583
        __f.__f_->__clone(__f_);
1584
    }
1585
    else
1586
        __f_ = __f.__f_->__clone();
1587
}
1588

    
1589
template<class _Rp, class ..._ArgTypes>
1590
template <class _Alloc>
1591
function<_Rp(_ArgTypes...)>::function(allocator_arg_t, const _Alloc&,
1592
                                     const function& __f)
1593
{
1594
    if (__f.__f_ == 0)
1595
        __f_ = 0;
1596
    else if (__f.__f_ == (const __base*)&__f.__buf_)
1597
    {
1598
        __f_ = (__base*)&__buf_;
1599
        __f.__f_->__clone(__f_);
1600
    }
1601
    else
1602
        __f_ = __f.__f_->__clone();
1603
}
1604

    
1605
template<class _Rp, class ..._ArgTypes>
1606
function<_Rp(_ArgTypes...)>::function(function&& __f) _NOEXCEPT
1607
{
1608
    if (__f.__f_ == 0)
1609
        __f_ = 0;
1610
    else if (__f.__f_ == (__base*)&__f.__buf_)
1611
    {
1612
        __f_ = (__base*)&__buf_;
1613
        __f.__f_->__clone(__f_);
1614
    }
1615
    else
1616
    {
1617
        __f_ = __f.__f_;
1618
        __f.__f_ = 0;
1619
    }
1620
}
1621

    
1622
template<class _Rp, class ..._ArgTypes>
1623
template <class _Alloc>
1624
function<_Rp(_ArgTypes...)>::function(allocator_arg_t, const _Alloc&,
1625
                                     function&& __f)
1626
{
1627
    if (__f.__f_ == 0)
1628
        __f_ = 0;
1629
    else if (__f.__f_ == (__base*)&__f.__buf_)
1630
    {
1631
        __f_ = (__base*)&__buf_;
1632
        __f.__f_->__clone(__f_);
1633
    }
1634
    else
1635
    {
1636
        __f_ = __f.__f_;
1637
        __f.__f_ = 0;
1638
    }
1639
}
1640

    
1641
template<class _Rp, class ..._ArgTypes>
1642
template <class _Fp>
1643
function<_Rp(_ArgTypes...)>::function(_Fp __f,
1644
                                     typename enable_if
1645
                                     <
1646
                                        __callable<_Fp>::value &&
1647
                                        !is_same<_Fp, function>::value
1648
                                     >::type*)
1649
    : __f_(0)
1650
{
1651
    if (__function::__not_null(__f))
1652
    {
1653
        typedef __function::__func<_Fp, allocator<_Fp>, _Rp(_ArgTypes...)> _FF;
1654
        if (sizeof(_FF) <= sizeof(__buf_) && is_nothrow_copy_constructible<_Fp>::value)
1655
        {
1656
            __f_ = (__base*)&__buf_;
1657
            ::new (__f_) _FF(_VSTD::move(__f));
1658
        }
1659
        else
1660
        {
1661
            typedef allocator<_FF> _Ap;
1662
            _Ap __a;
1663
            typedef __allocator_destructor<_Ap> _Dp;
1664
            unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
1665
            ::new (__hold.get()) _FF(_VSTD::move(__f), allocator<_Fp>(__a));
1666
            __f_ = __hold.release();
1667
        }
1668
    }
1669
}
1670

    
1671
template<class _Rp, class ..._ArgTypes>
1672
template <class _Fp, class _Alloc>
1673
function<_Rp(_ArgTypes...)>::function(allocator_arg_t, const _Alloc& __a0, _Fp __f,
1674
                                     typename enable_if<__callable<_Fp>::value>::type*)
1675
    : __f_(0)
1676
{
1677
    typedef allocator_traits<_Alloc> __alloc_traits;
1678
    if (__function::__not_null(__f))
1679
    {
1680
        typedef __function::__func<_Fp, _Alloc, _Rp(_ArgTypes...)> _FF;
1681
        typedef typename __rebind_alloc_helper<__alloc_traits, _FF>::type _Ap;
1682
        _Ap __a(__a0);
1683
        if (sizeof(_FF) <= sizeof(__buf_) && 
1684
            is_nothrow_copy_constructible<_Fp>::value && is_nothrow_copy_constructible<_Ap>::value)
1685
        {
1686
            __f_ = (__base*)&__buf_;
1687
            ::new (__f_) _FF(_VSTD::move(__f), _Alloc(__a));
1688
        }
1689
        else
1690
        {
1691
            typedef __allocator_destructor<_Ap> _Dp;
1692
            unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
1693
            ::new (__hold.get()) _FF(_VSTD::move(__f), _Alloc(__a));
1694
            __f_ = __hold.release();
1695
        }
1696
    }
1697
}
1698

    
1699
template<class _Rp, class ..._ArgTypes>
1700
function<_Rp(_ArgTypes...)>&
1701
function<_Rp(_ArgTypes...)>::operator=(const function& __f)
1702
{
1703
    function(__f).swap(*this);
1704
    return *this;
1705
}
1706

    
1707
template<class _Rp, class ..._ArgTypes>
1708
function<_Rp(_ArgTypes...)>&
1709
function<_Rp(_ArgTypes...)>::operator=(function&& __f) _NOEXCEPT
1710
{
1711
    if (__f_ == (__base*)&__buf_)
1712
        __f_->destroy();
1713
    else if (__f_)
1714
        __f_->destroy_deallocate();
1715
    __f_ = 0;
1716
    if (__f.__f_ == 0)
1717
        __f_ = 0;
1718
    else if (__f.__f_ == (__base*)&__f.__buf_)
1719
    {
1720
        __f_ = (__base*)&__buf_;
1721
        __f.__f_->__clone(__f_);
1722
    }
1723
    else
1724
    {
1725
        __f_ = __f.__f_;
1726
        __f.__f_ = 0;
1727
    }
1728
    return *this;
1729
}
1730

    
1731
template<class _Rp, class ..._ArgTypes>
1732
function<_Rp(_ArgTypes...)>&
1733
function<_Rp(_ArgTypes...)>::operator=(nullptr_t) _NOEXCEPT
1734
{
1735
    if (__f_ == (__base*)&__buf_)
1736
        __f_->destroy();
1737
    else if (__f_)
1738
        __f_->destroy_deallocate();
1739
    __f_ = 0;
1740
    return *this;
1741
}
1742

    
1743
template<class _Rp, class ..._ArgTypes>
1744
template <class _Fp>
1745
typename enable_if
1746
<
1747
    function<_Rp(_ArgTypes...)>::template __callable<typename decay<_Fp>::type>::value &&
1748
    !is_same<typename remove_reference<_Fp>::type, function<_Rp(_ArgTypes...)>>::value,
1749
    function<_Rp(_ArgTypes...)>&
1750
>::type
1751
function<_Rp(_ArgTypes...)>::operator=(_Fp&& __f)
1752
{
1753
    function(_VSTD::forward<_Fp>(__f)).swap(*this);
1754
    return *this;
1755
}
1756

    
1757
template<class _Rp, class ..._ArgTypes>
1758
function<_Rp(_ArgTypes...)>::~function()
1759
{
1760
    if (__f_ == (__base*)&__buf_)
1761
        __f_->destroy();
1762
    else if (__f_)
1763
        __f_->destroy_deallocate();
1764
}
1765

    
1766
template<class _Rp, class ..._ArgTypes>
1767
void
1768
function<_Rp(_ArgTypes...)>::swap(function& __f) _NOEXCEPT
1769
{
1770
    if (__f_ == (__base*)&__buf_ && __f.__f_ == (__base*)&__f.__buf_)
1771
    {
1772
        typename aligned_storage<sizeof(__buf_)>::type __tempbuf;
1773
        __base* __t = (__base*)&__tempbuf;
1774
        __f_->__clone(__t);
1775
        __f_->destroy();
1776
        __f_ = 0;
1777
        __f.__f_->__clone((__base*)&__buf_);
1778
        __f.__f_->destroy();
1779
        __f.__f_ = 0;
1780
        __f_ = (__base*)&__buf_;
1781
        __t->__clone((__base*)&__f.__buf_);
1782
        __t->destroy();
1783
        __f.__f_ = (__base*)&__f.__buf_;
1784
    }
1785
    else if (__f_ == (__base*)&__buf_)
1786
    {
1787
        __f_->__clone((__base*)&__f.__buf_);
1788
        __f_->destroy();
1789
        __f_ = __f.__f_;
1790
        __f.__f_ = (__base*)&__f.__buf_;
1791
    }
1792
    else if (__f.__f_ == (__base*)&__f.__buf_)
1793
    {
1794
        __f.__f_->__clone((__base*)&__buf_);
1795
        __f.__f_->destroy();
1796
        __f.__f_ = __f_;
1797
        __f_ = (__base*)&__buf_;
1798
    }
1799
    else
1800
        _VSTD::swap(__f_, __f.__f_);
1801
}
1802

    
1803
template<class _Rp, class ..._ArgTypes>
1804
_Rp
1805
function<_Rp(_ArgTypes...)>::operator()(_ArgTypes... __arg) const
1806
{
1807
#ifndef _LIBCPP_NO_EXCEPTIONS
1808
    if (__f_ == 0)
1809
        throw bad_function_call();
1810
#endif  // _LIBCPP_NO_EXCEPTIONS
1811
    return (*__f_)(_VSTD::forward<_ArgTypes>(__arg)...);
1812
}
1813

    
1814
#ifndef _LIBCPP_NO_RTTI
1815

    
1816
template<class _Rp, class ..._ArgTypes>
1817
const std::type_info&
1818
function<_Rp(_ArgTypes...)>::target_type() const _NOEXCEPT
1819
{
1820
    if (__f_ == 0)
1821
        return typeid(void);
1822
    return __f_->target_type();
1823
}
1824

    
1825
template<class _Rp, class ..._ArgTypes>
1826
template <typename _Tp>
1827
_Tp*
1828
function<_Rp(_ArgTypes...)>::target() _NOEXCEPT
1829
{
1830
    if (__f_ == 0)
1831
        return (_Tp*)0;
1832
    return (_Tp*)__f_->target(typeid(_Tp));
1833
}
1834

    
1835
template<class _Rp, class ..._ArgTypes>
1836
template <typename _Tp>
1837
const _Tp*
1838
function<_Rp(_ArgTypes...)>::target() const _NOEXCEPT
1839
{
1840
    if (__f_ == 0)
1841
        return (const _Tp*)0;
1842
    return (const _Tp*)__f_->target(typeid(_Tp));
1843
}
1844

    
1845
#endif  // _LIBCPP_NO_RTTI
1846

    
1847
template <class _Rp, class... _ArgTypes>
1848
inline _LIBCPP_INLINE_VISIBILITY
1849
bool
1850
operator==(const function<_Rp(_ArgTypes...)>& __f, nullptr_t) _NOEXCEPT {return !__f;}
1851

    
1852
template <class _Rp, class... _ArgTypes>
1853
inline _LIBCPP_INLINE_VISIBILITY
1854
bool
1855
operator==(nullptr_t, const function<_Rp(_ArgTypes...)>& __f) _NOEXCEPT {return !__f;}
1856

    
1857
template <class _Rp, class... _ArgTypes>
1858
inline _LIBCPP_INLINE_VISIBILITY
1859
bool
1860
operator!=(const function<_Rp(_ArgTypes...)>& __f, nullptr_t) _NOEXCEPT {return (bool)__f;}
1861

    
1862
template <class _Rp, class... _ArgTypes>
1863
inline _LIBCPP_INLINE_VISIBILITY
1864
bool
1865
operator!=(nullptr_t, const function<_Rp(_ArgTypes...)>& __f) _NOEXCEPT {return (bool)__f;}
1866

    
1867
template <class _Rp, class... _ArgTypes>
1868
inline _LIBCPP_INLINE_VISIBILITY
1869
void
1870
swap(function<_Rp(_ArgTypes...)>& __x, function<_Rp(_ArgTypes...)>& __y) _NOEXCEPT
1871
{return __x.swap(__y);}
1872

    
1873
#else // _LIBCPP_HAS_NO_VARIADICS
1874

    
1875
#include <__functional_03>
1876

    
1877
#endif
1878

    
1879
////////////////////////////////////////////////////////////////////////////////
1880
//                                  BIND
1881
//==============================================================================
1882

    
1883
template<class _Tp> struct __is_bind_expression : public false_type {};
1884
template<class _Tp> struct _LIBCPP_TYPE_VIS_ONLY is_bind_expression
1885
    : public __is_bind_expression<typename remove_cv<_Tp>::type> {};
1886

    
1887
template<class _Tp> struct __is_placeholder : public integral_constant<int, 0> {};
1888
template<class _Tp> struct _LIBCPP_TYPE_VIS_ONLY is_placeholder
1889
    : public __is_placeholder<typename remove_cv<_Tp>::type> {};
1890

    
1891
namespace placeholders
1892
{
1893

    
1894
template <int _Np> struct __ph {};
1895

    
1896
_LIBCPP_FUNC_VIS extern __ph<1>   _1;
1897
_LIBCPP_FUNC_VIS extern __ph<2>   _2;
1898
_LIBCPP_FUNC_VIS extern __ph<3>   _3;
1899
_LIBCPP_FUNC_VIS extern __ph<4>   _4;
1900
_LIBCPP_FUNC_VIS extern __ph<5>   _5;
1901
_LIBCPP_FUNC_VIS extern __ph<6>   _6;
1902
_LIBCPP_FUNC_VIS extern __ph<7>   _7;
1903
_LIBCPP_FUNC_VIS extern __ph<8>   _8;
1904
_LIBCPP_FUNC_VIS extern __ph<9>   _9;
1905
_LIBCPP_FUNC_VIS extern __ph<10> _10;
1906

    
1907
}  // placeholders
1908

    
1909
template<int _Np>
1910
struct __is_placeholder<placeholders::__ph<_Np> >
1911
    : public integral_constant<int, _Np> {};
1912

    
1913

    
1914
#ifndef _LIBCPP_HAS_NO_VARIADICS
1915

    
1916
template <class _Tp, class _Uj>
1917
inline _LIBCPP_INLINE_VISIBILITY
1918
_Tp&
1919
__mu(reference_wrapper<_Tp> __t, _Uj&)
1920
{
1921
    return __t.get();
1922
}
1923

    
1924
template <class _Ti, class ..._Uj, size_t ..._Indx>
1925
inline _LIBCPP_INLINE_VISIBILITY
1926
typename __invoke_of<_Ti&, _Uj...>::type
1927
__mu_expand(_Ti& __ti, tuple<_Uj...>& __uj, __tuple_indices<_Indx...>)
1928
{
1929
    return __ti(_VSTD::forward<_Uj>(_VSTD::get<_Indx>(__uj))...);
1930
}
1931

    
1932
template <class _Ti, class ..._Uj>
1933
inline _LIBCPP_INLINE_VISIBILITY
1934
typename __lazy_enable_if
1935
<
1936
    is_bind_expression<_Ti>::value,
1937
    __invoke_of<_Ti&, _Uj...>
1938
>::type
1939
__mu(_Ti& __ti, tuple<_Uj...>& __uj)
1940
{
1941
    typedef typename __make_tuple_indices<sizeof...(_Uj)>::type __indices;
1942
    return  __mu_expand(__ti, __uj, __indices());
1943
}
1944

    
1945
template <bool IsPh, class _Ti, class _Uj>
1946
struct __mu_return2 {};
1947

    
1948
template <class _Ti, class _Uj>
1949
struct __mu_return2<true, _Ti, _Uj>
1950
{
1951
    typedef typename tuple_element<is_placeholder<_Ti>::value - 1, _Uj>::type type;
1952
};
1953

    
1954
template <class _Ti, class _Uj>
1955
inline _LIBCPP_INLINE_VISIBILITY
1956
typename enable_if
1957
<
1958
    0 < is_placeholder<_Ti>::value,
1959
    typename __mu_return2<0 < is_placeholder<_Ti>::value, _Ti, _Uj>::type
1960
>::type
1961
__mu(_Ti&, _Uj& __uj)
1962
{
1963
    const size_t _Indx = is_placeholder<_Ti>::value - 1;
1964
    return _VSTD::forward<typename tuple_element<_Indx, _Uj>::type>(_VSTD::get<_Indx>(__uj));
1965
}
1966

    
1967
template <class _Ti, class _Uj>
1968
inline _LIBCPP_INLINE_VISIBILITY
1969
typename enable_if
1970
<
1971
    !is_bind_expression<_Ti>::value &&
1972
    is_placeholder<_Ti>::value == 0 &&
1973
    !__is_reference_wrapper<_Ti>::value,
1974
    _Ti&
1975
>::type
1976
__mu(_Ti& __ti, _Uj&)
1977
{
1978
    return __ti;
1979
}
1980

    
1981
template <class _Ti, bool IsReferenceWrapper, bool IsBindEx, bool IsPh,
1982
          class _TupleUj>
1983
struct ____mu_return;
1984

    
1985
template <bool _Invokable, class _Ti, class ..._Uj>
1986
struct ____mu_return_invokable  // false
1987
{
1988
    typedef __nat type;
1989
};
1990

    
1991
template <class _Ti, class ..._Uj>
1992
struct ____mu_return_invokable<true, _Ti, _Uj...>
1993
{
1994
    typedef typename __invoke_of<_Ti&, _Uj...>::type type;
1995
};
1996

    
1997
template <class _Ti, class ..._Uj>
1998
struct ____mu_return<_Ti, false, true, false, tuple<_Uj...> >
1999
    : public ____mu_return_invokable<__invokable<_Ti&, _Uj...>::value, _Ti, _Uj...>
2000
{
2001
};
2002

    
2003
template <class _Ti, class _TupleUj>
2004
struct ____mu_return<_Ti, false, false, true, _TupleUj>
2005
{
2006
    typedef typename tuple_element<is_placeholder<_Ti>::value - 1,
2007
                                   _TupleUj>::type&& type;
2008
};
2009

    
2010
template <class _Ti, class _TupleUj>
2011
struct ____mu_return<_Ti, true, false, false, _TupleUj>
2012
{
2013
    typedef typename _Ti::type& type;
2014
};
2015

    
2016
template <class _Ti, class _TupleUj>
2017
struct ____mu_return<_Ti, false, false, false, _TupleUj>
2018
{
2019
    typedef _Ti& type;
2020
};
2021

    
2022
template <class _Ti, class _TupleUj>
2023
struct __mu_return
2024
    : public ____mu_return<_Ti,
2025
                           __is_reference_wrapper<_Ti>::value,
2026
                           is_bind_expression<_Ti>::value,
2027
                           0 < is_placeholder<_Ti>::value &&
2028
                           is_placeholder<_Ti>::value <= tuple_size<_TupleUj>::value,
2029
                           _TupleUj>
2030
{
2031
};
2032

    
2033
template <class _Fp, class _BoundArgs, class _TupleUj>
2034
struct __is_valid_bind_return
2035
{
2036
    static const bool value = false;
2037
};
2038

    
2039
template <class _Fp, class ..._BoundArgs, class _TupleUj>
2040
struct __is_valid_bind_return<_Fp, tuple<_BoundArgs...>, _TupleUj>
2041
{
2042
    static const bool value = __invokable<_Fp,
2043
                    typename __mu_return<_BoundArgs, _TupleUj>::type...>::value;
2044
};
2045

    
2046
template <class _Fp, class ..._BoundArgs, class _TupleUj>
2047
struct __is_valid_bind_return<_Fp, const tuple<_BoundArgs...>, _TupleUj>
2048
{
2049
    static const bool value = __invokable<_Fp,
2050
                    typename __mu_return<const _BoundArgs, _TupleUj>::type...>::value;
2051
};
2052

    
2053
template <class _Fp, class _BoundArgs, class _TupleUj,
2054
          bool = __is_valid_bind_return<_Fp, _BoundArgs, _TupleUj>::value>
2055
struct __bind_return;
2056

    
2057
template <class _Fp, class ..._BoundArgs, class _TupleUj>
2058
struct __bind_return<_Fp, tuple<_BoundArgs...>, _TupleUj, true>
2059
{
2060
    typedef typename __invoke_of
2061
    <
2062
        _Fp&,
2063
        typename __mu_return
2064
        <
2065
            _BoundArgs,
2066
            _TupleUj
2067
        >::type...
2068
    >::type type;
2069
};
2070

    
2071
template <class _Fp, class ..._BoundArgs, class _TupleUj>
2072
struct __bind_return<_Fp, const tuple<_BoundArgs...>, _TupleUj, true>
2073
{
2074
    typedef typename __invoke_of
2075
    <
2076
        _Fp&,
2077
        typename __mu_return
2078
        <
2079
            const _BoundArgs,
2080
            _TupleUj
2081
        >::type...
2082
    >::type type;
2083
};
2084

    
2085
template <class _Fp, class _BoundArgs, size_t ..._Indx, class _Args>
2086
inline _LIBCPP_INLINE_VISIBILITY
2087
typename __bind_return<_Fp, _BoundArgs, _Args>::type
2088
__apply_functor(_Fp& __f, _BoundArgs& __bound_args, __tuple_indices<_Indx...>,
2089
                _Args&& __args)
2090
{
2091
    return __invoke(__f, __mu(_VSTD::get<_Indx>(__bound_args), __args)...);
2092
}
2093

    
2094
template<class _Fp, class ..._BoundArgs>
2095
class __bind
2096
    : public __weak_result_type<typename decay<_Fp>::type>
2097
{
2098
protected:
2099
    typedef typename decay<_Fp>::type _Fd;
2100
    typedef tuple<typename decay<_BoundArgs>::type...> _Td;
2101
private:
2102
    _Fd __f_;
2103
    _Td __bound_args_;
2104

    
2105
    typedef typename __make_tuple_indices<sizeof...(_BoundArgs)>::type __indices;
2106
public:
2107
#ifdef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
2108

    
2109
    _LIBCPP_INLINE_VISIBILITY
2110
    __bind(const __bind& __b)
2111
        : __f_(__b.__f_),
2112
          __bound_args_(__b.__bound_args_) {}
2113

    
2114
    _LIBCPP_INLINE_VISIBILITY
2115
    __bind& operator=(const __bind& __b)
2116
    {
2117
        __f_ = __b.__f_;
2118
        __bound_args_ = __b.__bound_args_;
2119
        return *this;
2120
    }
2121

    
2122
    _LIBCPP_INLINE_VISIBILITY
2123
    __bind(__bind&& __b)
2124
        : __f_(_VSTD::move(__b.__f_)),
2125
          __bound_args_(_VSTD::move(__b.__bound_args_)) {}
2126

    
2127
    _LIBCPP_INLINE_VISIBILITY
2128
    __bind& operator=(__bind&& __b)
2129
    {
2130
        __f_ = _VSTD::move(__b.__f_);
2131
        __bound_args_ = _VSTD::move(__b.__bound_args_);
2132
        return *this;
2133
    }
2134

    
2135
#endif  // _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
2136

    
2137
    template <class _Gp, class ..._BA,
2138
              class = typename enable_if
2139
                               <
2140
                                  is_constructible<_Fd, _Gp>::value &&
2141
                                  !is_same<typename remove_reference<_Gp>::type,
2142
                                           __bind>::value
2143
                               >::type>
2144
      _LIBCPP_INLINE_VISIBILITY
2145
      explicit __bind(_Gp&& __f, _BA&& ...__bound_args)
2146
        : __f_(_VSTD::forward<_Gp>(__f)),
2147
          __bound_args_(_VSTD::forward<_BA>(__bound_args)...) {}
2148

    
2149
    template <class ..._Args>
2150
        _LIBCPP_INLINE_VISIBILITY
2151
        typename __bind_return<_Fd, _Td, tuple<_Args&&...> >::type
2152
        operator()(_Args&& ...__args)
2153
        {
2154
            return __apply_functor(__f_, __bound_args_, __indices(),
2155
                                  tuple<_Args&&...>(_VSTD::forward<_Args>(__args)...));
2156
        }
2157

    
2158
    template <class ..._Args>
2159
        _LIBCPP_INLINE_VISIBILITY
2160
        typename __bind_return<const _Fd, const _Td, tuple<_Args&&...> >::type
2161
        operator()(_Args&& ...__args) const
2162
        {
2163
            return __apply_functor(__f_, __bound_args_, __indices(),
2164
                                   tuple<_Args&&...>(_VSTD::forward<_Args>(__args)...));
2165
        }
2166
};
2167

    
2168
template<class _Fp, class ..._BoundArgs>
2169
struct __is_bind_expression<__bind<_Fp, _BoundArgs...> > : public true_type {};
2170

    
2171
template<class _Rp, class _Fp, class ..._BoundArgs>
2172
class __bind_r
2173
    : public __bind<_Fp, _BoundArgs...>
2174
{
2175
    typedef __bind<_Fp, _BoundArgs...> base;
2176
    typedef typename base::_Fd _Fd;
2177
    typedef typename base::_Td _Td;
2178
public:
2179
    typedef _Rp result_type;
2180

    
2181
#ifdef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
2182

    
2183
    _LIBCPP_INLINE_VISIBILITY
2184
    __bind_r(const __bind_r& __b)
2185
        : base(_VSTD::forward<const base&>(__b)) {}
2186

    
2187
    _LIBCPP_INLINE_VISIBILITY
2188
    __bind_r& operator=(const __bind_r& __b)
2189
    {
2190
        base::operator=(_VSTD::forward<const base&>(__b));
2191
        return *this;
2192
    }
2193

    
2194
    _LIBCPP_INLINE_VISIBILITY
2195
    __bind_r(__bind_r&& __b)
2196
        : base(_VSTD::forward<base>(__b)) {}
2197

    
2198
    _LIBCPP_INLINE_VISIBILITY
2199
    __bind_r& operator=(__bind_r&& __b)
2200
    {
2201
        base::operator=(_VSTD::forward<base>(__b));
2202
        return *this;
2203
    }
2204

    
2205
#endif  // _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
2206

    
2207
    template <class _Gp, class ..._BA,
2208
              class = typename enable_if
2209
                               <
2210
                                  is_constructible<_Fd, _Gp>::value &&
2211
                                  !is_same<typename remove_reference<_Gp>::type,
2212
                                           __bind_r>::value
2213
                               >::type>
2214
      _LIBCPP_INLINE_VISIBILITY
2215
      explicit __bind_r(_Gp&& __f, _BA&& ...__bound_args)
2216
        : base(_VSTD::forward<_Gp>(__f),
2217
               _VSTD::forward<_BA>(__bound_args)...) {}
2218

    
2219
    template <class ..._Args>
2220
        _LIBCPP_INLINE_VISIBILITY
2221
        typename enable_if
2222
        <
2223
            is_convertible<typename __bind_return<_Fd, _Td, tuple<_Args&&...> >::type,
2224
                           result_type>::value || is_void<_Rp>::value,
2225
            result_type
2226
        >::type
2227
        operator()(_Args&& ...__args)
2228
        {
2229
            typedef __invoke_void_return_wrapper<_Rp> _Invoker;
2230
            return _Invoker::__call(static_cast<base&>(*this), _VSTD::forward<_Args>(__args)...);
2231
        }
2232

    
2233
    template <class ..._Args>
2234
        _LIBCPP_INLINE_VISIBILITY
2235
        typename enable_if
2236
        <
2237
            is_convertible<typename __bind_return<const _Fd, const _Td, tuple<_Args&&...> >::type,
2238
                           result_type>::value || is_void<_Rp>::value,
2239
            result_type
2240
        >::type
2241
        operator()(_Args&& ...__args) const
2242
        {
2243
            typedef __invoke_void_return_wrapper<_Rp> _Invoker;
2244
            return _Invoker::__call(static_cast<base const&>(*this), _VSTD::forward<_Args>(__args)...);
2245
        }
2246
};
2247

    
2248
template<class _Rp, class _Fp, class ..._BoundArgs>
2249
struct __is_bind_expression<__bind_r<_Rp, _Fp, _BoundArgs...> > : public true_type {};
2250

    
2251
template<class _Fp, class ..._BoundArgs>
2252
inline _LIBCPP_INLINE_VISIBILITY
2253
__bind<_Fp, _BoundArgs...>
2254
bind(_Fp&& __f, _BoundArgs&&... __bound_args)
2255
{
2256
    typedef __bind<_Fp, _BoundArgs...> type;
2257
    return type(_VSTD::forward<_Fp>(__f), _VSTD::forward<_BoundArgs>(__bound_args)...);
2258
}
2259

    
2260
template<class _Rp, class _Fp, class ..._BoundArgs>
2261
inline _LIBCPP_INLINE_VISIBILITY
2262
__bind_r<_Rp, _Fp, _BoundArgs...>
2263
bind(_Fp&& __f, _BoundArgs&&... __bound_args)
2264
{
2265
    typedef __bind_r<_Rp, _Fp, _BoundArgs...> type;
2266
    return type(_VSTD::forward<_Fp>(__f), _VSTD::forward<_BoundArgs>(__bound_args)...);
2267
}
2268

    
2269
#endif  // _LIBCPP_HAS_NO_VARIADICS
2270

    
2271
template <>
2272
struct _LIBCPP_TYPE_VIS_ONLY hash<bool>
2273
    : public unary_function<bool, size_t>
2274
{
2275
    _LIBCPP_INLINE_VISIBILITY
2276
    size_t operator()(bool __v) const _NOEXCEPT {return static_cast<size_t>(__v);}
2277
};
2278

    
2279
template <>
2280
struct _LIBCPP_TYPE_VIS_ONLY hash<char>
2281
    : public unary_function<char, size_t>
2282
{
2283
    _LIBCPP_INLINE_VISIBILITY
2284
    size_t operator()(char __v) const _NOEXCEPT {return static_cast<size_t>(__v);}
2285
};
2286

    
2287
template <>
2288
struct _LIBCPP_TYPE_VIS_ONLY hash<signed char>
2289
    : public unary_function<signed char, size_t>
2290
{
2291
    _LIBCPP_INLINE_VISIBILITY
2292
    size_t operator()(signed char __v) const _NOEXCEPT {return static_cast<size_t>(__v);}
2293
};
2294

    
2295
template <>
2296
struct _LIBCPP_TYPE_VIS_ONLY hash<unsigned char>
2297
    : public unary_function<unsigned char, size_t>
2298
{
2299
    _LIBCPP_INLINE_VISIBILITY
2300
    size_t operator()(unsigned char __v) const _NOEXCEPT {return static_cast<size_t>(__v);}
2301
};
2302

    
2303
#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
2304

    
2305
template <>
2306
struct _LIBCPP_TYPE_VIS_ONLY hash<char16_t>
2307
    : public unary_function<char16_t, size_t>
2308
{
2309
    _LIBCPP_INLINE_VISIBILITY
2310
    size_t operator()(char16_t __v) const _NOEXCEPT {return static_cast<size_t>(__v);}
2311
};
2312

    
2313
template <>
2314
struct _LIBCPP_TYPE_VIS_ONLY hash<char32_t>
2315
    : public unary_function<char32_t, size_t>
2316
{
2317
    _LIBCPP_INLINE_VISIBILITY
2318
    size_t operator()(char32_t __v) const _NOEXCEPT {return static_cast<size_t>(__v);}
2319
};
2320

    
2321
#endif  // _LIBCPP_HAS_NO_UNICODE_CHARS
2322

    
2323
template <>
2324
struct _LIBCPP_TYPE_VIS_ONLY hash<wchar_t>
2325
    : public unary_function<wchar_t, size_t>
2326
{
2327
    _LIBCPP_INLINE_VISIBILITY
2328
    size_t operator()(wchar_t __v) const _NOEXCEPT {return static_cast<size_t>(__v);}
2329
};
2330

    
2331
template <>
2332
struct _LIBCPP_TYPE_VIS_ONLY hash<short>
2333
    : public unary_function<short, size_t>
2334
{
2335
    _LIBCPP_INLINE_VISIBILITY
2336
    size_t operator()(short __v) const _NOEXCEPT {return static_cast<size_t>(__v);}
2337
};
2338

    
2339
template <>
2340
struct _LIBCPP_TYPE_VIS_ONLY hash<unsigned short>
2341
    : public unary_function<unsigned short, size_t>
2342
{
2343
    _LIBCPP_INLINE_VISIBILITY
2344
    size_t operator()(unsigned short __v) const _NOEXCEPT {return static_cast<size_t>(__v);}
2345
};
2346

    
2347
template <>
2348
struct _LIBCPP_TYPE_VIS_ONLY hash<int>
2349
    : public unary_function<int, size_t>
2350
{
2351
    _LIBCPP_INLINE_VISIBILITY
2352
    size_t operator()(int __v) const _NOEXCEPT {return static_cast<size_t>(__v);}
2353
};
2354

    
2355
template <>
2356
struct _LIBCPP_TYPE_VIS_ONLY hash<unsigned int>
2357
    : public unary_function<unsigned int, size_t>
2358
{
2359
    _LIBCPP_INLINE_VISIBILITY
2360
    size_t operator()(unsigned int __v) const _NOEXCEPT {return static_cast<size_t>(__v);}
2361
};
2362

    
2363
template <>
2364
struct _LIBCPP_TYPE_VIS_ONLY hash<long>
2365
    : public unary_function<long, size_t>
2366
{
2367
    _LIBCPP_INLINE_VISIBILITY
2368
    size_t operator()(long __v) const _NOEXCEPT {return static_cast<size_t>(__v);}
2369
};
2370

    
2371
template <>
2372
struct _LIBCPP_TYPE_VIS_ONLY hash<unsigned long>
2373
    : public unary_function<unsigned long, size_t>
2374
{
2375
    _LIBCPP_INLINE_VISIBILITY
2376
    size_t operator()(unsigned long __v) const _NOEXCEPT {return static_cast<size_t>(__v);}
2377
};
2378

    
2379
template <>
2380
struct _LIBCPP_TYPE_VIS_ONLY hash<long long>
2381
    : public __scalar_hash<long long>
2382
{
2383
};
2384

    
2385
template <>
2386
struct _LIBCPP_TYPE_VIS_ONLY hash<unsigned long long>
2387
    : public __scalar_hash<unsigned long long>
2388
{
2389
};
2390

    
2391
template <>
2392
struct _LIBCPP_TYPE_VIS_ONLY hash<float>
2393
    : public __scalar_hash<float>
2394
{
2395
    _LIBCPP_INLINE_VISIBILITY
2396
    size_t operator()(float __v) const _NOEXCEPT
2397
    {
2398
        // -0.0 and 0.0 should return same hash
2399
       if (__v == 0)
2400
           return 0;
2401
        return __scalar_hash<float>::operator()(__v);
2402
    }
2403
};
2404

    
2405
template <>
2406
struct _LIBCPP_TYPE_VIS_ONLY hash<double>
2407
    : public __scalar_hash<double>
2408
{
2409
    _LIBCPP_INLINE_VISIBILITY
2410
    size_t operator()(double __v) const _NOEXCEPT
2411
    {
2412
        // -0.0 and 0.0 should return same hash
2413
       if (__v == 0)
2414
           return 0;
2415
        return __scalar_hash<double>::operator()(__v);
2416
    }
2417
};
2418

    
2419
template <>
2420
struct _LIBCPP_TYPE_VIS_ONLY hash<long double>
2421
    : public __scalar_hash<long double>
2422
{
2423
    _LIBCPP_INLINE_VISIBILITY
2424
    size_t operator()(long double __v) const _NOEXCEPT
2425
    {
2426
        // -0.0 and 0.0 should return same hash
2427
        if (__v == 0)
2428
            return 0;
2429
#if defined(__i386__)
2430
        // Zero out padding bits
2431
        union
2432
        {
2433
            long double __t;
2434
            struct
2435
            {
2436
                size_t __a;
2437
                size_t __b;
2438
                size_t __c;
2439
                size_t __d;
2440
            } __s;
2441
        } __u;
2442
        __u.__s.__a = 0;
2443
        __u.__s.__b = 0;
2444
        __u.__s.__c = 0;
2445
        __u.__s.__d = 0;
2446
        __u.__t = __v;
2447
        return __u.__s.__a ^ __u.__s.__b ^ __u.__s.__c ^ __u.__s.__d;
2448
#elif defined(__x86_64__)
2449
        // Zero out padding bits
2450
        union
2451
        {
2452
            long double __t;
2453
            struct
2454
            {
2455
                size_t __a;
2456
                size_t __b;
2457
            } __s;
2458
        } __u;
2459
        __u.__s.__a = 0;
2460
        __u.__s.__b = 0;
2461
        __u.__t = __v;
2462
        return __u.__s.__a ^ __u.__s.__b;
2463
#else
2464
        return __scalar_hash<long double>::operator()(__v);
2465
#endif
2466
    }
2467
};
2468

    
2469
#if _LIBCPP_STD_VER > 11
2470
template <class _Tp>
2471
struct _LIBCPP_TYPE_VIS_ONLY hash
2472
    : public unary_function<_Tp, size_t>
2473
{
2474
    static_assert(is_enum<_Tp>::value, "This hash only works for enumeration types");
2475

    
2476
    _LIBCPP_INLINE_VISIBILITY
2477
    size_t operator()(_Tp __v) const _NOEXCEPT
2478
    {
2479
        typedef typename underlying_type<_Tp>::type type;
2480
        return hash<type>{}(static_cast<type>(__v));
2481
    }
2482
};
2483
#endif
2484

    
2485

    
2486
#if _LIBCPP_STD_VER > 14
2487
template <class _Fn, class ..._Args>
2488
result_of_t<_Fn&&(_Args&&...)>
2489
invoke(_Fn&& __f, _Args&&... __args) {
2490
    return __invoke(_VSTD::forward<_Fn>(__f), _VSTD::forward<_Args>(__args)...);
2491
}
2492
#endif
2493

    
2494
// struct hash<T*> in <memory>
2495

    
2496
_LIBCPP_END_NAMESPACE_STD
2497

    
2498
#endif  // _LIBCPP_FUNCTIONAL