1 | // -*- C++ -*- |
---|---|
2 | //===-------------------------- typeindex ---------------------------------===// |
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_TYPEINDEX |
11 | #define _LIBCPP_TYPEINDEX |
12 | |
13 | /* |
14 | |
15 | typeindex synopsis |
16 | |
17 | namespace std |
18 | { |
19 | |
20 | class type_index |
21 | { |
22 | public: |
23 | type_index(const type_info& rhs) noexcept; |
24 | |
25 | bool operator==(const type_index& rhs) const noexcept; |
26 | bool operator!=(const type_index& rhs) const noexcept; |
27 | bool operator< (const type_index& rhs) const noexcept; |
28 | bool operator<=(const type_index& rhs) const noexcept; |
29 | bool operator> (const type_index& rhs) const noexcept; |
30 | bool operator>=(const type_index& rhs) const noexcept; |
31 | |
32 | size_t hash_code() const noexcept; |
33 | const char* name() const noexcept; |
34 | }; |
35 | |
36 | template <> |
37 | struct hash<type_index> |
38 | : public unary_function<type_index, size_t> |
39 | { |
40 | size_t operator()(type_index index) const noexcept; |
41 | }; |
42 | |
43 | } // std |
44 | |
45 | */ |
46 | |
47 | #include <__config> |
48 | #include <typeinfo> |
49 | #include <__functional_base> |
50 | |
51 | #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) |
52 | #pragma GCC system_header |
53 | #endif |
54 | |
55 | _LIBCPP_BEGIN_NAMESPACE_STD |
56 | |
57 | class _LIBCPP_TEMPLATE_VIS type_index |
58 | { |
59 | const type_info* __t_; |
60 | public: |
61 | _LIBCPP_INLINE_VISIBILITY |
62 | type_index(const type_info& __y) _NOEXCEPT : __t_(&__y) {} |
63 | |
64 | _LIBCPP_INLINE_VISIBILITY |
65 | bool operator==(const type_index& __y) const _NOEXCEPT |
66 | {return *__t_ == *__y.__t_;} |
67 | _LIBCPP_INLINE_VISIBILITY |
68 | bool operator!=(const type_index& __y) const _NOEXCEPT |
69 | {return *__t_ != *__y.__t_;} |
70 | _LIBCPP_INLINE_VISIBILITY |
71 | bool operator< (const type_index& __y) const _NOEXCEPT |
72 | {return __t_->before(*__y.__t_);} |
73 | _LIBCPP_INLINE_VISIBILITY |
74 | bool operator<=(const type_index& __y) const _NOEXCEPT |
75 | {return !__y.__t_->before(*__t_);} |
76 | _LIBCPP_INLINE_VISIBILITY |
77 | bool operator> (const type_index& __y) const _NOEXCEPT |
78 | {return __y.__t_->before(*__t_);} |
79 | _LIBCPP_INLINE_VISIBILITY |
80 | bool operator>=(const type_index& __y) const _NOEXCEPT |
81 | {return !__t_->before(*__y.__t_);} |
82 | |
83 | _LIBCPP_INLINE_VISIBILITY |
84 | size_t hash_code() const _NOEXCEPT {return __t_->hash_code();} |
85 | _LIBCPP_INLINE_VISIBILITY |
86 | const char* name() const _NOEXCEPT {return __t_->name();} |
87 | }; |
88 | |
89 | template <class _Tp> struct _LIBCPP_TEMPLATE_VIS hash; |
90 | |
91 | template <> |
92 | struct _LIBCPP_TEMPLATE_VIS hash<type_index> |
93 | : public unary_function<type_index, size_t> |
94 | { |
95 | _LIBCPP_INLINE_VISIBILITY |
96 | size_t operator()(type_index __index) const _NOEXCEPT |
97 | {return __index.hash_code();} |
98 | }; |
99 | |
100 | _LIBCPP_END_NAMESPACE_STD |
101 | |
102 | #endif // _LIBCPP_TYPEINDEX |
103 |