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