Objective-C, NeXT, v2: Correct a regression in code-gen.
[official-gcc.git] / gcc / hash-map-traits.h
blobf2cd2e02b5dcc538361b11a994b9914ecfdfbd90
1 /* A hash map traits.
2 Copyright (C) 2015-2024 Free Software Foundation, Inc.
4 This file is part of GCC.
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
9 version.
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 for more details.
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>. */
20 #ifndef HASH_MAP_TRAITS_H
21 #define HASH_MAP_TRAITS_H
23 /* Bacause mem-stats.h uses default hashmap traits, we have to
24 put the class to this separate header file. */
26 #include "hash-traits.h"
28 /* Implement hash_map traits for a key with hash traits H. Empty and
29 deleted map entries are represented as empty and deleted keys. */
31 template <typename H, typename Value>
32 struct simple_hashmap_traits
34 typedef typename H::value_type key_type;
35 static const bool maybe_mx = true;
36 static inline hashval_t hash (const key_type &);
37 static inline bool equal_keys (const key_type &, const key_type &);
38 template <typename T> static inline void remove (T &);
39 static const bool empty_zero_p = H::empty_zero_p;
40 template <typename T> static inline bool is_empty (const T &);
41 template <typename T> static inline bool is_deleted (const T &);
42 template <typename T> static inline void mark_empty (T &);
43 template <typename T> static inline void mark_deleted (T &);
46 template <typename H, typename Value>
47 inline hashval_t
48 simple_hashmap_traits <H, Value>::hash (const key_type &h)
50 return H::hash (h);
53 template <typename H, typename Value>
54 inline bool
55 simple_hashmap_traits <H, Value>::equal_keys (const key_type &k1,
56 const key_type &k2)
58 return H::equal (k1, k2);
61 template <typename H, typename Value>
62 template <typename T>
63 inline void
64 simple_hashmap_traits <H, Value>::remove (T &entry)
66 H::remove (entry.m_key);
67 entry.m_value.~Value ();
70 template <typename H, typename Value>
71 template <typename T>
72 inline bool
73 simple_hashmap_traits <H, Value>::is_empty (const T &entry)
75 return H::is_empty (entry.m_key);
78 template <typename H, typename Value>
79 template <typename T>
80 inline bool
81 simple_hashmap_traits <H, Value>::is_deleted (const T &entry)
83 return H::is_deleted (entry.m_key);
86 template <typename H, typename Value>
87 template <typename T>
88 inline void
89 simple_hashmap_traits <H, Value>::mark_empty (T &entry)
91 H::mark_empty (entry.m_key);
94 template <typename H, typename Value>
95 template <typename T>
96 inline void
97 simple_hashmap_traits <H, Value>::mark_deleted (T &entry)
99 H::mark_deleted (entry.m_key);
102 template <typename H, typename Value>
103 struct simple_cache_map_traits: public simple_hashmap_traits<H,Value>
105 static const bool maybe_mx = false;
108 /* Implement traits for a hash_map with keys of type Key and values of
109 type Value for cases in which the key cannot represent empty and
110 deleted slots. Instead record empty and deleted entries in Value. */
112 template <typename Key, typename Value>
113 struct unbounded_hashmap_traits
115 typedef typename Key::value_type key_type;
117 static hashval_t hash (const typename Key::value_type &);
118 static bool equal_keys (const typename Key::value_type &,
119 const typename Key::compare_type &);
121 template <typename T> static inline void remove (T &);
122 static const bool empty_zero_p = default_hash_traits <Value>::empty_zero_p;
123 template <typename T> static inline bool is_empty (const T &);
124 template <typename T> static inline bool is_deleted (const T &);
125 template <typename T> static inline void mark_empty (T &);
126 template <typename T> static inline void mark_deleted (T &);
129 template <typename Key, typename Value>
130 inline hashval_t
131 unbounded_hashmap_traits <Key, Value>
132 ::hash (const typename Key::value_type &key)
134 return Key::hash (key);
137 template <typename Key, typename Value>
138 inline bool
139 unbounded_hashmap_traits <Key, Value>
140 ::equal_keys (const typename Key::value_type &x,
141 const typename Key::compare_type &y)
143 return Key::equal (x, y);
146 template <typename Key, typename Value>
147 template <typename T>
148 inline void
149 unbounded_hashmap_traits <Key, Value>::remove (T &entry)
151 default_hash_traits <Value>::remove (entry.m_value);
154 template <typename Key, typename Value>
155 template <typename T>
156 inline bool
157 unbounded_hashmap_traits <Key, Value>::is_empty (const T &entry)
159 return default_hash_traits <Value>::is_empty (entry.m_value);
162 template <typename Key, typename Value>
163 template <typename T>
164 inline bool
165 unbounded_hashmap_traits <Key, Value>::is_deleted (const T &entry)
167 return default_hash_traits <Value>::is_deleted (entry.m_value);
170 template <typename Key, typename Value>
171 template <typename T>
172 inline void
173 unbounded_hashmap_traits <Key, Value>::mark_empty (T &entry)
175 default_hash_traits <Value>::mark_empty (entry.m_value);
178 template <typename Key, typename Value>
179 template <typename T>
180 inline void
181 unbounded_hashmap_traits <Key, Value>::mark_deleted (T &entry)
183 default_hash_traits <Value>::mark_deleted (entry.m_value);
186 /* Implement traits for a hash_map from integer type Key to Value in
187 cases where Key has no spare values for recording empty and deleted
188 slots. */
190 template <typename Key, typename Value>
191 using unbounded_int_hashmap_traits
192 = unbounded_hashmap_traits <int_hash_base <Key>, Value>;
194 #endif // HASH_MAP_TRAITS_H