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