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