OpenCores
URL https://opencores.org/ocsvn/openrisc_2011-10-31/openrisc_2011-10-31/trunk

Subversion Repositories openrisc_2011-10-31

[/] [openrisc/] [trunk/] [gnu-src/] [gcc-4.5.1/] [libstdc++-v3/] [include/] [std/] [functional] - Blame information for rev 628

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 424 jeremybenn
//  -*- C++ -*-
2
 
3
// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
4
// Free Software Foundation, Inc.
5
//
6
// This file is part of the GNU ISO C++ Library.  This library is free
7
// software; you can redistribute it and/or modify it under the
8
// terms of the GNU General Public License as published by the
9
// Free Software Foundation; either version 3, or (at your option)
10
// any later version.
11
 
12
// This library is distributed in the hope that it will be useful,
13
// but WITHOUT ANY WARRANTY; without even the implied warranty of
14
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
// GNU General Public License for more details.
16
 
17
// Under Section 7 of GPL version 3, you are granted additional
18
// permissions described in the GCC Runtime Library Exception, version
19
// 3.1, as published by the Free Software Foundation.
20
 
21
// You should have received a copy of the GNU General Public License and
22
// a copy of the GCC Runtime Library Exception along with this program;
23
// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
24
// .
25
 
26
/*
27
 * Copyright (c) 1997
28
 * Silicon Graphics Computer Systems, Inc.
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.  Silicon Graphics 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
 
40
/** @file include/functional
41
 *  This is a Standard C++ Library header.
42
 */
43
 
44
#ifndef _GLIBCXX_FUNCTIONAL
45
#define _GLIBCXX_FUNCTIONAL 1
46
 
47
#pragma GCC system_header
48
 
49
#include 
50
#include 
51
 
52
#ifdef __GXX_EXPERIMENTAL_CXX0X__
53
 
54
#include 
55
#include 
56
#include 
57
#include 
58
#include 
59
#include 
60
 
