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