diff options
Diffstat (limited to 'libcxx/include/__functional/function.h')
| -rw-r--r-- | libcxx/include/__functional/function.h | 1679 | 
1 files changed, 41 insertions, 1638 deletions
| diff --git a/libcxx/include/__functional/function.h b/libcxx/include/__functional/function.h index db3af6e24101..ca79d334a028 100644 --- a/libcxx/include/__functional/function.h +++ b/libcxx/include/__functional/function.h @@ -17,20 +17,29 @@  #include <__functional/unary_function.h>  #include <__iterator/iterator_traits.h>  #include <__memory/addressof.h> +#include <__memory/allocator.h> +#include <__memory/allocator_destructor.h>  #include <__memory/allocator_traits.h> +#include <__memory/builtin_new_allocator.h>  #include <__memory/compressed_pair.h> -#include <__memory/shared_ptr.h> +#include <__memory/unique_ptr.h> +#include <__type_traits/strip_signature.h>  #include <__utility/forward.h>  #include <__utility/move.h> +#include <__utility/piecewise_construct.h>  #include <__utility/swap.h>  #include <exception> -#include <memory> // TODO: replace with <__memory/__builtin_new_allocator.h> +#include <new> +#include <tuple>  #include <type_traits> +#include <typeinfo>  #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)  #  pragma GCC system_header  #endif +#ifndef _LIBCPP_CXX03_LANG +  _LIBCPP_BEGIN_NAMESPACE_STD  // bad_function_call @@ -45,13 +54,13 @@ public:  // bad_function_call will end up containing a weak definition of the vtable and  // typeinfo.  #ifdef _LIBCPP_ABI_BAD_FUNCTION_CALL_KEY_FUNCTION -    virtual ~bad_function_call() _NOEXCEPT; +    ~bad_function_call() _NOEXCEPT override;  #else -    virtual ~bad_function_call() _NOEXCEPT {} +    ~bad_function_call() _NOEXCEPT override {}  #endif  #ifdef _LIBCPP_ABI_BAD_FUNCTION_CALL_GOOD_WHAT_MESSAGE -    virtual const char* what() const _NOEXCEPT; +    const char* what() const _NOEXCEPT override;  #endif  };  _LIBCPP_DIAGNOSTIC_POP @@ -66,14 +75,7 @@ void __throw_bad_function_call()  #endif  } -#if defined(_LIBCPP_CXX03_LANG) && !defined(_LIBCPP_DISABLE_DEPRECATION_WARNINGS) && __has_attribute(deprecated) -#   define _LIBCPP_DEPRECATED_CXX03_FUNCTION \ -        __attribute__((deprecated("Using std::function in C++03 is not supported anymore. Please upgrade to C++11 or later, or use a different type"))) -#else -#   define _LIBCPP_DEPRECATED_CXX03_FUNCTION /* nothing */ -#endif - -template<class _Fp> class _LIBCPP_DEPRECATED_CXX03_FUNCTION _LIBCPP_TEMPLATE_VIS function; // undefined +template<class _Fp> class _LIBCPP_TEMPLATE_VIS function; // undefined  namespace __function  { @@ -124,8 +126,6 @@ bool __not_null(_Rp (^__p)(_Args...)) { return __p; }  } // namespace __function -#ifndef _LIBCPP_CXX03_LANG -  namespace __function {  // __alloc_func holds a functor and an allocator. @@ -190,9 +190,7 @@ class __alloc_func<_Fp, _Ap, _Rp(_ArgTypes...)>      __alloc_func* __clone() const      {          typedef allocator_traits<_Alloc> __alloc_traits; -        typedef -            typename __rebind_alloc_helper<__alloc_traits, __alloc_func>::type -                _AA; +        typedef __rebind_alloc<__alloc_traits, __alloc_func> _AA;          _AA __a(__f_.second());          typedef __allocator_destructor<_AA> _Dp;          unique_ptr<__alloc_func, _Dp> __hold(__a.allocate(1), _Dp(__a, 1)); @@ -205,8 +203,7 @@ class __alloc_func<_Fp, _Ap, _Rp(_ArgTypes...)>      static void __destroy_and_delete(__alloc_func* __f) {        typedef allocator_traits<_Alloc> __alloc_traits; -      typedef typename __rebind_alloc_helper<__alloc_traits, __alloc_func>::type -          _FunAlloc; +      typedef __rebind_alloc<__alloc_traits, __alloc_func> _FunAlloc;        _FunAlloc __a(__f->__get_allocator());        __f->destroy();        __a.deallocate(__f, 1); @@ -265,7 +262,7 @@ class __base<_Rp(_ArgTypes...)>      __base& operator=(const __base&);  public:      _LIBCPP_INLINE_VISIBILITY __base() {} -    _LIBCPP_INLINE_VISIBILITY virtual ~__base() {} +    _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual ~__base() {}      virtual __base* __clone() const = 0;      virtual void __clone(__base*) const = 0;      virtual void destroy() _NOEXCEPT = 0; @@ -319,7 +316,7 @@ __base<_Rp(_ArgTypes...)>*  __func<_Fp, _Alloc, _Rp(_ArgTypes...)>::__clone() const  {      typedef allocator_traits<_Alloc> __alloc_traits; -    typedef typename __rebind_alloc_helper<__alloc_traits, __func>::type _Ap; +    typedef __rebind_alloc<__alloc_traits, __func> _Ap;      _Ap __a(__f_.__get_allocator());      typedef __allocator_destructor<_Ap> _Dp;      unique_ptr<__func, _Dp> __hold(__a.allocate(1), _Dp(__a, 1)); @@ -346,7 +343,7 @@ void  __func<_Fp, _Alloc, _Rp(_ArgTypes...)>::destroy_deallocate() _NOEXCEPT  {      typedef allocator_traits<_Alloc> __alloc_traits; -    typedef typename __rebind_alloc_helper<__alloc_traits, __func>::type _Ap; +    typedef __rebind_alloc<__alloc_traits, __func> _Ap;      _Ap __a(__f_.__get_allocator());      __f_.destroy();      __a.deallocate(this, 1); @@ -385,7 +382,9 @@ template <class _Fp> class __value_func;  template <class _Rp, class... _ArgTypes> class __value_func<_Rp(_ArgTypes...)>  { +    _LIBCPP_SUPPRESS_DEPRECATED_PUSH      typename aligned_storage<3 * sizeof(void*)>::type __buf_; +    _LIBCPP_SUPPRESS_DEPRECATED_POP      typedef __base<_Rp(_ArgTypes...)> __func;      __func* __f_; @@ -405,8 +404,7 @@ template <class _Rp, class... _ArgTypes> class __value_func<_Rp(_ArgTypes...)>      {          typedef allocator_traits<_Alloc> __alloc_traits;          typedef __function::__func<_Fp, _Alloc, _Rp(_ArgTypes...)> _Fun; -        typedef typename __rebind_alloc_helper<__alloc_traits, _Fun>::type -            _FunAlloc; +        typedef __rebind_alloc<__alloc_traits, _Fun> _FunAlloc;          if (__function::__not_null(__f))          { @@ -519,7 +517,9 @@ template <class _Rp, class... _ArgTypes> class __value_func<_Rp(_ArgTypes...)>              return;          if ((void*)__f_ == &__buf_ && (void*)__f.__f_ == &__f.__buf_)          { +            _LIBCPP_SUPPRESS_DEPRECATED_PUSH              typename aligned_storage<sizeof(__buf_)>::type __tempbuf; +            _LIBCPP_SUPPRESS_DEPRECATED_POP              __func* __t = __as_base(&__tempbuf);              __f_->__clone(__t);              __f_->destroy(); @@ -670,8 +670,7 @@ struct __policy  // Used to choose between perfect forwarding or pass-by-value. Pass-by-value is  // faster for types that can be passed in registers.  template <typename _Tp> -using __fast_forward = -    typename conditional<is_scalar<_Tp>::value, _Tp, _Tp&&>::type; +using __fast_forward = __conditional_t<is_scalar<_Tp>::value, _Tp, _Tp&&>;  // __policy_invoker calls an instance of __alloc_func held in __policy_storage. @@ -747,8 +746,7 @@ template <class _Rp, class... _ArgTypes> class __policy_func<_Rp(_ArgTypes...)>      {          typedef __alloc_func<_Fp, _Alloc, _Rp(_ArgTypes...)> _Fun;          typedef allocator_traits<_Alloc> __alloc_traits; -        typedef typename __rebind_alloc_helper<__alloc_traits, _Fun>::type -            _FunAlloc; +        typedef __rebind_alloc<__alloc_traits, _Fun> _FunAlloc;          if (__function::__not_null(__f))          { @@ -883,7 +881,7 @@ template <class _Rp, class... _ArgTypes> class __policy_func<_Rp(_ArgTypes...)>  #endif // _LIBCPP_NO_RTTI  }; -#if defined(_LIBCPP_HAS_BLOCKS_RUNTIME) && !defined(_LIBCPP_HAS_OBJC_ARC) +#if defined(_LIBCPP_HAS_BLOCKS_RUNTIME)  extern "C" void *_Block_copy(const void *);  extern "C" void _Block_release(const void *); @@ -898,14 +896,22 @@ class __func<_Rp1(^)(_ArgTypes1...), _Alloc, _Rp(_ArgTypes...)>  public:      _LIBCPP_INLINE_VISIBILITY      explicit __func(__block_type const& __f) +#ifdef _LIBCPP_HAS_OBJC_ARC +        : __f_(__f) +#else          : __f_(reinterpret_cast<__block_type>(__f ? _Block_copy(__f) : nullptr)) +#endif      { }      // [TODO] add && to save on a retain      _LIBCPP_INLINE_VISIBILITY      explicit __func(__block_type __f, const _Alloc& /* unused */) +#ifdef _LIBCPP_HAS_OBJC_ARC +        : __f_(__f) +#else          : __f_(reinterpret_cast<__block_type>(__f ? _Block_copy(__f) : nullptr)) +#endif      { }      virtual __base<_Rp(_ArgTypes...)>* __clone() const { @@ -921,8 +927,10 @@ public:      }      virtual void destroy() _NOEXCEPT { +#ifndef _LIBCPP_HAS_OBJC_ARC          if (__f_)              _Block_release(__f_); +#endif          __f_ = 0;      } @@ -950,7 +958,7 @@ public:  #endif // _LIBCPP_NO_RTTI  }; -#endif // _LIBCPP_HAS_EXTENSION_BLOCKS && !_LIBCPP_HAS_OBJC_ARC +#endif // _LIBCPP_HAS_EXTENSION_BLOCKS  } // namespace __function @@ -968,7 +976,7 @@ class _LIBCPP_TEMPLATE_VIS function<_Rp(_ArgTypes...)>      __func __f_;      template <class _Fp, bool = _And< -        _IsNotSame<__uncvref_t<_Fp>, function>, +        _IsNotSame<__remove_cvref_t<_Fp>, function>,          __invokable<_Fp, _ArgTypes...>      >::value>      struct __callable; @@ -1060,45 +1068,6 @@ public:  template<class _Rp, class ..._Ap>  function(_Rp(*)(_Ap...)) -> function<_Rp(_Ap...)>; -template<class _Fp> -struct __strip_signature; - -template<class _Rp, class _Gp, class ..._Ap> -struct __strip_signature<_Rp (_Gp::*) (_Ap...)> { using type = _Rp(_Ap...); }; -template<class _Rp, class _Gp, class ..._Ap> -struct __strip_signature<_Rp (_Gp::*) (_Ap...) const> { using type = _Rp(_Ap...); }; -template<class _Rp, class _Gp, class ..._Ap> -struct __strip_signature<_Rp (_Gp::*) (_Ap...) volatile> { using type = _Rp(_Ap...); }; -template<class _Rp, class _Gp, class ..._Ap> -struct __strip_signature<_Rp (_Gp::*) (_Ap...) const volatile> { using type = _Rp(_Ap...); }; - -template<class _Rp, class _Gp, class ..._Ap> -struct __strip_signature<_Rp (_Gp::*) (_Ap...) &> { using type = _Rp(_Ap...); }; -template<class _Rp, class _Gp, class ..._Ap> -struct __strip_signature<_Rp (_Gp::*) (_Ap...) const &> { using type = _Rp(_Ap...); }; -template<class _Rp, class _Gp, class ..._Ap> -struct __strip_signature<_Rp (_Gp::*) (_Ap...) volatile &> { using type = _Rp(_Ap...); }; -template<class _Rp, class _Gp, class ..._Ap> -struct __strip_signature<_Rp (_Gp::*) (_Ap...) const volatile &> { using type = _Rp(_Ap...); }; - -template<class _Rp, class _Gp, class ..._Ap> -struct __strip_signature<_Rp (_Gp::*) (_Ap...) noexcept> { using type = _Rp(_Ap...); }; -template<class _Rp, class _Gp, class ..._Ap> -struct __strip_signature<_Rp (_Gp::*) (_Ap...) const noexcept> { using type = _Rp(_Ap...); }; -template<class _Rp, class _Gp, class ..._Ap> -struct __strip_signature<_Rp (_Gp::*) (_Ap...) volatile noexcept> { using type = _Rp(_Ap...); }; -template<class _Rp, class _Gp, class ..._Ap> -struct __strip_signature<_Rp (_Gp::*) (_Ap...) const volatile noexcept> { using type = _Rp(_Ap...); }; - -template<class _Rp, class _Gp, class ..._Ap> -struct __strip_signature<_Rp (_Gp::*) (_Ap...) & noexcept> { using type = _Rp(_Ap...); }; -template<class _Rp, class _Gp, class ..._Ap> -struct __strip_signature<_Rp (_Gp::*) (_Ap...) const & noexcept> { using type = _Rp(_Ap...); }; -template<class _Rp, class _Gp, class ..._Ap> -struct __strip_signature<_Rp (_Gp::*) (_Ap...) volatile & noexcept> { using type = _Rp(_Ap...); }; -template<class _Rp, class _Gp, class ..._Ap> -struct __strip_signature<_Rp (_Gp::*) (_Ap...) const volatile & noexcept> { using type = _Rp(_Ap...); }; -  template<class _Fp, class _Stripped = typename __strip_signature<decltype(&_Fp::operator())>::type>  function(_Fp) -> function<_Stripped>;  #endif // _LIBCPP_STD_VER >= 17 @@ -1240,1574 +1209,8 @@ void  swap(function<_Rp(_ArgTypes...)>& __x, function<_Rp(_ArgTypes...)>& __y) _NOEXCEPT  {return __x.swap(__y);} -#elif defined(_LIBCPP_ENABLE_CXX03_FUNCTION) - -namespace __function { - -template<class _Fp> class __base; - -template<class _Rp> -class __base<_Rp()> -{ -    __base(const __base&); -    __base& operator=(const __base&); -public: -    __base() {} -    virtual ~__base() {} -    virtual __base* __clone() const = 0; -    virtual void __clone(__base*) const = 0; -    virtual void destroy() = 0; -    virtual void destroy_deallocate() = 0; -    virtual _Rp operator()() = 0; -#ifndef _LIBCPP_NO_RTTI -    virtual const void* target(const type_info&) const = 0; -    virtual const std::type_info& target_type() const = 0; -#endif // _LIBCPP_NO_RTTI -}; - -template<class _Rp, class _A0> -class __base<_Rp(_A0)> -{ -    __base(const __base&); -    __base& operator=(const __base&); -public: -    __base() {} -    virtual ~__base() {} -    virtual __base* __clone() const = 0; -    virtual void __clone(__base*) const = 0; -    virtual void destroy() = 0; -    virtual void destroy_deallocate() = 0; -    virtual _Rp operator()(_A0) = 0; -#ifndef _LIBCPP_NO_RTTI -    virtual const void* target(const type_info&) const = 0; -    virtual const std::type_info& target_type() const = 0; -#endif // _LIBCPP_NO_RTTI -}; - -template<class _Rp, class _A0, class _A1> -class __base<_Rp(_A0, _A1)> -{ -    __base(const __base&); -    __base& operator=(const __base&); -public: -    __base() {} -    virtual ~__base() {} -    virtual __base* __clone() const = 0; -    virtual void __clone(__base*) const = 0; -    virtual void destroy() = 0; -    virtual void destroy_deallocate() = 0; -    virtual _Rp operator()(_A0, _A1) = 0; -#ifndef _LIBCPP_NO_RTTI -    virtual const void* target(const type_info&) const = 0; -    virtual const std::type_info& target_type() const = 0; -#endif // _LIBCPP_NO_RTTI -}; - -template<class _Rp, class _A0, class _A1, class _A2> -class __base<_Rp(_A0, _A1, _A2)> -{ -    __base(const __base&); -    __base& operator=(const __base&); -public: -    __base() {} -    virtual ~__base() {} -    virtual __base* __clone() const = 0; -    virtual void __clone(__base*) const = 0; -    virtual void destroy() = 0; -    virtual void destroy_deallocate() = 0; -    virtual _Rp operator()(_A0, _A1, _A2) = 0; -#ifndef _LIBCPP_NO_RTTI -    virtual const void* target(const type_info&) const = 0; -    virtual const std::type_info& target_type() const = 0; -#endif // _LIBCPP_NO_RTTI -}; - -template<class _FD, class _Alloc, class _FB> class __func; - -template<class _Fp, class _Alloc, class _Rp> -class __func<_Fp, _Alloc, _Rp()> -    : public  __base<_Rp()> -{ -    __compressed_pair<_Fp, _Alloc> __f_; -public: -    explicit __func(_Fp __f) : __f_(_VSTD::move(__f), __default_init_tag()) {} -    explicit __func(_Fp __f, _Alloc __a) : __f_(_VSTD::move(__f), _VSTD::move(__a)) {} -    virtual __base<_Rp()>* __clone() const; -    virtual void __clone(__base<_Rp()>*) const; -    virtual void destroy(); -    virtual void destroy_deallocate(); -    virtual _Rp operator()(); -#ifndef _LIBCPP_NO_RTTI -    virtual const void* target(const type_info&) const; -    virtual const std::type_info& target_type() const; -#endif // _LIBCPP_NO_RTTI -}; - -template<class _Fp, class _Alloc, class _Rp> -__base<_Rp()>* -__func<_Fp, _Alloc, _Rp()>::__clone() const -{ -    typedef allocator_traits<_Alloc> __alloc_traits; -    typedef typename __rebind_alloc_helper<__alloc_traits, __func>::type _Ap; -    _Ap __a(__f_.second()); -    typedef __allocator_destructor<_Ap> _Dp; -    unique_ptr<__func, _Dp> __hold(__a.allocate(1), _Dp(__a, 1)); -    ::new ((void*)__hold.get()) __func(__f_.first(), _Alloc(__a)); -    return __hold.release(); -} - -template<class _Fp, class _Alloc, class _Rp> -void -__func<_Fp, _Alloc, _Rp()>::__clone(__base<_Rp()>* __p) const -{ -    ::new ((void*)__p) __func(__f_.first(), __f_.second()); -} - -template<class _Fp, class _Alloc, class _Rp> -void -__func<_Fp, _Alloc, _Rp()>::destroy() -{ -    __f_.~__compressed_pair<_Fp, _Alloc>(); -} - -template<class _Fp, class _Alloc, class _Rp> -void -__func<_Fp, _Alloc, _Rp()>::destroy_deallocate() -{ -    typedef allocator_traits<_Alloc> __alloc_traits; -    typedef typename __rebind_alloc_helper<__alloc_traits, __func>::type _Ap; -    _Ap __a(__f_.second()); -    __f_.~__compressed_pair<_Fp, _Alloc>(); -    __a.deallocate(this, 1); -} - -template<class _Fp, class _Alloc, class _Rp> -_Rp -__func<_Fp, _Alloc, _Rp()>::operator()() -{ -    typedef __invoke_void_return_wrapper<_Rp> _Invoker; -    return _Invoker::__call(__f_.first()); -} - -#ifndef _LIBCPP_NO_RTTI - -template<class _Fp, class _Alloc, class _Rp> -const void* -__func<_Fp, _Alloc, _Rp()>::target(const type_info& __ti) const -{ -    if (__ti == typeid(_Fp)) -        return _VSTD::addressof(__f_.first()); -    return (const void*)0; -} - -template<class _Fp, class _Alloc, class _Rp> -const std::type_info& -__func<_Fp, _Alloc, _Rp()>::target_type() const -{ -    return typeid(_Fp); -} - -#endif // _LIBCPP_NO_RTTI - -template<class _Fp, class _Alloc, class _Rp, class _A0> -class __func<_Fp, _Alloc, _Rp(_A0)> -    : public  __base<_Rp(_A0)> -{ -    __compressed_pair<_Fp, _Alloc> __f_; -public: -    _LIBCPP_INLINE_VISIBILITY explicit __func(_Fp __f) : __f_(_VSTD::move(__f), __default_init_tag()) {} -    _LIBCPP_INLINE_VISIBILITY explicit __func(_Fp __f, _Alloc __a) -        : __f_(_VSTD::move(__f), _VSTD::move(__a)) {} -    virtual __base<_Rp(_A0)>* __clone() const; -    virtual void __clone(__base<_Rp(_A0)>*) const; -    virtual void destroy(); -    virtual void destroy_deallocate(); -    virtual _Rp operator()(_A0); -#ifndef _LIBCPP_NO_RTTI -    virtual const void* target(const type_info&) const; -    virtual const std::type_info& target_type() const; -#endif // _LIBCPP_NO_RTTI -}; - -template<class _Fp, class _Alloc, class _Rp, class _A0> -__base<_Rp(_A0)>* -__func<_Fp, _Alloc, _Rp(_A0)>::__clone() const -{ -    typedef allocator_traits<_Alloc> __alloc_traits; -    typedef typename __rebind_alloc_helper<__alloc_traits, __func>::type _Ap; -    _Ap __a(__f_.second()); -    typedef __allocator_destructor<_Ap> _Dp; -    unique_ptr<__func, _Dp> __hold(__a.allocate(1), _Dp(__a, 1)); -    ::new ((void*)__hold.get()) __func(__f_.first(), _Alloc(__a)); -    return __hold.release(); -} - -template<class _Fp, class _Alloc, class _Rp, class _A0> -void -__func<_Fp, _Alloc, _Rp(_A0)>::__clone(__base<_Rp(_A0)>* __p) const -{ -    ::new ((void*)__p) __func(__f_.first(), __f_.second()); -} - -template<class _Fp, class _Alloc, class _Rp, class _A0> -void -__func<_Fp, _Alloc, _Rp(_A0)>::destroy() -{ -    __f_.~__compressed_pair<_Fp, _Alloc>(); -} - -template<class _Fp, class _Alloc, class _Rp, class _A0> -void -__func<_Fp, _Alloc, _Rp(_A0)>::destroy_deallocate() -{ -    typedef allocator_traits<_Alloc> __alloc_traits; -    typedef typename __rebind_alloc_helper<__alloc_traits, __func>::type _Ap; -    _Ap __a(__f_.second()); -    __f_.~__compressed_pair<_Fp, _Alloc>(); -    __a.deallocate(this, 1); -} - -template<class _Fp, class _Alloc, class _Rp, class _A0> -_Rp -__func<_Fp, _Alloc, _Rp(_A0)>::operator()(_A0 __a0) -{ -    typedef __invoke_void_return_wrapper<_Rp> _Invoker; -    return _Invoker::__call(__f_.first(), __a0); -} - -#ifndef _LIBCPP_NO_RTTI - -template<class _Fp, class _Alloc, class _Rp, class _A0> -const void* -__func<_Fp, _Alloc, _Rp(_A0)>::target(const type_info& __ti) const -{ -    if (__ti == typeid(_Fp)) -        return &__f_.first(); -    return (const void*)0; -} - -template<class _Fp, class _Alloc, class _Rp, class _A0> -const std::type_info& -__func<_Fp, _Alloc, _Rp(_A0)>::target_type() const -{ -    return typeid(_Fp); -} - -#endif // _LIBCPP_NO_RTTI - -template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1> -class __func<_Fp, _Alloc, _Rp(_A0, _A1)> -    : public  __base<_Rp(_A0, _A1)> -{ -    __compressed_pair<_Fp, _Alloc> __f_; -public: -    _LIBCPP_INLINE_VISIBILITY explicit __func(_Fp __f) : __f_(_VSTD::move(__f), __default_init_tag()) {} -    _LIBCPP_INLINE_VISIBILITY explicit __func(_Fp __f, _Alloc __a) -        : __f_(_VSTD::move(__f), _VSTD::move(__a)) {} -    virtual __base<_Rp(_A0, _A1)>* __clone() const; -    virtual void __clone(__base<_Rp(_A0, _A1)>*) const; -    virtual void destroy(); -    virtual void destroy_deallocate(); -    virtual _Rp operator()(_A0, _A1); -#ifndef _LIBCPP_NO_RTTI -    virtual const void* target(const type_info&) const; -    virtual const std::type_info& target_type() const; -#endif // _LIBCPP_NO_RTTI -}; - -template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1> -__base<_Rp(_A0, _A1)>* -__func<_Fp, _Alloc, _Rp(_A0, _A1)>::__clone() const -{ -    typedef allocator_traits<_Alloc> __alloc_traits; -    typedef typename __rebind_alloc_helper<__alloc_traits, __func>::type _Ap; -    _Ap __a(__f_.second()); -    typedef __allocator_destructor<_Ap> _Dp; -    unique_ptr<__func, _Dp> __hold(__a.allocate(1), _Dp(__a, 1)); -    ::new ((void*)__hold.get()) __func(__f_.first(), _Alloc(__a)); -    return __hold.release(); -} - -template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1> -void -__func<_Fp, _Alloc, _Rp(_A0, _A1)>::__clone(__base<_Rp(_A0, _A1)>* __p) const -{ -    ::new ((void*)__p) __func(__f_.first(), __f_.second()); -} - -template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1> -void -__func<_Fp, _Alloc, _Rp(_A0, _A1)>::destroy() -{ -    __f_.~__compressed_pair<_Fp, _Alloc>(); -} - -template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1> -void -__func<_Fp, _Alloc, _Rp(_A0, _A1)>::destroy_deallocate() -{ -    typedef allocator_traits<_Alloc> __alloc_traits; -    typedef typename __rebind_alloc_helper<__alloc_traits, __func>::type _Ap; -    _Ap __a(__f_.second()); -    __f_.~__compressed_pair<_Fp, _Alloc>(); -    __a.deallocate(this, 1); -} - -template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1> -_Rp -__func<_Fp, _Alloc, _Rp(_A0, _A1)>::operator()(_A0 __a0, _A1 __a1) -{ -    typedef __invoke_void_return_wrapper<_Rp> _Invoker; -    return _Invoker::__call(__f_.first(), __a0, __a1); -} - -#ifndef _LIBCPP_NO_RTTI - -template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1> -const void* -__func<_Fp, _Alloc, _Rp(_A0, _A1)>::target(const type_info& __ti) const -{ -    if (__ti == typeid(_Fp)) -        return &__f_.first(); -    return (const void*)0; -} - -template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1> -const std::type_info& -__func<_Fp, _Alloc, _Rp(_A0, _A1)>::target_type() const -{ -    return typeid(_Fp); -} - -#endif // _LIBCPP_NO_RTTI - -template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1, class _A2> -class __func<_Fp, _Alloc, _Rp(_A0, _A1, _A2)> -    : public  __base<_Rp(_A0, _A1, _A2)> -{ -    __compressed_pair<_Fp, _Alloc> __f_; -public: -    _LIBCPP_INLINE_VISIBILITY explicit __func(_Fp __f) : __f_(_VSTD::move(__f), __default_init_tag()) {} -    _LIBCPP_INLINE_VISIBILITY explicit __func(_Fp __f, _Alloc __a) -        : __f_(_VSTD::move(__f), _VSTD::move(__a)) {} -    virtual __base<_Rp(_A0, _A1, _A2)>* __clone() const; -    virtual void __clone(__base<_Rp(_A0, _A1, _A2)>*) const; -    virtual void destroy(); -    virtual void destroy_deallocate(); -    virtual _Rp operator()(_A0, _A1, _A2); -#ifndef _LIBCPP_NO_RTTI -    virtual const void* target(const type_info&) const; -    virtual const std::type_info& target_type() const; -#endif // _LIBCPP_NO_RTTI -}; - -template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1, class _A2> -__base<_Rp(_A0, _A1, _A2)>* -__func<_Fp, _Alloc, _Rp(_A0, _A1, _A2)>::__clone() const -{ -    typedef allocator_traits<_Alloc> __alloc_traits; -    typedef typename __rebind_alloc_helper<__alloc_traits, __func>::type _Ap; -    _Ap __a(__f_.second()); -    typedef __allocator_destructor<_Ap> _Dp; -    unique_ptr<__func, _Dp> __hold(__a.allocate(1), _Dp(__a, 1)); -    ::new ((void*)__hold.get()) __func(__f_.first(), _Alloc(__a)); -    return __hold.release(); -} - -template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1, class _A2> -void -__func<_Fp, _Alloc, _Rp(_A0, _A1, _A2)>::__clone(__base<_Rp(_A0, _A1, _A2)>* __p) const -{ -    ::new ((void*)__p) __func(__f_.first(), __f_.second()); -} - -template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1, class _A2> -void -__func<_Fp, _Alloc, _Rp(_A0, _A1, _A2)>::destroy() -{ -    __f_.~__compressed_pair<_Fp, _Alloc>(); -} - -template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1, class _A2> -void -__func<_Fp, _Alloc, _Rp(_A0, _A1, _A2)>::destroy_deallocate() -{ -    typedef allocator_traits<_Alloc> __alloc_traits; -    typedef typename __rebind_alloc_helper<__alloc_traits, __func>::type _Ap; -    _Ap __a(__f_.second()); -    __f_.~__compressed_pair<_Fp, _Alloc>(); -    __a.deallocate(this, 1); -} - -template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1, class _A2> -_Rp -__func<_Fp, _Alloc, _Rp(_A0, _A1, _A2)>::operator()(_A0 __a0, _A1 __a1, _A2 __a2) -{ -    typedef __invoke_void_return_wrapper<_Rp> _Invoker; -    return _Invoker::__call(__f_.first(), __a0, __a1, __a2); -} - -#ifndef _LIBCPP_NO_RTTI - -template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1, class _A2> -const void* -__func<_Fp, _Alloc, _Rp(_A0, _A1, _A2)>::target(const type_info& __ti) const -{ -    if (__ti == typeid(_Fp)) -        return &__f_.first(); -    return (const void*)0; -} - -template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1, class _A2> -const std::type_info& -__func<_Fp, _Alloc, _Rp(_A0, _A1, _A2)>::target_type() const -{ -    return typeid(_Fp); -} - -#endif // _LIBCPP_NO_RTTI - -} // namespace __function - -template<class _Rp> -class _LIBCPP_TEMPLATE_VIS function<_Rp()> -{ -    typedef __function::__base<_Rp()> __base; -    aligned_storage<3*sizeof(void*)>::type __buf_; -    __base* __f_; - -public: -    typedef _Rp result_type; - -    // 20.7.16.2.1, construct/copy/destroy: -    _LIBCPP_INLINE_VISIBILITY explicit function() : __f_(0) {} -    _LIBCPP_INLINE_VISIBILITY function(nullptr_t) : __f_(0) {} -    function(const function&); -    template<class _Fp> -      function(_Fp, -               typename enable_if<!is_integral<_Fp>::value>::type* = 0); - -    template<class _Alloc> -      _LIBCPP_INLINE_VISIBILITY -      function(allocator_arg_t, const _Alloc&) : __f_(0) {} -    template<class _Alloc> -      _LIBCPP_INLINE_VISIBILITY -      function(allocator_arg_t, const _Alloc&, nullptr_t) : __f_(0) {} -    template<class _Alloc> -      function(allocator_arg_t, const _Alloc&, const function&); -    template<class _Fp, class _Alloc> -      function(allocator_arg_t, const _Alloc& __a, _Fp __f, -               typename enable_if<!is_integral<_Fp>::value>::type* = 0); - -    function& operator=(const function&); -    function& operator=(nullptr_t); -    template<class _Fp> -      typename enable_if -      < -        !is_integral<_Fp>::value, -        function& -      >::type -      operator=(_Fp); - -    ~function(); - -    // 20.7.16.2.2, function modifiers: -    void swap(function&); -    template<class _Fp, class _Alloc> -      _LIBCPP_INLINE_VISIBILITY -      void assign(_Fp __f, const _Alloc& __a) -        {function(allocator_arg, __a, __f).swap(*this);} - -    // 20.7.16.2.3, function capacity: -    _LIBCPP_INLINE_VISIBILITY explicit operator bool() const {return __f_;} - -    template<class _R2> -      bool operator==(const function<_R2()>&) const = delete; -    template<class _R2> -      bool operator!=(const function<_R2()>&) const = delete; - -    // 20.7.16.2.4, function invocation: -    _Rp operator()() const; - -#ifndef _LIBCPP_NO_RTTI -    // 20.7.16.2.5, function target access: -    const std::type_info& target_type() const; -    template <typename _Tp> _Tp* target(); -    template <typename _Tp> const _Tp* target() const; -#endif // _LIBCPP_NO_RTTI -}; - -template<class _Rp> -function<_Rp()>::function(const function& __f) -{ -    if (__f.__f_ == 0) -        __f_ = 0; -    else if (__f.__f_ == (const __base*)&__f.__buf_) -    { -        __f_ = (__base*)&__buf_; -        __f.__f_->__clone(__f_); -    } -    else -        __f_ = __f.__f_->__clone(); -} - -template<class _Rp> -template<class _Alloc> -function<_Rp()>::function(allocator_arg_t, const _Alloc&, const function& __f) -{ -    if (__f.__f_ == 0) -        __f_ = 0; -    else if (__f.__f_ == (const __base*)&__f.__buf_) -    { -        __f_ = (__base*)&__buf_; -        __f.__f_->__clone(__f_); -    } -    else -        __f_ = __f.__f_->__clone(); -} - -template<class _Rp> -template <class _Fp> -function<_Rp()>::function(_Fp __f, -                                     typename enable_if<!is_integral<_Fp>::value>::type*) -    : __f_(0) -{ -    if (__function::__not_null(__f)) -    { -        typedef __function::__func<_Fp, allocator<_Fp>, _Rp()> _FF; -        if (sizeof(_FF) <= sizeof(__buf_)) -        { -            __f_ = (__base*)&__buf_; -            ::new ((void*)__f_) _FF(__f); -        } -        else -        { -            typedef allocator<_FF> _Ap; -            _Ap __a; -            typedef __allocator_destructor<_Ap> _Dp; -            unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1)); -            ::new ((void*)__hold.get()) _FF(__f, allocator<_Fp>(__a)); -            __f_ = __hold.release(); -        } -    } -} - -template<class _Rp> -template <class _Fp, class _Alloc> -function<_Rp()>::function(allocator_arg_t, const _Alloc& __a0, _Fp __f, -                                     typename enable_if<!is_integral<_Fp>::value>::type*) -    : __f_(0) -{ -    typedef allocator_traits<_Alloc> __alloc_traits; -    if (__function::__not_null(__f)) -    { -        typedef __function::__func<_Fp, _Alloc, _Rp()> _FF; -        if (sizeof(_FF) <= sizeof(__buf_)) -        { -            __f_ = (__base*)&__buf_; -            ::new ((void*)__f_) _FF(__f, __a0); -        } -        else -        { -            typedef typename __rebind_alloc_helper<__alloc_traits, _FF>::type _Ap; -            _Ap __a(__a0); -            typedef __allocator_destructor<_Ap> _Dp; -            unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1)); -            ::new ((void*)__hold.get()) _FF(__f, _Alloc(__a)); -            __f_ = __hold.release(); -        } -    } -} - -template<class _Rp> -function<_Rp()>& -function<_Rp()>::operator=(const function& __f) -{ -    if (__f) -        function(__f).swap(*this); -    else -        *this = nullptr; -    return *this; -} - -template<class _Rp> -function<_Rp()>& -function<_Rp()>::operator=(nullptr_t) -{ -    __base* __t = __f_; -    __f_ = 0; -    if (__t == (__base*)&__buf_) -        __t->destroy(); -    else if (__t) -        __t->destroy_deallocate(); -    return *this; -} - -template<class _Rp> -template <class _Fp> -typename enable_if -< -    !is_integral<_Fp>::value, -    function<_Rp()>& ->::type -function<_Rp()>::operator=(_Fp __f) -{ -    function(_VSTD::move(__f)).swap(*this); -    return *this; -} - -template<class _Rp> -function<_Rp()>::~function() -{ -    if (__f_ == (__base*)&__buf_) -        __f_->destroy(); -    else if (__f_) -        __f_->destroy_deallocate(); -} - -template<class _Rp> -void -function<_Rp()>::swap(function& __f) -{ -    if (_VSTD::addressof(__f) == this) -      return; -    if (__f_ == (__base*)&__buf_ && __f.__f_ == (__base*)&__f.__buf_) -    { -        typename aligned_storage<sizeof(__buf_)>::type __tempbuf; -        __base* __t = (__base*)&__tempbuf; -        __f_->__clone(__t); -        __f_->destroy(); -        __f_ = 0; -        __f.__f_->__clone((__base*)&__buf_); -        __f.__f_->destroy(); -        __f.__f_ = 0; -        __f_ = (__base*)&__buf_; -        __t->__clone((__base*)&__f.__buf_); -        __t->destroy(); -        __f.__f_ = (__base*)&__f.__buf_; -    } -    else if (__f_ == (__base*)&__buf_) -    { -        __f_->__clone((__base*)&__f.__buf_); -        __f_->destroy(); -        __f_ = __f.__f_; -        __f.__f_ = (__base*)&__f.__buf_; -    } -    else if (__f.__f_ == (__base*)&__f.__buf_) -    { -        __f.__f_->__clone((__base*)&__buf_); -        __f.__f_->destroy(); -        __f.__f_ = __f_; -        __f_ = (__base*)&__buf_; -    } -    else -        _VSTD::swap(__f_, __f.__f_); -} - -template<class _Rp> -_Rp -function<_Rp()>::operator()() const -{ -    if (__f_ == 0) -        __throw_bad_function_call(); -    return (*__f_)(); -} - -#ifndef _LIBCPP_NO_RTTI - -template<class _Rp> -const std::type_info& -function<_Rp()>::target_type() const -{ -    if (__f_ == 0) -        return typeid(void); -    return __f_->target_type(); -} - -template<class _Rp> -template <typename _Tp> -_Tp* -function<_Rp()>::target() -{ -    if (__f_ == 0) -        return (_Tp*)0; -    return (_Tp*) const_cast<void *>(__f_->target(typeid(_Tp))); -} - -template<class _Rp> -template <typename _Tp> -const _Tp* -function<_Rp()>::target() const -{ -    if (__f_ == 0) -        return (const _Tp*)0; -    return (const _Tp*)__f_->target(typeid(_Tp)); -} - -#endif // _LIBCPP_NO_RTTI - -template<class _Rp, class _A0> -class _LIBCPP_TEMPLATE_VIS function<_Rp(_A0)> -    : public unary_function<_A0, _Rp> -{ -    typedef __function::__base<_Rp(_A0)> __base; -    aligned_storage<3*sizeof(void*)>::type __buf_; -    __base* __f_; - -public: -    typedef _Rp result_type; - -    // 20.7.16.2.1, construct/copy/destroy: -    _LIBCPP_INLINE_VISIBILITY explicit function() : __f_(0) {} -    _LIBCPP_INLINE_VISIBILITY function(nullptr_t) : __f_(0) {} -    function(const function&); -    template<class _Fp> -      function(_Fp, -               typename enable_if<!is_integral<_Fp>::value>::type* = 0); - -    template<class _Alloc> -      _LIBCPP_INLINE_VISIBILITY -      function(allocator_arg_t, const _Alloc&) : __f_(0) {} -    template<class _Alloc> -      _LIBCPP_INLINE_VISIBILITY -      function(allocator_arg_t, const _Alloc&, nullptr_t) : __f_(0) {} -    template<class _Alloc> -      function(allocator_arg_t, const _Alloc&, const function&); -    template<class _Fp, class _Alloc> -      function(allocator_arg_t, const _Alloc& __a, _Fp __f, -               typename enable_if<!is_integral<_Fp>::value>::type* = 0); - -    function& operator=(const function&); -    function& operator=(nullptr_t); -    template<class _Fp> -      typename enable_if -      < -        !is_integral<_Fp>::value, -        function& -      >::type -      operator=(_Fp); - -    ~function(); - -    // 20.7.16.2.2, function modifiers: -    void swap(function&); -    template<class _Fp, class _Alloc> -      _LIBCPP_INLINE_VISIBILITY -      void assign(_Fp __f, const _Alloc& __a) -        {function(allocator_arg, __a, __f).swap(*this);} - -    // 20.7.16.2.3, function capacity: -    _LIBCPP_INLINE_VISIBILITY explicit operator bool() const {return __f_;} - -    template<class _R2, class _B0> -      bool operator==(const function<_R2(_B0)>&) const = delete; -    template<class _R2, class _B0> -      bool operator!=(const function<_R2(_B0)>&) const = delete; - -    // 20.7.16.2.4, function invocation: -    _Rp operator()(_A0) const; - -#ifndef _LIBCPP_NO_RTTI -    // 20.7.16.2.5, function target access: -    const std::type_info& target_type() const; -    template <typename _Tp> _Tp* target(); -    template <typename _Tp> const _Tp* target() const; -#endif // _LIBCPP_NO_RTTI -}; - -template<class _Rp, class _A0> -function<_Rp(_A0)>::function(const function& __f) -{ -    if (__f.__f_ == 0) -        __f_ = 0; -    else if (__f.__f_ == (const __base*)&__f.__buf_) -    { -        __f_ = (__base*)&__buf_; -        __f.__f_->__clone(__f_); -    } -    else -        __f_ = __f.__f_->__clone(); -} - -template<class _Rp, class _A0> -template<class _Alloc> -function<_Rp(_A0)>::function(allocator_arg_t, const _Alloc&, const function& __f) -{ -    if (__f.__f_ == 0) -        __f_ = 0; -    else if (__f.__f_ == (const __base*)&__f.__buf_) -    { -        __f_ = (__base*)&__buf_; -        __f.__f_->__clone(__f_); -    } -    else -        __f_ = __f.__f_->__clone(); -} - -template<class _Rp, class _A0> -template <class _Fp> -function<_Rp(_A0)>::function(_Fp __f, -                                     typename enable_if<!is_integral<_Fp>::value>::type*) -    : __f_(0) -{ -    if (__function::__not_null(__f)) -    { -        typedef __function::__func<_Fp, allocator<_Fp>, _Rp(_A0)> _FF; -        if (sizeof(_FF) <= sizeof(__buf_)) -        { -            __f_ = (__base*)&__buf_; -            ::new ((void*)__f_) _FF(__f); -        } -        else -        { -            typedef allocator<_FF> _Ap; -            _Ap __a; -            typedef __allocator_destructor<_Ap> _Dp; -            unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1)); -            ::new ((void*)__hold.get()) _FF(__f, allocator<_Fp>(__a)); -            __f_ = __hold.release(); -        } -    } -} - -template<class _Rp, class _A0> -template <class _Fp, class _Alloc> -function<_Rp(_A0)>::function(allocator_arg_t, const _Alloc& __a0, _Fp __f, -                                     typename enable_if<!is_integral<_Fp>::value>::type*) -    : __f_(0) -{ -    typedef allocator_traits<_Alloc> __alloc_traits; -    if (__function::__not_null(__f)) -    { -        typedef __function::__func<_Fp, _Alloc, _Rp(_A0)> _FF; -        if (sizeof(_FF) <= sizeof(__buf_)) -        { -            __f_ = (__base*)&__buf_; -            ::new ((void*)__f_) _FF(__f, __a0); -        } -        else -        { -            typedef typename __rebind_alloc_helper<__alloc_traits, _FF>::type _Ap; -            _Ap __a(__a0); -            typedef __allocator_destructor<_Ap> _Dp; -            unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1)); -            ::new ((void*)__hold.get()) _FF(__f, _Alloc(__a)); -            __f_ = __hold.release(); -        } -    } -} - -template<class _Rp, class _A0> -function<_Rp(_A0)>& -function<_Rp(_A0)>::operator=(const function& __f) -{ -    if (__f) -        function(__f).swap(*this); -    else -        *this = nullptr; -    return *this; -} - -template<class _Rp, class _A0> -function<_Rp(_A0)>& -function<_Rp(_A0)>::operator=(nullptr_t) -{ -    __base* __t = __f_; -    __f_ = 0; -    if (__t == (__base*)&__buf_) -        __t->destroy(); -    else if (__t) -        __t->destroy_deallocate(); -    return *this; -} - -template<class _Rp, class _A0> -template <class _Fp> -typename enable_if -< -    !is_integral<_Fp>::value, -    function<_Rp(_A0)>& ->::type -function<_Rp(_A0)>::operator=(_Fp __f) -{ -    function(_VSTD::move(__f)).swap(*this); -    return *this; -} - -template<class _Rp, class _A0> -function<_Rp(_A0)>::~function() -{ -    if (__f_ == (__base*)&__buf_) -        __f_->destroy(); -    else if (__f_) -        __f_->destroy_deallocate(); -} - -template<class _Rp, class _A0> -void -function<_Rp(_A0)>::swap(function& __f) -{ -    if (_VSTD::addressof(__f) == this) -      return; -    if (__f_ == (__base*)&__buf_ && __f.__f_ == (__base*)&__f.__buf_) -    { -        typename aligned_storage<sizeof(__buf_)>::type __tempbuf; -        __base* __t = (__base*)&__tempbuf; -        __f_->__clone(__t); -        __f_->destroy(); -        __f_ = 0; -        __f.__f_->__clone((__base*)&__buf_); -        __f.__f_->destroy(); -        __f.__f_ = 0; -        __f_ = (__base*)&__buf_; -        __t->__clone((__base*)&__f.__buf_); -        __t->destroy(); -        __f.__f_ = (__base*)&__f.__buf_; -    } -    else if (__f_ == (__base*)&__buf_) -    { -        __f_->__clone((__base*)&__f.__buf_); -        __f_->destroy(); -        __f_ = __f.__f_; -        __f.__f_ = (__base*)&__f.__buf_; -    } -    else if (__f.__f_ == (__base*)&__f.__buf_) -    { -        __f.__f_->__clone((__base*)&__buf_); -        __f.__f_->destroy(); -        __f.__f_ = __f_; -        __f_ = (__base*)&__buf_; -    } -    else -        _VSTD::swap(__f_, __f.__f_); -} - -template<class _Rp, class _A0> -_Rp -function<_Rp(_A0)>::operator()(_A0 __a0) const -{ -    if (__f_ == 0) -        __throw_bad_function_call(); -    return (*__f_)(__a0); -} - -#ifndef _LIBCPP_NO_RTTI - -template<class _Rp, class _A0> -const std::type_info& -function<_Rp(_A0)>::target_type() const -{ -    if (__f_ == 0) -        return typeid(void); -    return __f_->target_type(); -} - -template<class _Rp, class _A0> -template <typename _Tp> -_Tp* -function<_Rp(_A0)>::target() -{ -    if (__f_ == 0) -        return (_Tp*)0; -    return (_Tp*) const_cast<void *>(__f_->target(typeid(_Tp))); -} - -template<class _Rp, class _A0> -template <typename _Tp> -const _Tp* -function<_Rp(_A0)>::target() const -{ -    if (__f_ == 0) -        return (const _Tp*)0; -    return (const _Tp*)__f_->target(typeid(_Tp)); -} - -#endif // _LIBCPP_NO_RTTI - -template<class _Rp, class _A0, class _A1> -class _LIBCPP_TEMPLATE_VIS function<_Rp(_A0, _A1)> -    : public binary_function<_A0, _A1, _Rp> -{ -    typedef __function::__base<_Rp(_A0, _A1)> __base; -    aligned_storage<3*sizeof(void*)>::type __buf_; -    __base* __f_; - -public: -    typedef _Rp result_type; - -    // 20.7.16.2.1, construct/copy/destroy: -    _LIBCPP_INLINE_VISIBILITY explicit function() : __f_(0) {} -    _LIBCPP_INLINE_VISIBILITY function(nullptr_t) : __f_(0) {} -    function(const function&); -    template<class _Fp> -      function(_Fp, -               typename enable_if<!is_integral<_Fp>::value>::type* = 0); - -    template<class _Alloc> -      _LIBCPP_INLINE_VISIBILITY -      function(allocator_arg_t, const _Alloc&) : __f_(0) {} -    template<class _Alloc> -      _LIBCPP_INLINE_VISIBILITY -      function(allocator_arg_t, const _Alloc&, nullptr_t) : __f_(0) {} -    template<class _Alloc> -      function(allocator_arg_t, const _Alloc&, const function&); -    template<class _Fp, class _Alloc> -      function(allocator_arg_t, const _Alloc& __a, _Fp __f, -               typename enable_if<!is_integral<_Fp>::value>::type* = 0); - -    function& operator=(const function&); -    function& operator=(nullptr_t); -    template<class _Fp> -      typename enable_if -      < -        !is_integral<_Fp>::value, -        function& -      >::type -      operator=(_Fp); - -    ~function(); - -    // 20.7.16.2.2, function modifiers: -    void swap(function&); -    template<class _Fp, class _Alloc> -      _LIBCPP_INLINE_VISIBILITY -      void assign(_Fp __f, const _Alloc& __a) -        {function(allocator_arg, __a, __f).swap(*this);} - -    // 20.7.16.2.3, function capacity: -    _LIBCPP_INLINE_VISIBILITY explicit operator bool() const {return __f_;} - -    template<class _R2, class _B0, class _B1> -      bool operator==(const function<_R2(_B0, _B1)>&) const = delete; -    template<class _R2, class _B0, class _B1> -      bool operator!=(const function<_R2(_B0, _B1)>&) const = delete; - -    // 20.7.16.2.4, function invocation: -    _Rp operator()(_A0, _A1) const; - -#ifndef _LIBCPP_NO_RTTI -    // 20.7.16.2.5, function target access: -    const std::type_info& target_type() const; -    template <typename _Tp> _Tp* target(); -    template <typename _Tp> const _Tp* target() const; -#endif // _LIBCPP_NO_RTTI -}; - -template<class _Rp, class _A0, class _A1> -function<_Rp(_A0, _A1)>::function(const function& __f) -{ -    if (__f.__f_ == 0) -        __f_ = 0; -    else if (__f.__f_ == (const __base*)&__f.__buf_) -    { -        __f_ = (__base*)&__buf_; -        __f.__f_->__clone(__f_); -    } -    else -        __f_ = __f.__f_->__clone(); -} - -template<class _Rp, class _A0, class _A1> -template<class _Alloc> -function<_Rp(_A0, _A1)>::function(allocator_arg_t, const _Alloc&, const function& __f) -{ -    if (__f.__f_ == 0) -        __f_ = 0; -    else if (__f.__f_ == (const __base*)&__f.__buf_) -    { -        __f_ = (__base*)&__buf_; -        __f.__f_->__clone(__f_); -    } -    else -        __f_ = __f.__f_->__clone(); -} - -template<class _Rp, class _A0, class _A1> -template <class _Fp> -function<_Rp(_A0, _A1)>::function(_Fp __f, -                                 typename enable_if<!is_integral<_Fp>::value>::type*) -    : __f_(0) -{ -    if (__function::__not_null(__f)) -    { -        typedef __function::__func<_Fp, allocator<_Fp>, _Rp(_A0, _A1)> _FF; -        if (sizeof(_FF) <= sizeof(__buf_)) -        { -            __f_ = (__base*)&__buf_; -            ::new ((void*)__f_) _FF(__f); -        } -        else -        { -            typedef allocator<_FF> _Ap; -            _Ap __a; -            typedef __allocator_destructor<_Ap> _Dp; -            unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1)); -            ::new ((void*)__hold.get()) _FF(__f, allocator<_Fp>(__a)); -            __f_ = __hold.release(); -        } -    } -} - -template<class _Rp, class _A0, class _A1> -template <class _Fp, class _Alloc> -function<_Rp(_A0, _A1)>::function(allocator_arg_t, const _Alloc& __a0, _Fp __f, -                                 typename enable_if<!is_integral<_Fp>::value>::type*) -    : __f_(0) -{ -    typedef allocator_traits<_Alloc> __alloc_traits; -    if (__function::__not_null(__f)) -    { -        typedef __function::__func<_Fp, _Alloc, _Rp(_A0, _A1)> _FF; -        if (sizeof(_FF) <= sizeof(__buf_)) -        { -            __f_ = (__base*)&__buf_; -            ::new ((void*)__f_) _FF(__f, __a0); -        } -        else -        { -            typedef typename __rebind_alloc_helper<__alloc_traits, _FF>::type _Ap; -            _Ap __a(__a0); -            typedef __allocator_destructor<_Ap> _Dp; -            unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1)); -            ::new ((void*)__hold.get()) _FF(__f, _Alloc(__a)); -            __f_ = __hold.release(); -        } -    } -} - -template<class _Rp, class _A0, class _A1> -function<_Rp(_A0, _A1)>& -function<_Rp(_A0, _A1)>::operator=(const function& __f) -{ -    if (__f) -        function(__f).swap(*this); -    else -        *this = nullptr; -    return *this; -} - -template<class _Rp, class _A0, class _A1> -function<_Rp(_A0, _A1)>& -function<_Rp(_A0, _A1)>::operator=(nullptr_t) -{ -    __base* __t = __f_; -    __f_ = 0; -    if (__t == (__base*)&__buf_) -        __t->destroy(); -    else if (__t) -        __t->destroy_deallocate(); -    return *this; -} - -template<class _Rp, class _A0, class _A1> -template <class _Fp> -typename enable_if -< -    !is_integral<_Fp>::value, -    function<_Rp(_A0, _A1)>& ->::type -function<_Rp(_A0, _A1)>::operator=(_Fp __f) -{ -    function(_VSTD::move(__f)).swap(*this); -    return *this; -} - -template<class _Rp, class _A0, class _A1> -function<_Rp(_A0, _A1)>::~function() -{ -    if (__f_ == (__base*)&__buf_) -        __f_->destroy(); -    else if (__f_) -        __f_->destroy_deallocate(); -} - -template<class _Rp, class _A0, class _A1> -void -function<_Rp(_A0, _A1)>::swap(function& __f) -{ -    if (_VSTD::addressof(__f) == this) -      return; -    if (__f_ == (__base*)&__buf_ && __f.__f_ == (__base*)&__f.__buf_) -    { -        typename aligned_storage<sizeof(__buf_)>::type __tempbuf; -        __base* __t = (__base*)&__tempbuf; -        __f_->__clone(__t); -        __f_->destroy(); -        __f_ = 0; -        __f.__f_->__clone((__base*)&__buf_); -        __f.__f_->destroy(); -        __f.__f_ = 0; -        __f_ = (__base*)&__buf_; -        __t->__clone((__base*)&__f.__buf_); -        __t->destroy(); -        __f.__f_ = (__base*)&__f.__buf_; -    } -    else if (__f_ == (__base*)&__buf_) -    { -        __f_->__clone((__base*)&__f.__buf_); -        __f_->destroy(); -        __f_ = __f.__f_; -        __f.__f_ = (__base*)&__f.__buf_; -    } -    else if (__f.__f_ == (__base*)&__f.__buf_) -    { -        __f.__f_->__clone((__base*)&__buf_); -        __f.__f_->destroy(); -        __f.__f_ = __f_; -        __f_ = (__base*)&__buf_; -    } -    else -        _VSTD::swap(__f_, __f.__f_); -} - -template<class _Rp, class _A0, class _A1> -_Rp -function<_Rp(_A0, _A1)>::operator()(_A0 __a0, _A1 __a1) const -{ -    if (__f_ == 0) -        __throw_bad_function_call(); -    return (*__f_)(__a0, __a1); -} - -#ifndef _LIBCPP_NO_RTTI - -template<class _Rp, class _A0, class _A1> -const std::type_info& -function<_Rp(_A0, _A1)>::target_type() const -{ -    if (__f_ == 0) -        return typeid(void); -    return __f_->target_type(); -} - -template<class _Rp, class _A0, class _A1> -template <typename _Tp> -_Tp* -function<_Rp(_A0, _A1)>::target() -{ -    if (__f_ == 0) -        return (_Tp*)0; -    return (_Tp*) const_cast<void *>(__f_->target(typeid(_Tp))); -} - -template<class _Rp, class _A0, class _A1> -template <typename _Tp> -const _Tp* -function<_Rp(_A0, _A1)>::target() const -{ -    if (__f_ == 0) -        return (const _Tp*)0; -    return (const _Tp*)__f_->target(typeid(_Tp)); -} - -#endif // _LIBCPP_NO_RTTI - -template<class _Rp, class _A0, class _A1, class _A2> -class _LIBCPP_TEMPLATE_VIS function<_Rp(_A0, _A1, _A2)> -{ -    typedef __function::__base<_Rp(_A0, _A1, _A2)> __base; -    aligned_storage<3*sizeof(void*)>::type __buf_; -    __base* __f_; - -public: -    typedef _Rp result_type; - -    // 20.7.16.2.1, construct/copy/destroy: -    _LIBCPP_INLINE_VISIBILITY explicit function() : __f_(0) {} -    _LIBCPP_INLINE_VISIBILITY function(nullptr_t) : __f_(0) {} -    function(const function&); -    template<class _Fp> -      function(_Fp, -               typename enable_if<!is_integral<_Fp>::value>::type* = 0); - -    template<class _Alloc> -      _LIBCPP_INLINE_VISIBILITY -      function(allocator_arg_t, const _Alloc&) : __f_(0) {} -    template<class _Alloc> -      _LIBCPP_INLINE_VISIBILITY -      function(allocator_arg_t, const _Alloc&, nullptr_t) : __f_(0) {} -    template<class _Alloc> -      function(allocator_arg_t, const _Alloc&, const function&); -    template<class _Fp, class _Alloc> -      function(allocator_arg_t, const _Alloc& __a, _Fp __f, -               typename enable_if<!is_integral<_Fp>::value>::type* = 0); - -    function& operator=(const function&); -    function& operator=(nullptr_t); -    template<class _Fp> -      typename enable_if -      < -        !is_integral<_Fp>::value, -        function& -      >::type -      operator=(_Fp); - -    ~function(); - -    // 20.7.16.2.2, function modifiers: -    void swap(function&); -    template<class _Fp, class _Alloc> -      _LIBCPP_INLINE_VISIBILITY -      void assign(_Fp __f, const _Alloc& __a) -        {function(allocator_arg, __a, __f).swap(*this);} - -    // 20.7.16.2.3, function capacity: -    _LIBCPP_INLINE_VISIBILITY explicit operator bool() const {return __f_;} - -    template<class _R2, class _B0, class _B1, class _B2> -      bool operator==(const function<_R2(_B0, _B1, _B2)>&) const = delete; -    template<class _R2, class _B0, class _B1, class _B2> -      bool operator!=(const function<_R2(_B0, _B1, _B2)>&) const = delete; - -    // 20.7.16.2.4, function invocation: -    _Rp operator()(_A0, _A1, _A2) const; - -#ifndef _LIBCPP_NO_RTTI -    // 20.7.16.2.5, function target access: -    const std::type_info& target_type() const; -    template <typename _Tp> _Tp* target(); -    template <typename _Tp> const _Tp* target() const; -#endif // _LIBCPP_NO_RTTI -}; - -template<class _Rp, class _A0, class _A1, class _A2> -function<_Rp(_A0, _A1, _A2)>::function(const function& __f) -{ -    if (__f.__f_ == 0) -        __f_ = 0; -    else if (__f.__f_ == (const __base*)&__f.__buf_) -    { -        __f_ = (__base*)&__buf_; -        __f.__f_->__clone(__f_); -    } -    else -        __f_ = __f.__f_->__clone(); -} - -template<class _Rp, class _A0, class _A1, class _A2> -template<class _Alloc> -function<_Rp(_A0, _A1, _A2)>::function(allocator_arg_t, const _Alloc&, -                                      const function& __f) -{ -    if (__f.__f_ == 0) -        __f_ = 0; -    else if (__f.__f_ == (const __base*)&__f.__buf_) -    { -        __f_ = (__base*)&__buf_; -        __f.__f_->__clone(__f_); -    } -    else -        __f_ = __f.__f_->__clone(); -} - -template<class _Rp, class _A0, class _A1, class _A2> -template <class _Fp> -function<_Rp(_A0, _A1, _A2)>::function(_Fp __f, -                                     typename enable_if<!is_integral<_Fp>::value>::type*) -    : __f_(0) -{ -    if (__function::__not_null(__f)) -    { -        typedef __function::__func<_Fp, allocator<_Fp>, _Rp(_A0, _A1, _A2)> _FF; -        if (sizeof(_FF) <= sizeof(__buf_)) -        { -            __f_ = (__base*)&__buf_; -            ::new ((void*)__f_) _FF(__f); -        } -        else -        { -            typedef allocator<_FF> _Ap; -            _Ap __a; -            typedef __allocator_destructor<_Ap> _Dp; -            unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1)); -            ::new ((void*)__hold.get()) _FF(__f, allocator<_Fp>(__a)); -            __f_ = __hold.release(); -        } -    } -} - -template<class _Rp, class _A0, class _A1, class _A2> -template <class _Fp, class _Alloc> -function<_Rp(_A0, _A1, _A2)>::function(allocator_arg_t, const _Alloc& __a0, _Fp __f, -                                     typename enable_if<!is_integral<_Fp>::value>::type*) -    : __f_(0) -{ -    typedef allocator_traits<_Alloc> __alloc_traits; -    if (__function::__not_null(__f)) -    { -        typedef __function::__func<_Fp, _Alloc, _Rp(_A0, _A1, _A2)> _FF; -        if (sizeof(_FF) <= sizeof(__buf_)) -        { -            __f_ = (__base*)&__buf_; -            ::new ((void*)__f_) _FF(__f, __a0); -        } -        else -        { -            typedef typename __rebind_alloc_helper<__alloc_traits, _FF>::type _Ap; -            _Ap __a(__a0); -            typedef __allocator_destructor<_Ap> _Dp; -            unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1)); -            ::new ((void*)__hold.get()) _FF(__f, _Alloc(__a)); -            __f_ = __hold.release(); -        } -    } -} - -template<class _Rp, class _A0, class _A1, class _A2> -function<_Rp(_A0, _A1, _A2)>& -function<_Rp(_A0, _A1, _A2)>::operator=(const function& __f) -{ -    if (__f) -        function(__f).swap(*this); -    else -        *this = nullptr; -    return *this; -} - -template<class _Rp, class _A0, class _A1, class _A2> -function<_Rp(_A0, _A1, _A2)>& -function<_Rp(_A0, _A1, _A2)>::operator=(nullptr_t) -{ -    __base* __t = __f_; -    __f_ = 0; -    if (__t == (__base*)&__buf_) -        __t->destroy(); -    else if (__t) -        __t->destroy_deallocate(); -    return *this; -} - -template<class _Rp, class _A0, class _A1, class _A2> -template <class _Fp> -typename enable_if -< -    !is_integral<_Fp>::value, -    function<_Rp(_A0, _A1, _A2)>& ->::type -function<_Rp(_A0, _A1, _A2)>::operator=(_Fp __f) -{ -    function(_VSTD::move(__f)).swap(*this); -    return *this; -} - -template<class _Rp, class _A0, class _A1, class _A2> -function<_Rp(_A0, _A1, _A2)>::~function() -{ -    if (__f_ == (__base*)&__buf_) -        __f_->destroy(); -    else if (__f_) -        __f_->destroy_deallocate(); -} - -template<class _Rp, class _A0, class _A1, class _A2> -void -function<_Rp(_A0, _A1, _A2)>::swap(function& __f) -{ -    if (_VSTD::addressof(__f) == this) -      return; -    if (__f_ == (__base*)&__buf_ && __f.__f_ == (__base*)&__f.__buf_) -    { -        typename aligned_storage<sizeof(__buf_)>::type __tempbuf; -        __base* __t = (__base*)&__tempbuf; -        __f_->__clone(__t); -        __f_->destroy(); -        __f_ = 0; -        __f.__f_->__clone((__base*)&__buf_); -        __f.__f_->destroy(); -        __f.__f_ = 0; -        __f_ = (__base*)&__buf_; -        __t->__clone((__base*)&__f.__buf_); -        __t->destroy(); -        __f.__f_ = (__base*)&__f.__buf_; -    } -    else if (__f_ == (__base*)&__buf_) -    { -        __f_->__clone((__base*)&__f.__buf_); -        __f_->destroy(); -        __f_ = __f.__f_; -        __f.__f_ = (__base*)&__f.__buf_; -    } -    else if (__f.__f_ == (__base*)&__f.__buf_) -    { -        __f.__f_->__clone((__base*)&__buf_); -        __f.__f_->destroy(); -        __f.__f_ = __f_; -        __f_ = (__base*)&__buf_; -    } -    else -        _VSTD::swap(__f_, __f.__f_); -} - -template<class _Rp, class _A0, class _A1, class _A2> -_Rp -function<_Rp(_A0, _A1, _A2)>::operator()(_A0 __a0, _A1 __a1, _A2 __a2) const -{ -    if (__f_ == 0) -        __throw_bad_function_call(); -    return (*__f_)(__a0, __a1, __a2); -} - -#ifndef _LIBCPP_NO_RTTI - -template<class _Rp, class _A0, class _A1, class _A2> -const std::type_info& -function<_Rp(_A0, _A1, _A2)>::target_type() const -{ -    if (__f_ == 0) -        return typeid(void); -    return __f_->target_type(); -} - -template<class _Rp, class _A0, class _A1, class _A2> -template <typename _Tp> -_Tp* -function<_Rp(_A0, _A1, _A2)>::target() -{ -    if (__f_ == 0) -        return (_Tp*)0; -    return (_Tp*) const_cast<void *>(__f_->target(typeid(_Tp))); -} - -template<class _Rp, class _A0, class _A1, class _A2> -template <typename _Tp> -const _Tp* -function<_Rp(_A0, _A1, _A2)>::target() const -{ -    if (__f_ == 0) -        return (const _Tp*)0; -    return (const _Tp*)__f_->target(typeid(_Tp)); -} - -#endif // _LIBCPP_NO_RTTI - -template <class _Fp> -inline _LIBCPP_INLINE_VISIBILITY -bool -operator==(const function<_Fp>& __f, nullptr_t) {return !__f;} - -template <class _Fp> -inline _LIBCPP_INLINE_VISIBILITY -bool -operator==(nullptr_t, const function<_Fp>& __f) {return !__f;} - -template <class _Fp> -inline _LIBCPP_INLINE_VISIBILITY -bool -operator!=(const function<_Fp>& __f, nullptr_t) {return (bool)__f;} - -template <class _Fp> -inline _LIBCPP_INLINE_VISIBILITY -bool -operator!=(nullptr_t, const function<_Fp>& __f) {return (bool)__f;} - -template <class _Fp> -inline _LIBCPP_INLINE_VISIBILITY -void -swap(function<_Fp>& __x, function<_Fp>& __y) -{return __x.swap(__y);} +_LIBCPP_END_NAMESPACE_STD  #endif // _LIBCPP_CXX03_LANG -_LIBCPP_END_NAMESPACE_STD -  #endif // _LIBCPP___FUNCTIONAL_FUNCTION_H | 