61
namespace std
62
{
63
  template
64
    class _Mem_fn;
65
 
66
  /**
67
   *  Actual implementation of _Has_result_type, which uses SFINAE to
68
   *  determine if the type _Tp has a publicly-accessible member type
69
   *  result_type.
70
  */
71
  template
72
    class _Has_result_type_helper : __sfinae_types
73
    {
74
      template
75
        struct _Wrap_type
76
        { };
77
 
78
      template
79
        static __one __test(_Wrap_type*);
80
 
81
      template
82
        static __two __test(...);
83
 
84
    public:
85
      static const bool value = sizeof(__test<_Tp>(0)) == 1;
86
    };
87
 
88
  template
89
    struct _Has_result_type
90
    : integral_constant
91
              _Has_result_type_helper::type>::value>
92
    { };
93
 
94
  /// If we have found a result_type, extract it.
95
  template
96
    struct _Maybe_get_result_type
97
    { };
98
 
99
  template
100
    struct _Maybe_get_result_type
101
    {
102
      typedef typename _Functor::result_type result_type;
103
    };
104
 
105
  /**
106
   *  Base class for any function object that has a weak result type, as
107
   *  defined in 3.3/3 of TR1.
108
  */
109
  template
110
    struct _Weak_result_type_impl
111
    : _Maybe_get_result_type<_Has_result_type<_Functor>::value, _Functor>
112
    { };
113
 
114
  /// Retrieve the result type for a function type.
115
  template
116
    struct _Weak_result_type_impl<_Res(_ArgTypes...)>
117
    {
118
      typedef _Res result_type;
119
    };
120
 
121
  /// Retrieve the result type for a function reference.
122
  template
123
    struct _Weak_result_type_impl<_Res(&)(_ArgTypes...)>
124
    {
125
      typedef _Res result_type;
126
    };
127
 
128
  /// Retrieve the result type for a function pointer.
129
  template
130
    struct _Weak_result_type_impl<_Res(*)(_ArgTypes...)>
131
    {
132
      typedef _Res result_type;
133
    };
134
 
135
  /// Retrieve result type for a member function pointer.
136
  template
137
    struct _Weak_result_type_impl<_Res (_Class::*)(_ArgTypes...)>
138
    {
139
      typedef _Res result_type;
140
    };
141
 
142
  /// Retrieve result type for a const member function pointer.
143
  template
144
    struct _Weak_result_type_impl<_Res (_Class::*)(_ArgTypes...) const>
145
    {
146
      typedef _Res result_type;
147
    };
148
 
149
  /// Retrieve result type for a volatile member function pointer.
150
  template
151
    struct _Weak_result_type_impl<_Res (_Class::*)(_ArgTypes...) volatile>
152
    {
153
      typedef _Res result_type;
154
    };
155
 
156
  /// Retrieve result type for a const volatile member function pointer.
157
  template
158
    struct _Weak_result_type_impl<_Res (_Class::*)(_ArgTypes...)const volatile>
159
    {
160
      typedef _Res result_type;
161
    };
162
 
163
  /**
164
   *  Strip top-level cv-qualifiers from the function object and let
165
   *  _Weak_result_type_impl perform the real work.
166
  */
167
  template
168
    struct _Weak_result_type
169
    : _Weak_result_type_impl::type>
170
    { };
171
 
172
  template
173
    class result_of;
174
 
175
  template
176
    struct result_of<_Functor(_ArgTypes...)>
177
    {
178
      typedef
179
        decltype( std::declval<_Functor>()(std::declval<_ArgTypes>()...) )
180
        type;
181
    };
182
 
183
  /// Determines if the type _Tp derives from unary_function.
184
  template
185
    struct _Derives_from_unary_function : __sfinae_types
186
    {
187
    private:
188
      template
189
        static __one __test(const volatile unary_function<_T1, _Res>*);
190
 
191
      // It's tempting to change "..." to const volatile void*, but
192
      // that fails when _Tp is a function type.
193
      static __two __test(...);
194
 
195
    public:
196
      static const bool value = sizeof(__test((_Tp*)0)) == 1;
197
    };
198
 
199
  /// Determines if the type _Tp derives from binary_function.
200
  template
201
    struct _Derives_from_binary_function : __sfinae_types
202
    {
203
    private:
204
      template
205
        static __one __test(const volatile binary_function<_T1, _T2, _Res>*);
206
 
207
      // It's tempting to change "..." to const volatile void*, but
208
      // that fails when _Tp is a function type.
209
      static __two __test(...);
210
 
211
    public:
212
      static const bool value = sizeof(__test((_Tp*)0)) == 1;
213
    };
214
 
215
  /// Turns a function type into a function pointer type
216
  template::value>
217
    struct _Function_to_function_pointer
218
    {
219
      typedef _Tp type;
220
    };
221
 
222
  template
223
    struct _Function_to_function_pointer<_Tp, true>
224
    {
225
      typedef _Tp* type;
226
    };
227
 
228
  /**
229
   * Invoke a function object, which may be either a member pointer or a
230
   * function object. The first parameter will tell which.
231
   */
232
  template
233
    inline
234
    typename enable_if<
235
             (!is_member_pointer<_Functor>::value
236
              && !is_function<_Functor>::value
237
              && !is_function::type>::value),
238
             typename result_of<_Functor(_Args...)>::type
239
           >::type
240
    __invoke(_Functor& __f, _Args&&... __args)
241
    {
242
      return __f(std::forward<_Args>(__args)...);
243
    }
244
 
245
  // To pick up function references (that will become function pointers)
246
  template
247
    inline
248
    typename enable_if<
249
             (is_pointer<_Functor>::value
250
              && is_function::type>::value),
251
             typename result_of<_Functor(_Args...)>::type
252
           >::type
253
    __invoke(_Functor __f, _Args&&... __args)
254
    {
255
      return __f(std::forward<_Args>(__args)...);
256
    }
257
 
258
  /**
259
   *  Knowing which of unary_function and binary_function _Tp derives
260
   *  from, derives from the same and ensures that reference_wrapper
261
   *  will have a weak result type. See cases below.
262
   */
263
  template
264
    struct _Reference_wrapper_base_impl;
265
 
266
  // Not a unary_function or binary_function, so try a weak result type.
267
  template
268
    struct _Reference_wrapper_base_impl
269
    : _Weak_result_type<_Tp>
270
    { };
271
 
272
  // unary_function but not binary_function
273
  template
274
    struct _Reference_wrapper_base_impl
275
    : unary_function
276
                     typename _Tp::result_type>
277
    { };
278
 
279
  // binary_function but not unary_function
280
  template
281
    struct _Reference_wrapper_base_impl
282
    : binary_function
283
                      typename _Tp::second_argument_type,
284
                      typename _Tp::result_type>
285
    { };
286
 
287
  // Both unary_function and binary_function. Import result_type to
288
  // avoid conflicts.
289
   template
290
    struct _Reference_wrapper_base_impl
291
    : unary_function
292
                     typename _Tp::result_type>,
293
      binary_function
294
                      typename _Tp::second_argument_type,
295
                      typename _Tp::result_type>
296
    {
297
      typedef typename _Tp::result_type result_type;
298
    };
299
 
300
  /**
301
   *  Derives from unary_function or binary_function when it
302
   *  can. Specializations handle all of the easy cases. The primary
303
   *  template determines what to do with a class type, which may
304
   *  derive from both unary_function and binary_function.
305
  */
306
  template
307
    struct _Reference_wrapper_base
308
    : _Reference_wrapper_base_impl<
309
      _Derives_from_unary_function<_Tp>::value,
310
      _Derives_from_binary_function<_Tp>::value,
311
      _Tp>
312
    { };
313
 
314
  // - a function type (unary)
315
  template
316
    struct _Reference_wrapper_base<_Res(_T1)>
317
    : unary_function<_T1, _Res>
318
    { };
319
 
320
  // - a function type (binary)
321
  template
322
    struct _Reference_wrapper_base<_Res(_T1, _T2)>
323
    : binary_function<_T1, _T2, _Res>
324
    { };
325
 
326
  // - a function pointer type (unary)
327
  template
328
    struct _Reference_wrapper_base<_Res(*)(_T1)>
329
    : unary_function<_T1, _Res>
330
    { };
331
 
332
  // - a function pointer type (binary)
333
  template
334
    struct _Reference_wrapper_base<_Res(*)(_T1, _T2)>
335
    : binary_function<_T1, _T2, _Res>
336
    { };
337
 
338
  // - a pointer to member function type (unary, no qualifiers)
339
  template
340
    struct _Reference_wrapper_base<_Res (_T1::*)()>
341
    : unary_function<_T1*, _Res>
342
    { };
343
 
344
  // - a pointer to member function type (binary, no qualifiers)
345
  template
346
    struct _Reference_wrapper_base<_Res (_T1::*)(_T2)>
347
    : binary_function<_T1*, _T2, _Res>
348
    { };
349
 
350
  // - a pointer to member function type (unary, const)
351
  template
352
    struct _Reference_wrapper_base<_Res (_T1::*)() const>
353
    : unary_function
354
    { };
355
 
356
  // - a pointer to member function type (binary, const)
357
  template
358
    struct _Reference_wrapper_base<_Res (_T1::*)(_T2) const>
359
    : binary_function
360
    { };
361
 
362
  // - a pointer to member function type (unary, volatile)
363
  template
364
    struct _Reference_wrapper_base<_Res (_T1::*)() volatile>
365
    : unary_function
366
    { };
367
 
368
  // - a pointer to member function type (binary, volatile)
369
  template
370
    struct _Reference_wrapper_base<_Res (_T1::*)(_T2) volatile>
371
    : binary_function
372
    { };
373
 
374
  // - a pointer to member function type (unary, const volatile)
375
  template
376
    struct _Reference_wrapper_base<_Res (_T1::*)() const volatile>
377
    : unary_function
378
    { };
379
 
380
  // - a pointer to member function type (binary, const volatile)
381
  template
382
    struct _Reference_wrapper_base<_Res (_T1::*)(_T2) const volatile>
383
    : binary_function
384
    { };
385
 
386
  /**
387
   *  @brief Primary class template for reference_wrapper.
388
   *  @ingroup functors
389
   *  @{
390
   */
391
  template
392
    class reference_wrapper
393
    : public _Reference_wrapper_base::type>
394
    {
395
      // If _Tp is a function type, we can't form result_of<_Tp(...)>,
396
      // so turn it into a function pointer type.
397
      typedef typename _Function_to_function_pointer<_Tp>::type
398
        _M_func_type;
399
 
400
      _Tp* _M_data;
401
    public:
402
      typedef _Tp type;
403
 
404
      reference_wrapper(_Tp& __indata): _M_data(&__indata)
405
      { }
406
 
407
      reference_wrapper(_Tp&&) = delete;
408
 
409
      reference_wrapper(const reference_wrapper<_Tp>& __inref):
410
      _M_data(__inref._M_data)
411
      { }
412
 
413
      reference_wrapper&
414
      operator=(const reference_wrapper<_Tp>& __inref)
415
      {
416
        _M_data = __inref._M_data;
417
        return *this;
418
      }
419
 
420
      operator _Tp&() const
421
      { return this->get(); }
422
 
423
      _Tp&
424
      get() const
425
      { return *_M_data; }
426
 
427
      template
428
        typename result_of<_M_func_type(_Args...)>::type
429
        operator()(_Args&&... __args) const
430
        {
431
          return __invoke(get(), std::forward<_Args>(__args)...);
432
        }
433
    };
434
 
435
 
436
  /// Denotes a reference should be taken to a variable.
437
  template
438
    inline reference_wrapper<_Tp>
439
    ref(_Tp& __t)
440
    { return reference_wrapper<_Tp>(__t); }
441
 
442
  /// Denotes a const reference should be taken to a variable.
443
  template
444
    inline reference_wrapper
445
    cref(const _Tp& __t)
446
    { return reference_wrapper(__t); }
447
 
448
  /// Partial specialization.
449
  template
450
    inline reference_wrapper<_Tp>
451
    ref(reference_wrapper<_Tp> __t)
452
    { return ref(__t.get()); }
453
 
454
  /// Partial specialization.
455
  template
456
    inline reference_wrapper
457
    cref(reference_wrapper<_Tp> __t)
458
    { return cref(__t.get()); }
459
 
460
  // @} group functors
461
 
462
  template
463
    struct _Mem_fn_const_or_non
464
    {
465
      typedef const _Tp& type;
466
    };
467
 
468
  template
469
    struct _Mem_fn_const_or_non<_Tp, false>
470
    {
471
      typedef _Tp& type;
472
    };
473
 
474
  /**
475
   * Derives from @c unary_function or @c binary_function, or perhaps
476
   * nothing, depending on the number of arguments provided. The
477
   * primary template is the basis case, which derives nothing.
478
   */
479
  template
480
    struct _Maybe_unary_or_binary_function { };
481
 
482
  /// Derives from @c unary_function, as appropriate.
483
  template
484
    struct _Maybe_unary_or_binary_function<_Res, _T1>
485
    : std::unary_function<_T1, _Res> { };
486
 
487
  /// Derives from @c binary_function, as appropriate.
488
  template
489
    struct _Maybe_unary_or_binary_function<_Res, _T1, _T2>
490
    : std::binary_function<_T1, _T2, _Res> { };
491
 
492
  /// Implementation of @c mem_fn for member function pointers.
493
  template
494
    class _Mem_fn<_Res (_Class::*)(_ArgTypes...)>
495
    : public _Maybe_unary_or_binary_function<_Res, _Class*, _ArgTypes...>
496
    {
497
      typedef _Res (_Class::*_Functor)(_ArgTypes...);
498
 
499
      template
500
        _Res
501
        _M_call(_Tp& __object, const volatile _Class *,
502
                _ArgTypes... __args) const
503
        { return (__object.*__pmf)(std::forward<_ArgTypes>(__args)...); }
504
 
505
      template
506
        _Res
507
        _M_call(_Tp& __ptr, const volatile void *, _ArgTypes... __args) const
508
        { return ((*__ptr).*__pmf)(std::forward<_ArgTypes>(__args)...); }
509
 
510
    public:
511
      typedef _Res result_type;
512
 
513
      explicit _Mem_fn(_Functor __pmf) : __pmf(__pmf) { }
514
 
515
      // Handle objects
516
      _Res
517
      operator()(_Class& __object, _ArgTypes... __args) const
518
      { return (__object.*__pmf)(std::forward<_ArgTypes>(__args)...); }
519
 
520
      // Handle pointers
521
      _Res
522
      operator()(_Class* __object, _ArgTypes... __args) const
523
      { return (__object->*__pmf)(std::forward<_ArgTypes>(__args)...); }
524
 
525
      // Handle smart pointers, references and pointers to derived
526
      template
527
        _Res
528
        operator()(_Tp& __object, _ArgTypes... __args) const
529
        {
530
          return _M_call(__object, &__object,
531
              std::forward<_ArgTypes>(__args)...);
532
        }
533
 
534
    private:
535
      _Functor __pmf;
536
    };
537
 
538
  /// Implementation of @c mem_fn for const member function pointers.
539
  template
540
    class _Mem_fn<_Res (_Class::*)(_ArgTypes...) const>
541
    : public _Maybe_unary_or_binary_function<_Res, const _Class*,
542
                                             _ArgTypes...>
543
    {
544
      typedef _Res (_Class::*_Functor)(_ArgTypes...) const;
545
 
546
      template
547
        _Res
548
        _M_call(_Tp& __object, const volatile _Class *,
549
                _ArgTypes... __args) const
550
        { return (__object.*__pmf)(std::forward<_ArgTypes>(__args)...); }
551
 
552
      template
553
        _Res
554
        _M_call(_Tp& __ptr, const volatile void *, _ArgTypes... __args) const
555
        { return ((*__ptr).*__pmf)(std::forward<_ArgTypes>(__args)...); }
556
 
557
    public:
558
      typedef _Res result_type;
559
 
560
      explicit _Mem_fn(_Functor __pmf) : __pmf(__pmf) { }
561
 
562
      // Handle objects
563
      _Res
564
      operator()(const _Class& __object, _ArgTypes... __args) const
565
      { return (__object.*__pmf)(std::forward<_ArgTypes>(__args)...); }
566
 
567
      // Handle pointers
568
      _Res
569
      operator()(const _Class* __object, _ArgTypes... __args) const
570
      { return (__object->*__pmf)(std::forward<_ArgTypes>(__args)...); }
571
 
572
      // Handle smart pointers, references and pointers to derived
573
      template
574
        _Res operator()(_Tp& __object, _ArgTypes... __args) const
575
        {
576
          return _M_call(__object, &__object,
577
              std::forward<_ArgTypes>(__args)...);
578
        }
579
 
580
    private:
581
      _Functor __pmf;
582
    };
583
 
584
  /// Implementation of @c mem_fn for volatile member function pointers.
585
  template
586
    class _Mem_fn<_Res (_Class::*)(_ArgTypes...) volatile>
587
    : public _Maybe_unary_or_binary_function<_Res, volatile _Class*,
588
                                             _ArgTypes...>
589
    {
590
      typedef _Res (_Class::*_Functor)(_ArgTypes...) volatile;
591
 
592
      template
593
        _Res
594
        _M_call(_Tp& __object, const volatile _Class *,
595
                _ArgTypes... __args) const
596
        { return (__object.*__pmf)(std::forward<_ArgTypes>(__args)...); }
597
 
598
      template
599
        _Res
600
        _M_call(_Tp& __ptr, const volatile void *, _ArgTypes... __args) const
601
        { return ((*__ptr).*__pmf)(std::forward<_ArgTypes>(__args)...); }
602
 
603
    public:
604
      typedef _Res result_type;
605
 
606
      explicit _Mem_fn(_Functor __pmf) : __pmf(__pmf) { }
607
 
608
      // Handle objects
609
      _Res
610
      operator()(volatile _Class& __object, _ArgTypes... __args) const
611
      { return (__object.*__pmf)(std::forward<_ArgTypes>(__args)...); }
612
 
613
      // Handle pointers
614
      _Res
615
      operator()(volatile _Class* __object, _ArgTypes... __args) const
616
      { return (__object->*__pmf)(std::forward<_ArgTypes>(__args)...); }
617
 
618
      // Handle smart pointers, references and pointers to derived
619
      template
620
        _Res
621
        operator()(_Tp& __object, _ArgTypes... __args) const
622
        {
623
          return _M_call(__object, &__object,
624
              std::forward<_ArgTypes>(__args)...);
625
        }
626
 
627
    private:
628
      _Functor __pmf;
629
    };
630
 
631
  /// Implementation of @c mem_fn for const volatile member function pointers.
632
  template
633
    class _Mem_fn<_Res (_Class::*)(_ArgTypes...) const volatile>
634
    : public _Maybe_unary_or_binary_function<_Res, const volatile _Class*,
635
                                             _ArgTypes...>
636
    {
637
      typedef _Res (_Class::*_Functor)(_ArgTypes...) const volatile;
638
 
639
      template
640
        _Res
641
        _M_call(_Tp& __object, const volatile _Class *,
642
                _ArgTypes... __args) const
643
        { return (__object.*__pmf)(std::forward<_ArgTypes>(__args)...); }
644
 
645
      template
646
        _Res
647
        _M_call(_Tp& __ptr, const volatile void *, _ArgTypes... __args) const
648
        { return ((*__ptr).*__pmf)(std::forward<_ArgTypes>(__args)...); }
649
 
650
    public:
651
      typedef _Res result_type;
652
 
653
      explicit _Mem_fn(_Functor __pmf) : __pmf(__pmf) { }
654
 
655
      // Handle objects
656
      _Res
657
      operator()(const volatile _Class& __object, _ArgTypes... __args) const
658
      { return (__object.*__pmf)(std::forward<_ArgTypes>(__args)...); }
659
 
660
      // Handle pointers
661
      _Res
662
      operator()(const volatile _Class* __object, _ArgTypes... __args) const
663
      { return (__object->*__pmf)(std::forward<_ArgTypes>(__args)...); }
664
 
665
      // Handle smart pointers, references and pointers to derived
666
      template
667
        _Res operator()(_Tp& __object, _ArgTypes... __args) const
668
        {
669
          return _M_call(__object, &__object,
670
              std::forward<_ArgTypes>(__args)...);
671
        }
672
 
673
    private:
674
      _Functor __pmf;
675
    };
676
 
677
 
678
  template
679
    class _Mem_fn<_Res _Class::*>
680
    {
681
      // This bit of genius is due to Peter Dimov, improved slightly by
682
      // Douglas Gregor.
683
      template
684
        _Res&
685
        _M_call(_Tp& __object, _Class *) const
686
        { return __object.*__pm; }
687
 
688
      template
689
        _Res&
690
        _M_call(_Tp& __object, _Up * const *) const
691
        { return (*__object).*__pm; }
692
 
693
      template
694
        const _Res&
695
        _M_call(_Tp& __object, const _Up * const *) const
696
        { return (*__object).*__pm; }
697
 
698
      template
699
        const _Res&
700
        _M_call(_Tp& __object, const _Class *) const
701
        { return __object.*__pm; }
702
 
703
      template
704
        const _Res&
705
        _M_call(_Tp& __ptr, const volatile void*) const
706
        { return (*__ptr).*__pm; }
707
 
708
      template static _Tp& __get_ref();
709
 
710
      template
711
        static __sfinae_types::__one __check_const(_Tp&, _Class*);
712
      template
713
        static __sfinae_types::__one __check_const(_Tp&, _Up * const *);
714
      template
715
        static __sfinae_types::__two __check_const(_Tp&, const _Up * const *);
716
      template
717
        static __sfinae_types::__two __check_const(_Tp&, const _Class*);
718
      template
719
        static __sfinae_types::__two __check_const(_Tp&, const volatile void*);
720
 
721
    public:
722
      template
723
        struct _Result_type
724
        : _Mem_fn_const_or_non<_Res,
725
          (sizeof(__sfinae_types::__two)
726
           == sizeof(__check_const<_Tp>(__get_ref<_Tp>(), (_Tp*)0)))>
727
        { };
728
 
729
      template
730
        struct result;
731
 
732
      template
733
        struct result<_CVMem(_Tp)>
734
        : public _Result_type<_Tp> { };
735
 
736
      template
737
        struct result<_CVMem(_Tp&)>
738
        : public _Result_type<_Tp> { };
739
 
740
      explicit
741
      _Mem_fn(_Res _Class::*__pm) : __pm(__pm) { }
742
 
743
      // Handle objects
744
      _Res&
745
      operator()(_Class& __object) const
746
      { return __object.*__pm; }
747
 
748
      const _Res&
749
      operator()(const _Class& __object) const
750
      { return __object.*__pm; }
751
 
752
      // Handle pointers
753
      _Res&
754
      operator()(_Class* __object) const
755
      { return __object->*__pm; }
756
 
757
      const _Res&
758
      operator()(const _Class* __object) const
759
      { return __object->*__pm; }
760
 
761
      // Handle smart pointers and derived
762
      template
763
        typename _Result_type<_Tp>::type
764
        operator()(_Tp& __unknown) const
765
        { return _M_call(__unknown, &__unknown); }
766
 
767
    private:
768
      _Res _Class::*__pm;
769
    };
770
 
771
  /**
772
   *  @brief Returns a function object that forwards to the member
773
   *  pointer @a pm.
774
   *  @ingroup functors
775
   */
776
  template
777
    inline _Mem_fn<_Tp _Class::*>
778
    mem_fn(_Tp _Class::* __pm)
779
    {
780
      return _Mem_fn<_Tp _Class::*>(__pm);
781
    }
782
 
783
  /**
784
   *  @brief Determines if the given type _Tp is a function object
785
   *  should be treated as a subexpression when evaluating calls to
786
   *  function objects returned by bind(). [TR1 3.6.1]
787
   *  @ingroup binders
788
   */
789
  template
790
    struct is_bind_expression
791
    : public false_type { };
792
 
793
  /**
794
   *  @brief Determines if the given type _Tp is a placeholder in a
795
   *  bind() expression and, if so, which placeholder it is. [TR1 3.6.2]
796
   *  @ingroup binders
797
   */
798
  template
799
    struct is_placeholder
800
    : public integral_constant
801
    { };
802
 
803
  /// The type of placeholder objects defined by libstdc++.
804
  template struct _Placeholder { };
805
 
806
  /** @namespace std::placeholders
807
   *  @brief ISO C++ 0x entities sub namespace for functional.
808
   *  @ingroup binders
809
   *
810
   *  Define a large number of placeholders. There is no way to
811
   *  simplify this with variadic templates, because we're introducing
812
   *  unique names for each.
813
   */
814
  namespace placeholders
815
  {
816
    namespace
817
    {
818
      _Placeholder<1> _1;
819
      _Placeholder<2> _2;
820
      _Placeholder<3> _3;
821
      _Placeholder<4> _4;
822
      _Placeholder<5> _5;
823
      _Placeholder<6> _6;
824
      _Placeholder<7> _7;
825
      _Placeholder<8> _8;
826
      _Placeholder<9> _9;
827
      _Placeholder<10> _10;
828
      _Placeholder<11> _11;
829
      _Placeholder<12> _12;
830
      _Placeholder<13> _13;
831
      _Placeholder<14> _14;
832
      _Placeholder<15> _15;
833
      _Placeholder<16> _16;
834
      _Placeholder<17> _17;
835
      _Placeholder<18> _18;
836
      _Placeholder<19> _19;
837
      _Placeholder<20> _20;
838
      _Placeholder<21> _21;
839
      _Placeholder<22> _22;
840
      _Placeholder<23> _23;
841
      _Placeholder<24> _24;
842
      _Placeholder<25> _25;
843
      _Placeholder<26> _26;
844
      _Placeholder<27> _27;
845
      _Placeholder<28> _28;
846
      _Placeholder<29> _29;
847
    }
848
  }
849
 
850
  /**
851
   *  Partial specialization of is_placeholder that provides the placeholder
852
   *  number for the placeholder objects defined by libstdc++.
853
   *  @ingroup binders
854
   */
855
  template
856
    struct is_placeholder<_Placeholder<_Num> >
857
    : public integral_constant
858
    { };
859
 
860
  /**
861
   * Stores a tuple of indices. Used by bind() to extract the elements
862
   * in a tuple.
863
   */
864
  template
865
    struct _Index_tuple
866
    {
867
      typedef _Index_tuple<_Indexes..., sizeof...(_Indexes)> __next;
868
    };
869
 
870
  /// Builds an _Index_tuple<0, 1, 2, ..., _Num-1>.
871
  template
872
    struct _Build_index_tuple
873
    {
874
      typedef typename _Build_index_tuple<_Num-1>::__type::__next __type;
875
    };
876
 
877
  template<>
878
    struct _Build_index_tuple<0>
879
    {
880
      typedef _Index_tuple<> __type;
881
    };
882
 
883
  /**
884
   * Used by _Safe_tuple_element to indicate that there is no tuple
885
   * element at this position.
886
   */
887
  struct _No_tuple_element;
888
 
889
  /**
890
   * Implementation helper for _Safe_tuple_element. This primary
891
   * template handles the case where it is safe to use @c
892
   * tuple_element.
893
   */
894
  template
895
    struct _Safe_tuple_element_impl
896
    : tuple_element<__i, _Tuple> { };
897
 
898
  /**
899
   * Implementation helper for _Safe_tuple_element. This partial
900
   * specialization handles the case where it is not safe to use @c
901
   * tuple_element. We just return @c _No_tuple_element.
902
   */
903
  template
904
    struct _Safe_tuple_element_impl<__i, _Tuple, false>
905
    {
906
      typedef _No_tuple_element type;
907
    };
908
 
909
  /**
910
   * Like tuple_element, but returns @c _No_tuple_element when
911
   * tuple_element would return an error.
912
   */
913
 template
914
   struct _Safe_tuple_element
915
   : _Safe_tuple_element_impl<__i, _Tuple,
916
                              (__i >= 0 && __i < tuple_size<_Tuple>::value)>
917
   { };
918
 
919
  /**
920
   *  Maps an argument to bind() into an actual argument to the bound
921
   *  function object [TR1 3.6.3/5]. Only the first parameter should
922
   *  be specified: the rest are used to determine among the various
923
   *  implementations. Note that, although this class is a function
924
   *  object, it isn't entirely normal because it takes only two
925
   *  parameters regardless of the number of parameters passed to the
926
   *  bind expression. The first parameter is the bound argument and
927
   *  the second parameter is a tuple containing references to the
928
   *  rest of the arguments.
929
   */
930
  template
931
           bool _IsBindExp = is_bind_expression<_Arg>::value,
932
           bool _IsPlaceholder = (is_placeholder<_Arg>::value > 0)>
933
    class _Mu;
934
 
935
  /**
936
   *  If the argument is reference_wrapper<_Tp>, returns the
937
   *  underlying reference. [TR1 3.6.3/5 bullet 1]
938
   */
939
  template
940
    class _Mu, false, false>
941
    {
942
    public:
943
      typedef _Tp& result_type;
944
 
945
      /* Note: This won't actually work for const volatile
946
       * reference_wrappers, because reference_wrapper::get() is const
947
       * but not volatile-qualified. This might be a defect in the TR.
948
       */
949
      template
950
        result_type
951
        operator()(_CVRef& __arg, _Tuple&&) const volatile
952
        { return __arg.get(); }
953
    };
954
 
955
  /**
956
   *  If the argument is a bind expression, we invoke the underlying
957
   *  function object with the same cv-qualifiers as we are given and
958
   *  pass along all of our arguments (unwrapped). [TR1 3.6.3/5 bullet 2]
959
   */
960
  template
961
    class _Mu<_Arg, true, false>
962
    {
963
    public:
964
      template class result;
965
 
966
      // Determine the result type when we pass the arguments along. This
967
      // involves passing along the cv-qualifiers placed on _Mu and
968
      // unwrapping the argument bundle.
969
      template
970
        class result<_CVMu(_CVArg, tuple<_Args...>)>
971
        : public result_of<_CVArg(_Args...)> { };
972
 
973
      template
974
        typename result_of<_CVArg(_Args...)>::type
975
        operator()(_CVArg& __arg,
976
                   tuple<_Args...>&& __tuple) const volatile
977
        {
978
          // Construct an index tuple and forward to __call
979
          typedef typename _Build_index_tuple::__type
980
            _Indexes;
981
          return this->__call(__arg, std::move(__tuple), _Indexes());
982
        }
983
 
984
    private:
985
      // Invokes the underlying function object __arg by unpacking all
986
      // of the arguments in the tuple.
987
      template
988
        typename result_of<_CVArg(_Args...)>::type
989
        __call(_CVArg& __arg, tuple<_Args...>&& __tuple,
990
               const _Index_tuple<_Indexes...>&) const volatile
991
        {
992
          return __arg(std::forward<_Args>(get<_Indexes>(__tuple))...);
993
        }
994
    };
995
 
996
  /**
997
   *  If the argument is a placeholder for the Nth argument, returns
998
   *  a reference to the Nth argument to the bind function object.
999
   *  [TR1 3.6.3/5 bullet 3]
1000
   */
1001
  template
1002
    class _Mu<_Arg, false, true>
1003
    {
1004
    public:
1005
      template class result;
1006
 
1007
      template
1008
        class result<_CVMu(_CVArg, _Tuple)>
1009
        {
1010
          // Add a reference, if it hasn't already been done for us.
1011
          // This allows us to be a little bit sloppy in constructing
1012
          // the tuple that we pass to result_of<...>.
1013
          typedef typename _Safe_tuple_element<(is_placeholder<_Arg>::value
1014
                                                - 1), _Tuple>::type
1015
            __base_type;
1016
 
1017
        public:
1018
          typedef typename add_rvalue_reference<__base_type>::type type;
1019
        };
1020
 
1021
      template
1022
        typename result<_Mu(_Arg, _Tuple)>::type
1023
        operator()(const volatile _Arg&, _Tuple&& __tuple) const volatile
1024
        {
1025
          return std::forward::type>(
1026
              ::std::get<(is_placeholder<_Arg>::value - 1)>(__tuple));
1027
        }
1028
    };
1029
 
1030
  /**
1031
   *  If the argument is just a value, returns a reference to that
1032
   *  value. The cv-qualifiers on the reference are the same as the
1033
   *  cv-qualifiers on the _Mu object. [TR1 3.6.3/5 bullet 4]
1034
   */
1035
  template
1036
    class _Mu<_Arg, false, false>
1037
    {
1038
    public:
1039
      template struct result;
1040
 
1041
      template
1042
        struct result<_CVMu(_CVArg, _Tuple)>
1043
        {
1044
          typedef typename add_lvalue_reference<_CVArg>::type type;
1045
        };
1046
 
1047
      // Pick up the cv-qualifiers of the argument
1048
      template
1049
        _CVArg&&
1050
        operator()(_CVArg&& __arg, _Tuple&&) const volatile
1051
        { return std::forward<_CVArg>(__arg); }
1052
    };
1053
 
1054
  /**
1055
   *  Maps member pointers into instances of _Mem_fn but leaves all
1056
   *  other function objects untouched. Used by tr1::bind(). The
1057
   *  primary template handles the non--member-pointer case.
1058
   */
1059
  template
1060
    struct _Maybe_wrap_member_pointer
1061
    {
1062
      typedef _Tp type;
1063
 
1064
      static const _Tp&
1065
      __do_wrap(const _Tp& __x)
1066
      { return __x; }
1067
    };
1068
 
1069
  /**
1070
   *  Maps member pointers into instances of _Mem_fn but leaves all
1071
   *  other function objects untouched. Used by tr1::bind(). This
1072
   *  partial specialization handles the member pointer case.
1073
   */
1074
  template
1075
    struct _Maybe_wrap_member_pointer<_Tp _Class::*>
1076
    {
1077
      typedef _Mem_fn<_Tp _Class::*> type;
1078
 
1079
      static type
1080
      __do_wrap(_Tp _Class::* __pm)
1081
      { return type(__pm); }
1082
    };
1083
 
1084
  // Specialization needed to prevent "forming reference to void" errors when
1085
  // bind() is called, because argument deduction instantiates
1086
  // _Maybe_wrap_member_pointer outside the immediate context where
1087
  // SFINAE applies.
1088
  template<>
1089
    struct _Maybe_wrap_member_pointer
1090
    {
1091
      typedef void type;
1092
    };
1093
 
1094
  /// Type of the function object returned from bind().
1095
  template
1096
    struct _Bind;
1097
 
1098
   template
1099
    class _Bind<_Functor(_Bound_args...)>
1100
    : public _Weak_result_type<_Functor>
1101
    {
1102
      typedef _Bind __self_type;
1103
      typedef typename _Build_index_tuple::__type
1104
        _Bound_indexes;
1105
 
1106
      _Functor _M_f;
1107
      tuple<_Bound_args...> _M_bound_args;
1108
 
1109
      // Call unqualified
1110
      template
1111
        _Result
1112
        __call(tuple<_Args...>&& __args, _Index_tuple<_Indexes...>)
1113
        {
1114
          return _M_f(_Mu<_Bound_args>()
1115
                      (get<_Indexes>(_M_bound_args), std::move(__args))...);
1116
        }
1117
 
1118
      // Call as const
1119
      template
1120
        _Result
1121
        __call_c(tuple<_Args...>&& __args, _Index_tuple<_Indexes...>) const
1122
        {
1123
          return _M_f(_Mu<_Bound_args>()
1124
                      (get<_Indexes>(_M_bound_args), std::move(__args))...);
1125
        }
1126
 
1127
#if 0
1128
      // Call as volatile
1129
      template
1130
        _Result
1131
        __call_v(tuple<_Args...>&& __args,
1132
                 _Index_tuple<_Indexes...>) volatile
1133
        {
1134
          return _M_f(_Mu<_Bound_args>()
1135
                      (get<_Indexes>(_M_bound_args), std::move(__args))...);
1136
        }
1137
 
1138
      // Call as const volatile
1139
      template
1140
        _Result
1141
        __call_c_v(tuple<_Args...>&& __args,
1142
                   _Index_tuple<_Indexes...>) const volatile
1143
        {
1144
          return _M_f(_Mu<_Bound_args>()
1145
                      (get<_Indexes>(_M_bound_args), std::move(__args))...);
1146
        }
1147
#endif
1148
 
1149
     public:
1150
      explicit _Bind(_Functor __f, _Bound_args... __bound_args)
1151
      : _M_f(std::forward<_Functor>(__f)),
1152
        _M_bound_args(std::forward<_Bound_args>(__bound_args)...)
1153
      { }
1154
 
1155
      // Call unqualified
1156
      template
1157
        = decltype( std::declval<_Functor>()(
1158
              _Mu<_Bound_args>()( std::declval<_Bound_args&>(),
1159
                                  std::declval&&>() )... ) )>
1160
        _Result
1161
        operator()(_Args&&... __args)
1162
        {
1163
          return this->__call<_Result>(tuple<_Args...>
1164
                                       (std::forward<_Args>(__args)...),
1165
                                       _Bound_indexes());
1166
        }
1167
 
1168
      // Call as const
1169
      template
1170
        = decltype( std::declval()(
1171
              _Mu<_Bound_args>()( std::declval(),
1172
                                  std::declval&&>() )... ) )>
1173
        _Result
1174
        operator()(_Args&&... __args) const
1175
        {
1176
          return this->__call_c<_Result>(tuple<_Args...>
1177
                                         (std::forward<_Args>(__args)...),
1178
                                         _Bound_indexes());
1179
        }
1180
 
1181
#if 0
1182
      // Call as volatile
1183
      template
1184
        = decltype( std::declval()(
1185
              _Mu<_Bound_args>()( std::declval(),
1186
                                  std::declval&&>() )... ) )>
1187
        _Result
1188
        operator()(_Args&&... __args) volatile
1189
        {
1190
          return this->__call_v<_Result>(tuple<_Args...>
1191
                                         (std::forward<_Args>(__args)...),
1192
                                         _Bound_indexes());
1193
        }
1194
 
1195
      // Call as const volatile
1196
      template
1197
        = decltype( std::declval()(
1198
              _Mu<_Bound_args>()( std::declval(),
1199
                                  std::declval&&>() )... ) )>
1200
        _Result
1201
        operator()(_Args&&... __args) const volatile
1202
        {
1203
          return this->__call_c_v<_Result>(tuple<_Args...>
1204
                                           (std::forward<_Args>(__args)...),
1205
                                           _Bound_indexes());
1206
        }
1207
#endif
1208
    };
1209
 
1210
  /// Type of the function object returned from bind().
1211
  template
1212
    struct _Bind_result;
1213
 
1214
  template
1215
    class _Bind_result<_Result, _Functor(_Bound_args...)>
1216
    {
1217
      typedef _Bind_result __self_type;
1218
      typedef typename _Build_index_tuple::__type
1219
        _Bound_indexes;
1220
 
1221
      _Functor _M_f;
1222
      tuple<_Bound_args...> _M_bound_args;
1223
 
1224
      // sfinae types
1225
      template
1226
        struct __enable_if_void : enable_if::value, int> { };
1227
      template
1228
        struct __disable_if_void : enable_if::value, int> { };
1229
 
1230
      // Call unqualified
1231
      template
1232
        _Result
1233
        __call(tuple<_Args...>&& __args, _Index_tuple<_Indexes...>,
1234
            typename __disable_if_void<_Res>::type = 0)
1235
        {
1236
          return _M_f(_Mu<_Bound_args>()
1237
                      (get<_Indexes>(_M_bound_args), std::move(__args))...);
1238
        }
1239
 
1240
      // Call unqualified, return void
1241
      template
1242
        void
1243
        __call(tuple<_Args...>&& __args, _Index_tuple<_Indexes...>,
1244
            typename __enable_if_void<_Res>::type = 0)
1245
        {
1246
          _M_f(_Mu<_Bound_args>()
1247
               (get<_Indexes>(_M_bound_args), std::move(__args))...);
1248
        }
1249
 
1250
      // Call as const
1251
      template
1252
        _Result
1253
        __call(tuple<_Args...>&& __args, _Index_tuple<_Indexes...>,
1254
            typename __disable_if_void<_Res>::type = 0) const
1255
        {
1256
          return _M_f(_Mu<_Bound_args>()
1257
                      (get<_Indexes>(_M_bound_args), std::move(__args))...);
1258
        }
1259
 
1260
      // Call as const, return void
1261
      template
1262
        void
1263
        __call(tuple<_Args...>&& __args, _Index_tuple<_Indexes...>,
1264
            typename __enable_if_void<_Res>::type = 0) const
1265
        {
1266
          _M_f(_Mu<_Bound_args>()
1267
               (get<_Indexes>(_M_bound_args),  std::move(__args))...);
1268
        }
1269
 
1270
      // Call as volatile
1271
      template
1272
        _Result
1273
        __call(tuple<_Args...>&& __args, _Index_tuple<_Indexes...>,
1274
            typename __disable_if_void<_Res>::type = 0) volatile
1275
        {
1276
          return _M_f(_Mu<_Bound_args>()
1277
                      (get<_Indexes>(_M_bound_args), std::move(__args))...);
1278
        }
1279
 
1280
      // Call as volatile, return void
1281
      template
1282
        void
1283
        __call(tuple<_Args...>&& __args, _Index_tuple<_Indexes...>,
1284
            typename __enable_if_void<_Res>::type = 0) volatile
1285
        {
1286
          _M_f(_Mu<_Bound_args>()
1287
               (get<_Indexes>(_M_bound_args), std::move(__args))...);
1288
        }
1289
 
1290
      // Call as const volatile
1291
      template
1292
        _Result
1293
        __call(tuple<_Args...>&& __args, _Index_tuple<_Indexes...>,
1294
            typename __disable_if_void<_Res>::type = 0) const volatile
1295
        {
1296
          return _M_f(_Mu<_Bound_args>()
1297
                      (get<_Indexes>(_M_bound_args), std::move(__args))...);
1298
        }
1299
 
1300
      // Call as const volatile, return void
1301
      template
1302
        void
1303
        __call(tuple<_Args...>&& __args,
1304
               _Index_tuple<_Indexes...>,
1305
            typename __enable_if_void<_Res>::type = 0) const volatile
1306
        {
1307
          _M_f(_Mu<_Bound_args>()
1308
               (get<_Indexes>(_M_bound_args), std::move(__args))...);
1309
        }
1310
 
1311
    public:
1312
      typedef _Result result_type;
1313
 
1314
      explicit
1315
      _Bind_result(_Functor __f, _Bound_args... __bound_args)
1316
      : _M_f(std::forward<_Functor>(__f)),
1317
        _M_bound_args(std::forward<_Bound_args>(__bound_args)...)
1318
      { }
1319
 
1320
      // Call unqualified
1321
      template
1322
        result_type
1323
        operator()(_Args&&... __args)
1324
        {
1325
          return this->__call<_Result>(
1326
              tuple<_Args...>(std::forward<_Args...>(__args)...),
1327
              _Bound_indexes());
1328
        }
1329
 
1330
      // Call as const
1331
      template
1332
        result_type
1333
        operator()(_Args&&... __args) const
1334
        {
1335
          return this->__call<_Result>(
1336
              tuple<_Args...>(std::forward<_Args...>(__args)...),
1337
              _Bound_indexes());
1338
        }
1339
 
1340
      // Call as volatile
1341
      template
1342
        result_type
1343
        operator()(_Args&&... __args) volatile
1344
        {
1345
          return this->__call<_Result>(
1346
              tuple<_Args...>(std::forward<_Args...>(__args)...),
1347
              _Bound_indexes());
1348
        }
1349
 
1350
      // Call as const volatile
1351
      template
1352
        result_type
1353
        operator()(_Args&&... __args) const volatile
1354
        {
1355
          return this->__call<_Result>(
1356
              tuple<_Args...>(std::forward<_Args...>(__args)...),
1357
              _Bound_indexes());
1358
        }
1359
    };
1360
 
1361
  /**
1362
   *  @brief Class template _Bind is always a bind expression.
1363
   *  @ingroup binders
1364
   */
1365
  template
1366
    struct is_bind_expression<_Bind<_Signature> >
1367
    : public true_type { };
1368
 
1369
  /**
1370
   *  @brief Class template _Bind is always a bind expression.
1371
   *  @ingroup binders
1372
   */
1373
  template
1374
    struct is_bind_expression<_Bind_result<_Result, _Signature> >
1375
    : public true_type { };
1376
 
1377
  /**
1378
   *  @brief Function template for std::bind.
1379
   *  @ingroup binders
1380
   */
1381
  template
1382
    inline
1383
    _Bind::type(_ArgTypes...)>
1384
    bind(_Functor __f, _ArgTypes... __args)
1385
    {
1386
      typedef _Maybe_wrap_member_pointer<_Functor> __maybe_type;
1387
      typedef typename __maybe_type::type __functor_type;
1388
      typedef _Bind<__functor_type(_ArgTypes...)> __result_type;
1389
      return __result_type(__maybe_type::__do_wrap(__f),
1390
                           std::forward<_ArgTypes>(__args)...);
1391
    }
1392
 
1393
  /**
1394
   *  @brief Function template for std::bind.
1395
   *  @ingroup binders
1396
   */
1397
  template
1398
    inline
1399
    _Bind_result<_Result,
1400
                 typename _Maybe_wrap_member_pointer<_Functor>::type
1401
                            (_ArgTypes...)>
1402
    bind(_Functor __f, _ArgTypes... __args)
1403
    {
1404
      typedef _Maybe_wrap_member_pointer<_Functor> __maybe_type;
1405
      typedef typename __maybe_type::type __functor_type;
1406
      typedef _Bind_result<_Result, __functor_type(_ArgTypes...)>
1407
        __result_type;
1408
      return __result_type(__maybe_type::__do_wrap(__f),
1409
                           std::forward<_ArgTypes>(__args)...);
1410
    }
1411
 
1412
  /**
1413
   *  @brief Exception class thrown when class template function's
1414
   *  operator() is called with an empty target.
1415
   *  @ingroup exceptions
1416
   */
1417
  class bad_function_call : public std::exception { };
1418
 
1419
  /**
1420
   *  The integral constant expression 0 can be converted into a
1421
   *  pointer to this type. It is used by the function template to
1422
   *  accept NULL pointers.
1423
   */
1424
  struct _M_clear_type;
1425
 
1426
  /**
1427
   *  Trait identifying "location-invariant" types, meaning that the
1428
   *  address of the object (or any of its members) will not escape.
1429
   *  Also implies a trivial copy constructor and assignment operator.
1430
   */
1431
  template
1432
    struct __is_location_invariant
1433
    : integral_constant::value
1434
                               || is_member_pointer<_Tp>::value)>
