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