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