1435
    { };
1436
 
1437
  class _Undefined_class;
1438
 
1439
  union _Nocopy_types
1440
  {
1441
    void*       _M_object;
1442
    const void* _M_const_object;
1443
    void (*_M_function_pointer)();
1444
    void (_Undefined_class::*_M_member_pointer)();
1445
  };
1446
 
1447
  union _Any_data
1448
  {
1449
    void*       _M_access()       { return &_M_pod_data[0]; }
1450
    const void* _M_access() const { return &_M_pod_data[0]; }
1451
 
1452
    template
1453
      _Tp&
1454
      _M_access()
1455
      { return *static_cast<_Tp*>(_M_access()); }
1456
 
1457
    template
1458
      const _Tp&
1459
      _M_access() const
1460
      { return *static_cast(_M_access()); }
1461
 
1462
    _Nocopy_types _M_unused;
1463
    char _M_pod_data[sizeof(_Nocopy_types)];
1464
  };
1465
 
1466
  enum _Manager_operation
1467
  {
1468
    __get_type_info,
1469
    __get_functor_ptr,
1470
    __clone_functor,
1471
    __destroy_functor
1472
  };
1473
 
1474
  // Simple type wrapper that helps avoid annoying const problems
1475
  // when casting between void pointers and pointers-to-pointers.
