LCOV - code coverage report
Current view: top level - /usr/include/c++/14/bits - std_function.h (source / functions) Coverage Total Hit
Test: PostgreSQL 19devel Lines: 100.0 % 16 16
Test Date: 2026-02-27 05:14:50 Functions: 100.0 % 5 5
Legend: Lines:     hit not hit

            Line data    Source code
       1              : // Implementation of std::function -*- C++ -*-
       2              : 
       3              : // Copyright (C) 2004-2024 Free Software Foundation, Inc.
       4              : //
       5              : // This file is part of the GNU ISO C++ Library.  This library is free
       6              : // software; you can redistribute it and/or modify it under the
       7              : // terms of the GNU General Public License as published by the
       8              : // Free Software Foundation; either version 3, or (at your option)
       9              : // any later version.
      10              : 
      11              : // This library is distributed in the hope that it will be useful,
      12              : // but WITHOUT ANY WARRANTY; without even the implied warranty of
      13              : // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      14              : // GNU General Public License for more details.
      15              : 
      16              : // Under Section 7 of GPL version 3, you are granted additional
      17              : // permissions described in the GCC Runtime Library Exception, version
      18              : // 3.1, as published by the Free Software Foundation.
      19              : 
      20              : // You should have received a copy of the GNU General Public License and
      21              : // a copy of the GCC Runtime Library Exception along with this program;
      22              : // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
      23              : // <http://www.gnu.org/licenses/>.
      24              : 
      25              : /** @file include/bits/std_function.h
      26              :  *  This is an internal header file, included by other library headers.
      27              :  *  Do not attempt to use it directly. @headername{functional}
      28              :  */
      29              : 
      30              : #ifndef _GLIBCXX_STD_FUNCTION_H
      31              : #define _GLIBCXX_STD_FUNCTION_H 1
      32              : 
      33              : #pragma GCC system_header
      34              : 
      35              : #if __cplusplus < 201103L
      36              : # include <bits/c++0x_warning.h>
      37              : #else
      38              : 
      39              : #include <new>                // placement new
      40              : #include <typeinfo>           // typeid
      41              : #include <bits/invoke.h>      // __invoke_r
      42              : #include <bits/refwrap.h>     // ref wrapper, _Maybe_unary_or_binary_function
      43              : #include <bits/functexcept.h> // __throw_bad_function_call
      44              : 
      45              : namespace std _GLIBCXX_VISIBILITY(default)
      46              : {
      47              : _GLIBCXX_BEGIN_NAMESPACE_VERSION
      48              : 
      49              :   /**
      50              :    *  @brief Exception class thrown when class template function's
      51              :    *  operator() is called with an empty target.
      52              :    *  @ingroup exceptions
      53              :    */
      54              :   class bad_function_call : public std::exception
      55              :   {
      56              :   public:
      57              :     virtual ~bad_function_call() noexcept;
      58              : 
      59              :     const char* what() const noexcept;
      60              :   };
      61              : 
      62              :   /**
      63              :    *  Trait identifying "location-invariant" types, meaning that the
      64              :    *  address of the object (or any of its members) will not escape.
      65              :    *  Trivially copyable types are location-invariant and users can
      66              :    *  specialize this trait for other types.
      67              :    */
      68              :   template<typename _Tp>
      69              :     struct __is_location_invariant
      70              :     : is_trivially_copyable<_Tp>::type
      71              :     { };
      72              : 
      73              :   class _Undefined_class;
      74              : 
      75              :   union _Nocopy_types
      76              :   {
      77              :     void*       _M_object;
      78              :     const void* _M_const_object;
      79              :     void (*_M_function_pointer)();
      80              :     void (_Undefined_class::*_M_member_pointer)();
      81              :   };
      82              : 
      83              :   union [[gnu::may_alias]] _Any_data
      84              :   {
      85              :     void*       _M_access()       noexcept { return &_M_pod_data[0]; }
      86              :     const void* _M_access() const noexcept { return &_M_pod_data[0]; }
      87              : 
      88              :     template<typename _Tp>
      89              :       _Tp&
      90              :       _M_access() noexcept
      91              :       { return *static_cast<_Tp*>(_M_access()); }
      92              : 
      93              :     template<typename _Tp>
      94              :       const _Tp&
      95              :       _M_access() const noexcept
      96              :       { return *static_cast<const _Tp*>(_M_access()); }
      97              : 
      98              :     _Nocopy_types _M_unused;
      99              :     char _M_pod_data[sizeof(_Nocopy_types)];
     100              :   };
     101              : 
     102              :   enum _Manager_operation
     103              :   {
     104              :     __get_type_info,
     105              :     __get_functor_ptr,
     106              :     __clone_functor,
     107              :     __destroy_functor
     108              :   };
     109              : 
     110              :   template<typename _Signature>
     111              :     class function;
     112              : 
     113              :   /// Base class of all polymorphic function object wrappers.
     114              :   class _Function_base
     115              :   {
     116              :   public:
     117              :     static const size_t _M_max_size = sizeof(_Nocopy_types);
     118              :     static const size_t _M_max_align = __alignof__(_Nocopy_types);
     119              : 
     120              :     template<typename _Functor>
     121              :       class _Base_manager
     122              :       {
     123              :       protected:
     124              :     static const bool __stored_locally =
     125              :     (__is_location_invariant<_Functor>::value
     126              :      && sizeof(_Functor) <= _M_max_size
     127              :      && __alignof__(_Functor) <= _M_max_align
     128              :      && (_M_max_align % __alignof__(_Functor) == 0));
     129              : 
     130              :     using _Local_storage = integral_constant<bool, __stored_locally>;
     131              : 
     132              :     // Retrieve a pointer to the function object
     133              :     static _Functor*
     134              :     _M_get_pointer(const _Any_data& __source) noexcept
     135              :     {
     136              :       if _GLIBCXX17_CONSTEXPR (__stored_locally)
     137              :         {
     138              :           const _Functor& __f = __source._M_access<_Functor>();
     139              :           return const_cast<_Functor*>(std::__addressof(__f));
     140              :         }
     141              :       else // have stored a pointer
     142              :         return __source._M_access<_Functor*>();
     143              :     }
     144              : 
     145              :       private:
     146              :     // Construct a location-invariant function object that fits within
     147              :     // an _Any_data structure.
     148              :     template<typename _Fn>
     149              :       static void
     150              :       _M_create(_Any_data& __dest, _Fn&& __f, true_type)
     151              :       {
     152              :         ::new (__dest._M_access()) _Functor(std::forward<_Fn>(__f));
     153              :       }
     154              : 
     155              :     // Construct a function object on the heap and store a pointer.
     156              :     template<typename _Fn>
     157              :       static void
     158              :       _M_create(_Any_data& __dest, _Fn&& __f, false_type)
     159              :       {
     160              :         __dest._M_access<_Functor*>()
     161              :           = new _Functor(std::forward<_Fn>(__f));
     162              :       }
     163              : 
     164              :     // Destroy an object stored in the internal buffer.
     165              :     static void
     166              :     _M_destroy(_Any_data& __victim, true_type)
     167              :     {
     168              :       __victim._M_access<_Functor>().~_Functor();
     169              :     }
     170              : 
     171              :     // Destroy an object located on the heap.
     172              :     static void
     173              :     _M_destroy(_Any_data& __victim, false_type)
     174              :     {
     175              :       delete __victim._M_access<_Functor*>();
     176              :     }
     177              : 
     178              :       public:
     179              :     static bool
     180              :     _M_manager(_Any_data& __dest, const _Any_data& __source,
     181              :            _Manager_operation __op)
     182              :     {
     183              :       switch (__op)
     184              :         {
     185              :         case __get_type_info:
     186              : #if __cpp_rtti
     187              :           __dest._M_access<const type_info*>() = &typeid(_Functor);
     188              : #else
     189              :           __dest._M_access<const type_info*>() = nullptr;
     190              : #endif
     191              :           break;
     192              : 
     193              :         case __get_functor_ptr:
     194              :           __dest._M_access<_Functor*>() = _M_get_pointer(__source);
     195              :           break;
     196              : 
     197              :         case __clone_functor:
     198              :           _M_init_functor(__dest,
     199              :           *const_cast<const _Functor*>(_M_get_pointer(__source)));
     200              :           break;
     201              : 
     202              :         case __destroy_functor:
     203              :           _M_destroy(__dest, _Local_storage());
     204              :           break;
     205              :         }
     206              :       return false;
     207              :     }
     208              : 
     209              :     template<typename _Fn>
     210              :       static void
     211              :       _M_init_functor(_Any_data& __functor, _Fn&& __f)
     212              :       noexcept(__and_<_Local_storage,
     213              :               is_nothrow_constructible<_Functor, _Fn>>::value)
     214              :       {
     215              :         _M_create(__functor, std::forward<_Fn>(__f), _Local_storage());
     216              :       }
     217              : 
     218              :     template<typename _Signature>
     219              :       static bool
     220              :       _M_not_empty_function(const function<_Signature>& __f) noexcept
     221              :       { return static_cast<bool>(__f); }
     222              : 
     223              :     template<typename _Tp>
     224              :       static bool
     225              :       _M_not_empty_function(_Tp* __fp) noexcept
     226              :       { return __fp != nullptr; }
     227              : 
     228              :     template<typename _Class, typename _Tp>
     229              :       static bool
     230              :       _M_not_empty_function(_Tp _Class::* __mp) noexcept
     231              :       { return __mp != nullptr; }
     232              : 
     233              :     template<typename _Tp>
     234              :       static bool
     235              :       _M_not_empty_function(const _Tp&) noexcept
     236              :       { return true; }
     237              :       };
     238              : 
     239          428 :     _Function_base() = default;
     240              : 
     241          428 :     ~_Function_base()
     242              :     {
     243          428 :       if (_M_manager)
     244          428 :     _M_manager(_M_functor, _M_functor, __destroy_functor);
     245          428 :     }
     246              : 
     247          428 :     bool _M_empty() const { return !_M_manager; }
     248              : 
     249              :     using _Manager_type
     250              :       = bool (*)(_Any_data&, const _Any_data&, _Manager_operation);
     251              : 
     252              :     _Any_data     _M_functor{};
     253              :     _Manager_type _M_manager{};
     254              :   };
     255              : 
     256              :   template<typename _Signature, typename _Functor>
     257              :     class _Function_handler;
     258              : 
     259              :   template<typename _Res, typename _Functor, typename... _ArgTypes>
     260              :     class _Function_handler<_Res(_ArgTypes...), _Functor>
     261              :     : public _Function_base::_Base_manager<_Functor>
     262              :     {
     263              :       using _Base = _Function_base::_Base_manager<_Functor>;
     264              : 
     265              :     public:
     266              :       static bool
     267              :       _M_manager(_Any_data& __dest, const _Any_data& __source,
     268              :          _Manager_operation __op)
     269              :       {
     270              :     switch (__op)
     271              :       {
     272              : #if __cpp_rtti
     273              :       case __get_type_info:
     274              :         __dest._M_access<const type_info*>() = &typeid(_Functor);
     275              :         break;
     276              : #endif
     277              :       case __get_functor_ptr:
     278              :         __dest._M_access<_Functor*>() = _Base::_M_get_pointer(__source);
     279              :         break;
     280              : 
     281              :       default:
     282              :         _Base::_M_manager(__dest, __source, __op);
     283              :       }
     284              :     return false;
     285              :       }
     286              : 
     287              :       static _Res
     288              :       _M_invoke(const _Any_data& __functor, _ArgTypes&&... __args)
     289              :       {
     290              :     return std::__invoke_r<_Res>(*_Base::_M_get_pointer(__functor),
     291              :                      std::forward<_ArgTypes>(__args)...);
     292              :       }
     293              : 
     294              :       template<typename _Fn>
     295              :     static constexpr bool
     296              :     _S_nothrow_init() noexcept
     297              :     {
     298              :       return __and_<typename _Base::_Local_storage,
     299              :             is_nothrow_constructible<_Functor, _Fn>>::value;
     300              :     }
     301              :     };
     302              : 
     303              :   // Specialization for invalid types
     304              :   template<>
     305              :     class _Function_handler<void, void>
     306              :     {
     307              :     public:
     308              :       static bool
     309              :       _M_manager(_Any_data&, const _Any_data&, _Manager_operation)
     310              :       { return false; }
     311              :     };
     312              : 
     313              :   // Avoids instantiating ill-formed specializations of _Function_handler
     314              :   // in std::function<_Signature>::target<_Functor>().
     315              :   // e.g. _Function_handler<Sig, void()> and _Function_handler<Sig, void>
     316              :   // would be ill-formed.
     317              :   template<typename _Signature, typename _Functor,
     318              :        bool __valid = is_object<_Functor>::value>
     319              :     struct _Target_handler
     320              :     : _Function_handler<_Signature, typename remove_cv<_Functor>::type>
     321              :     { };
     322              : 
     323              :   template<typename _Signature, typename _Functor>
     324              :     struct _Target_handler<_Signature, _Functor, false>
     325              :     : _Function_handler<void, void>
     326              :     { };
     327              : 
     328              :   /**
     329              :    *  @brief Polymorphic function wrapper.
     330              :    *  @ingroup functors
     331              :    *  @since C++11
     332              :    */
     333              :   template<typename _Res, typename... _ArgTypes>
     334              :     class function<_Res(_ArgTypes...)>
     335              :     : public _Maybe_unary_or_binary_function<_Res, _ArgTypes...>,
     336              :       private _Function_base
     337              :     {
     338              :       // Equivalent to std::decay_t except that it produces an invalid type
     339              :       // if the decayed type is the current specialization of std::function.
     340              :       template<typename _Func,
     341              :            bool _Self = is_same<__remove_cvref_t<_Func>, function>::value>
     342              :     using _Decay_t
     343              :       = typename __enable_if_t<!_Self, decay<_Func>>::type;
     344              : 
     345              :       template<typename _Func,
     346              :            typename _DFunc = _Decay_t<_Func>,
     347              :            typename _Res2 = __invoke_result<_DFunc&, _ArgTypes...>>
     348              :     struct _Callable
     349              :     : __is_invocable_impl<_Res2, _Res>::type
     350              :     { };
     351              : 
     352              :       template<typename _Cond, typename _Tp = void>
     353              :     using _Requires = __enable_if_t<_Cond::value, _Tp>;
     354              : 
     355              :       template<typename _Functor>
     356              :     using _Handler
     357              :       = _Function_handler<_Res(_ArgTypes...), __decay_t<_Functor>>;
     358              : 
     359              :     public:
     360              :       typedef _Res result_type;
     361              : 
     362              :       // [3.7.2.1] construct/copy/destroy
     363              : 
     364              :       /**
     365              :        *  @brief Default construct creates an empty function call wrapper.
     366              :        *  @post `!(bool)*this`
     367              :        */
     368              :       function() noexcept
     369              :       : _Function_base() { }
     370              : 
     371              :       /**
     372              :        *  @brief Creates an empty function call wrapper.
     373              :        *  @post @c !(bool)*this
     374              :        */
     375              :       function(nullptr_t) noexcept
     376              :       : _Function_base() { }
     377              : 
     378              :       /**
     379              :        *  @brief %Function copy constructor.
     380              :        *  @param __x A %function object with identical call signature.
     381              :        *  @post `bool(*this) == bool(__x)`
     382              :        *
     383              :        *  The newly-created %function contains a copy of the target of
     384              :        *  `__x` (if it has one).
     385              :        */
     386              :       function(const function& __x)
     387              :       : _Function_base()
     388              :       {
     389              :     if (static_cast<bool>(__x))
     390              :       {
     391              :         __x._M_manager(_M_functor, __x._M_functor, __clone_functor);
     392              :         _M_invoker = __x._M_invoker;
     393              :         _M_manager = __x._M_manager;
     394              :       }
     395              :       }
     396              : 
     397              :       /**
     398              :        *  @brief %Function move constructor.
     399              :        *  @param __x A %function object rvalue with identical call signature.
     400              :        *
     401              :        *  The newly-created %function contains the target of `__x`
     402              :        *  (if it has one).
     403              :        */
     404          428 :       function(function&& __x) noexcept
     405          428 :       : _Function_base(), _M_invoker(__x._M_invoker)
     406              :       {
     407          428 :     if (static_cast<bool>(__x))
     408              :       {
     409          428 :         _M_functor = __x._M_functor;
     410          428 :         _M_manager = __x._M_manager;
     411          428 :         __x._M_manager = nullptr;
     412          428 :         __x._M_invoker = nullptr;
     413              :       }
     414          428 :       }
     415              : 
     416              :       /**
     417              :        *  @brief Builds a %function that targets a copy of the incoming
     418              :        *  function object.
     419              :        *  @param __f A %function object that is callable with parameters of
     420              :        *  type `ArgTypes...` and returns a value convertible to `Res`.
     421              :        *
     422              :        *  The newly-created %function object will target a copy of
     423              :        *  `__f`. If `__f` is `reference_wrapper<F>`, then this function
     424              :        *  object will contain a reference to the function object `__f.get()`.
     425              :        *  If `__f` is a null function pointer, null pointer-to-member, or
     426              :        *  empty `std::function`, the newly-created object will be empty.
     427              :        *
     428              :        *  If `__f` is a non-null function pointer or an object of type
     429              :        *  `reference_wrapper<F>`, this function will not throw.
     430              :        */
     431              :       // _GLIBCXX_RESOLVE_LIB_DEFECTS
     432              :       // 2774. std::function construction vs assignment
     433              :       template<typename _Functor,
     434              :            typename _Constraints = _Requires<_Callable<_Functor>>>
     435              :     function(_Functor&& __f)
     436              :     noexcept(_Handler<_Functor>::template _S_nothrow_init<_Functor>())
     437              :     : _Function_base()
     438              :     {
     439              :       static_assert(is_copy_constructible<__decay_t<_Functor>>::value,
     440              :           "std::function target must be copy-constructible");
     441              :       static_assert(is_constructible<__decay_t<_Functor>, _Functor>::value,
     442              :           "std::function target must be constructible from the "
     443              :           "constructor argument");
     444              : 
     445              :       using _My_handler = _Handler<_Functor>;
     446              : 
     447              :       if (_My_handler::_M_not_empty_function(__f))
     448              :         {
     449              :           _My_handler::_M_init_functor(_M_functor,
     450              :                        std::forward<_Functor>(__f));
     451              :           _M_invoker = &_My_handler::_M_invoke;
     452              :           _M_manager = &_My_handler::_M_manager;
     453              :         }
     454              :     }
     455              : 
     456              :       /**
     457              :        *  @brief Function assignment operator.
     458              :        *  @param __x A %function with identical call signature.
     459              :        *  @post `(bool)*this == (bool)x`
     460              :        *  @returns `*this`
     461              :        *
     462              :        *  The target of `__x` is copied to `*this`. If `__x` has no
     463              :        *  target, then `*this` will be empty.
     464              :        *
     465              :        *  If `__x` targets a function pointer or a reference to a function
     466              :        *  object, then this operation will not throw an exception.
     467              :        */
     468              :       function&
     469              :       operator=(const function& __x)
     470              :       {
     471              :     function(__x).swap(*this);
     472              :     return *this;
     473              :       }
     474              : 
     475              :       /**
     476              :        *  @brief Function move-assignment operator.
     477              :        *  @param __x A %function rvalue with identical call signature.
     478              :        *  @returns `*this`
     479              :        *
     480              :        *  The target of `__x` is moved to `*this`. If `__x` has no
     481              :        *  target, then `*this` will be empty.
     482              :        *
     483              :        *  If `__x` targets a function pointer or a reference to a function
     484              :        *  object, then this operation will not throw an exception.
     485              :        */
     486              :       function&
     487              :       operator=(function&& __x) noexcept
     488              :       {
     489              :     function(std::move(__x)).swap(*this);
     490              :     return *this;
     491              :       }
     492              : 
     493              :       /**
     494              :        *  @brief Function assignment to empty.
     495              :        *  @post `!(bool)*this`
     496              :        *  @returns `*this`
     497              :        *
     498              :        *  The target of `*this` is deallocated, leaving it empty.
     499              :        */
     500              :       function&
     501              :       operator=(nullptr_t) noexcept
     502              :       {
     503              :     if (_M_manager)
     504              :       {
     505              :         _M_manager(_M_functor, _M_functor, __destroy_functor);
     506              :         _M_manager = nullptr;
     507              :         _M_invoker = nullptr;
     508              :       }
     509              :     return *this;
     510              :       }
     511              : 
     512              :       /**
     513              :        *  @brief Function assignment to a new target.
     514              :        *  @param __f  A function object that is callable with parameters of
     515              :        *              type  `_ArgTypes...` and returns a value convertible
     516              :        *              to `_Res`.
     517              :        *  @return `*this`
     518              :        *  @since C++11
     519              :        *
     520              :        *  This function object wrapper will target a copy of `__f`. If `__f`
     521              :        *  is `reference_wrapper<F>`, then this function object will contain
     522              :        *  a reference to the function object `__f.get()`. If `__f` is a null
     523              :        *  function pointer or null pointer-to-member, this object will be
     524              :        *  empty.
     525              :        *
     526              :        *  If `__f` is a non-null function pointer or an object of type
     527              :        *  `reference_wrapper<F>`, this function will not throw.
     528              :        */
     529              :       template<typename _Functor>
     530              :     _Requires<_Callable<_Functor>, function&>
     531              :     operator=(_Functor&& __f)
     532              :     noexcept(_Handler<_Functor>::template _S_nothrow_init<_Functor>())
     533              :     {
     534              :       function(std::forward<_Functor>(__f)).swap(*this);
     535              :       return *this;
     536              :     }
     537              : 
     538              :       /// @overload
     539              :       template<typename _Functor>
     540              :     function&
     541              :     operator=(reference_wrapper<_Functor> __f) noexcept
     542              :     {
     543              :       function(__f).swap(*this);
     544              :       return *this;
     545              :     }
     546              : 
     547              :       // [3.7.2.2] function modifiers
     548              : 
     549              :       /**
     550              :        *  @brief Swap the targets of two %function objects.
     551              :        *  @param __x A %function with identical call signature.
     552              :        *
     553              :        *  Swap the targets of `this` function object and `__f`.
     554              :        *  This function will not throw exceptions.
     555              :        */
     556              :       void swap(function& __x) noexcept
     557              :       {
     558              :     std::swap(_M_functor, __x._M_functor);
     559              :     std::swap(_M_manager, __x._M_manager);
     560              :     std::swap(_M_invoker, __x._M_invoker);
     561              :       }
     562              : 
     563              :       // [3.7.2.3] function capacity
     564              : 
     565              :       /**
     566              :        *  @brief Determine if the %function wrapper has a target.
     567              :        *
     568              :        *  @return `true` when this function object contains a target,
     569              :        *  or `false` when it is empty.
     570              :        *
     571              :        *  This function will not throw exceptions.
     572              :        */
     573          428 :       explicit operator bool() const noexcept
     574          428 :       { return !_M_empty(); }
     575              : 
     576              :       // [3.7.2.4] function invocation
     577              : 
     578              :       /**
     579              :        *  @brief Invokes the function targeted by `*this`.
     580              :        *  @returns the result of the target.
     581              :        *  @throws `bad_function_call` when `!(bool)*this`
     582              :        *
     583              :        *  The function call operator invokes the target function object
     584              :        *  stored by `this`.
     585              :        */
     586              :       _Res
     587              :       operator()(_ArgTypes... __args) const
     588              :       {
     589              :     if (_M_empty())
     590              :       __throw_bad_function_call();
     591              :     return _M_invoker(_M_functor, std::forward<_ArgTypes>(__args)...);
     592              :       }
     593              : 
     594              : #if __cpp_rtti
     595              :       // [3.7.2.5] function target access
     596              :       /**
     597              :        *  @brief Determine the type of the target of this function object
     598              :        *  wrapper.
     599              :        *
     600              :        *  @returns the type identifier of the target function object, or
     601              :        *  `typeid(void)` if `!(bool)*this`.
     602              :        *
     603              :        *  This function will not throw exceptions.
     604              :        */
     605              :       const type_info&
     606              :       target_type() const noexcept
     607              :       {
     608              :     if (_M_manager)
     609              :       {
     610              :         _Any_data __typeinfo_result;
     611              :         _M_manager(__typeinfo_result, _M_functor, __get_type_info);
     612              :         if (auto __ti =  __typeinfo_result._M_access<const type_info*>())
     613              :           return *__ti;
     614              :       }
     615              :     return typeid(void);
     616              :       }
     617              : #endif
     618              : 
     619              :       /**
     620              :        *  @brief Access the stored target function object.
     621              :        *
     622              :        *  @return Returns a pointer to the stored target function object,
     623              :        *  if `typeid(_Functor).equals(target_type())`; otherwise, a null
     624              :        *  pointer.
     625              :        *
     626              :        * This function does not throw exceptions.
     627              :        *
     628              :        * @{
     629              :        */
     630              :       template<typename _Functor>
     631              :     _Functor*
     632              :     target() noexcept
     633              :     {
     634              :       const function* __const_this = this;
     635              :       const _Functor* __func = __const_this->template target<_Functor>();
     636              :       // If is_function_v<_Functor> is true then const_cast<_Functor*>
     637              :       // would be ill-formed, so use *const_cast<_Functor**> instead.
     638              :       return *const_cast<_Functor**>(&__func);
     639              :     }
     640              : 
     641              :       template<typename _Functor>
     642              :     const _Functor*
     643              :     target() const noexcept
     644              :     {
     645              :       if _GLIBCXX17_CONSTEXPR (is_object<_Functor>::value)
     646              :         {
     647              :           // For C++11 and C++14 if-constexpr is not used above, so
     648              :           // _Target_handler avoids ill-formed _Function_handler types.
     649              :           using _Handler = _Target_handler<_Res(_ArgTypes...), _Functor>;
     650              : 
     651              :           if (_M_manager == &_Handler::_M_manager
     652              : #if __cpp_rtti
     653              :           || (_M_manager && typeid(_Functor) == target_type())
     654              : #endif
     655              :          )
     656              :         {
     657              :           _Any_data __ptr;
     658              :           _M_manager(__ptr, _M_functor, __get_functor_ptr);
     659              :           return __ptr._M_access<const _Functor*>();
     660              :         }
     661              :         }
     662              :       return nullptr;
     663              :     }
     664              :       /// @}
     665              : 
     666              :     private:
     667              :       using _Invoker_type = _Res (*)(const _Any_data&, _ArgTypes&&...);
     668              :       _Invoker_type _M_invoker = nullptr;
     669              :     };
     670              : 
     671              : #if __cpp_deduction_guides >= 201606
     672              :   template<typename>
     673              :     struct __function_guide_helper
     674              :     { };
     675              : 
     676              :   template<typename _Res, typename _Tp, bool _Nx, typename... _Args>
     677              :     struct __function_guide_helper<
     678              :       _Res (_Tp::*) (_Args...) noexcept(_Nx)
     679              :     >
     680              :     { using type = _Res(_Args...); };
     681              : 
     682              :   template<typename _Res, typename _Tp, bool _Nx, typename... _Args>
     683              :     struct __function_guide_helper<
     684              :       _Res (_Tp::*) (_Args...) & noexcept(_Nx)
     685              :     >
     686              :     { using type = _Res(_Args...); };
     687              : 
     688              :   template<typename _Res, typename _Tp, bool _Nx, typename... _Args>
     689              :     struct __function_guide_helper<
     690              :       _Res (_Tp::*) (_Args...) const noexcept(_Nx)
     691              :     >
     692              :     { using type = _Res(_Args...); };
     693              : 
     694              :   template<typename _Res, typename _Tp, bool _Nx, typename... _Args>
     695              :     struct __function_guide_helper<
     696              :       _Res (_Tp::*) (_Args...) const & noexcept(_Nx)
     697              :     >
     698              :     { using type = _Res(_Args...); };
     699              : 
     700              : #if __cpp_explicit_this_parameter >= 202110L
     701              :   template<typename _Res, typename _Tp, bool _Nx, typename... _Args>
     702              :     struct __function_guide_helper<_Res (*) (_Tp, _Args...) noexcept(_Nx)>
     703              :     { using type = _Res(_Args...); };
     704              : #endif
     705              : 
     706              : #if __cpp_static_call_operator >= 202207L && __cpp_concepts >= 202002L
     707              :   template<typename _StaticCallOp>
     708              :     struct __function_guide_static_helper
     709              :     { };
     710              : 
     711              :   template<typename _Res, bool _Nx, typename... _Args>
     712              :     struct __function_guide_static_helper<_Res (*) (_Args...) noexcept(_Nx)>
     713              :     { using type = _Res(_Args...); };
     714              : 
     715              :   template<typename _Fn, typename _Op>
     716              :     using __function_guide_t = typename __conditional_t<
     717              :       requires (_Fn& __f) { (void) __f.operator(); },
     718              :       __function_guide_static_helper<_Op>,
     719              :       __function_guide_helper<_Op>>::type;
     720              : #else
     721              :   template<typename _Fn, typename _Op>
     722              :     using __function_guide_t = typename __function_guide_helper<_Op>::type;
     723              : #endif
     724              : 
     725              :   template<typename _Res, typename... _ArgTypes>
     726              :     function(_Res(*)(_ArgTypes...)) -> function<_Res(_ArgTypes...)>;
     727              : 
     728              :   template<typename _Fn, typename _Signature
     729              :          = __function_guide_t<_Fn, decltype(&_Fn::operator())>>
     730              :     function(_Fn) -> function<_Signature>;
     731              : #endif
     732              : 
     733              :   // [20.7.15.2.6] null pointer comparisons
     734              : 
     735              :   /**
     736              :    *  @brief Test whether a polymorphic function object wrapper is empty.
     737              :    *  @returns `true` if the wrapper has no target, `false` otherwise
     738              :    *
     739              :    *  This function will not throw exceptions.
     740              :    */
     741              :   template<typename _Res, typename... _Args>
     742              :     inline bool
     743              :     operator==(const function<_Res(_Args...)>& __f, nullptr_t) noexcept
     744              :     { return !static_cast<bool>(__f); }
     745              : 
     746              : #if __cpp_impl_three_way_comparison < 201907L
     747              :   /// @overload
     748              :   template<typename _Res, typename... _Args>
     749              :     inline bool
     750              :     operator==(nullptr_t, const function<_Res(_Args...)>& __f) noexcept
     751              :     { return !static_cast<bool>(__f); }
     752              : 
     753              :   /**
     754              :    *  @brief Test whether a polymorphic function object wrapper is non-empty.
     755              :    *  @returns `false` if the wrapper has no target, `true` otherwise
     756              :    *
     757              :    *  This function will not throw exceptions.
     758              :    */
     759              :   template<typename _Res, typename... _Args>
     760              :     inline bool
     761              :     operator!=(const function<_Res(_Args...)>& __f, nullptr_t) noexcept
     762              :     { return static_cast<bool>(__f); }
     763              : 
     764              :   /// @overload
     765              :   template<typename _Res, typename... _Args>
     766              :     inline bool
     767              :     operator!=(nullptr_t, const function<_Res(_Args...)>& __f) noexcept
     768              :     { return static_cast<bool>(__f); }
     769              : #endif
     770              : 
     771              :   // [20.7.15.2.7] specialized algorithms
     772              : 
     773              :   /**
     774              :    *  @brief Swap the targets of two polymorphic function object wrappers.
     775              :    *
     776              :    *  This function will not throw exceptions.
     777              :    */
     778              :   // _GLIBCXX_RESOLVE_LIB_DEFECTS
     779              :   // 2062. Effect contradictions w/o no-throw guarantee of std::function swaps
     780              :   template<typename _Res, typename... _Args>
     781              :     inline void
     782              :     swap(function<_Res(_Args...)>& __x, function<_Res(_Args...)>& __y) noexcept
     783              :     { __x.swap(__y); }
     784              : 
     785              : #if __cplusplus >= 201703L
     786              :   namespace __detail::__variant
     787              :   {
     788              :     template<typename> struct _Never_valueless_alt; // see <variant>
     789              : 
     790              :     // Provide the strong exception-safety guarantee when emplacing a
     791              :     // function into a variant.
     792              :     template<typename _Signature>
     793              :       struct _Never_valueless_alt<std::function<_Signature>>
     794              :       : std::true_type
     795              :       { };
     796              :   }  // namespace __detail::__variant
     797              : #endif // C++17
     798              : 
     799              : _GLIBCXX_END_NAMESPACE_VERSION
     800              : } // namespace std
     801              : 
     802              : #endif // C++11
     803              : #endif // _GLIBCXX_STD_FUNCTION_H
        

Generated by: LCOV version 2.0-1