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