1476
  template
1477
    struct _Simple_type_wrapper
1478
    {
1479
      _Simple_type_wrapper(_Tp __value) : __value(__value) { }
1480
 
1481
      _Tp __value;
1482
    };
1483
 
1484
  template
1485
    struct __is_location_invariant<_Simple_type_wrapper<_Tp> >
1486
    : __is_location_invariant<_Tp>
1487
    { };
1488
 
1489
  // Converts a reference to a function object into a callable
1490
  // function object.
1491
  template
1492
    inline _Functor&
1493
    __callable_functor(_Functor& __f)
1494
    { return __f; }
1495
 
1496
  template
1497
    inline _Mem_fn<_Member _Class::*>
1498
    __callable_functor(_Member _Class::* &__p)
1499
    { return mem_fn(__p); }
1500
 
1501
  template
1502
    inline _Mem_fn<_Member _Class::*>
1503
    __callable_functor(_Member _Class::* const &__p)
1504
    { return mem_fn(__p); }
1505
 
1506
  template
1507
    class function;
1508
 
1509
  /// Base class of all polymorphic function object wrappers.
1510
  class _Function_base
1511
  {
1512
  public:
1513
    static const std::size_t _M_max_size = sizeof(_Nocopy_types);
1514
    static const std::size_t _M_max_align = __alignof__(_Nocopy_types);
1515
 
1516
    template
1517
      class _Base_manager
1518
      {
1519
      protected:
1520
        static const bool __stored_locally =
1521
        (__is_location_invariant<_Functor>::value
1522
         && sizeof(_Functor) <= _M_max_size
1523
         && __alignof__(_Functor) <= _M_max_align
1524
         && (_M_max_align % __alignof__(_Functor) == 0));
1525
 
1526
        typedef integral_constant _Local_storage;
1527
 
1528
        // Retrieve a pointer to the function object
1529
        static _Functor*
1530
        _M_get_pointer(const _Any_data& __source)
1531
        {
1532
          const _Functor* __ptr =
1533
            __stored_locally? &__source._M_access<_Functor>()
1534
            /* have stored a pointer */ : __source._M_access<_Functor*>();
1535
          return const_cast<_Functor*>(__ptr);
1536
        }
1537
 
1538
        // Clone a location-invariant function object that fits within
1539
        // an _Any_data structure.
1540
        static void
1541
        _M_clone(_Any_data& __dest, const _Any_data& __source, true_type)
1542
        {
1543
          new (__dest._M_access()) _Functor(__source._M_access<_Functor>());
1544
        }
1545
 
1546
        // Clone a function object that is not location-invariant or
1547
        // that cannot fit into an _Any_data structure.
1548
        static void
1549
        _M_clone(_Any_data& __dest, const _Any_data& __source, false_type)
1550
        {
1551
          __dest._M_access<_Functor*>() =
1552
            new _Functor(*__source._M_access<_Functor*>());
1553
        }
1554
 
1555
        // Destroying a location-invariant object may still require
1556
        // destruction.
1557
        static void
1558
        _M_destroy(_Any_data& __victim, true_type)
1559
        {
1560
          __victim._M_access<_Functor>().~_Functor();
1561
        }
1562
 
1563
        // Destroying an object located on the heap.
1564
        static void
1565
        _M_destroy(_Any_data& __victim, false_type)
1566
        {
1567
          delete __victim._M_access<_Functor*>();
1568
        }
1569
 
1570
      public:
1571
        static bool
1572
        _M_manager(_Any_data& __dest, const _Any_data& __source,
1573
                   _Manager_operation __op)
1574
        {
1575
          switch (__op)
1576
            {
1577
#ifdef __GXX_RTTI
1578
            case __get_type_info:
1579
              __dest._M_access() = &typeid(_Functor);
1580
              break;
1581
#endif
1582
            case __get_functor_ptr:
1583
              __dest._M_access<_Functor*>() = _M_get_pointer(__source);
1584
              break;
1585
 
1586
            case __clone_functor:
1587
              _M_clone(__dest, __source, _Local_storage());
1588
              break;
1589
 
1590
            case __destroy_functor:
1591
              _M_destroy(__dest, _Local_storage());
1592
              break;
1593
            }
1594
          return false;
1595
        }
1596
 
1597
        static void
1598
        _M_init_functor(_Any_data& __functor, _Functor&& __f)
1599
        { _M_init_functor(__functor, std::move(__f), _Local_storage()); }
1600
 
1601
        template
1602
          static bool
1603
          _M_not_empty_function(const function<_Signature>& __f)
1604
          { return static_cast(__f); }
1605
 
1606
        template
1607
          static bool
1608
          _M_not_empty_function(const _Tp*& __fp)
1609
          { return __fp; }
1610
 
1611
        template
1612
          static bool
1613
          _M_not_empty_function(_Tp _Class::* const& __mp)
1614
          { return __mp; }
1615
 
1616
        template
1617
          static bool
1618
          _M_not_empty_function(const _Tp&)
1619
          { return true; }
1620
 
1621
      private:
1622
        static void
1623
        _M_init_functor(_Any_data& __functor, _Functor&& __f, true_type)
1624
        { new (__functor._M_access()) _Functor(std::move(__f)); }
1625
 
1626
        static void
1627
        _M_init_functor(_Any_data& __functor, _Functor&& __f, false_type)
1628
        { __functor._M_access<_Functor*>() = new _Functor(std::move(__f)); }
1629
      };
1630
 
1631
    template
1632
      class _Ref_manager : public _Base_manager<_Functor*>
1633
      {
1634
        typedef _Function_base::_Base_manager<_Functor*> _Base;
1635
 
1636
    public:
1637
        static bool
1638
        _M_manager(_Any_data& __dest, const _Any_data& __source,
1639
                   _Manager_operation __op)
1640
        {
1641
          switch (__op)
1642
            {
1643
#ifdef __GXX_RTTI
1644
            case __get_type_info:
1645
              __dest._M_access() = &typeid(_Functor);
1646
              break;
1647
#endif
1648
            case __get_functor_ptr:
1649
              __dest._M_access<_Functor*>() = *_Base::_M_get_pointer(__source);
1650
              return is_const<_Functor>::value;
1651
              break;
1652
 
1653
            default:
1654
              _Base::_M_manager(__dest, __source, __op);
1655
            }
1656
          return false;
1657
        }
1658
 
1659
        static void
1660
        _M_init_functor(_Any_data& __functor, reference_wrapper<_Functor> __f)
1661
        {
1662
          // TBD: Use address_of function instead.
1663
          _Base::_M_init_functor(__functor, &__f.get());
1664
        }
1665
      };
1666
 
1667
    _Function_base() : _M_manager(0) { }
1668
 
1669
    ~_Function_base()
1670
    {
1671
      if (_M_manager)
1672
        _M_manager(_M_functor, _M_functor, __destroy_functor);
1673
    }
1674
 
1675
 
1676
    bool _M_empty() const { return !_M_manager; }
1677
 
1678
    typedef bool (*_Manager_type)(_Any_data&, const _Any_data&,
1679
                                  _Manager_operation);
1680
 
1681
    _Any_data     _M_functor;
1682
    _Manager_type _M_manager;
1683
  };
