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