1// -*- C++ -*- 2//===----------------------------------------------------------------------===// 3// 4// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5// See https://llvm.org/LICENSE.txt for license information. 6// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7// 8//===----------------------------------------------------------------------===// 9 10#ifndef _LIBCPP_ANY 11#define _LIBCPP_ANY 12 13/* 14 any synopsis 15 16namespace std { 17 18 class bad_any_cast : public bad_cast 19 { 20 public: 21 virtual const char* what() const noexcept; 22 }; 23 24 class any 25 { 26 public: 27 28 // 6.3.1 any construct/destruct 29 any() noexcept; 30 31 any(const any& other); 32 any(any&& other) noexcept; 33 34 template <class ValueType> 35 any(ValueType&& value); 36 37 ~any(); 38 39 // 6.3.2 any assignments 40 any& operator=(const any& rhs); 41 any& operator=(any&& rhs) noexcept; 42 43 template <class ValueType> 44 any& operator=(ValueType&& rhs); 45 46 // 6.3.3 any modifiers 47 template <class ValueType, class... Args> 48 decay_t<ValueType>& emplace(Args&&... args); 49 template <class ValueType, class U, class... Args> 50 decay_t<ValueType>& emplace(initializer_list<U>, Args&&...); 51 void reset() noexcept; 52 void swap(any& rhs) noexcept; 53 54 // 6.3.4 any observers 55 bool has_value() const noexcept; 56 const type_info& type() const noexcept; 57 }; 58 59 // 6.4 Non-member functions 60 void swap(any& x, any& y) noexcept; 61 62 template <class T, class ...Args> 63 any make_any(Args&& ...args); 64 template <class T, class U, class ...Args> 65 any make_any(initializer_list<U>, Args&& ...args); 66 67 template<class ValueType> 68 ValueType any_cast(const any& operand); 69 template<class ValueType> 70 ValueType any_cast(any& operand); 71 template<class ValueType> 72 ValueType any_cast(any&& operand); 73 74 template<class ValueType> 75 const ValueType* any_cast(const any* operand) noexcept; 76 template<class ValueType> 77 ValueType* any_cast(any* operand) noexcept; 78 79} // namespace std 80 81*/ 82 83#include <__assert> // all public C++ headers provide the assertion handler 84#include <__availability> 85#include <__config> 86#include <__memory/allocator.h> 87#include <__memory/allocator_destructor.h> 88#include <__memory/allocator_traits.h> 89#include <__memory/unique_ptr.h> 90#include <__utility/forward.h> 91#include <__utility/in_place.h> 92#include <__utility/move.h> 93#include <__utility/unreachable.h> 94#include <cstdlib> 95#include <initializer_list> 96#include <type_traits> 97#include <typeinfo> 98#include <version> 99 100#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 101# pragma GCC system_header 102#endif 103 104namespace std { 105class _LIBCPP_EXCEPTION_ABI _LIBCPP_AVAILABILITY_BAD_ANY_CAST bad_any_cast : public bad_cast 106{ 107public: 108 const char* what() const _NOEXCEPT override; 109}; 110} // namespace std 111 112_LIBCPP_BEGIN_NAMESPACE_STD 113 114#if _LIBCPP_STD_VER > 14 115 116_LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY 117_LIBCPP_AVAILABILITY_THROW_BAD_ANY_CAST 118void __throw_bad_any_cast() 119{ 120#ifndef _LIBCPP_NO_EXCEPTIONS 121 throw bad_any_cast(); 122#else 123 _VSTD::abort(); 124#endif 125} 126 127// Forward declarations 128class _LIBCPP_TEMPLATE_VIS any; 129 130template <class _ValueType> 131_LIBCPP_INLINE_VISIBILITY 132add_pointer_t<add_const_t<_ValueType>> 133any_cast(any const *) _NOEXCEPT; 134 135template <class _ValueType> 136_LIBCPP_INLINE_VISIBILITY 137add_pointer_t<_ValueType> any_cast(any *) _NOEXCEPT; 138 139namespace __any_imp 140{ 141 _LIBCPP_SUPPRESS_DEPRECATED_PUSH 142 using _Buffer = aligned_storage_t<3*sizeof(void*), alignment_of<void*>::value>; 143 _LIBCPP_SUPPRESS_DEPRECATED_POP 144 145 template <class _Tp> 146 using _IsSmallObject = integral_constant<bool 147 , sizeof(_Tp) <= sizeof(_Buffer) 148 && alignment_of<_Buffer>::value 149 % alignment_of<_Tp>::value == 0 150 && is_nothrow_move_constructible<_Tp>::value 151 >; 152 153 enum class _Action { 154 _Destroy, 155 _Copy, 156 _Move, 157 _Get, 158 _TypeInfo 159 }; 160 161 template <class _Tp> struct _SmallHandler; 162 template <class _Tp> struct _LargeHandler; 163 164 template <class _Tp> 165 struct _LIBCPP_TEMPLATE_VIS __unique_typeinfo { static constexpr int __id = 0; }; 166 template <class _Tp> constexpr int __unique_typeinfo<_Tp>::__id; 167 168 template <class _Tp> 169 inline _LIBCPP_INLINE_VISIBILITY 170 constexpr const void* __get_fallback_typeid() { 171 return &__unique_typeinfo<remove_cv_t<remove_reference_t<_Tp>>>::__id; 172 } 173 174 template <class _Tp> 175 inline _LIBCPP_INLINE_VISIBILITY 176 bool __compare_typeid(type_info const* __id, const void* __fallback_id) 177 { 178#if !defined(_LIBCPP_HAS_NO_RTTI) 179 if (__id && *__id == typeid(_Tp)) 180 return true; 181#endif 182 if (!__id && __fallback_id == __any_imp::__get_fallback_typeid<_Tp>()) 183 return true; 184 return false; 185 } 186 187 template <class _Tp> 188 using _Handler = conditional_t< 189 _IsSmallObject<_Tp>::value, _SmallHandler<_Tp>, _LargeHandler<_Tp>>; 190 191} // namespace __any_imp 192 193class _LIBCPP_TEMPLATE_VIS any 194{ 195public: 196 // construct/destruct 197 _LIBCPP_INLINE_VISIBILITY 198 constexpr any() _NOEXCEPT : __h_(nullptr) {} 199 200 _LIBCPP_INLINE_VISIBILITY 201 any(any const & __other) : __h_(nullptr) 202 { 203 if (__other.__h_) __other.__call(_Action::_Copy, this); 204 } 205 206 _LIBCPP_INLINE_VISIBILITY 207 any(any && __other) _NOEXCEPT : __h_(nullptr) 208 { 209 if (__other.__h_) __other.__call(_Action::_Move, this); 210 } 211 212 template < 213 class _ValueType 214 , class _Tp = decay_t<_ValueType> 215 , class = enable_if_t< 216 !is_same<_Tp, any>::value && 217 !__is_inplace_type<_ValueType>::value && 218 is_copy_constructible<_Tp>::value> 219 > 220 _LIBCPP_INLINE_VISIBILITY 221 any(_ValueType && __value); 222 223 template <class _ValueType, class ..._Args, 224 class _Tp = decay_t<_ValueType>, 225 class = enable_if_t< 226 is_constructible<_Tp, _Args...>::value && 227 is_copy_constructible<_Tp>::value 228 > 229 > 230 _LIBCPP_INLINE_VISIBILITY 231 explicit any(in_place_type_t<_ValueType>, _Args&&... __args); 232 233 template <class _ValueType, class _Up, class ..._Args, 234 class _Tp = decay_t<_ValueType>, 235 class = enable_if_t< 236 is_constructible<_Tp, initializer_list<_Up>&, _Args...>::value && 237 is_copy_constructible<_Tp>::value> 238 > 239 _LIBCPP_INLINE_VISIBILITY 240 explicit any(in_place_type_t<_ValueType>, initializer_list<_Up>, _Args&&... __args); 241 242 _LIBCPP_INLINE_VISIBILITY 243 ~any() { this->reset(); } 244 245 // assignments 246 _LIBCPP_INLINE_VISIBILITY 247 any & operator=(any const & __rhs) { 248 any(__rhs).swap(*this); 249 return *this; 250 } 251 252 _LIBCPP_INLINE_VISIBILITY 253 any & operator=(any && __rhs) _NOEXCEPT { 254 any(_VSTD::move(__rhs)).swap(*this); 255 return *this; 256 } 257 258 template < 259 class _ValueType 260 , class _Tp = decay_t<_ValueType> 261 , class = enable_if_t< 262 !is_same<_Tp, any>::value 263 && is_copy_constructible<_Tp>::value> 264 > 265 _LIBCPP_INLINE_VISIBILITY 266 any & operator=(_ValueType && __rhs); 267 268 template <class _ValueType, class ..._Args, 269 class _Tp = decay_t<_ValueType>, 270 class = enable_if_t< 271 is_constructible<_Tp, _Args...>::value && 272 is_copy_constructible<_Tp>::value> 273 > 274 _LIBCPP_INLINE_VISIBILITY 275 _Tp& emplace(_Args&&...); 276 277 template <class _ValueType, class _Up, class ..._Args, 278 class _Tp = decay_t<_ValueType>, 279 class = enable_if_t< 280 is_constructible<_Tp, initializer_list<_Up>&, _Args...>::value && 281 is_copy_constructible<_Tp>::value> 282 > 283 _LIBCPP_INLINE_VISIBILITY 284 _Tp& emplace(initializer_list<_Up>, _Args&&...); 285 286 // 6.3.3 any modifiers 287 _LIBCPP_INLINE_VISIBILITY 288 void reset() _NOEXCEPT { if (__h_) this->__call(_Action::_Destroy); } 289 290 _LIBCPP_INLINE_VISIBILITY 291 void swap(any & __rhs) _NOEXCEPT; 292 293 // 6.3.4 any observers 294 _LIBCPP_INLINE_VISIBILITY 295 bool has_value() const _NOEXCEPT { return __h_ != nullptr; } 296 297#if !defined(_LIBCPP_HAS_NO_RTTI) 298 _LIBCPP_INLINE_VISIBILITY 299 const type_info & type() const _NOEXCEPT { 300 if (__h_) { 301 return *static_cast<type_info const *>(this->__call(_Action::_TypeInfo)); 302 } else { 303 return typeid(void); 304 } 305 } 306#endif 307 308private: 309 typedef __any_imp::_Action _Action; 310 using _HandleFuncPtr = void* (*)(_Action, any const *, any *, const type_info *, 311 const void* __fallback_info); 312 313 union _Storage { 314 constexpr _Storage() : __ptr(nullptr) {} 315 void * __ptr; 316 __any_imp::_Buffer __buf; 317 }; 318 319 _LIBCPP_INLINE_VISIBILITY 320 void * __call(_Action __a, any * __other = nullptr, 321 type_info const * __info = nullptr, 322 const void* __fallback_info = nullptr) const 323 { 324 return __h_(__a, this, __other, __info, __fallback_info); 325 } 326 327 _LIBCPP_INLINE_VISIBILITY 328 void * __call(_Action __a, any * __other = nullptr, 329 type_info const * __info = nullptr, 330 const void* __fallback_info = nullptr) 331 { 332 return __h_(__a, this, __other, __info, __fallback_info); 333 } 334 335 template <class> 336 friend struct __any_imp::_SmallHandler; 337 template <class> 338 friend struct __any_imp::_LargeHandler; 339 340 template <class _ValueType> 341 friend add_pointer_t<add_const_t<_ValueType>> 342 any_cast(any const *) _NOEXCEPT; 343 344 template <class _ValueType> 345 friend add_pointer_t<_ValueType> 346 any_cast(any *) _NOEXCEPT; 347 348 _HandleFuncPtr __h_ = nullptr; 349 _Storage __s_; 350}; 351 352namespace __any_imp 353{ 354 template <class _Tp> 355 struct _LIBCPP_TEMPLATE_VIS _SmallHandler 356 { 357 _LIBCPP_INLINE_VISIBILITY 358 static void* __handle(_Action __act, any const * __this, any * __other, 359 type_info const * __info, const void* __fallback_info) 360 { 361 switch (__act) 362 { 363 case _Action::_Destroy: 364 __destroy(const_cast<any &>(*__this)); 365 return nullptr; 366 case _Action::_Copy: 367 __copy(*__this, *__other); 368 return nullptr; 369 case _Action::_Move: 370 __move(const_cast<any &>(*__this), *__other); 371 return nullptr; 372 case _Action::_Get: 373 return __get(const_cast<any &>(*__this), __info, __fallback_info); 374 case _Action::_TypeInfo: 375 return __type_info(); 376 } 377 __libcpp_unreachable(); 378 } 379 380 template <class ..._Args> 381 _LIBCPP_INLINE_VISIBILITY 382 static _Tp& __create(any & __dest, _Args&&... __args) { 383 typedef allocator<_Tp> _Alloc; 384 typedef allocator_traits<_Alloc> _ATraits; 385 _Alloc __a; 386 _Tp * __ret = static_cast<_Tp*>(static_cast<void*>(&__dest.__s_.__buf)); 387 _ATraits::construct(__a, __ret, _VSTD::forward<_Args>(__args)...); 388 __dest.__h_ = &_SmallHandler::__handle; 389 return *__ret; 390 } 391 392 private: 393 _LIBCPP_INLINE_VISIBILITY 394 static void __destroy(any & __this) { 395 typedef allocator<_Tp> _Alloc; 396 typedef allocator_traits<_Alloc> _ATraits; 397 _Alloc __a; 398 _Tp * __p = static_cast<_Tp *>(static_cast<void*>(&__this.__s_.__buf)); 399 _ATraits::destroy(__a, __p); 400 __this.__h_ = nullptr; 401 } 402 403 _LIBCPP_INLINE_VISIBILITY 404 static void __copy(any const & __this, any & __dest) { 405 _SmallHandler::__create(__dest, *static_cast<_Tp const *>( 406 static_cast<void const *>(&__this.__s_.__buf))); 407 } 408 409 _LIBCPP_INLINE_VISIBILITY 410 static void __move(any & __this, any & __dest) { 411 _SmallHandler::__create(__dest, _VSTD::move( 412 *static_cast<_Tp*>(static_cast<void*>(&__this.__s_.__buf)))); 413 __destroy(__this); 414 } 415 416 _LIBCPP_INLINE_VISIBILITY 417 static void* __get(any & __this, 418 type_info const * __info, 419 const void* __fallback_id) 420 { 421 if (__any_imp::__compare_typeid<_Tp>(__info, __fallback_id)) 422 return static_cast<void*>(&__this.__s_.__buf); 423 return nullptr; 424 } 425 426 _LIBCPP_INLINE_VISIBILITY 427 static void* __type_info() 428 { 429#if !defined(_LIBCPP_HAS_NO_RTTI) 430 return const_cast<void*>(static_cast<void const *>(&typeid(_Tp))); 431#else 432 return nullptr; 433#endif 434 } 435 }; 436 437 template <class _Tp> 438 struct _LIBCPP_TEMPLATE_VIS _LargeHandler 439 { 440 _LIBCPP_INLINE_VISIBILITY 441 static void* __handle(_Action __act, any const * __this, 442 any * __other, type_info const * __info, 443 void const* __fallback_info) 444 { 445 switch (__act) 446 { 447 case _Action::_Destroy: 448 __destroy(const_cast<any &>(*__this)); 449 return nullptr; 450 case _Action::_Copy: 451 __copy(*__this, *__other); 452 return nullptr; 453 case _Action::_Move: 454 __move(const_cast<any &>(*__this), *__other); 455 return nullptr; 456 case _Action::_Get: 457 return __get(const_cast<any &>(*__this), __info, __fallback_info); 458 case _Action::_TypeInfo: 459 return __type_info(); 460 } 461 __libcpp_unreachable(); 462 } 463 464 template <class ..._Args> 465 _LIBCPP_INLINE_VISIBILITY 466 static _Tp& __create(any & __dest, _Args&&... __args) { 467 typedef allocator<_Tp> _Alloc; 468 typedef allocator_traits<_Alloc> _ATraits; 469 typedef __allocator_destructor<_Alloc> _Dp; 470 _Alloc __a; 471 unique_ptr<_Tp, _Dp> __hold(_ATraits::allocate(__a, 1), _Dp(__a, 1)); 472 _Tp * __ret = __hold.get(); 473 _ATraits::construct(__a, __ret, _VSTD::forward<_Args>(__args)...); 474 __dest.__s_.__ptr = __hold.release(); 475 __dest.__h_ = &_LargeHandler::__handle; 476 return *__ret; 477 } 478 479 private: 480 481 _LIBCPP_INLINE_VISIBILITY 482 static void __destroy(any & __this){ 483 typedef allocator<_Tp> _Alloc; 484 typedef allocator_traits<_Alloc> _ATraits; 485 _Alloc __a; 486 _Tp * __p = static_cast<_Tp *>(__this.__s_.__ptr); 487 _ATraits::destroy(__a, __p); 488 _ATraits::deallocate(__a, __p, 1); 489 __this.__h_ = nullptr; 490 } 491 492 _LIBCPP_INLINE_VISIBILITY 493 static void __copy(any const & __this, any & __dest) { 494 _LargeHandler::__create(__dest, *static_cast<_Tp const *>(__this.__s_.__ptr)); 495 } 496 497 _LIBCPP_INLINE_VISIBILITY 498 static void __move(any & __this, any & __dest) { 499 __dest.__s_.__ptr = __this.__s_.__ptr; 500 __dest.__h_ = &_LargeHandler::__handle; 501 __this.__h_ = nullptr; 502 } 503 504 _LIBCPP_INLINE_VISIBILITY 505 static void* __get(any & __this, type_info const * __info, 506 void const* __fallback_info) 507 { 508 if (__any_imp::__compare_typeid<_Tp>(__info, __fallback_info)) 509 return static_cast<void*>(__this.__s_.__ptr); 510 return nullptr; 511 512 } 513 514 _LIBCPP_INLINE_VISIBILITY 515 static void* __type_info() 516 { 517#if !defined(_LIBCPP_HAS_NO_RTTI) 518 return const_cast<void*>(static_cast<void const *>(&typeid(_Tp))); 519#else 520 return nullptr; 521#endif 522 } 523 }; 524 525} // namespace __any_imp 526 527 528template <class _ValueType, class _Tp, class> 529any::any(_ValueType && __v) : __h_(nullptr) 530{ 531 __any_imp::_Handler<_Tp>::__create(*this, _VSTD::forward<_ValueType>(__v)); 532} 533 534template <class _ValueType, class ..._Args, class _Tp, class> 535any::any(in_place_type_t<_ValueType>, _Args&&... __args) { 536 __any_imp::_Handler<_Tp>::__create(*this, _VSTD::forward<_Args>(__args)...); 537} 538 539template <class _ValueType, class _Up, class ..._Args, class _Tp, class> 540any::any(in_place_type_t<_ValueType>, initializer_list<_Up> __il, _Args&&... __args) { 541 __any_imp::_Handler<_Tp>::__create(*this, __il, _VSTD::forward<_Args>(__args)...); 542} 543 544template <class _ValueType, class, class> 545inline _LIBCPP_INLINE_VISIBILITY 546any & any::operator=(_ValueType && __v) 547{ 548 any(_VSTD::forward<_ValueType>(__v)).swap(*this); 549 return *this; 550} 551 552template <class _ValueType, class ..._Args, class _Tp, class> 553inline _LIBCPP_INLINE_VISIBILITY 554_Tp& any::emplace(_Args&&... __args) { 555 reset(); 556 return __any_imp::_Handler<_Tp>::__create(*this, _VSTD::forward<_Args>(__args)...); 557} 558 559template <class _ValueType, class _Up, class ..._Args, class _Tp, class> 560inline _LIBCPP_INLINE_VISIBILITY 561_Tp& any::emplace(initializer_list<_Up> __il, _Args&&... __args) { 562 reset(); 563 return __any_imp::_Handler<_Tp>::__create(*this, __il, _VSTD::forward<_Args>(__args)...); 564} 565 566inline _LIBCPP_INLINE_VISIBILITY 567void any::swap(any & __rhs) _NOEXCEPT 568{ 569 if (this == &__rhs) 570 return; 571 if (__h_ && __rhs.__h_) { 572 any __tmp; 573 __rhs.__call(_Action::_Move, &__tmp); 574 this->__call(_Action::_Move, &__rhs); 575 __tmp.__call(_Action::_Move, this); 576 } 577 else if (__h_) { 578 this->__call(_Action::_Move, &__rhs); 579 } 580 else if (__rhs.__h_) { 581 __rhs.__call(_Action::_Move, this); 582 } 583} 584 585// 6.4 Non-member functions 586 587inline _LIBCPP_INLINE_VISIBILITY 588void swap(any & __lhs, any & __rhs) _NOEXCEPT 589{ 590 __lhs.swap(__rhs); 591} 592 593template <class _Tp, class ..._Args> 594inline _LIBCPP_INLINE_VISIBILITY 595any make_any(_Args&&... __args) { 596 return any(in_place_type<_Tp>, _VSTD::forward<_Args>(__args)...); 597} 598 599template <class _Tp, class _Up, class ..._Args> 600inline _LIBCPP_INLINE_VISIBILITY 601any make_any(initializer_list<_Up> __il, _Args&&... __args) { 602 return any(in_place_type<_Tp>, __il, _VSTD::forward<_Args>(__args)...); 603} 604 605template <class _ValueType> 606inline _LIBCPP_INLINE_VISIBILITY 607_LIBCPP_AVAILABILITY_THROW_BAD_ANY_CAST 608_ValueType any_cast(any const & __v) 609{ 610 using _RawValueType = __remove_cvref_t<_ValueType>; 611 static_assert(is_constructible<_ValueType, _RawValueType const &>::value, 612 "ValueType is required to be a const lvalue reference " 613 "or a CopyConstructible type"); 614 auto __tmp = _VSTD::any_cast<add_const_t<_RawValueType>>(&__v); 615 if (__tmp == nullptr) 616 __throw_bad_any_cast(); 617 return static_cast<_ValueType>(*__tmp); 618} 619 620template <class _ValueType> 621inline _LIBCPP_INLINE_VISIBILITY 622_LIBCPP_AVAILABILITY_THROW_BAD_ANY_CAST 623_ValueType any_cast(any & __v) 624{ 625 using _RawValueType = __remove_cvref_t<_ValueType>; 626 static_assert(is_constructible<_ValueType, _RawValueType &>::value, 627 "ValueType is required to be an lvalue reference " 628 "or a CopyConstructible type"); 629 auto __tmp = _VSTD::any_cast<_RawValueType>(&__v); 630 if (__tmp == nullptr) 631 __throw_bad_any_cast(); 632 return static_cast<_ValueType>(*__tmp); 633} 634 635template <class _ValueType> 636inline _LIBCPP_INLINE_VISIBILITY 637_LIBCPP_AVAILABILITY_THROW_BAD_ANY_CAST 638_ValueType any_cast(any && __v) 639{ 640 using _RawValueType = __remove_cvref_t<_ValueType>; 641 static_assert(is_constructible<_ValueType, _RawValueType>::value, 642 "ValueType is required to be an rvalue reference " 643 "or a CopyConstructible type"); 644 auto __tmp = _VSTD::any_cast<_RawValueType>(&__v); 645 if (__tmp == nullptr) 646 __throw_bad_any_cast(); 647 return static_cast<_ValueType>(_VSTD::move(*__tmp)); 648} 649 650template <class _ValueType> 651inline _LIBCPP_INLINE_VISIBILITY 652add_pointer_t<add_const_t<_ValueType>> 653any_cast(any const * __any) _NOEXCEPT 654{ 655 static_assert(!is_reference<_ValueType>::value, 656 "_ValueType may not be a reference."); 657 return _VSTD::any_cast<_ValueType>(const_cast<any *>(__any)); 658} 659 660template <class _RetType> 661inline _LIBCPP_INLINE_VISIBILITY 662_RetType __pointer_or_func_cast(void* __p, /*IsFunction*/false_type) noexcept { 663 return static_cast<_RetType>(__p); 664} 665 666template <class _RetType> 667inline _LIBCPP_INLINE_VISIBILITY 668_RetType __pointer_or_func_cast(void*, /*IsFunction*/true_type) noexcept { 669 return nullptr; 670} 671 672template <class _ValueType> 673_LIBCPP_HIDE_FROM_ABI 674add_pointer_t<_ValueType> 675any_cast(any * __any) _NOEXCEPT 676{ 677 using __any_imp::_Action; 678 static_assert(!is_reference<_ValueType>::value, 679 "_ValueType may not be a reference."); 680 typedef add_pointer_t<_ValueType> _ReturnType; 681 if (__any && __any->__h_) { 682 void *__p = __any->__call(_Action::_Get, nullptr, 683#if !defined(_LIBCPP_HAS_NO_RTTI) 684 &typeid(_ValueType), 685#else 686 nullptr, 687#endif 688 __any_imp::__get_fallback_typeid<_ValueType>()); 689 return _VSTD::__pointer_or_func_cast<_ReturnType>( 690 __p, is_function<_ValueType>{}); 691 } 692 return nullptr; 693} 694 695#endif // _LIBCPP_STD_VER > 14 696 697_LIBCPP_END_NAMESPACE_STD 698 699#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 17 700# include <chrono> 701#endif 702 703#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20 704# include <atomic> 705# include <concepts> 706# include <iosfwd> 707# include <iterator> 708# include <memory> 709# include <variant> 710#endif 711 712#endif // _LIBCPP_ANY 713