13e519524SHoward Hinnant// -*- C++ -*- 2eb8650a7SLouis Dionne//===----------------------------------------------------------------------===// 33e519524SHoward Hinnant// 457b08b09SChandler Carruth// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 557b08b09SChandler Carruth// See https://llvm.org/LICENSE.txt for license information. 657b08b09SChandler Carruth// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 73e519524SHoward Hinnant// 83e519524SHoward Hinnant//===----------------------------------------------------------------------===// 93e519524SHoward Hinnant 103e519524SHoward Hinnant#ifndef _LIBCPP_TYPEINDEX 113e519524SHoward Hinnant#define _LIBCPP_TYPEINDEX 123e519524SHoward Hinnant 133e519524SHoward Hinnant/* 143e519524SHoward Hinnant 153e519524SHoward Hinnant typeindex synopsis 163e519524SHoward Hinnant 173e519524SHoward Hinnantnamespace std 183e519524SHoward Hinnant{ 193e519524SHoward Hinnant 203e519524SHoward Hinnantclass type_index 213e519524SHoward Hinnant{ 223e519524SHoward Hinnantpublic: 239e5c99f6SHoward Hinnant type_index(const type_info& rhs) noexcept; 243e519524SHoward Hinnant 259e5c99f6SHoward Hinnant bool operator==(const type_index& rhs) const noexcept; 269e5c99f6SHoward Hinnant bool operator!=(const type_index& rhs) const noexcept; 279e5c99f6SHoward Hinnant bool operator< (const type_index& rhs) const noexcept; 289e5c99f6SHoward Hinnant bool operator<=(const type_index& rhs) const noexcept; 299e5c99f6SHoward Hinnant bool operator> (const type_index& rhs) const noexcept; 309e5c99f6SHoward Hinnant bool operator>=(const type_index& rhs) const noexcept; 313e519524SHoward Hinnant 329e5c99f6SHoward Hinnant size_t hash_code() const noexcept; 339e5c99f6SHoward Hinnant const char* name() const noexcept; 343e519524SHoward Hinnant}; 353e519524SHoward Hinnant 363e519524SHoward Hinnanttemplate <> 373e519524SHoward Hinnantstruct hash<type_index> 383e519524SHoward Hinnant : public unary_function<type_index, size_t> 393e519524SHoward Hinnant{ 409e5c99f6SHoward Hinnant size_t operator()(type_index index) const noexcept; 413e519524SHoward Hinnant}; 423e519524SHoward Hinnant 433e519524SHoward Hinnant} // std 443e519524SHoward Hinnant 453e519524SHoward Hinnant*/ 463e519524SHoward Hinnant 47385cc25aSLouis Dionne#include <__assert> // all public C++ headers provide the assertion handler 483e519524SHoward Hinnant#include <__config> 49050b064fSChristopher Di Bella#include <__functional/unary_function.h> 50bfbd73f8SArthur O'Dwyer#include <typeinfo> 51bd6e6846SMark de Wever#include <version> 523e519524SHoward Hinnant 53*de4a57cbSLouis Dionne#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES 54*de4a57cbSLouis Dionne# include <iosfwd> 55*de4a57cbSLouis Dionne# include <new> 56*de4a57cbSLouis Dionne# include <utility> 57*de4a57cbSLouis Dionne#endif 58*de4a57cbSLouis Dionne 59db1978b6SNikolas Klauser// standard-mandated includes 60db1978b6SNikolas Klauser#include <compare> 61db1978b6SNikolas Klauser 62073458b1SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 633e519524SHoward Hinnant# pragma GCC system_header 64073458b1SHoward Hinnant#endif 653e519524SHoward Hinnant 663e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD 673e519524SHoward Hinnant 68e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS type_index 693e519524SHoward Hinnant{ 703e519524SHoward Hinnant const type_info* __t_; 713e519524SHoward Hinnantpublic: 72789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 739e5c99f6SHoward Hinnant type_index(const type_info& __y) _NOEXCEPT : __t_(&__y) {} 743e519524SHoward Hinnant 75789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 769e5c99f6SHoward Hinnant bool operator==(const type_index& __y) const _NOEXCEPT 779e5c99f6SHoward Hinnant {return *__t_ == *__y.__t_;} 78789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 799e5c99f6SHoward Hinnant bool operator!=(const type_index& __y) const _NOEXCEPT 809e5c99f6SHoward Hinnant {return *__t_ != *__y.__t_;} 81789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 829e5c99f6SHoward Hinnant bool operator< (const type_index& __y) const _NOEXCEPT 839e5c99f6SHoward Hinnant {return __t_->before(*__y.__t_);} 84789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 859e5c99f6SHoward Hinnant bool operator<=(const type_index& __y) const _NOEXCEPT 869e5c99f6SHoward Hinnant {return !__y.__t_->before(*__t_);} 87789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 889e5c99f6SHoward Hinnant bool operator> (const type_index& __y) const _NOEXCEPT 899e5c99f6SHoward Hinnant {return __y.__t_->before(*__t_);} 90789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 919e5c99f6SHoward Hinnant bool operator>=(const type_index& __y) const _NOEXCEPT 929e5c99f6SHoward Hinnant {return !__t_->before(*__y.__t_);} 933e519524SHoward Hinnant 94789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 959e5c99f6SHoward Hinnant size_t hash_code() const _NOEXCEPT {return __t_->hash_code();} 96789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 979e5c99f6SHoward Hinnant const char* name() const _NOEXCEPT {return __t_->name();} 983e519524SHoward Hinnant}; 993e519524SHoward Hinnant 100e2f2d1edSEric Fiseliertemplate <class _Tp> struct _LIBCPP_TEMPLATE_VIS hash; 1013e519524SHoward Hinnant 1023e519524SHoward Hinnanttemplate <> 103e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS hash<type_index> 104681cde7dSNikolas Klauser : public __unary_function<type_index, size_t> 1053e519524SHoward Hinnant{ 106789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1079e5c99f6SHoward Hinnant size_t operator()(type_index __index) const _NOEXCEPT 1089e5c99f6SHoward Hinnant {return __index.hash_code();} 1093e519524SHoward Hinnant}; 1103e519524SHoward Hinnant 1113e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD 1123e519524SHoward Hinnant 1133e519524SHoward Hinnant#endif // _LIBCPP_TYPEINDEX 114