1684
 
1685
  template
1686
    class _Function_handler;
1687
 
1688
  template
1689
    class _Function_handler<_Res(_ArgTypes...), _Functor>
1690
    : public _Function_base::_Base_manager<_Functor>
1691
    {
1692
      typedef _Function_base::_Base_manager<_Functor> _Base;
1693
 
1694
    public:
1695
      static _Res
1696
      _M_invoke(const _Any_data& __functor, _ArgTypes... __args)
1697
      {
1698
        return (*_Base::_M_get_pointer(__functor))(
1699
            std::forward<_ArgTypes>(__args)...);
1700
      }
1701
    };
1702
 
1703
  template
1704
    class _Function_handler
1705
    : public _Function_base::_Base_manager<_Functor>
1706
    {
1707
      typedef _Function_base::_Base_manager<_Functor> _Base;
1708
 
1709
     public:
1710
      static void
1711
      _M_invoke(const _Any_data& __functor, _ArgTypes... __args)
1712
      {
1713
        (*_Base::_M_get_pointer(__functor))(
1714
            std::forward<_ArgTypes>(__args)...);
1715
      }
1716
    };
1717
 
1718
  template
1719
    class _Function_handler<_Res(_ArgTypes...), reference_wrapper<_Functor> >
1720
    : public _Function_base::_Ref_manager<_Functor>
