1 /* Traits for hashable types.
2 Copyright (C) 2014-2017 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
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
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/>. */
23 /* Helpful type for removing with free. */
25 template <typename Type
>
26 struct typed_free_remove
28 static inline void remove (Type
*p
);
32 /* Remove with free. */
34 template <typename Type
>
36 typed_free_remove
<Type
>::remove (Type
*p
)
41 /* Helpful type for removing with delete. */
43 template <typename Type
>
44 struct typed_delete_remove
46 static inline void remove (Type
*p
);
50 /* Remove with delete. */
52 template <typename Type
>
54 typed_delete_remove
<Type
>::remove (Type
*p
)
59 /* Helpful type for a no-op remove. */
61 template <typename Type
>
62 struct typed_noop_remove
64 static inline void remove (Type
&);
68 /* Remove doing nothing. */
70 template <typename Type
>
72 typed_noop_remove
<Type
>::remove (Type
&)
77 /* Hasher for integer type Type in which Empty is a spare value that can be
78 used to mark empty slots. If Deleted != Empty then Deleted is another
79 spare value that can be used for deleted slots; if Deleted == Empty then
80 hash table entries cannot be deleted. */
82 template <typename Type
, Type Empty
, Type Deleted
= Empty
>
83 struct int_hash
: typed_noop_remove
<Type
>
85 typedef Type value_type
;
86 typedef Type compare_type
;
88 static inline hashval_t
hash (value_type
);
89 static inline bool equal (value_type existing
, value_type candidate
);
90 static inline void mark_deleted (Type
&);
91 static inline void mark_empty (Type
&);
92 static inline bool is_deleted (Type
);
93 static inline bool is_empty (Type
);
96 template <typename Type
, Type Empty
, Type Deleted
>
98 int_hash
<Type
, Empty
, Deleted
>::hash (value_type x
)
103 template <typename Type
, Type Empty
, Type Deleted
>
105 int_hash
<Type
, Empty
, Deleted
>::equal (value_type x
, value_type y
)
110 template <typename Type
, Type Empty
, Type Deleted
>
112 int_hash
<Type
, Empty
, Deleted
>::mark_deleted (Type
&x
)
114 gcc_assert (Empty
!= Deleted
);
118 template <typename Type
, Type Empty
, Type Deleted
>
120 int_hash
<Type
, Empty
, Deleted
>::mark_empty (Type
&x
)
125 template <typename Type
, Type Empty
, Type Deleted
>
127 int_hash
<Type
, Empty
, Deleted
>::is_deleted (Type x
)
129 return Empty
!= Deleted
&& x
== Deleted
;
132 template <typename Type
, Type Empty
, Type Deleted
>
134 int_hash
<Type
, Empty
, Deleted
>::is_empty (Type x
)
139 /* Pointer hasher based on pointer equality. Other types of pointer hash
140 can inherit this and override the hash and equal functions with some
141 other form of equality (such as string equality). */
143 template <typename Type
>
146 typedef Type
*value_type
;
147 typedef Type
*compare_type
;
149 static inline hashval_t
hash (const value_type
&);
150 static inline bool equal (const value_type
&existing
,
151 const compare_type
&candidate
);
152 static inline void mark_deleted (Type
*&);
153 static inline void mark_empty (Type
*&);
154 static inline bool is_deleted (Type
*);
155 static inline bool is_empty (Type
*);
158 template <typename Type
>
160 pointer_hash
<Type
>::hash (const value_type
&candidate
)
162 /* This is a really poor hash function, but it is what the current code uses,
163 so I am reusing it to avoid an additional axis in testing. */
164 return (hashval_t
) ((intptr_t)candidate
>> 3);
167 template <typename Type
>
169 pointer_hash
<Type
>::equal (const value_type
&existing
,
170 const compare_type
&candidate
)
172 return existing
== candidate
;
175 template <typename Type
>
177 pointer_hash
<Type
>::mark_deleted (Type
*&e
)
179 e
= reinterpret_cast<Type
*> (1);
182 template <typename Type
>
184 pointer_hash
<Type
>::mark_empty (Type
*&e
)
189 template <typename Type
>
191 pointer_hash
<Type
>::is_deleted (Type
*e
)
193 return e
== reinterpret_cast<Type
*> (1);
196 template <typename Type
>
198 pointer_hash
<Type
>::is_empty (Type
*e
)
203 /* Hasher for "const char *" strings, using string rather than pointer
206 struct string_hash
: pointer_hash
<const char>
208 static inline hashval_t
hash (const char *);
209 static inline bool equal (const char *, const char *);
213 string_hash::hash (const char *id
)
215 return htab_hash_string (id
);
219 string_hash::equal (const char *id1
, const char *id2
)
221 return strcmp (id1
, id2
) == 0;
224 /* Remover and marker for entries in gc memory. */
229 static void remove (T
&) {}
234 extern void gt_ggc_mx (T
&);
241 extern void gt_pch_nx (T
&);
246 pch_nx (T
&p
, gt_pointer_operator op
, void *cookie
)
252 /* Remover and marker for "cache" entries in gc memory. These entries can
253 be deleted if there are no non-cache references to the data. */
256 struct ggc_cache_remove
: ggc_remove
<T
>
258 /* Entries are weakly held because this is for caches. */
259 static void ggc_mx (T
&) {}
262 keep_cache_entry (T
&e
)
264 return ggc_marked_p (e
) ? -1 : 0;
268 /* Traits for pointer elements that should not be freed when an element
271 template <typename T
>
272 struct nofree_ptr_hash
: pointer_hash
<T
>, typed_noop_remove
<T
*> {};
274 /* Traits for pointer elements that should be freed via free() when an
275 element is deleted. */
277 template <typename T
>
278 struct free_ptr_hash
: pointer_hash
<T
>, typed_free_remove
<T
> {};
280 /* Traits for pointer elements that should be freed via delete operand when an
281 element is deleted. */
283 template <typename T
>
284 struct delete_ptr_hash
: pointer_hash
<T
>, typed_delete_remove
<T
> {};
286 /* Traits for elements that point to gc memory. The pointed-to data
287 must be kept across collections. */
289 template <typename T
>
290 struct ggc_ptr_hash
: pointer_hash
<T
>, ggc_remove
<T
*> {};
292 /* Traits for elements that point to gc memory. The elements don't
293 in themselves keep the pointed-to data alive and they can be deleted
294 if the pointed-to data is going to be collected. */
296 template <typename T
>
297 struct ggc_cache_ptr_hash
: pointer_hash
<T
>, ggc_cache_remove
<T
*> {};
299 /* Traits for string elements that should not be freed when an element
302 struct nofree_string_hash
: string_hash
, typed_noop_remove
<const char *> {};
304 /* Traits for pairs of values, using the first to record empty and
307 template <typename T1
, typename T2
>
310 typedef std::pair
<typename
T1::value_type
,
311 typename
T2::value_type
> value_type
;
312 typedef std::pair
<typename
T1::compare_type
,
313 typename
T2::compare_type
> compare_type
;
315 static inline hashval_t
hash (const value_type
&);
316 static inline bool equal (const value_type
&, const compare_type
&);
317 static inline void remove (value_type
&);
318 static inline void mark_deleted (value_type
&);
319 static inline void mark_empty (value_type
&);
320 static inline bool is_deleted (const value_type
&);
321 static inline bool is_empty (const value_type
&);
324 template <typename T1
, typename T2
>
326 pair_hash
<T1
, T2
>::hash (const value_type
&x
)
328 return iterative_hash_hashval_t (T1::hash (x
.first
), T2::hash (x
.second
));
331 template <typename T1
, typename T2
>
333 pair_hash
<T1
, T2
>::equal (const value_type
&x
, const compare_type
&y
)
335 return T1::equal (x
.first
, y
.first
) && T2::equal (x
.second
, y
.second
);
338 template <typename T1
, typename T2
>
340 pair_hash
<T1
, T2
>::remove (value_type
&x
)
342 T1::remove (x
.first
);
343 T2::remove (x
.second
);
346 template <typename T1
, typename T2
>
348 pair_hash
<T1
, T2
>::mark_deleted (value_type
&x
)
350 T1::mark_deleted (x
.first
);
353 template <typename T1
, typename T2
>
355 pair_hash
<T1
, T2
>::mark_empty (value_type
&x
)
357 T1::mark_empty (x
.first
);
360 template <typename T1
, typename T2
>
362 pair_hash
<T1
, T2
>::is_deleted (const value_type
&x
)
364 return T1::is_deleted (x
.first
);
367 template <typename T1
, typename T2
>
369 pair_hash
<T1
, T2
>::is_empty (const value_type
&x
)
371 return T1::is_empty (x
.first
);
374 template <typename T
> struct default_hash_traits
: T
{};
376 template <typename T
>
377 struct default_hash_traits
<T
*> : ggc_ptr_hash
<T
> {};