xref: /freebsd/contrib/llvm-project/libcxx/include/any (revision 06c3fb2749bda94cb5201f81ffdb8fa6c3161b2e)
10b57cec5SDimitry Andric// -*- C++ -*-
2349cc55cSDimitry Andric//===----------------------------------------------------------------------===//
30b57cec5SDimitry Andric//
40b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
50b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
60b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
70b57cec5SDimitry Andric//
80b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
90b57cec5SDimitry Andric
100b57cec5SDimitry Andric#ifndef _LIBCPP_ANY
110b57cec5SDimitry Andric#define _LIBCPP_ANY
120b57cec5SDimitry Andric
130b57cec5SDimitry Andric/*
140b57cec5SDimitry Andric   any synopsis
150b57cec5SDimitry Andric
160b57cec5SDimitry Andricnamespace std {
170b57cec5SDimitry Andric
180b57cec5SDimitry Andric  class bad_any_cast : public bad_cast
190b57cec5SDimitry Andric  {
200b57cec5SDimitry Andric  public:
210b57cec5SDimitry Andric    virtual const char* what() const noexcept;
220b57cec5SDimitry Andric  };
230b57cec5SDimitry Andric
240b57cec5SDimitry Andric  class any
250b57cec5SDimitry Andric  {
260b57cec5SDimitry Andric  public:
270b57cec5SDimitry Andric
280b57cec5SDimitry Andric    // 6.3.1 any construct/destruct
290b57cec5SDimitry Andric    any() noexcept;
300b57cec5SDimitry Andric
310b57cec5SDimitry Andric    any(const any& other);
320b57cec5SDimitry Andric    any(any&& other) noexcept;
330b57cec5SDimitry Andric
340b57cec5SDimitry Andric    template <class ValueType>
350b57cec5SDimitry Andric      any(ValueType&& value);
360b57cec5SDimitry Andric
370b57cec5SDimitry Andric    ~any();
380b57cec5SDimitry Andric
390b57cec5SDimitry Andric    // 6.3.2 any assignments
400b57cec5SDimitry Andric    any& operator=(const any& rhs);
410b57cec5SDimitry Andric    any& operator=(any&& rhs) noexcept;
420b57cec5SDimitry Andric
430b57cec5SDimitry Andric    template <class ValueType>
440b57cec5SDimitry Andric      any& operator=(ValueType&& rhs);
450b57cec5SDimitry Andric
460b57cec5SDimitry Andric    // 6.3.3 any modifiers
470b57cec5SDimitry Andric    template <class ValueType, class... Args>
480b57cec5SDimitry Andric      decay_t<ValueType>& emplace(Args&&... args);
490b57cec5SDimitry Andric    template <class ValueType, class U, class... Args>
500b57cec5SDimitry Andric      decay_t<ValueType>& emplace(initializer_list<U>, Args&&...);
510b57cec5SDimitry Andric    void reset() noexcept;
520b57cec5SDimitry Andric    void swap(any& rhs) noexcept;
530b57cec5SDimitry Andric
540b57cec5SDimitry Andric    // 6.3.4 any observers
550b57cec5SDimitry Andric    bool has_value() const noexcept;
560b57cec5SDimitry Andric    const type_info& type() const noexcept;
570b57cec5SDimitry Andric  };
580b57cec5SDimitry Andric
590b57cec5SDimitry Andric   // 6.4 Non-member functions
600b57cec5SDimitry Andric  void swap(any& x, any& y) noexcept;
610b57cec5SDimitry Andric
620b57cec5SDimitry Andric  template <class T, class ...Args>
630b57cec5SDimitry Andric    any make_any(Args&& ...args);
640b57cec5SDimitry Andric  template <class T, class U, class ...Args>
650b57cec5SDimitry Andric    any make_any(initializer_list<U>, Args&& ...args);
660b57cec5SDimitry Andric
670b57cec5SDimitry Andric  template<class ValueType>
680b57cec5SDimitry Andric    ValueType any_cast(const any& operand);
690b57cec5SDimitry Andric  template<class ValueType>
700b57cec5SDimitry Andric    ValueType any_cast(any& operand);
710b57cec5SDimitry Andric  template<class ValueType>
720b57cec5SDimitry Andric    ValueType any_cast(any&& operand);
730b57cec5SDimitry Andric
740b57cec5SDimitry Andric  template<class ValueType>
750b57cec5SDimitry Andric    const ValueType* any_cast(const any* operand) noexcept;
760b57cec5SDimitry Andric  template<class ValueType>
770b57cec5SDimitry Andric    ValueType* any_cast(any* operand) noexcept;
780b57cec5SDimitry Andric
790b57cec5SDimitry Andric} // namespace std
800b57cec5SDimitry Andric
810b57cec5SDimitry Andric*/
820b57cec5SDimitry Andric
8381ad6265SDimitry Andric#include <__assert> // all public C++ headers provide the assertion handler
84e8d8bef9SDimitry Andric#include <__availability>
85fe6060f1SDimitry Andric#include <__config>
86bdd1243dSDimitry Andric#include <__memory/allocator.h>
87bdd1243dSDimitry Andric#include <__memory/allocator_destructor.h>
88bdd1243dSDimitry Andric#include <__memory/allocator_traits.h>
89bdd1243dSDimitry Andric#include <__memory/unique_ptr.h>
90*06c3fb27SDimitry Andric#include <__type_traits/add_const.h>
91*06c3fb27SDimitry Andric#include <__type_traits/add_pointer.h>
92*06c3fb27SDimitry Andric#include <__type_traits/aligned_storage.h>
93*06c3fb27SDimitry Andric#include <__type_traits/alignment_of.h>
94*06c3fb27SDimitry Andric#include <__type_traits/conditional.h>
95*06c3fb27SDimitry Andric#include <__type_traits/decay.h>
96*06c3fb27SDimitry Andric#include <__type_traits/is_constructible.h>
97*06c3fb27SDimitry Andric#include <__type_traits/is_copy_constructible.h>
98*06c3fb27SDimitry Andric#include <__type_traits/is_function.h>
99*06c3fb27SDimitry Andric#include <__type_traits/is_nothrow_move_constructible.h>
100*06c3fb27SDimitry Andric#include <__type_traits/is_reference.h>
101*06c3fb27SDimitry Andric#include <__type_traits/is_same.h>
102*06c3fb27SDimitry Andric#include <__type_traits/remove_cv.h>
103*06c3fb27SDimitry Andric#include <__type_traits/remove_cvref.h>
104*06c3fb27SDimitry Andric#include <__type_traits/remove_reference.h>
105fe6060f1SDimitry Andric#include <__utility/forward.h>
10681ad6265SDimitry Andric#include <__utility/in_place.h>
10781ad6265SDimitry Andric#include <__utility/move.h>
10881ad6265SDimitry Andric#include <__utility/unreachable.h>
109*06c3fb27SDimitry Andric#include <__verbose_abort>
11081ad6265SDimitry Andric#include <initializer_list>
111fe6060f1SDimitry Andric#include <typeinfo>
1120b57cec5SDimitry Andric#include <version>
1130b57cec5SDimitry Andric
1140b57cec5SDimitry Andric#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
1150b57cec5SDimitry Andric#  pragma GCC system_header
1160b57cec5SDimitry Andric#endif
1170b57cec5SDimitry Andric
118*06c3fb27SDimitry Andric_LIBCPP_PUSH_MACROS
119*06c3fb27SDimitry Andric#include <__undef_macros>
120*06c3fb27SDimitry Andric
1210b57cec5SDimitry Andricnamespace std {
122*06c3fb27SDimitry Andricclass _LIBCPP_EXPORTED_FROM_ABI _LIBCPP_AVAILABILITY_BAD_ANY_CAST bad_any_cast : public bad_cast
1230b57cec5SDimitry Andric{
1240b57cec5SDimitry Andricpublic:
125bdd1243dSDimitry Andric    const char* what() const _NOEXCEPT override;
1260b57cec5SDimitry Andric};
1270b57cec5SDimitry Andric} // namespace std
1280b57cec5SDimitry Andric
1290b57cec5SDimitry Andric_LIBCPP_BEGIN_NAMESPACE_STD
1300b57cec5SDimitry Andric
131*06c3fb27SDimitry Andric#if _LIBCPP_STD_VER >= 17
1320b57cec5SDimitry Andric
1330b57cec5SDimitry Andric_LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY
1340b57cec5SDimitry Andric_LIBCPP_AVAILABILITY_THROW_BAD_ANY_CAST
1350b57cec5SDimitry Andricvoid __throw_bad_any_cast()
1360b57cec5SDimitry Andric{
137*06c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
1380b57cec5SDimitry Andric    throw bad_any_cast();
1390b57cec5SDimitry Andric#else
140*06c3fb27SDimitry Andric    _LIBCPP_VERBOSE_ABORT("bad_any_cast was thrown in -fno-exceptions mode");
1410b57cec5SDimitry Andric#endif
1420b57cec5SDimitry Andric}
1430b57cec5SDimitry Andric
1440b57cec5SDimitry Andric// Forward declarations
1450b57cec5SDimitry Andricclass _LIBCPP_TEMPLATE_VIS any;
1460b57cec5SDimitry Andric
1470b57cec5SDimitry Andrictemplate <class _ValueType>
1480b57cec5SDimitry Andric_LIBCPP_INLINE_VISIBILITY
1490b57cec5SDimitry Andricadd_pointer_t<add_const_t<_ValueType>>
1500b57cec5SDimitry Andricany_cast(any const *) _NOEXCEPT;
1510b57cec5SDimitry Andric
1520b57cec5SDimitry Andrictemplate <class _ValueType>
1530b57cec5SDimitry Andric_LIBCPP_INLINE_VISIBILITY
1540b57cec5SDimitry Andricadd_pointer_t<_ValueType> any_cast(any *) _NOEXCEPT;
1550b57cec5SDimitry Andric
1560b57cec5SDimitry Andricnamespace __any_imp
1570b57cec5SDimitry Andric{
158bdd1243dSDimitry Andric  _LIBCPP_SUPPRESS_DEPRECATED_PUSH
1590b57cec5SDimitry Andric  using _Buffer = aligned_storage_t<3*sizeof(void*), alignment_of<void*>::value>;
160bdd1243dSDimitry Andric  _LIBCPP_SUPPRESS_DEPRECATED_POP
1610b57cec5SDimitry Andric
1620b57cec5SDimitry Andric  template <class _Tp>
1630b57cec5SDimitry Andric  using _IsSmallObject = integral_constant<bool
1640b57cec5SDimitry Andric        , sizeof(_Tp) <= sizeof(_Buffer)
1650b57cec5SDimitry Andric          && alignment_of<_Buffer>::value
1660b57cec5SDimitry Andric             % alignment_of<_Tp>::value == 0
1670b57cec5SDimitry Andric          && is_nothrow_move_constructible<_Tp>::value
1680b57cec5SDimitry Andric        >;
1690b57cec5SDimitry Andric
1700b57cec5SDimitry Andric  enum class _Action {
1710b57cec5SDimitry Andric    _Destroy,
1720b57cec5SDimitry Andric    _Copy,
1730b57cec5SDimitry Andric    _Move,
1740b57cec5SDimitry Andric    _Get,
1750b57cec5SDimitry Andric    _TypeInfo
1760b57cec5SDimitry Andric  };
1770b57cec5SDimitry Andric
1780b57cec5SDimitry Andric  template <class _Tp> struct _SmallHandler;
1790b57cec5SDimitry Andric  template <class _Tp> struct _LargeHandler;
1800b57cec5SDimitry Andric
1810b57cec5SDimitry Andric  template <class _Tp>
1820b57cec5SDimitry Andric  struct  _LIBCPP_TEMPLATE_VIS __unique_typeinfo { static constexpr int __id = 0; };
1830b57cec5SDimitry Andric  template <class _Tp> constexpr int __unique_typeinfo<_Tp>::__id;
1840b57cec5SDimitry Andric
1850b57cec5SDimitry Andric  template <class _Tp>
1860b57cec5SDimitry Andric  inline _LIBCPP_INLINE_VISIBILITY
1870b57cec5SDimitry Andric  constexpr const void* __get_fallback_typeid() {
188e8d8bef9SDimitry Andric      return &__unique_typeinfo<remove_cv_t<remove_reference_t<_Tp>>>::__id;
1890b57cec5SDimitry Andric  }
1900b57cec5SDimitry Andric
1910b57cec5SDimitry Andric  template <class _Tp>
1920b57cec5SDimitry Andric  inline _LIBCPP_INLINE_VISIBILITY
1930b57cec5SDimitry Andric  bool __compare_typeid(type_info const* __id, const void* __fallback_id)
1940b57cec5SDimitry Andric  {
1951ac55f4cSDimitry Andric#if !defined(_LIBCPP_HAS_NO_RTTI)
1960b57cec5SDimitry Andric      if (__id && *__id == typeid(_Tp))
1970b57cec5SDimitry Andric          return true;
1980b57cec5SDimitry Andric#endif
1990b57cec5SDimitry Andric      if (!__id && __fallback_id == __any_imp::__get_fallback_typeid<_Tp>())
2000b57cec5SDimitry Andric          return true;
2010b57cec5SDimitry Andric      return false;
2020b57cec5SDimitry Andric  }
2030b57cec5SDimitry Andric
2040b57cec5SDimitry Andric  template <class _Tp>
2050b57cec5SDimitry Andric  using _Handler = conditional_t<
2060b57cec5SDimitry Andric    _IsSmallObject<_Tp>::value, _SmallHandler<_Tp>, _LargeHandler<_Tp>>;
2070b57cec5SDimitry Andric
2080b57cec5SDimitry Andric} // namespace __any_imp
2090b57cec5SDimitry Andric
2100b57cec5SDimitry Andricclass _LIBCPP_TEMPLATE_VIS any
2110b57cec5SDimitry Andric{
2120b57cec5SDimitry Andricpublic:
2130b57cec5SDimitry Andric  // construct/destruct
2140b57cec5SDimitry Andric  _LIBCPP_INLINE_VISIBILITY
215bdd1243dSDimitry Andric  constexpr any() _NOEXCEPT : __h_(nullptr) {}
2160b57cec5SDimitry Andric
2170b57cec5SDimitry Andric  _LIBCPP_INLINE_VISIBILITY
218bdd1243dSDimitry Andric  any(any const & __other) : __h_(nullptr)
2190b57cec5SDimitry Andric  {
220bdd1243dSDimitry Andric    if (__other.__h_) __other.__call(_Action::_Copy, this);
2210b57cec5SDimitry Andric  }
2220b57cec5SDimitry Andric
2230b57cec5SDimitry Andric  _LIBCPP_INLINE_VISIBILITY
224bdd1243dSDimitry Andric  any(any && __other) _NOEXCEPT : __h_(nullptr)
2250b57cec5SDimitry Andric  {
226bdd1243dSDimitry Andric    if (__other.__h_) __other.__call(_Action::_Move, this);
2270b57cec5SDimitry Andric  }
2280b57cec5SDimitry Andric
2290b57cec5SDimitry Andric  template <
2300b57cec5SDimitry Andric      class _ValueType
2310b57cec5SDimitry Andric    , class _Tp = decay_t<_ValueType>
2320b57cec5SDimitry Andric    , class = enable_if_t<
2330b57cec5SDimitry Andric        !is_same<_Tp, any>::value &&
2340b57cec5SDimitry Andric        !__is_inplace_type<_ValueType>::value &&
2350b57cec5SDimitry Andric        is_copy_constructible<_Tp>::value>
2360b57cec5SDimitry Andric    >
2370b57cec5SDimitry Andric  _LIBCPP_INLINE_VISIBILITY
2380b57cec5SDimitry Andric  any(_ValueType && __value);
2390b57cec5SDimitry Andric
2400b57cec5SDimitry Andric  template <class _ValueType, class ..._Args,
2410b57cec5SDimitry Andric    class _Tp = decay_t<_ValueType>,
2420b57cec5SDimitry Andric    class = enable_if_t<
2430b57cec5SDimitry Andric        is_constructible<_Tp, _Args...>::value &&
2440b57cec5SDimitry Andric        is_copy_constructible<_Tp>::value
2450b57cec5SDimitry Andric    >
2460b57cec5SDimitry Andric  >
2470b57cec5SDimitry Andric  _LIBCPP_INLINE_VISIBILITY
2480b57cec5SDimitry Andric  explicit any(in_place_type_t<_ValueType>, _Args&&... __args);
2490b57cec5SDimitry Andric
2500b57cec5SDimitry Andric  template <class _ValueType, class _Up, class ..._Args,
2510b57cec5SDimitry Andric    class _Tp = decay_t<_ValueType>,
2520b57cec5SDimitry Andric    class = enable_if_t<
2530b57cec5SDimitry Andric        is_constructible<_Tp, initializer_list<_Up>&, _Args...>::value &&
2540b57cec5SDimitry Andric        is_copy_constructible<_Tp>::value>
2550b57cec5SDimitry Andric  >
2560b57cec5SDimitry Andric  _LIBCPP_INLINE_VISIBILITY
2570b57cec5SDimitry Andric  explicit any(in_place_type_t<_ValueType>, initializer_list<_Up>, _Args&&... __args);
2580b57cec5SDimitry Andric
2590b57cec5SDimitry Andric  _LIBCPP_INLINE_VISIBILITY
2600b57cec5SDimitry Andric  ~any() { this->reset(); }
2610b57cec5SDimitry Andric
2620b57cec5SDimitry Andric  // assignments
2630b57cec5SDimitry Andric  _LIBCPP_INLINE_VISIBILITY
2640b57cec5SDimitry Andric  any & operator=(any const & __rhs) {
2650b57cec5SDimitry Andric    any(__rhs).swap(*this);
2660b57cec5SDimitry Andric    return *this;
2670b57cec5SDimitry Andric  }
2680b57cec5SDimitry Andric
2690b57cec5SDimitry Andric  _LIBCPP_INLINE_VISIBILITY
2700b57cec5SDimitry Andric  any & operator=(any && __rhs) _NOEXCEPT {
2710b57cec5SDimitry Andric    any(_VSTD::move(__rhs)).swap(*this);
2720b57cec5SDimitry Andric    return *this;
2730b57cec5SDimitry Andric  }
2740b57cec5SDimitry Andric
2750b57cec5SDimitry Andric  template <
2760b57cec5SDimitry Andric      class _ValueType
2770b57cec5SDimitry Andric    , class _Tp = decay_t<_ValueType>
2780b57cec5SDimitry Andric    , class = enable_if_t<
2790b57cec5SDimitry Andric          !is_same<_Tp, any>::value
2800b57cec5SDimitry Andric          && is_copy_constructible<_Tp>::value>
2810b57cec5SDimitry Andric    >
2820b57cec5SDimitry Andric  _LIBCPP_INLINE_VISIBILITY
2830b57cec5SDimitry Andric  any & operator=(_ValueType && __rhs);
2840b57cec5SDimitry Andric
2850b57cec5SDimitry Andric  template <class _ValueType, class ..._Args,
2860b57cec5SDimitry Andric    class _Tp = decay_t<_ValueType>,
2870b57cec5SDimitry Andric    class = enable_if_t<
2880b57cec5SDimitry Andric        is_constructible<_Tp, _Args...>::value &&
2890b57cec5SDimitry Andric        is_copy_constructible<_Tp>::value>
2900b57cec5SDimitry Andric    >
2910b57cec5SDimitry Andric  _LIBCPP_INLINE_VISIBILITY
292753f127fSDimitry Andric  _Tp& emplace(_Args&&...);
2930b57cec5SDimitry Andric
2940b57cec5SDimitry Andric  template <class _ValueType, class _Up, class ..._Args,
2950b57cec5SDimitry Andric    class _Tp = decay_t<_ValueType>,
2960b57cec5SDimitry Andric    class = enable_if_t<
2970b57cec5SDimitry Andric        is_constructible<_Tp, initializer_list<_Up>&, _Args...>::value &&
2980b57cec5SDimitry Andric        is_copy_constructible<_Tp>::value>
2990b57cec5SDimitry Andric  >
3000b57cec5SDimitry Andric  _LIBCPP_INLINE_VISIBILITY
3010b57cec5SDimitry Andric  _Tp& emplace(initializer_list<_Up>, _Args&&...);
3020b57cec5SDimitry Andric
3030b57cec5SDimitry Andric  // 6.3.3 any modifiers
3040b57cec5SDimitry Andric  _LIBCPP_INLINE_VISIBILITY
305bdd1243dSDimitry Andric  void reset() _NOEXCEPT { if (__h_) this->__call(_Action::_Destroy); }
3060b57cec5SDimitry Andric
3070b57cec5SDimitry Andric  _LIBCPP_INLINE_VISIBILITY
3080b57cec5SDimitry Andric  void swap(any & __rhs) _NOEXCEPT;
3090b57cec5SDimitry Andric
3100b57cec5SDimitry Andric  // 6.3.4 any observers
3110b57cec5SDimitry Andric  _LIBCPP_INLINE_VISIBILITY
312bdd1243dSDimitry Andric  bool has_value() const _NOEXCEPT { return __h_ != nullptr; }
3130b57cec5SDimitry Andric
3141ac55f4cSDimitry Andric#if !defined(_LIBCPP_HAS_NO_RTTI)
3150b57cec5SDimitry Andric  _LIBCPP_INLINE_VISIBILITY
3160b57cec5SDimitry Andric  const type_info & type() const _NOEXCEPT {
317bdd1243dSDimitry Andric    if (__h_) {
3180b57cec5SDimitry Andric        return *static_cast<type_info const *>(this->__call(_Action::_TypeInfo));
3190b57cec5SDimitry Andric    } else {
3200b57cec5SDimitry Andric        return typeid(void);
3210b57cec5SDimitry Andric    }
3220b57cec5SDimitry Andric  }
3230b57cec5SDimitry Andric#endif
3240b57cec5SDimitry Andric
3250b57cec5SDimitry Andricprivate:
3260b57cec5SDimitry Andric    typedef __any_imp::_Action _Action;
3270b57cec5SDimitry Andric    using _HandleFuncPtr =  void* (*)(_Action, any const *, any *, const type_info *,
3280b57cec5SDimitry Andric      const void* __fallback_info);
3290b57cec5SDimitry Andric
3300b57cec5SDimitry Andric    union _Storage {
331*06c3fb27SDimitry Andric        _LIBCPP_HIDE_FROM_ABI constexpr _Storage() : __ptr(nullptr) {}
3320b57cec5SDimitry Andric        void *  __ptr;
3330b57cec5SDimitry Andric        __any_imp::_Buffer __buf;
3340b57cec5SDimitry Andric    };
3350b57cec5SDimitry Andric
3360b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
3370b57cec5SDimitry Andric    void * __call(_Action __a, any * __other = nullptr,
3380b57cec5SDimitry Andric                  type_info const * __info = nullptr,
3390b57cec5SDimitry Andric                   const void* __fallback_info = nullptr) const
3400b57cec5SDimitry Andric    {
341bdd1243dSDimitry Andric        return __h_(__a, this, __other, __info, __fallback_info);
3420b57cec5SDimitry Andric    }
3430b57cec5SDimitry Andric
3440b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
3450b57cec5SDimitry Andric    void * __call(_Action __a, any * __other = nullptr,
3460b57cec5SDimitry Andric                  type_info const * __info = nullptr,
3470b57cec5SDimitry Andric                  const void* __fallback_info = nullptr)
3480b57cec5SDimitry Andric    {
349bdd1243dSDimitry Andric        return __h_(__a, this, __other, __info, __fallback_info);
3500b57cec5SDimitry Andric    }
3510b57cec5SDimitry Andric
3520b57cec5SDimitry Andric    template <class>
3530b57cec5SDimitry Andric    friend struct __any_imp::_SmallHandler;
3540b57cec5SDimitry Andric    template <class>
3550b57cec5SDimitry Andric    friend struct __any_imp::_LargeHandler;
3560b57cec5SDimitry Andric
3570b57cec5SDimitry Andric    template <class _ValueType>
3580b57cec5SDimitry Andric    friend add_pointer_t<add_const_t<_ValueType>>
3590b57cec5SDimitry Andric    any_cast(any const *) _NOEXCEPT;
3600b57cec5SDimitry Andric
3610b57cec5SDimitry Andric    template <class _ValueType>
3620b57cec5SDimitry Andric    friend add_pointer_t<_ValueType>
3630b57cec5SDimitry Andric    any_cast(any *) _NOEXCEPT;
3640b57cec5SDimitry Andric
365bdd1243dSDimitry Andric    _HandleFuncPtr __h_ = nullptr;
366bdd1243dSDimitry Andric    _Storage __s_;
3670b57cec5SDimitry Andric};
3680b57cec5SDimitry Andric
3690b57cec5SDimitry Andricnamespace __any_imp
3700b57cec5SDimitry Andric{
3710b57cec5SDimitry Andric  template <class _Tp>
3720b57cec5SDimitry Andric  struct _LIBCPP_TEMPLATE_VIS _SmallHandler
3730b57cec5SDimitry Andric  {
3740b57cec5SDimitry Andric     _LIBCPP_INLINE_VISIBILITY
3750b57cec5SDimitry Andric     static void* __handle(_Action __act, any const * __this, any * __other,
3760b57cec5SDimitry Andric                           type_info const * __info, const void* __fallback_info)
3770b57cec5SDimitry Andric     {
3780b57cec5SDimitry Andric        switch (__act)
3790b57cec5SDimitry Andric        {
3800b57cec5SDimitry Andric        case _Action::_Destroy:
3810b57cec5SDimitry Andric          __destroy(const_cast<any &>(*__this));
3820b57cec5SDimitry Andric          return nullptr;
3830b57cec5SDimitry Andric        case _Action::_Copy:
3840b57cec5SDimitry Andric            __copy(*__this, *__other);
3850b57cec5SDimitry Andric            return nullptr;
3860b57cec5SDimitry Andric        case _Action::_Move:
3870b57cec5SDimitry Andric          __move(const_cast<any &>(*__this), *__other);
3880b57cec5SDimitry Andric          return nullptr;
3890b57cec5SDimitry Andric        case _Action::_Get:
3900b57cec5SDimitry Andric            return __get(const_cast<any &>(*__this), __info, __fallback_info);
3910b57cec5SDimitry Andric        case _Action::_TypeInfo:
3920b57cec5SDimitry Andric          return __type_info();
3930b57cec5SDimitry Andric        }
39481ad6265SDimitry Andric        __libcpp_unreachable();
3950b57cec5SDimitry Andric    }
3960b57cec5SDimitry Andric
3970b57cec5SDimitry Andric    template <class ..._Args>
3980b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
3990b57cec5SDimitry Andric    static _Tp& __create(any & __dest, _Args&&... __args) {
400e8d8bef9SDimitry Andric        typedef allocator<_Tp> _Alloc;
401e8d8bef9SDimitry Andric        typedef allocator_traits<_Alloc> _ATraits;
402e8d8bef9SDimitry Andric        _Alloc __a;
403bdd1243dSDimitry Andric        _Tp * __ret = static_cast<_Tp*>(static_cast<void*>(&__dest.__s_.__buf));
404e8d8bef9SDimitry Andric        _ATraits::construct(__a, __ret, _VSTD::forward<_Args>(__args)...);
405bdd1243dSDimitry Andric        __dest.__h_ = &_SmallHandler::__handle;
4060b57cec5SDimitry Andric        return *__ret;
4070b57cec5SDimitry Andric    }
4080b57cec5SDimitry Andric
4090b57cec5SDimitry Andric  private:
4100b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
4110b57cec5SDimitry Andric    static void __destroy(any & __this) {
412e8d8bef9SDimitry Andric        typedef allocator<_Tp> _Alloc;
413e8d8bef9SDimitry Andric        typedef allocator_traits<_Alloc> _ATraits;
414e8d8bef9SDimitry Andric        _Alloc __a;
415bdd1243dSDimitry Andric        _Tp * __p = static_cast<_Tp *>(static_cast<void*>(&__this.__s_.__buf));
416e8d8bef9SDimitry Andric        _ATraits::destroy(__a, __p);
417bdd1243dSDimitry Andric        __this.__h_ = nullptr;
4180b57cec5SDimitry Andric    }
4190b57cec5SDimitry Andric
4200b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
4210b57cec5SDimitry Andric    static void __copy(any const & __this, any & __dest) {
4220b57cec5SDimitry Andric        _SmallHandler::__create(__dest, *static_cast<_Tp const *>(
423bdd1243dSDimitry Andric            static_cast<void const *>(&__this.__s_.__buf)));
4240b57cec5SDimitry Andric    }
4250b57cec5SDimitry Andric
4260b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
4270b57cec5SDimitry Andric    static void __move(any & __this, any & __dest) {
4280b57cec5SDimitry Andric        _SmallHandler::__create(__dest, _VSTD::move(
429bdd1243dSDimitry Andric            *static_cast<_Tp*>(static_cast<void*>(&__this.__s_.__buf))));
4300b57cec5SDimitry Andric        __destroy(__this);
4310b57cec5SDimitry Andric    }
4320b57cec5SDimitry Andric
4330b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
4340b57cec5SDimitry Andric    static void* __get(any & __this,
4350b57cec5SDimitry Andric                       type_info const * __info,
4360b57cec5SDimitry Andric                       const void* __fallback_id)
4370b57cec5SDimitry Andric    {
4380b57cec5SDimitry Andric        if (__any_imp::__compare_typeid<_Tp>(__info, __fallback_id))
439bdd1243dSDimitry Andric            return static_cast<void*>(&__this.__s_.__buf);
4400b57cec5SDimitry Andric        return nullptr;
4410b57cec5SDimitry Andric    }
4420b57cec5SDimitry Andric
4430b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
4440b57cec5SDimitry Andric    static void* __type_info()
4450b57cec5SDimitry Andric    {
4461ac55f4cSDimitry Andric#if !defined(_LIBCPP_HAS_NO_RTTI)
4470b57cec5SDimitry Andric        return const_cast<void*>(static_cast<void const *>(&typeid(_Tp)));
4480b57cec5SDimitry Andric#else
4490b57cec5SDimitry Andric        return nullptr;
4500b57cec5SDimitry Andric#endif
4510b57cec5SDimitry Andric    }
4520b57cec5SDimitry Andric  };
4530b57cec5SDimitry Andric
4540b57cec5SDimitry Andric  template <class _Tp>
4550b57cec5SDimitry Andric  struct _LIBCPP_TEMPLATE_VIS _LargeHandler
4560b57cec5SDimitry Andric  {
4570b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
4580b57cec5SDimitry Andric    static void* __handle(_Action __act, any const * __this,
4590b57cec5SDimitry Andric                          any * __other, type_info const * __info,
4600b57cec5SDimitry Andric                          void const* __fallback_info)
4610b57cec5SDimitry Andric    {
4620b57cec5SDimitry Andric        switch (__act)
4630b57cec5SDimitry Andric        {
4640b57cec5SDimitry Andric        case _Action::_Destroy:
4650b57cec5SDimitry Andric          __destroy(const_cast<any &>(*__this));
4660b57cec5SDimitry Andric          return nullptr;
4670b57cec5SDimitry Andric        case _Action::_Copy:
4680b57cec5SDimitry Andric          __copy(*__this, *__other);
4690b57cec5SDimitry Andric          return nullptr;
4700b57cec5SDimitry Andric        case _Action::_Move:
4710b57cec5SDimitry Andric          __move(const_cast<any &>(*__this), *__other);
4720b57cec5SDimitry Andric          return nullptr;
4730b57cec5SDimitry Andric        case _Action::_Get:
4740b57cec5SDimitry Andric            return __get(const_cast<any &>(*__this), __info, __fallback_info);
4750b57cec5SDimitry Andric        case _Action::_TypeInfo:
4760b57cec5SDimitry Andric          return __type_info();
4770b57cec5SDimitry Andric        }
47881ad6265SDimitry Andric        __libcpp_unreachable();
4790b57cec5SDimitry Andric    }
4800b57cec5SDimitry Andric
4810b57cec5SDimitry Andric    template <class ..._Args>
4820b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
4830b57cec5SDimitry Andric    static _Tp& __create(any & __dest, _Args&&... __args) {
4840b57cec5SDimitry Andric        typedef allocator<_Tp> _Alloc;
485e8d8bef9SDimitry Andric        typedef allocator_traits<_Alloc> _ATraits;
4860b57cec5SDimitry Andric        typedef __allocator_destructor<_Alloc> _Dp;
4870b57cec5SDimitry Andric        _Alloc __a;
488e8d8bef9SDimitry Andric        unique_ptr<_Tp, _Dp> __hold(_ATraits::allocate(__a, 1), _Dp(__a, 1));
489e8d8bef9SDimitry Andric        _Tp * __ret = __hold.get();
490e8d8bef9SDimitry Andric        _ATraits::construct(__a, __ret, _VSTD::forward<_Args>(__args)...);
491bdd1243dSDimitry Andric        __dest.__s_.__ptr = __hold.release();
492bdd1243dSDimitry Andric        __dest.__h_ = &_LargeHandler::__handle;
4930b57cec5SDimitry Andric        return *__ret;
4940b57cec5SDimitry Andric    }
4950b57cec5SDimitry Andric
4960b57cec5SDimitry Andric  private:
4970b57cec5SDimitry Andric
4980b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
4990b57cec5SDimitry Andric    static void __destroy(any & __this){
500e8d8bef9SDimitry Andric        typedef allocator<_Tp> _Alloc;
501e8d8bef9SDimitry Andric        typedef allocator_traits<_Alloc> _ATraits;
502e8d8bef9SDimitry Andric        _Alloc __a;
503bdd1243dSDimitry Andric        _Tp * __p = static_cast<_Tp *>(__this.__s_.__ptr);
504e8d8bef9SDimitry Andric        _ATraits::destroy(__a, __p);
505e8d8bef9SDimitry Andric        _ATraits::deallocate(__a, __p, 1);
506bdd1243dSDimitry Andric        __this.__h_ = nullptr;
5070b57cec5SDimitry Andric    }
5080b57cec5SDimitry Andric
5090b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
5100b57cec5SDimitry Andric    static void __copy(any const & __this, any & __dest) {
511bdd1243dSDimitry Andric        _LargeHandler::__create(__dest, *static_cast<_Tp const *>(__this.__s_.__ptr));
5120b57cec5SDimitry Andric    }
5130b57cec5SDimitry Andric
5140b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
5150b57cec5SDimitry Andric    static void __move(any & __this, any & __dest) {
516bdd1243dSDimitry Andric      __dest.__s_.__ptr = __this.__s_.__ptr;
517bdd1243dSDimitry Andric      __dest.__h_ = &_LargeHandler::__handle;
518bdd1243dSDimitry Andric      __this.__h_ = nullptr;
5190b57cec5SDimitry Andric    }
5200b57cec5SDimitry Andric
5210b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
5220b57cec5SDimitry Andric    static void* __get(any & __this, type_info const * __info,
5230b57cec5SDimitry Andric                       void const* __fallback_info)
5240b57cec5SDimitry Andric    {
5250b57cec5SDimitry Andric        if (__any_imp::__compare_typeid<_Tp>(__info, __fallback_info))
526bdd1243dSDimitry Andric            return static_cast<void*>(__this.__s_.__ptr);
5270b57cec5SDimitry Andric        return nullptr;
5280b57cec5SDimitry Andric
5290b57cec5SDimitry Andric    }
5300b57cec5SDimitry Andric
5310b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
5320b57cec5SDimitry Andric    static void* __type_info()
5330b57cec5SDimitry Andric    {
5341ac55f4cSDimitry Andric#if !defined(_LIBCPP_HAS_NO_RTTI)
5350b57cec5SDimitry Andric        return const_cast<void*>(static_cast<void const *>(&typeid(_Tp)));
5360b57cec5SDimitry Andric#else
5370b57cec5SDimitry Andric        return nullptr;
5380b57cec5SDimitry Andric#endif
5390b57cec5SDimitry Andric    }
5400b57cec5SDimitry Andric  };
5410b57cec5SDimitry Andric
5420b57cec5SDimitry Andric} // namespace __any_imp
5430b57cec5SDimitry Andric
5440b57cec5SDimitry Andric
5450b57cec5SDimitry Andrictemplate <class _ValueType, class _Tp, class>
546bdd1243dSDimitry Andricany::any(_ValueType && __v) : __h_(nullptr)
5470b57cec5SDimitry Andric{
5480b57cec5SDimitry Andric  __any_imp::_Handler<_Tp>::__create(*this, _VSTD::forward<_ValueType>(__v));
5490b57cec5SDimitry Andric}
5500b57cec5SDimitry Andric
5510b57cec5SDimitry Andrictemplate <class _ValueType, class ..._Args, class _Tp, class>
5520b57cec5SDimitry Andricany::any(in_place_type_t<_ValueType>, _Args&&... __args) {
5530b57cec5SDimitry Andric  __any_imp::_Handler<_Tp>::__create(*this, _VSTD::forward<_Args>(__args)...);
5540b57cec5SDimitry Andric}
5550b57cec5SDimitry Andric
5560b57cec5SDimitry Andrictemplate <class _ValueType, class _Up, class ..._Args, class _Tp, class>
5570b57cec5SDimitry Andricany::any(in_place_type_t<_ValueType>, initializer_list<_Up> __il, _Args&&... __args) {
5580b57cec5SDimitry Andric  __any_imp::_Handler<_Tp>::__create(*this, __il, _VSTD::forward<_Args>(__args)...);
5590b57cec5SDimitry Andric}
5600b57cec5SDimitry Andric
5610b57cec5SDimitry Andrictemplate <class _ValueType, class, class>
5620b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
5630b57cec5SDimitry Andricany & any::operator=(_ValueType && __v)
5640b57cec5SDimitry Andric{
5650b57cec5SDimitry Andric  any(_VSTD::forward<_ValueType>(__v)).swap(*this);
5660b57cec5SDimitry Andric  return *this;
5670b57cec5SDimitry Andric}
5680b57cec5SDimitry Andric
5690b57cec5SDimitry Andrictemplate <class _ValueType, class ..._Args, class _Tp, class>
5700b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
5710b57cec5SDimitry Andric_Tp& any::emplace(_Args&&... __args) {
5720b57cec5SDimitry Andric  reset();
5730b57cec5SDimitry Andric  return __any_imp::_Handler<_Tp>::__create(*this, _VSTD::forward<_Args>(__args)...);
5740b57cec5SDimitry Andric}
5750b57cec5SDimitry Andric
5760b57cec5SDimitry Andrictemplate <class _ValueType, class _Up, class ..._Args, class _Tp, class>
5770b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
5780b57cec5SDimitry Andric_Tp& any::emplace(initializer_list<_Up> __il, _Args&&... __args) {
5790b57cec5SDimitry Andric  reset();
5800b57cec5SDimitry Andric  return __any_imp::_Handler<_Tp>::__create(*this, __il, _VSTD::forward<_Args>(__args)...);
5810b57cec5SDimitry Andric}
5820b57cec5SDimitry Andric
5830b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
5840b57cec5SDimitry Andricvoid any::swap(any & __rhs) _NOEXCEPT
5850b57cec5SDimitry Andric{
5860b57cec5SDimitry Andric    if (this == &__rhs)
5870b57cec5SDimitry Andric      return;
588bdd1243dSDimitry Andric    if (__h_ && __rhs.__h_) {
5890b57cec5SDimitry Andric        any __tmp;
5900b57cec5SDimitry Andric        __rhs.__call(_Action::_Move, &__tmp);
5910b57cec5SDimitry Andric        this->__call(_Action::_Move, &__rhs);
5920b57cec5SDimitry Andric        __tmp.__call(_Action::_Move, this);
5930b57cec5SDimitry Andric    }
594bdd1243dSDimitry Andric    else if (__h_) {
5950b57cec5SDimitry Andric        this->__call(_Action::_Move, &__rhs);
5960b57cec5SDimitry Andric    }
597bdd1243dSDimitry Andric    else if (__rhs.__h_) {
5980b57cec5SDimitry Andric        __rhs.__call(_Action::_Move, this);
5990b57cec5SDimitry Andric    }
6000b57cec5SDimitry Andric}
6010b57cec5SDimitry Andric
6020b57cec5SDimitry Andric// 6.4 Non-member functions
6030b57cec5SDimitry Andric
6040b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
6050b57cec5SDimitry Andricvoid swap(any & __lhs, any & __rhs) _NOEXCEPT
6060b57cec5SDimitry Andric{
6070b57cec5SDimitry Andric    __lhs.swap(__rhs);
6080b57cec5SDimitry Andric}
6090b57cec5SDimitry Andric
6100b57cec5SDimitry Andrictemplate <class _Tp, class ..._Args>
6110b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
6120b57cec5SDimitry Andricany make_any(_Args&&... __args) {
6130b57cec5SDimitry Andric    return any(in_place_type<_Tp>, _VSTD::forward<_Args>(__args)...);
6140b57cec5SDimitry Andric}
6150b57cec5SDimitry Andric
6160b57cec5SDimitry Andrictemplate <class _Tp, class _Up, class ..._Args>
6170b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
6180b57cec5SDimitry Andricany make_any(initializer_list<_Up> __il, _Args&&... __args) {
6190b57cec5SDimitry Andric    return any(in_place_type<_Tp>, __il, _VSTD::forward<_Args>(__args)...);
6200b57cec5SDimitry Andric}
6210b57cec5SDimitry Andric
6220b57cec5SDimitry Andrictemplate <class _ValueType>
6230b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
6240b57cec5SDimitry Andric_LIBCPP_AVAILABILITY_THROW_BAD_ANY_CAST
6250b57cec5SDimitry Andric_ValueType any_cast(any const & __v)
6260b57cec5SDimitry Andric{
627bdd1243dSDimitry Andric    using _RawValueType = __remove_cvref_t<_ValueType>;
6280b57cec5SDimitry Andric    static_assert(is_constructible<_ValueType, _RawValueType const &>::value,
6290b57cec5SDimitry Andric                  "ValueType is required to be a const lvalue reference "
6300b57cec5SDimitry Andric                  "or a CopyConstructible type");
6310b57cec5SDimitry Andric    auto __tmp = _VSTD::any_cast<add_const_t<_RawValueType>>(&__v);
6320b57cec5SDimitry Andric    if (__tmp == nullptr)
6330b57cec5SDimitry Andric        __throw_bad_any_cast();
6340b57cec5SDimitry Andric    return static_cast<_ValueType>(*__tmp);
6350b57cec5SDimitry Andric}
6360b57cec5SDimitry Andric
6370b57cec5SDimitry Andrictemplate <class _ValueType>
6380b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
6390b57cec5SDimitry Andric_LIBCPP_AVAILABILITY_THROW_BAD_ANY_CAST
6400b57cec5SDimitry Andric_ValueType any_cast(any & __v)
6410b57cec5SDimitry Andric{
642bdd1243dSDimitry Andric    using _RawValueType = __remove_cvref_t<_ValueType>;
6430b57cec5SDimitry Andric    static_assert(is_constructible<_ValueType, _RawValueType &>::value,
6440b57cec5SDimitry Andric                  "ValueType is required to be an lvalue reference "
6450b57cec5SDimitry Andric                  "or a CopyConstructible type");
6460b57cec5SDimitry Andric    auto __tmp = _VSTD::any_cast<_RawValueType>(&__v);
6470b57cec5SDimitry Andric    if (__tmp == nullptr)
6480b57cec5SDimitry Andric        __throw_bad_any_cast();
6490b57cec5SDimitry Andric    return static_cast<_ValueType>(*__tmp);
6500b57cec5SDimitry Andric}
6510b57cec5SDimitry Andric
6520b57cec5SDimitry Andrictemplate <class _ValueType>
6530b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
6540b57cec5SDimitry Andric_LIBCPP_AVAILABILITY_THROW_BAD_ANY_CAST
6550b57cec5SDimitry Andric_ValueType any_cast(any && __v)
6560b57cec5SDimitry Andric{
657bdd1243dSDimitry Andric    using _RawValueType = __remove_cvref_t<_ValueType>;
6580b57cec5SDimitry Andric    static_assert(is_constructible<_ValueType, _RawValueType>::value,
6590b57cec5SDimitry Andric                  "ValueType is required to be an rvalue reference "
6600b57cec5SDimitry Andric                  "or a CopyConstructible type");
6610b57cec5SDimitry Andric    auto __tmp = _VSTD::any_cast<_RawValueType>(&__v);
6620b57cec5SDimitry Andric    if (__tmp == nullptr)
6630b57cec5SDimitry Andric        __throw_bad_any_cast();
6640b57cec5SDimitry Andric    return static_cast<_ValueType>(_VSTD::move(*__tmp));
6650b57cec5SDimitry Andric}
6660b57cec5SDimitry Andric
6670b57cec5SDimitry Andrictemplate <class _ValueType>
6680b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
6690b57cec5SDimitry Andricadd_pointer_t<add_const_t<_ValueType>>
6700b57cec5SDimitry Andricany_cast(any const * __any) _NOEXCEPT
6710b57cec5SDimitry Andric{
6720b57cec5SDimitry Andric    static_assert(!is_reference<_ValueType>::value,
6730b57cec5SDimitry Andric                  "_ValueType may not be a reference.");
6740b57cec5SDimitry Andric    return _VSTD::any_cast<_ValueType>(const_cast<any *>(__any));
6750b57cec5SDimitry Andric}
6760b57cec5SDimitry Andric
6770b57cec5SDimitry Andrictemplate <class _RetType>
6780b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
6790b57cec5SDimitry Andric_RetType __pointer_or_func_cast(void* __p, /*IsFunction*/false_type) noexcept {
6800b57cec5SDimitry Andric  return static_cast<_RetType>(__p);
6810b57cec5SDimitry Andric}
6820b57cec5SDimitry Andric
6830b57cec5SDimitry Andrictemplate <class _RetType>
6840b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
6850b57cec5SDimitry Andric_RetType __pointer_or_func_cast(void*, /*IsFunction*/true_type) noexcept {
6860b57cec5SDimitry Andric  return nullptr;
6870b57cec5SDimitry Andric}
6880b57cec5SDimitry Andric
6890b57cec5SDimitry Andrictemplate <class _ValueType>
69081ad6265SDimitry Andric_LIBCPP_HIDE_FROM_ABI
6910b57cec5SDimitry Andricadd_pointer_t<_ValueType>
6920b57cec5SDimitry Andricany_cast(any * __any) _NOEXCEPT
6930b57cec5SDimitry Andric{
6940b57cec5SDimitry Andric    using __any_imp::_Action;
6950b57cec5SDimitry Andric    static_assert(!is_reference<_ValueType>::value,
6960b57cec5SDimitry Andric                  "_ValueType may not be a reference.");
697bdd1243dSDimitry Andric    typedef add_pointer_t<_ValueType> _ReturnType;
698bdd1243dSDimitry Andric    if (__any && __any->__h_) {
6990b57cec5SDimitry Andric      void *__p = __any->__call(_Action::_Get, nullptr,
7001ac55f4cSDimitry Andric#if !defined(_LIBCPP_HAS_NO_RTTI)
7010b57cec5SDimitry Andric                          &typeid(_ValueType),
7020b57cec5SDimitry Andric#else
7030b57cec5SDimitry Andric                          nullptr,
7040b57cec5SDimitry Andric#endif
7050b57cec5SDimitry Andric                          __any_imp::__get_fallback_typeid<_ValueType>());
7060b57cec5SDimitry Andric        return _VSTD::__pointer_or_func_cast<_ReturnType>(
7070b57cec5SDimitry Andric            __p, is_function<_ValueType>{});
7080b57cec5SDimitry Andric    }
7090b57cec5SDimitry Andric    return nullptr;
7100b57cec5SDimitry Andric}
7110b57cec5SDimitry Andric
712*06c3fb27SDimitry Andric#endif // _LIBCPP_STD_VER >= 17
7130b57cec5SDimitry Andric
7140b57cec5SDimitry Andric_LIBCPP_END_NAMESPACE_STD
7150b57cec5SDimitry Andric
716*06c3fb27SDimitry Andric_LIBCPP_POP_MACROS
717*06c3fb27SDimitry Andric
718bdd1243dSDimitry Andric#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 17
719bdd1243dSDimitry Andric#  include <chrono>
720bdd1243dSDimitry Andric#endif
721bdd1243dSDimitry Andric
722bdd1243dSDimitry Andric#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
723bdd1243dSDimitry Andric#  include <atomic>
724bdd1243dSDimitry Andric#  include <concepts>
725*06c3fb27SDimitry Andric#  include <cstdlib>
726bdd1243dSDimitry Andric#  include <iosfwd>
727bdd1243dSDimitry Andric#  include <iterator>
728bdd1243dSDimitry Andric#  include <memory>
729*06c3fb27SDimitry Andric#  include <stdexcept>
730*06c3fb27SDimitry Andric#  include <type_traits>
731bdd1243dSDimitry Andric#  include <variant>
732bdd1243dSDimitry Andric#endif
733bdd1243dSDimitry Andric
7340b57cec5SDimitry Andric#endif // _LIBCPP_ANY
735