1721
    {
1722
      typedef _Function_base::_Ref_manager<_Functor> _Base;
1723
 
1724
     public:
1725
      static _Res
1726
      _M_invoke(const _Any_data& __functor, _ArgTypes... __args)
1727
      {
1728
        return __callable_functor(**_Base::_M_get_pointer(__functor))(
1729
              std::forward<_ArgTypes>(__args)...);
1730
      }
1731
    };
1732
 
1733
  template
1734
    class _Function_handler >
1735
    : public _Function_base::_Ref_manager<_Functor>
1736
    {
1737
      typedef _Function_base::_Ref_manager<_Functor> _Base;
1738
 
1739
     public:
1740
      static void
1741
      _M_invoke(const _Any_data& __functor, _ArgTypes... __args)
1742
      {
1743
        __callable_functor(**_Base::_M_get_pointer(__functor))(
1744
            std::forward<_ArgTypes>(__args)...);
1745
      }
1746
    };
1747
 
1748
  template
1749
           typename... _ArgTypes>
1750
    class _Function_handler<_Res(_ArgTypes...), _Member _Class::*>
1751
    : public _Function_handler
1752
    {
1753
      typedef _Function_handler
1754
        _Base;
1755
 
1756
     public:
1757
      static _Res
1758
      _M_invoke(const _Any_data& __functor, _ArgTypes... __args)
1759
      {
1760
        return mem_fn(_Base::_M_get_pointer(__functor)->__value)(
1761
            std::forward<_ArgTypes>(__args)...);
1762
      }
1763
    };
