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> 9006c3fb27SDimitry Andric#include <__type_traits/add_const.h> 9106c3fb27SDimitry Andric#include <__type_traits/add_pointer.h> 9206c3fb27SDimitry Andric#include <__type_traits/aligned_storage.h> 9306c3fb27SDimitry Andric#include <__type_traits/conditional.h> 9406c3fb27SDimitry Andric#include <__type_traits/decay.h> 9506c3fb27SDimitry Andric#include <__type_traits/is_constructible.h> 9606c3fb27SDimitry Andric#include <__type_traits/is_copy_constructible.h> 9706c3fb27SDimitry Andric#include <__type_traits/is_function.h> 9806c3fb27SDimitry Andric#include <__type_traits/is_nothrow_move_constructible.h> 9906c3fb27SDimitry Andric#include <__type_traits/is_reference.h> 10006c3fb27SDimitry Andric#include <__type_traits/is_same.h> 10106c3fb27SDimitry Andric#include <__type_traits/remove_cv.h> 10206c3fb27SDimitry Andric#include <__type_traits/remove_cvref.h> 10306c3fb27SDimitry Andric#include <__type_traits/remove_reference.h> 104fe6060f1SDimitry Andric#include <__utility/forward.h> 10581ad6265SDimitry Andric#include <__utility/in_place.h> 10681ad6265SDimitry Andric#include <__utility/move.h> 10781ad6265SDimitry Andric#include <__utility/unreachable.h> 10806c3fb27SDimitry Andric#include <__verbose_abort> 10981ad6265SDimitry Andric#include <initializer_list> 110fe6060f1SDimitry Andric#include <typeinfo> 1110b57cec5SDimitry Andric#include <version> 1120b57cec5SDimitry Andric 1130b57cec5SDimitry Andric#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 1140b57cec5SDimitry Andric# pragma GCC system_header 1150b57cec5SDimitry Andric#endif 1160b57cec5SDimitry Andric 11706c3fb27SDimitry Andric_LIBCPP_PUSH_MACROS 11806c3fb27SDimitry Andric#include <__undef_macros> 11906c3fb27SDimitry Andric 1200b57cec5SDimitry Andricnamespace std { 12106c3fb27SDimitry Andricclass _LIBCPP_EXPORTED_FROM_ABI _LIBCPP_AVAILABILITY_BAD_ANY_CAST bad_any_cast : public bad_cast 1220b57cec5SDimitry Andric{ 1230b57cec5SDimitry Andricpublic: 124bdd1243dSDimitry Andric const char* what() const _NOEXCEPT override; 1250b57cec5SDimitry Andric}; 1260b57cec5SDimitry Andric} // namespace std 1270b57cec5SDimitry Andric 1280b57cec5SDimitry Andric_LIBCPP_BEGIN_NAMESPACE_STD 1290b57cec5SDimitry Andric 13006c3fb27SDimitry Andric#if _LIBCPP_STD_VER >= 17 1310b57cec5SDimitry Andric 132*5f757f3fSDimitry Andric_LIBCPP_NORETURN inline _LIBCPP_HIDE_FROM_ABI 1330b57cec5SDimitry Andric_LIBCPP_AVAILABILITY_THROW_BAD_ANY_CAST 1340b57cec5SDimitry Andricvoid __throw_bad_any_cast() 1350b57cec5SDimitry Andric{ 13606c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 1370b57cec5SDimitry Andric throw bad_any_cast(); 1380b57cec5SDimitry Andric#else 13906c3fb27SDimitry Andric _LIBCPP_VERBOSE_ABORT("bad_any_cast was thrown in -fno-exceptions mode"); 1400b57cec5SDimitry Andric#endif 1410b57cec5SDimitry Andric} 1420b57cec5SDimitry Andric 1430b57cec5SDimitry Andric// Forward declarations 1440b57cec5SDimitry Andricclass _LIBCPP_TEMPLATE_VIS any; 1450b57cec5SDimitry Andric 1460b57cec5SDimitry Andrictemplate <class _ValueType> 147*5f757f3fSDimitry Andric_LIBCPP_HIDE_FROM_ABI 1480b57cec5SDimitry Andricadd_pointer_t<add_const_t<_ValueType>> 1490b57cec5SDimitry Andricany_cast(any const *) _NOEXCEPT; 1500b57cec5SDimitry Andric 1510b57cec5SDimitry Andrictemplate <class _ValueType> 152*5f757f3fSDimitry Andric_LIBCPP_HIDE_FROM_ABI 1530b57cec5SDimitry Andricadd_pointer_t<_ValueType> any_cast(any *) _NOEXCEPT; 1540b57cec5SDimitry Andric 1550b57cec5SDimitry Andricnamespace __any_imp 1560b57cec5SDimitry Andric{ 157bdd1243dSDimitry Andric _LIBCPP_SUPPRESS_DEPRECATED_PUSH 158*5f757f3fSDimitry Andric using _Buffer = aligned_storage_t<3*sizeof(void*), alignof(void*)>; 159bdd1243dSDimitry Andric _LIBCPP_SUPPRESS_DEPRECATED_POP 1600b57cec5SDimitry Andric 1610b57cec5SDimitry Andric template <class _Tp> 1620b57cec5SDimitry Andric using _IsSmallObject = integral_constant<bool 1630b57cec5SDimitry Andric , sizeof(_Tp) <= sizeof(_Buffer) 164*5f757f3fSDimitry Andric && alignof(_Buffer) % alignof(_Tp) == 0 1650b57cec5SDimitry Andric && is_nothrow_move_constructible<_Tp>::value 1660b57cec5SDimitry Andric >; 1670b57cec5SDimitry Andric 1680b57cec5SDimitry Andric enum class _Action { 1690b57cec5SDimitry Andric _Destroy, 1700b57cec5SDimitry Andric _Copy, 1710b57cec5SDimitry Andric _Move, 1720b57cec5SDimitry Andric _Get, 1730b57cec5SDimitry Andric _TypeInfo 1740b57cec5SDimitry Andric }; 1750b57cec5SDimitry Andric 1760b57cec5SDimitry Andric template <class _Tp> struct _SmallHandler; 1770b57cec5SDimitry Andric template <class _Tp> struct _LargeHandler; 1780b57cec5SDimitry Andric 1790b57cec5SDimitry Andric template <class _Tp> 1800b57cec5SDimitry Andric struct _LIBCPP_TEMPLATE_VIS __unique_typeinfo { static constexpr int __id = 0; }; 1810b57cec5SDimitry Andric template <class _Tp> constexpr int __unique_typeinfo<_Tp>::__id; 1820b57cec5SDimitry Andric 1830b57cec5SDimitry Andric template <class _Tp> 184*5f757f3fSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI 1850b57cec5SDimitry Andric constexpr const void* __get_fallback_typeid() { 186e8d8bef9SDimitry Andric return &__unique_typeinfo<remove_cv_t<remove_reference_t<_Tp>>>::__id; 1870b57cec5SDimitry Andric } 1880b57cec5SDimitry Andric 1890b57cec5SDimitry Andric template <class _Tp> 190*5f757f3fSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI 1910b57cec5SDimitry Andric bool __compare_typeid(type_info const* __id, const void* __fallback_id) 1920b57cec5SDimitry Andric { 1931ac55f4cSDimitry Andric#if !defined(_LIBCPP_HAS_NO_RTTI) 1940b57cec5SDimitry Andric if (__id && *__id == typeid(_Tp)) 1950b57cec5SDimitry Andric return true; 1960b57cec5SDimitry Andric#endif 197*5f757f3fSDimitry Andric return !__id && __fallback_id == __any_imp::__get_fallback_typeid<_Tp>(); 1980b57cec5SDimitry Andric } 1990b57cec5SDimitry Andric 2000b57cec5SDimitry Andric template <class _Tp> 2010b57cec5SDimitry Andric using _Handler = conditional_t< 2020b57cec5SDimitry Andric _IsSmallObject<_Tp>::value, _SmallHandler<_Tp>, _LargeHandler<_Tp>>; 2030b57cec5SDimitry Andric 2040b57cec5SDimitry Andric} // namespace __any_imp 2050b57cec5SDimitry Andric 2060b57cec5SDimitry Andricclass _LIBCPP_TEMPLATE_VIS any 2070b57cec5SDimitry Andric{ 2080b57cec5SDimitry Andricpublic: 2090b57cec5SDimitry Andric // construct/destruct 210*5f757f3fSDimitry Andric _LIBCPP_HIDE_FROM_ABI 211bdd1243dSDimitry Andric constexpr any() _NOEXCEPT : __h_(nullptr) {} 2120b57cec5SDimitry Andric 213*5f757f3fSDimitry Andric _LIBCPP_HIDE_FROM_ABI 214bdd1243dSDimitry Andric any(any const & __other) : __h_(nullptr) 2150b57cec5SDimitry Andric { 216bdd1243dSDimitry Andric if (__other.__h_) __other.__call(_Action::_Copy, this); 2170b57cec5SDimitry Andric } 2180b57cec5SDimitry Andric 219*5f757f3fSDimitry Andric _LIBCPP_HIDE_FROM_ABI 220bdd1243dSDimitry Andric any(any && __other) _NOEXCEPT : __h_(nullptr) 2210b57cec5SDimitry Andric { 222bdd1243dSDimitry Andric if (__other.__h_) __other.__call(_Action::_Move, this); 2230b57cec5SDimitry Andric } 2240b57cec5SDimitry Andric 2250b57cec5SDimitry Andric template < 2260b57cec5SDimitry Andric class _ValueType 2270b57cec5SDimitry Andric , class _Tp = decay_t<_ValueType> 2280b57cec5SDimitry Andric , class = enable_if_t< 2290b57cec5SDimitry Andric !is_same<_Tp, any>::value && 2300b57cec5SDimitry Andric !__is_inplace_type<_ValueType>::value && 2310b57cec5SDimitry Andric is_copy_constructible<_Tp>::value> 2320b57cec5SDimitry Andric > 233*5f757f3fSDimitry Andric _LIBCPP_HIDE_FROM_ABI 2340b57cec5SDimitry Andric any(_ValueType && __value); 2350b57cec5SDimitry Andric 2360b57cec5SDimitry Andric template <class _ValueType, class ..._Args, 2370b57cec5SDimitry Andric class _Tp = decay_t<_ValueType>, 2380b57cec5SDimitry Andric class = enable_if_t< 2390b57cec5SDimitry Andric is_constructible<_Tp, _Args...>::value && 2400b57cec5SDimitry Andric is_copy_constructible<_Tp>::value 2410b57cec5SDimitry Andric > 2420b57cec5SDimitry Andric > 243*5f757f3fSDimitry Andric _LIBCPP_HIDE_FROM_ABI 2440b57cec5SDimitry Andric explicit any(in_place_type_t<_ValueType>, _Args&&... __args); 2450b57cec5SDimitry Andric 2460b57cec5SDimitry Andric template <class _ValueType, class _Up, class ..._Args, 2470b57cec5SDimitry Andric class _Tp = decay_t<_ValueType>, 2480b57cec5SDimitry Andric class = enable_if_t< 2490b57cec5SDimitry Andric is_constructible<_Tp, initializer_list<_Up>&, _Args...>::value && 2500b57cec5SDimitry Andric is_copy_constructible<_Tp>::value> 2510b57cec5SDimitry Andric > 252*5f757f3fSDimitry Andric _LIBCPP_HIDE_FROM_ABI 2530b57cec5SDimitry Andric explicit any(in_place_type_t<_ValueType>, initializer_list<_Up>, _Args&&... __args); 2540b57cec5SDimitry Andric 255*5f757f3fSDimitry Andric _LIBCPP_HIDE_FROM_ABI 2560b57cec5SDimitry Andric ~any() { this->reset(); } 2570b57cec5SDimitry Andric 2580b57cec5SDimitry Andric // assignments 259*5f757f3fSDimitry Andric _LIBCPP_HIDE_FROM_ABI 2600b57cec5SDimitry Andric any & operator=(any const & __rhs) { 2610b57cec5SDimitry Andric any(__rhs).swap(*this); 2620b57cec5SDimitry Andric return *this; 2630b57cec5SDimitry Andric } 2640b57cec5SDimitry Andric 265*5f757f3fSDimitry Andric _LIBCPP_HIDE_FROM_ABI 2660b57cec5SDimitry Andric any & operator=(any && __rhs) _NOEXCEPT { 267*5f757f3fSDimitry Andric any(std::move(__rhs)).swap(*this); 2680b57cec5SDimitry Andric return *this; 2690b57cec5SDimitry Andric } 2700b57cec5SDimitry Andric 2710b57cec5SDimitry Andric template < 2720b57cec5SDimitry Andric class _ValueType 2730b57cec5SDimitry Andric , class _Tp = decay_t<_ValueType> 2740b57cec5SDimitry Andric , class = enable_if_t< 2750b57cec5SDimitry Andric !is_same<_Tp, any>::value 2760b57cec5SDimitry Andric && is_copy_constructible<_Tp>::value> 2770b57cec5SDimitry Andric > 278*5f757f3fSDimitry Andric _LIBCPP_HIDE_FROM_ABI 2790b57cec5SDimitry Andric any & operator=(_ValueType && __rhs); 2800b57cec5SDimitry Andric 2810b57cec5SDimitry Andric template <class _ValueType, class ..._Args, 2820b57cec5SDimitry Andric class _Tp = decay_t<_ValueType>, 2830b57cec5SDimitry Andric class = enable_if_t< 2840b57cec5SDimitry Andric is_constructible<_Tp, _Args...>::value && 2850b57cec5SDimitry Andric is_copy_constructible<_Tp>::value> 2860b57cec5SDimitry Andric > 287*5f757f3fSDimitry Andric _LIBCPP_HIDE_FROM_ABI 288753f127fSDimitry Andric _Tp& emplace(_Args&&...); 2890b57cec5SDimitry Andric 2900b57cec5SDimitry Andric template <class _ValueType, class _Up, class ..._Args, 2910b57cec5SDimitry Andric class _Tp = decay_t<_ValueType>, 2920b57cec5SDimitry Andric class = enable_if_t< 2930b57cec5SDimitry Andric is_constructible<_Tp, initializer_list<_Up>&, _Args...>::value && 2940b57cec5SDimitry Andric is_copy_constructible<_Tp>::value> 2950b57cec5SDimitry Andric > 296*5f757f3fSDimitry Andric _LIBCPP_HIDE_FROM_ABI 2970b57cec5SDimitry Andric _Tp& emplace(initializer_list<_Up>, _Args&&...); 2980b57cec5SDimitry Andric 2990b57cec5SDimitry Andric // 6.3.3 any modifiers 300*5f757f3fSDimitry Andric _LIBCPP_HIDE_FROM_ABI 301bdd1243dSDimitry Andric void reset() _NOEXCEPT { if (__h_) this->__call(_Action::_Destroy); } 3020b57cec5SDimitry Andric 303*5f757f3fSDimitry Andric _LIBCPP_HIDE_FROM_ABI 3040b57cec5SDimitry Andric void swap(any & __rhs) _NOEXCEPT; 3050b57cec5SDimitry Andric 3060b57cec5SDimitry Andric // 6.3.4 any observers 307*5f757f3fSDimitry Andric _LIBCPP_HIDE_FROM_ABI 308bdd1243dSDimitry Andric bool has_value() const _NOEXCEPT { return __h_ != nullptr; } 3090b57cec5SDimitry Andric 3101ac55f4cSDimitry Andric#if !defined(_LIBCPP_HAS_NO_RTTI) 311*5f757f3fSDimitry Andric _LIBCPP_HIDE_FROM_ABI 3120b57cec5SDimitry Andric const type_info & type() const _NOEXCEPT { 313bdd1243dSDimitry Andric if (__h_) { 3140b57cec5SDimitry Andric return *static_cast<type_info const *>(this->__call(_Action::_TypeInfo)); 3150b57cec5SDimitry Andric } else { 3160b57cec5SDimitry Andric return typeid(void); 3170b57cec5SDimitry Andric } 3180b57cec5SDimitry Andric } 3190b57cec5SDimitry Andric#endif 3200b57cec5SDimitry Andric 3210b57cec5SDimitry Andricprivate: 3220b57cec5SDimitry Andric typedef __any_imp::_Action _Action; 3230b57cec5SDimitry Andric using _HandleFuncPtr = void* (*)(_Action, any const *, any *, const type_info *, 3240b57cec5SDimitry Andric const void* __fallback_info); 3250b57cec5SDimitry Andric 3260b57cec5SDimitry Andric union _Storage { 32706c3fb27SDimitry Andric _LIBCPP_HIDE_FROM_ABI constexpr _Storage() : __ptr(nullptr) {} 3280b57cec5SDimitry Andric void * __ptr; 3290b57cec5SDimitry Andric __any_imp::_Buffer __buf; 3300b57cec5SDimitry Andric }; 3310b57cec5SDimitry Andric 332*5f757f3fSDimitry Andric _LIBCPP_HIDE_FROM_ABI 3330b57cec5SDimitry Andric void * __call(_Action __a, any * __other = nullptr, 3340b57cec5SDimitry Andric type_info const * __info = nullptr, 3350b57cec5SDimitry Andric const void* __fallback_info = nullptr) const 3360b57cec5SDimitry Andric { 337bdd1243dSDimitry Andric return __h_(__a, this, __other, __info, __fallback_info); 3380b57cec5SDimitry Andric } 3390b57cec5SDimitry Andric 340*5f757f3fSDimitry Andric _LIBCPP_HIDE_FROM_ABI 3410b57cec5SDimitry Andric void * __call(_Action __a, any * __other = nullptr, 3420b57cec5SDimitry Andric type_info const * __info = nullptr, 3430b57cec5SDimitry Andric const void* __fallback_info = nullptr) 3440b57cec5SDimitry Andric { 345bdd1243dSDimitry Andric return __h_(__a, this, __other, __info, __fallback_info); 3460b57cec5SDimitry Andric } 3470b57cec5SDimitry Andric 3480b57cec5SDimitry Andric template <class> 3490b57cec5SDimitry Andric friend struct __any_imp::_SmallHandler; 3500b57cec5SDimitry Andric template <class> 3510b57cec5SDimitry Andric friend struct __any_imp::_LargeHandler; 3520b57cec5SDimitry Andric 3530b57cec5SDimitry Andric template <class _ValueType> 3540b57cec5SDimitry Andric friend add_pointer_t<add_const_t<_ValueType>> 3550b57cec5SDimitry Andric any_cast(any const *) _NOEXCEPT; 3560b57cec5SDimitry Andric 3570b57cec5SDimitry Andric template <class _ValueType> 3580b57cec5SDimitry Andric friend add_pointer_t<_ValueType> 3590b57cec5SDimitry Andric any_cast(any *) _NOEXCEPT; 3600b57cec5SDimitry Andric 361bdd1243dSDimitry Andric _HandleFuncPtr __h_ = nullptr; 362bdd1243dSDimitry Andric _Storage __s_; 3630b57cec5SDimitry Andric}; 3640b57cec5SDimitry Andric 3650b57cec5SDimitry Andricnamespace __any_imp 3660b57cec5SDimitry Andric{ 3670b57cec5SDimitry Andric template <class _Tp> 3680b57cec5SDimitry Andric struct _LIBCPP_TEMPLATE_VIS _SmallHandler 3690b57cec5SDimitry Andric { 370*5f757f3fSDimitry Andric _LIBCPP_HIDE_FROM_ABI 3710b57cec5SDimitry Andric static void* __handle(_Action __act, any const * __this, any * __other, 3720b57cec5SDimitry Andric type_info const * __info, const void* __fallback_info) 3730b57cec5SDimitry Andric { 3740b57cec5SDimitry Andric switch (__act) 3750b57cec5SDimitry Andric { 3760b57cec5SDimitry Andric case _Action::_Destroy: 3770b57cec5SDimitry Andric __destroy(const_cast<any &>(*__this)); 3780b57cec5SDimitry Andric return nullptr; 3790b57cec5SDimitry Andric case _Action::_Copy: 3800b57cec5SDimitry Andric __copy(*__this, *__other); 3810b57cec5SDimitry Andric return nullptr; 3820b57cec5SDimitry Andric case _Action::_Move: 3830b57cec5SDimitry Andric __move(const_cast<any &>(*__this), *__other); 3840b57cec5SDimitry Andric return nullptr; 3850b57cec5SDimitry Andric case _Action::_Get: 3860b57cec5SDimitry Andric return __get(const_cast<any &>(*__this), __info, __fallback_info); 3870b57cec5SDimitry Andric case _Action::_TypeInfo: 3880b57cec5SDimitry Andric return __type_info(); 3890b57cec5SDimitry Andric } 39081ad6265SDimitry Andric __libcpp_unreachable(); 3910b57cec5SDimitry Andric } 3920b57cec5SDimitry Andric 3930b57cec5SDimitry Andric template <class ..._Args> 394*5f757f3fSDimitry Andric _LIBCPP_HIDE_FROM_ABI 3950b57cec5SDimitry Andric static _Tp& __create(any & __dest, _Args&&... __args) { 396e8d8bef9SDimitry Andric typedef allocator<_Tp> _Alloc; 397e8d8bef9SDimitry Andric typedef allocator_traits<_Alloc> _ATraits; 398e8d8bef9SDimitry Andric _Alloc __a; 399bdd1243dSDimitry Andric _Tp * __ret = static_cast<_Tp*>(static_cast<void*>(&__dest.__s_.__buf)); 400*5f757f3fSDimitry Andric _ATraits::construct(__a, __ret, std::forward<_Args>(__args)...); 401bdd1243dSDimitry Andric __dest.__h_ = &_SmallHandler::__handle; 4020b57cec5SDimitry Andric return *__ret; 4030b57cec5SDimitry Andric } 4040b57cec5SDimitry Andric 4050b57cec5SDimitry Andric private: 406*5f757f3fSDimitry Andric _LIBCPP_HIDE_FROM_ABI 4070b57cec5SDimitry Andric static void __destroy(any & __this) { 408e8d8bef9SDimitry Andric typedef allocator<_Tp> _Alloc; 409e8d8bef9SDimitry Andric typedef allocator_traits<_Alloc> _ATraits; 410e8d8bef9SDimitry Andric _Alloc __a; 411bdd1243dSDimitry Andric _Tp * __p = static_cast<_Tp *>(static_cast<void*>(&__this.__s_.__buf)); 412e8d8bef9SDimitry Andric _ATraits::destroy(__a, __p); 413bdd1243dSDimitry Andric __this.__h_ = nullptr; 4140b57cec5SDimitry Andric } 4150b57cec5SDimitry Andric 416*5f757f3fSDimitry Andric _LIBCPP_HIDE_FROM_ABI 4170b57cec5SDimitry Andric static void __copy(any const & __this, any & __dest) { 4180b57cec5SDimitry Andric _SmallHandler::__create(__dest, *static_cast<_Tp const *>( 419bdd1243dSDimitry Andric static_cast<void const *>(&__this.__s_.__buf))); 4200b57cec5SDimitry Andric } 4210b57cec5SDimitry Andric 422*5f757f3fSDimitry Andric _LIBCPP_HIDE_FROM_ABI 4230b57cec5SDimitry Andric static void __move(any & __this, any & __dest) { 424*5f757f3fSDimitry Andric _SmallHandler::__create(__dest, std::move( 425bdd1243dSDimitry Andric *static_cast<_Tp*>(static_cast<void*>(&__this.__s_.__buf)))); 4260b57cec5SDimitry Andric __destroy(__this); 4270b57cec5SDimitry Andric } 4280b57cec5SDimitry Andric 429*5f757f3fSDimitry Andric _LIBCPP_HIDE_FROM_ABI 4300b57cec5SDimitry Andric static void* __get(any & __this, 4310b57cec5SDimitry Andric type_info const * __info, 4320b57cec5SDimitry Andric const void* __fallback_id) 4330b57cec5SDimitry Andric { 4340b57cec5SDimitry Andric if (__any_imp::__compare_typeid<_Tp>(__info, __fallback_id)) 435bdd1243dSDimitry Andric return static_cast<void*>(&__this.__s_.__buf); 4360b57cec5SDimitry Andric return nullptr; 4370b57cec5SDimitry Andric } 4380b57cec5SDimitry Andric 439*5f757f3fSDimitry Andric _LIBCPP_HIDE_FROM_ABI 4400b57cec5SDimitry Andric static void* __type_info() 4410b57cec5SDimitry Andric { 4421ac55f4cSDimitry Andric#if !defined(_LIBCPP_HAS_NO_RTTI) 4430b57cec5SDimitry Andric return const_cast<void*>(static_cast<void const *>(&typeid(_Tp))); 4440b57cec5SDimitry Andric#else 4450b57cec5SDimitry Andric return nullptr; 4460b57cec5SDimitry Andric#endif 4470b57cec5SDimitry Andric } 4480b57cec5SDimitry Andric }; 4490b57cec5SDimitry Andric 4500b57cec5SDimitry Andric template <class _Tp> 4510b57cec5SDimitry Andric struct _LIBCPP_TEMPLATE_VIS _LargeHandler 4520b57cec5SDimitry Andric { 453*5f757f3fSDimitry Andric _LIBCPP_HIDE_FROM_ABI 4540b57cec5SDimitry Andric static void* __handle(_Action __act, any const * __this, 4550b57cec5SDimitry Andric any * __other, type_info const * __info, 4560b57cec5SDimitry Andric void const* __fallback_info) 4570b57cec5SDimitry Andric { 4580b57cec5SDimitry Andric switch (__act) 4590b57cec5SDimitry Andric { 4600b57cec5SDimitry Andric case _Action::_Destroy: 4610b57cec5SDimitry Andric __destroy(const_cast<any &>(*__this)); 4620b57cec5SDimitry Andric return nullptr; 4630b57cec5SDimitry Andric case _Action::_Copy: 4640b57cec5SDimitry Andric __copy(*__this, *__other); 4650b57cec5SDimitry Andric return nullptr; 4660b57cec5SDimitry Andric case _Action::_Move: 4670b57cec5SDimitry Andric __move(const_cast<any &>(*__this), *__other); 4680b57cec5SDimitry Andric return nullptr; 4690b57cec5SDimitry Andric case _Action::_Get: 4700b57cec5SDimitry Andric return __get(const_cast<any &>(*__this), __info, __fallback_info); 4710b57cec5SDimitry Andric case _Action::_TypeInfo: 4720b57cec5SDimitry Andric return __type_info(); 4730b57cec5SDimitry Andric } 47481ad6265SDimitry Andric __libcpp_unreachable(); 4750b57cec5SDimitry Andric } 4760b57cec5SDimitry Andric 4770b57cec5SDimitry Andric template <class ..._Args> 478*5f757f3fSDimitry Andric _LIBCPP_HIDE_FROM_ABI 4790b57cec5SDimitry Andric static _Tp& __create(any & __dest, _Args&&... __args) { 4800b57cec5SDimitry Andric typedef allocator<_Tp> _Alloc; 481e8d8bef9SDimitry Andric typedef allocator_traits<_Alloc> _ATraits; 4820b57cec5SDimitry Andric typedef __allocator_destructor<_Alloc> _Dp; 4830b57cec5SDimitry Andric _Alloc __a; 484e8d8bef9SDimitry Andric unique_ptr<_Tp, _Dp> __hold(_ATraits::allocate(__a, 1), _Dp(__a, 1)); 485e8d8bef9SDimitry Andric _Tp * __ret = __hold.get(); 486*5f757f3fSDimitry Andric _ATraits::construct(__a, __ret, std::forward<_Args>(__args)...); 487bdd1243dSDimitry Andric __dest.__s_.__ptr = __hold.release(); 488bdd1243dSDimitry Andric __dest.__h_ = &_LargeHandler::__handle; 4890b57cec5SDimitry Andric return *__ret; 4900b57cec5SDimitry Andric } 4910b57cec5SDimitry Andric 4920b57cec5SDimitry Andric private: 4930b57cec5SDimitry Andric 494*5f757f3fSDimitry Andric _LIBCPP_HIDE_FROM_ABI 4950b57cec5SDimitry Andric static void __destroy(any & __this){ 496e8d8bef9SDimitry Andric typedef allocator<_Tp> _Alloc; 497e8d8bef9SDimitry Andric typedef allocator_traits<_Alloc> _ATraits; 498e8d8bef9SDimitry Andric _Alloc __a; 499bdd1243dSDimitry Andric _Tp * __p = static_cast<_Tp *>(__this.__s_.__ptr); 500e8d8bef9SDimitry Andric _ATraits::destroy(__a, __p); 501e8d8bef9SDimitry Andric _ATraits::deallocate(__a, __p, 1); 502bdd1243dSDimitry Andric __this.__h_ = nullptr; 5030b57cec5SDimitry Andric } 5040b57cec5SDimitry Andric 505*5f757f3fSDimitry Andric _LIBCPP_HIDE_FROM_ABI 5060b57cec5SDimitry Andric static void __copy(any const & __this, any & __dest) { 507bdd1243dSDimitry Andric _LargeHandler::__create(__dest, *static_cast<_Tp const *>(__this.__s_.__ptr)); 5080b57cec5SDimitry Andric } 5090b57cec5SDimitry Andric 510*5f757f3fSDimitry Andric _LIBCPP_HIDE_FROM_ABI 5110b57cec5SDimitry Andric static void __move(any & __this, any & __dest) { 512bdd1243dSDimitry Andric __dest.__s_.__ptr = __this.__s_.__ptr; 513bdd1243dSDimitry Andric __dest.__h_ = &_LargeHandler::__handle; 514bdd1243dSDimitry Andric __this.__h_ = nullptr; 5150b57cec5SDimitry Andric } 5160b57cec5SDimitry Andric 517*5f757f3fSDimitry Andric _LIBCPP_HIDE_FROM_ABI 5180b57cec5SDimitry Andric static void* __get(any & __this, type_info const * __info, 5190b57cec5SDimitry Andric void const* __fallback_info) 5200b57cec5SDimitry Andric { 5210b57cec5SDimitry Andric if (__any_imp::__compare_typeid<_Tp>(__info, __fallback_info)) 522bdd1243dSDimitry Andric return static_cast<void*>(__this.__s_.__ptr); 5230b57cec5SDimitry Andric return nullptr; 5240b57cec5SDimitry Andric 5250b57cec5SDimitry Andric } 5260b57cec5SDimitry Andric 527*5f757f3fSDimitry Andric _LIBCPP_HIDE_FROM_ABI 5280b57cec5SDimitry Andric static void* __type_info() 5290b57cec5SDimitry Andric { 5301ac55f4cSDimitry Andric#if !defined(_LIBCPP_HAS_NO_RTTI) 5310b57cec5SDimitry Andric return const_cast<void*>(static_cast<void const *>(&typeid(_Tp))); 5320b57cec5SDimitry Andric#else 5330b57cec5SDimitry Andric return nullptr; 5340b57cec5SDimitry Andric#endif 5350b57cec5SDimitry Andric } 5360b57cec5SDimitry Andric }; 5370b57cec5SDimitry Andric 5380b57cec5SDimitry Andric} // namespace __any_imp 5390b57cec5SDimitry Andric 5400b57cec5SDimitry Andric 5410b57cec5SDimitry Andrictemplate <class _ValueType, class _Tp, class> 542bdd1243dSDimitry Andricany::any(_ValueType && __v) : __h_(nullptr) 5430b57cec5SDimitry Andric{ 544*5f757f3fSDimitry Andric __any_imp::_Handler<_Tp>::__create(*this, std::forward<_ValueType>(__v)); 5450b57cec5SDimitry Andric} 5460b57cec5SDimitry Andric 5470b57cec5SDimitry Andrictemplate <class _ValueType, class ..._Args, class _Tp, class> 5480b57cec5SDimitry Andricany::any(in_place_type_t<_ValueType>, _Args&&... __args) { 549*5f757f3fSDimitry Andric __any_imp::_Handler<_Tp>::__create(*this, std::forward<_Args>(__args)...); 5500b57cec5SDimitry Andric} 5510b57cec5SDimitry Andric 5520b57cec5SDimitry Andrictemplate <class _ValueType, class _Up, class ..._Args, class _Tp, class> 5530b57cec5SDimitry Andricany::any(in_place_type_t<_ValueType>, initializer_list<_Up> __il, _Args&&... __args) { 554*5f757f3fSDimitry Andric __any_imp::_Handler<_Tp>::__create(*this, __il, std::forward<_Args>(__args)...); 5550b57cec5SDimitry Andric} 5560b57cec5SDimitry Andric 5570b57cec5SDimitry Andrictemplate <class _ValueType, class, class> 558*5f757f3fSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI 5590b57cec5SDimitry Andricany & any::operator=(_ValueType && __v) 5600b57cec5SDimitry Andric{ 561*5f757f3fSDimitry Andric any(std::forward<_ValueType>(__v)).swap(*this); 5620b57cec5SDimitry Andric return *this; 5630b57cec5SDimitry Andric} 5640b57cec5SDimitry Andric 5650b57cec5SDimitry Andrictemplate <class _ValueType, class ..._Args, class _Tp, class> 566*5f757f3fSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI 5670b57cec5SDimitry Andric_Tp& any::emplace(_Args&&... __args) { 5680b57cec5SDimitry Andric reset(); 569*5f757f3fSDimitry Andric return __any_imp::_Handler<_Tp>::__create(*this, std::forward<_Args>(__args)...); 5700b57cec5SDimitry Andric} 5710b57cec5SDimitry Andric 5720b57cec5SDimitry Andrictemplate <class _ValueType, class _Up, class ..._Args, class _Tp, class> 573*5f757f3fSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI 5740b57cec5SDimitry Andric_Tp& any::emplace(initializer_list<_Up> __il, _Args&&... __args) { 5750b57cec5SDimitry Andric reset(); 576*5f757f3fSDimitry Andric return __any_imp::_Handler<_Tp>::__create(*this, __il, std::forward<_Args>(__args)...); 5770b57cec5SDimitry Andric} 5780b57cec5SDimitry Andric 579*5f757f3fSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI 5800b57cec5SDimitry Andricvoid any::swap(any & __rhs) _NOEXCEPT 5810b57cec5SDimitry Andric{ 5820b57cec5SDimitry Andric if (this == &__rhs) 5830b57cec5SDimitry Andric return; 584bdd1243dSDimitry Andric if (__h_ && __rhs.__h_) { 5850b57cec5SDimitry Andric any __tmp; 5860b57cec5SDimitry Andric __rhs.__call(_Action::_Move, &__tmp); 5870b57cec5SDimitry Andric this->__call(_Action::_Move, &__rhs); 5880b57cec5SDimitry Andric __tmp.__call(_Action::_Move, this); 5890b57cec5SDimitry Andric } 590bdd1243dSDimitry Andric else if (__h_) { 5910b57cec5SDimitry Andric this->__call(_Action::_Move, &__rhs); 5920b57cec5SDimitry Andric } 593bdd1243dSDimitry Andric else if (__rhs.__h_) { 5940b57cec5SDimitry Andric __rhs.__call(_Action::_Move, this); 5950b57cec5SDimitry Andric } 5960b57cec5SDimitry Andric} 5970b57cec5SDimitry Andric 5980b57cec5SDimitry Andric// 6.4 Non-member functions 5990b57cec5SDimitry Andric 600*5f757f3fSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI 6010b57cec5SDimitry Andricvoid swap(any & __lhs, any & __rhs) _NOEXCEPT 6020b57cec5SDimitry Andric{ 6030b57cec5SDimitry Andric __lhs.swap(__rhs); 6040b57cec5SDimitry Andric} 6050b57cec5SDimitry Andric 6060b57cec5SDimitry Andrictemplate <class _Tp, class ..._Args> 607*5f757f3fSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI 6080b57cec5SDimitry Andricany make_any(_Args&&... __args) { 609*5f757f3fSDimitry Andric return any(in_place_type<_Tp>, std::forward<_Args>(__args)...); 6100b57cec5SDimitry Andric} 6110b57cec5SDimitry Andric 6120b57cec5SDimitry Andrictemplate <class _Tp, class _Up, class ..._Args> 613*5f757f3fSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI 6140b57cec5SDimitry Andricany make_any(initializer_list<_Up> __il, _Args&&... __args) { 615*5f757f3fSDimitry Andric return any(in_place_type<_Tp>, __il, std::forward<_Args>(__args)...); 6160b57cec5SDimitry Andric} 6170b57cec5SDimitry Andric 6180b57cec5SDimitry Andrictemplate <class _ValueType> 619*5f757f3fSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI 6200b57cec5SDimitry Andric_LIBCPP_AVAILABILITY_THROW_BAD_ANY_CAST 6210b57cec5SDimitry Andric_ValueType any_cast(any const & __v) 6220b57cec5SDimitry Andric{ 623bdd1243dSDimitry Andric using _RawValueType = __remove_cvref_t<_ValueType>; 6240b57cec5SDimitry Andric static_assert(is_constructible<_ValueType, _RawValueType const &>::value, 6250b57cec5SDimitry Andric "ValueType is required to be a const lvalue reference " 6260b57cec5SDimitry Andric "or a CopyConstructible type"); 627*5f757f3fSDimitry Andric auto __tmp = std::any_cast<add_const_t<_RawValueType>>(&__v); 6280b57cec5SDimitry Andric if (__tmp == nullptr) 6290b57cec5SDimitry Andric __throw_bad_any_cast(); 6300b57cec5SDimitry Andric return static_cast<_ValueType>(*__tmp); 6310b57cec5SDimitry Andric} 6320b57cec5SDimitry Andric 6330b57cec5SDimitry Andrictemplate <class _ValueType> 634*5f757f3fSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI 6350b57cec5SDimitry Andric_LIBCPP_AVAILABILITY_THROW_BAD_ANY_CAST 6360b57cec5SDimitry Andric_ValueType any_cast(any & __v) 6370b57cec5SDimitry Andric{ 638bdd1243dSDimitry Andric using _RawValueType = __remove_cvref_t<_ValueType>; 6390b57cec5SDimitry Andric static_assert(is_constructible<_ValueType, _RawValueType &>::value, 6400b57cec5SDimitry Andric "ValueType is required to be an lvalue reference " 6410b57cec5SDimitry Andric "or a CopyConstructible type"); 642*5f757f3fSDimitry Andric auto __tmp = std::any_cast<_RawValueType>(&__v); 6430b57cec5SDimitry Andric if (__tmp == nullptr) 6440b57cec5SDimitry Andric __throw_bad_any_cast(); 6450b57cec5SDimitry Andric return static_cast<_ValueType>(*__tmp); 6460b57cec5SDimitry Andric} 6470b57cec5SDimitry Andric 6480b57cec5SDimitry Andrictemplate <class _ValueType> 649*5f757f3fSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI 6500b57cec5SDimitry Andric_LIBCPP_AVAILABILITY_THROW_BAD_ANY_CAST 6510b57cec5SDimitry Andric_ValueType any_cast(any && __v) 6520b57cec5SDimitry Andric{ 653bdd1243dSDimitry Andric using _RawValueType = __remove_cvref_t<_ValueType>; 6540b57cec5SDimitry Andric static_assert(is_constructible<_ValueType, _RawValueType>::value, 6550b57cec5SDimitry Andric "ValueType is required to be an rvalue reference " 6560b57cec5SDimitry Andric "or a CopyConstructible type"); 657*5f757f3fSDimitry Andric auto __tmp = std::any_cast<_RawValueType>(&__v); 6580b57cec5SDimitry Andric if (__tmp == nullptr) 6590b57cec5SDimitry Andric __throw_bad_any_cast(); 660*5f757f3fSDimitry Andric return static_cast<_ValueType>(std::move(*__tmp)); 6610b57cec5SDimitry Andric} 6620b57cec5SDimitry Andric 6630b57cec5SDimitry Andrictemplate <class _ValueType> 664*5f757f3fSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI 6650b57cec5SDimitry Andricadd_pointer_t<add_const_t<_ValueType>> 6660b57cec5SDimitry Andricany_cast(any const * __any) _NOEXCEPT 6670b57cec5SDimitry Andric{ 6680b57cec5SDimitry Andric static_assert(!is_reference<_ValueType>::value, 6690b57cec5SDimitry Andric "_ValueType may not be a reference."); 670*5f757f3fSDimitry Andric return std::any_cast<_ValueType>(const_cast<any *>(__any)); 6710b57cec5SDimitry Andric} 6720b57cec5SDimitry Andric 6730b57cec5SDimitry Andrictemplate <class _RetType> 674*5f757f3fSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI 6750b57cec5SDimitry Andric_RetType __pointer_or_func_cast(void* __p, /*IsFunction*/false_type) noexcept { 6760b57cec5SDimitry Andric return static_cast<_RetType>(__p); 6770b57cec5SDimitry Andric} 6780b57cec5SDimitry Andric 6790b57cec5SDimitry Andrictemplate <class _RetType> 680*5f757f3fSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI 6810b57cec5SDimitry Andric_RetType __pointer_or_func_cast(void*, /*IsFunction*/true_type) noexcept { 6820b57cec5SDimitry Andric return nullptr; 6830b57cec5SDimitry Andric} 6840b57cec5SDimitry Andric 6850b57cec5SDimitry Andrictemplate <class _ValueType> 68681ad6265SDimitry Andric_LIBCPP_HIDE_FROM_ABI 6870b57cec5SDimitry Andricadd_pointer_t<_ValueType> 6880b57cec5SDimitry Andricany_cast(any * __any) _NOEXCEPT 6890b57cec5SDimitry Andric{ 6900b57cec5SDimitry Andric using __any_imp::_Action; 6910b57cec5SDimitry Andric static_assert(!is_reference<_ValueType>::value, 6920b57cec5SDimitry Andric "_ValueType may not be a reference."); 693bdd1243dSDimitry Andric typedef add_pointer_t<_ValueType> _ReturnType; 694bdd1243dSDimitry Andric if (__any && __any->__h_) { 6950b57cec5SDimitry Andric void *__p = __any->__call(_Action::_Get, nullptr, 6961ac55f4cSDimitry Andric#if !defined(_LIBCPP_HAS_NO_RTTI) 6970b57cec5SDimitry Andric &typeid(_ValueType), 6980b57cec5SDimitry Andric#else 6990b57cec5SDimitry Andric nullptr, 7000b57cec5SDimitry Andric#endif 7010b57cec5SDimitry Andric __any_imp::__get_fallback_typeid<_ValueType>()); 702*5f757f3fSDimitry Andric return std::__pointer_or_func_cast<_ReturnType>( 7030b57cec5SDimitry Andric __p, is_function<_ValueType>{}); 7040b57cec5SDimitry Andric } 7050b57cec5SDimitry Andric return nullptr; 7060b57cec5SDimitry Andric} 7070b57cec5SDimitry Andric 70806c3fb27SDimitry Andric#endif // _LIBCPP_STD_VER >= 17 7090b57cec5SDimitry Andric 7100b57cec5SDimitry Andric_LIBCPP_END_NAMESPACE_STD 7110b57cec5SDimitry Andric 71206c3fb27SDimitry Andric_LIBCPP_POP_MACROS 71306c3fb27SDimitry Andric 714bdd1243dSDimitry Andric#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 17 715bdd1243dSDimitry Andric# include <chrono> 716bdd1243dSDimitry Andric#endif 717bdd1243dSDimitry Andric 718bdd1243dSDimitry Andric#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20 719bdd1243dSDimitry Andric# include <atomic> 720bdd1243dSDimitry Andric# include <concepts> 72106c3fb27SDimitry Andric# include <cstdlib> 722bdd1243dSDimitry Andric# include <iosfwd> 723bdd1243dSDimitry Andric# include <iterator> 724bdd1243dSDimitry Andric# include <memory> 72506c3fb27SDimitry Andric# include <stdexcept> 72606c3fb27SDimitry Andric# include <type_traits> 727bdd1243dSDimitry Andric# include <variant> 728bdd1243dSDimitry Andric#endif 729bdd1243dSDimitry Andric 7300b57cec5SDimitry Andric#endif // _LIBCPP_ANY 731