1764
 
1765
  template
1766
    class _Function_handler
1767
    : public _Function_base::_Base_manager<
1768
                 _Simple_type_wrapper< _Member _Class::* > >
1769
    {
1770
      typedef _Member _Class::* _Functor;
1771
      typedef _Simple_type_wrapper<_Functor> _Wrapper;
1772
      typedef _Function_base::_Base_manager<_Wrapper> _Base;
1773
 
1774
     public:
1775
      static bool
1776
      _M_manager(_Any_data& __dest, const _Any_data& __source,
1777
                 _Manager_operation __op)
1778
      {
1779
        switch (__op)
1780
          {
1781
#ifdef __GXX_RTTI
1782
          case __get_type_info:
1783
            __dest._M_access() = &typeid(_Functor);
1784
            break;
1785
#endif
1786
          case __get_functor_ptr:
1787
            __dest._M_access<_Functor*>() =
1788
              &_Base::_M_get_pointer(__source)->__value;
1789
            break;
1790
 
1791
          default:
1792
            _Base::_M_manager(__dest, __source, __op);
1793
          }
1794
        return false;
1795
      }
1796
 
1797
      static void
1798
      _M_invoke(const _Any_data& __functor, _ArgTypes... __args)
1799
      {
1800
        mem_fn(_Base::_M_get_pointer(__functor)->__value)(
1801
            std::forward<_ArgTypes>(__args)...);
1802
      }
1803
    };
1804
 
1805
  /**
1806
   *  @brief Primary class template for std::function.
1807
   *  @ingroup functors
1808
   *
1809
   *  Polymorphic function wrapper.
1810
   */
1811
  template
1812
    class function<_Res(_ArgTypes...)>
1813
    : public _Maybe_unary_or_binary_function<_Res, _ArgTypes...>,
1814
      private _Function_base
1815
    {
1816
      typedef _Res _Signature_type(_ArgTypes...);
1817
 
1818
      struct _Useless { };
1819
 
1820
    public:
1821
      typedef _Res result_type;
1822
 
1823
      // [3.7.2.1] construct/copy/destroy
1824
 
1825
      /**
1826
       *  @brief Default construct creates an empty function call wrapper.
1827
       *  @post @c !(bool)*this
1828
       */
1829
      explicit
1830
      function() : _Function_base() { }
1831
 
1832
      /**
1833
       *  @brief Default construct creates an empty function call wrapper.
1834
       *  @post @c !(bool)*this
1835
       */
1836
      function(_M_clear_type*) : _Function_base() { }
1837
 
1838
      /**
1839
       *  @brief %Function copy constructor.
1840
       *  @param x A %function object with identical call signature.
1841
       *  @post @c (bool)*this == (bool)x
1842
       *
1843
       *  The newly-created %function contains a copy of the target of @a
1844
       *  x (if it has one).
1845
       */
1846
      function(const function& __x);
1847
 
1848
      /**
1849
       *  @brief %Function move constructor.
1850
       *  @param x A %function object rvalue with identical call signature.
1851
       *
1852
       *  The newly-created %function contains the target of @a x
1853
       *  (if it has one).
1854
       */
1855
      function(function&& __x) : _Function_base()
1856
      {
1857
        __x.swap(*this);
1858
      }
1859
 
1860
      // TODO: needs allocator_arg_t
1861
 
1862
      /**
1863
       *  @brief Builds a %function that targets a copy of the incoming
1864
       *  function object.
1865
       *  @param f A %function object that is callable with parameters of
1866
       *  type @c T1, @c T2, ..., @c TN and returns a value convertible
1867
       *  to @c Res.
1868
       *
1869
       *  The newly-created %function object will target a copy of @a
1870
       *  f. If @a f is @c reference_wrapper, then this function
1871
       *  object will contain a reference to the function object @c
1872
       *  f.get(). If @a f is a NULL function pointer or NULL
1873
       *  pointer-to-member, the newly-created object will be empty.
1874
       *
1875
       *  If @a f is a non-NULL function pointer or an object of type @c
1876
       *  reference_wrapper, this function will not throw.
1877
       */
1878
      template
1879
        function(_Functor __f,
1880
                 typename enable_if<
1881
                           !is_integral<_Functor>::value, _Useless>::type
1882
                   = _Useless());
1883
 
1884
      /**
1885
       *  @brief %Function assignment operator.
1886
       *  @param x A %function with identical call signature.
1887
       *  @post @c (bool)*this == (bool)x
1888
       *  @returns @c *this
1889
       *
1890
       *  The target of @a x is copied to @c *this. If @a x has no
1891
       *  target, then @c *this will be empty.
1892
       *
1893
       *  If @a x targets a function pointer or a reference to a function
1894
       *  object, then this operation will not throw an %exception.
1895
       */
1896
      function&
1897
      operator=(const function& __x)
1898
      {
1899
        function(__x).swap(*this);
1900
        return *this;
1901
      }
1902
 
1903
      /**
1904
       *  @brief %Function move-assignment operator.
1905
       *  @param x A %function rvalue with identical call signature.
1906
       *  @returns @c *this
1907
       *
1908
       *  The target of @a x is moved to @c *this. If @a x has no
1909
       *  target, then @c *this will be empty.
1910
       *
1911
       *  If @a x targets a function pointer or a reference to a function
1912
       *  object, then this operation will not throw an %exception.
1913
       */
1914
      function&
1915
      operator=(function&& __x)
1916
      {
1917
        function(std::move(__x)).swap(*this);
1918
        return *this;
1919
      }
1920
 
1921
      /**
1922
       *  @brief %Function assignment to zero.
1923
       *  @post @c !(bool)*this
1924
       *  @returns @c *this
1925
       *
1926
       *  The target of @c *this is deallocated, leaving it empty.
1927
       */
1928
      function&
1929
      operator=(_M_clear_type*)
1930
      {
1931
        if (_M_manager)
1932
          {
1933
            _M_manager(_M_functor, _M_functor, __destroy_functor);
1934
            _M_manager = 0;
1935
            _M_invoker = 0;
1936
          }
1937
        return *this;
1938
      }
1939
 
1940
      /**
1941
       *  @brief %Function assignment to a new target.
1942
       *  @param f A %function object that is callable with parameters of
1943
       *  type @c T1, @c T2, ..., @c TN and returns a value convertible
1944
       *  to @c Res.
1945
       *  @return @c *this
1946
       *
1947
       *  This  %function object wrapper will target a copy of @a
1948
       *  f. If @a f is @c reference_wrapper, then this function
1949
       *  object will contain a reference to the function object @c
1950
       *  f.get(). If @a f is a NULL function pointer or NULL
1951
       *  pointer-to-member, @c this object will be empty.
1952
       *
1953
       *  If @a f is a non-NULL function pointer or an object of type @c
1954
       *  reference_wrapper, this function will not throw.
1955
       */
1956
      template
1957
        typename enable_if::value, function&>::type
1958
        operator=(_Functor&& __f)
1959
        {
1960
          function(std::forward<_Functor>(__f)).swap(*this);
1961
          return *this;
1962
        }
1963
 
1964
      /// @overload
1965
      template
1966
        typename enable_if::value, function&>::type
1967
        operator=(reference_wrapper<_Functor> __f)
1968
        {
1969
          function(__f).swap(*this);
1970
          return *this;
1971
        }
1972
 
1973
      // [3.7.2.2] function modifiers
1974
 
1975
      /**
1976
       *  @brief Swap the targets of two %function objects.
1977
       *  @param f A %function with identical call signature.
1978
       *
1979
       *  Swap the targets of @c this function object and @a f. This
1980
       *  function will not throw an %exception.
1981
       */
1982
      void swap(function& __x)
1983
      {
1984
        /* We cannot perform direct assignments of the _M_functor
1985
           parts as they are of type _Any_data and have a different
1986
           dynamic type.  Doing so would violate type-based aliasing
1987
           rules and lead to spurious miscompilations.
1988
           Instead perform a bytewise exchange of the memory of
1989
           both POD objects.
1990
           ???  A wordwise exchange honoring alignment of _M_functor
1991
           would be more efficient.  See PR42845.  */
1992
        for (unsigned i = 0; i < sizeof (_M_functor._M_pod_data); ++i)
1993
          std::swap (_M_functor._M_pod_data[i], __x._M_functor._M_pod_data[i]);
1994
        _Manager_type __old_manager = _M_manager;
1995
        _M_manager = __x._M_manager;
1996
        __x._M_manager = __old_manager;
1997
        _Invoker_type __old_invoker = _M_invoker;
1998
        _M_invoker = __x._M_invoker;
1999
        __x._M_invoker = __old_invoker;
2000
      }
2001
 
2002
      // TODO: needs allocator_arg_t
2003
      /*
2004
      template
2005
        void
2006
        assign(_Functor&& __f, const _Alloc& __a)
2007
        {
2008
          function(allocator_arg, __a,
2009
                   std::forward<_Functor>(__f)).swap(*this);
2010
        }
2011
      */
2012
 
2013
      // [3.7.2.3] function capacity
2014
 
2015
      /**
2016
       *  @brief Determine if the %function wrapper has a target.
2017
       *
2018
       *  @return @c true when this %function object contains a target,
2019
       *  or @c false when it is empty.
2020
       *
2021
       *  This function will not throw an %exception.
2022
       */
2023
      explicit operator bool() const
2024
      { return !_M_empty(); }
2025
 
2026
      // [3.7.2.4] function invocation
2027
 
2028
      /**
2029
       *  @brief Invokes the function targeted by @c *this.
2030
       *  @returns the result of the target.
2031
       *  @throws bad_function_call when @c !(bool)*this
2032
       *
2033
       *  The function call operator invokes the target function object
2034
       *  stored by @c this.
2035
       */
2036
      _Res operator()(_ArgTypes... __args) const;
2037
 
2038
#ifdef __GXX_RTTI
2039
      // [3.7.2.5] function target access
2040
      /**
2041
       *  @brief Determine the type of the target of this function object
2042
       *  wrapper.
2043
       *
2044
       *  @returns the type identifier of the target function object, or
2045
       *  @c typeid(void) if @c !(bool)*this.
2046
       *
2047
       *  This function will not throw an %exception.
2048
       */
2049
      const type_info& target_type() const;
2050
 
2051
      /**
2052
       *  @brief Access the stored target function object.
2053
       *
2054
       *  @return Returns a pointer to the stored target function object,
2055
       *  if @c typeid(Functor).equals(target_type()); otherwise, a NULL
2056
       *  pointer.
2057
       *
2058
       * This function will not throw an %exception.
2059
       */
2060
      template       _Functor* target();
2061
 
2062
      /// @overload
2063
      template const _Functor* target() const;
2064
#endif
2065
 
2066
      // deleted overloads
2067
      template
2068
        void operator==(const function<_Res2(_ArgTypes2...)>&) const = delete;
2069
      template
2070
        void operator!=(const function<_Res2(_ArgTypes2...)>&) const = delete;
2071
 
2072
    private:
2073
      typedef _Res (*_Invoker_type)(const _Any_data&, _ArgTypes...);
2074
      _Invoker_type _M_invoker;
2075
  };
2076
 
2077
  // Out-of-line member definitions.
2078
  template
2079
    function<_Res(_ArgTypes...)>::
2080
    function(const function& __x)
2081
    : _Function_base()
2082
    {
2083
      if (static_cast(__x))
2084
        {
2085
          _M_invoker = __x._M_invoker;
2086
          _M_manager = __x._M_manager;
2087
          __x._M_manager(_M_functor, __x._M_functor, __clone_functor);
2088
        }
2089
    }
2090
 
2091
  template
2092
    template
2093
      function<_Res(_ArgTypes...)>::
2094
      function(_Functor __f,
2095
               typename enable_if<
2096
                        !is_integral<_Functor>::value, _Useless>::type)
2097
      : _Function_base()
2098
      {
2099
        typedef _Function_handler<_Signature_type, _Functor> _My_handler;
2100
 
2101
        if (_My_handler::_M_not_empty_function(__f))
2102
          {
2103
            _M_invoker = &_My_handler::_M_invoke;
2104
            _M_manager = &_My_handler::_M_manager;
2105
            _My_handler::_M_init_functor(_M_functor, std::move(__f));
2106
          }
2107
      }
2108
 
2109
  template
2110
    _Res
2111
    function<_Res(_ArgTypes...)>::
2112
    operator()(_ArgTypes... __args) const
2113
    {
2114
      if (_M_empty())
2115
        __throw_bad_function_call();
2116
      return _M_invoker(_M_functor, std::forward<_ArgTypes>(__args)...);
2117
    }
2118
 
2119
#ifdef __GXX_RTTI
2120
  template
2121
    const type_info&
2122
    function<_Res(_ArgTypes...)>::
2123
    target_type() const
2124
    {
2125
      if (_M_manager)
2126
        {
2127
          _Any_data __typeinfo_result;
2128
          _M_manager(__typeinfo_result, _M_functor, __get_type_info);
2129
          return *__typeinfo_result._M_access();
2130
        }
2131
      else
2132
        return typeid(void);
2133
    }
2134
 
2135
  template
2136
    template
2137
      _Functor*
2138
      function<_Res(_ArgTypes...)>::
2139
      target()
2140
      {
2141
        if (typeid(_Functor) == target_type() && _M_manager)
2142
          {
2143
            _Any_data __ptr;
2144
            if (_M_manager(__ptr, _M_functor, __get_functor_ptr)
2145
                && !is_const<_Functor>::value)
2146
              return 0;
2147
            else
2148
              return __ptr._M_access<_Functor*>();
2149
          }
2150
        else
2151
          return 0;
2152
      }
2153
 
2154
  template
2155
    template
2156
      const _Functor*
2157
      function<_Res(_ArgTypes...)>::
2158
      target() const
2159
      {
2160
        if (typeid(_Functor) == target_type() && _M_manager)
2161
          {
2162
            _Any_data __ptr;
2163
            _M_manager(__ptr, _M_functor, __get_functor_ptr);
2164
            return __ptr._M_access();
2165
          }
2166
        else
2167
          return 0;
2168
      }
2169
#endif
2170
 
2171
  // [20.7.15.2.6] null pointer comparisons
2172
 
2173
  /**
2174
   *  @brief Compares a polymorphic function object wrapper against 0
2175
   *  (the NULL pointer).
2176
   *  @returns @c true if the wrapper has no target, @c false otherwise
2177
   *
2178
   *  This function will not throw an %exception.
2179
   */
2180
  template
2181
    inline bool
2182
    operator==(const function<_Res(_Args...)>& __f, _M_clear_type*)
2183
    { return !static_cast(__f); }
2184
 
2185
  /// @overload
2186
  template
2187
    inline bool
2188
    operator==(_M_clear_type*, const function<_Res(_Args...)>& __f)
2189
    { return !static_cast(__f); }
2190
 
2191
  /**
2192
   *  @brief Compares a polymorphic function object wrapper against 0
2193
   *  (the NULL pointer).
2194
   *  @returns @c false if the wrapper has no target, @c true otherwise
2195
   *
2196
   *  This function will not throw an %exception.
2197
   */
2198
  template
2199
    inline bool
2200
    operator!=(const function<_Res(_Args...)>& __f, _M_clear_type*)
2201
    { return static_cast(__f); }
2202
 
2203
  /// @overload
2204
  template
2205
    inline bool
2206
    operator!=(_M_clear_type*, const function<_Res(_Args...)>& __f)
2207
    { return static_cast(__f); }
2208
 
2209
  // [20.7.15.2.7] specialized algorithms
2210
 
2211
  /**
2212
   *  @brief Swap the targets of two polymorphic function object wrappers.
2213
   *
2214
   *  This function will not throw an %exception.
2215
   */
2216
  template
2217
    inline void
2218
    swap(function<_Res(_Args...)>& __x, function<_Res(_Args...)>& __y)
2219
    { __x.swap(__y); }
2220
}
2221
 
2222
#endif // __GXX_EXPERIMENTAL_CXX0X__
2223
 
2224
#endif // _GLIBCXX_FUNCTIONAL

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.