1 /* Unit tests for hash-set.h.
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
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/>. */
22 #include "coretypes.h"
32 /* Construct a hash_set <const char *> and verify that various operations
36 test_set_of_strings ()
38 hash_set
<const char *> s
;
39 ASSERT_EQ (0, s
.elements ());
41 const char *red
= "red";
42 const char *green
= "green";
43 const char *blue
= "blue";
45 ASSERT_EQ (false, s
.contains (red
));
47 for (hash_set
<const char *>::iterator it
= s
.begin (); it
!= s
.end (); ++it
)
48 ASSERT_EQ (true, false);
50 /* Populate the hash_set. */
51 ASSERT_EQ (false, s
.add (red
));
52 ASSERT_EQ (false, s
.add (green
));
53 ASSERT_EQ (false, s
.add (blue
));
54 ASSERT_EQ (true, s
.add (green
));
56 /* Verify that the values are now within the set. */
57 ASSERT_EQ (true, s
.contains (red
));
58 ASSERT_EQ (true, s
.contains (green
));
59 ASSERT_EQ (true, s
.contains (blue
));
60 ASSERT_EQ (3, s
.elements ());
64 ASSERT_EQ (false, s
.contains (red
));
65 ASSERT_EQ (true, s
.contains (green
));
66 ASSERT_EQ (true, s
.contains (blue
));
67 ASSERT_EQ (2, s
.elements ());
70 ASSERT_EQ (false, s
.contains (red
));
71 ASSERT_EQ (true, s
.contains (green
));
72 ASSERT_EQ (true, s
.contains (blue
));
73 ASSERT_EQ (2, s
.elements ());
76 for (hash_set
<const char *>::iterator it
= s
.begin (); it
!= s
.end (); ++it
)
80 ASSERT_EQ (*it
, blue
);
81 ASSERT_EQ (seen
& (1 << n
), 0);
86 hash_set
<const char *, true> t
;
87 ASSERT_EQ (0, t
.elements ());
89 ASSERT_EQ (false, t
.contains (red
));
91 for (hash_set
<const char *, true>::iterator it
= t
.begin ();
93 ASSERT_EQ (true, false);
95 /* Populate the hash_set. */
96 ASSERT_EQ (false, t
.add (red
));
97 ASSERT_EQ (false, t
.add (green
));
98 ASSERT_EQ (false, t
.add (blue
));
99 ASSERT_EQ (true, t
.add (green
));
101 /* Verify that the values are now within the set. */
102 ASSERT_EQ (true, t
.contains (red
));
103 ASSERT_EQ (true, t
.contains (green
));
104 ASSERT_EQ (true, t
.contains (blue
));
105 ASSERT_EQ (3, t
.elements ());
108 for (hash_set
<const char *, true>::iterator it
= t
.begin ();
109 it
!= t
.end (); ++it
)
114 else if (*it
== blue
)
117 ASSERT_EQ (*it
, red
);
118 ASSERT_EQ (seen
& (1 << n
), 0);
125 ASSERT_EQ (false, t
.contains (red
));
126 ASSERT_EQ (true, t
.contains (green
));
127 ASSERT_EQ (true, t
.contains (blue
));
128 ASSERT_EQ (2, t
.elements ());
131 ASSERT_EQ (false, t
.contains (red
));
132 ASSERT_EQ (true, t
.contains (green
));
133 ASSERT_EQ (true, t
.contains (blue
));
134 ASSERT_EQ (2, t
.elements ());
137 typedef class hash_set_test_value_t
145 hash_set_test_value_t (int v
= 1): pval (&val
), val (v
)
150 hash_set_test_value_t (const hash_set_test_value_t
&rhs
)
151 : pval (&val
), val (rhs
.val
)
156 hash_set_test_value_t
& operator= (const hash_set_test_value_t
&rhs
)
163 ~hash_set_test_value_t ()
165 /* Verify that the value hasn't been corrupted. */
166 gcc_assert (*pval
> 0);
167 gcc_assert (pval
== &val
);
181 struct value_hash_traits
: int_hash
<int, -1, -2>
183 typedef int_hash
<int, -1, -2> base_type
;
184 typedef val_t value_type
;
185 typedef value_type compare_type
;
187 static hashval_t
hash (const value_type
&v
)
189 return base_type::hash (v
.val
);
192 static bool equal (const value_type
&a
, const compare_type
&b
)
194 return base_type::equal (a
.val
, b
.val
);
197 static void mark_deleted (value_type
&v
)
199 base_type::mark_deleted (v
.val
);
202 static const bool empty_zero_p
= false;
204 static void mark_empty (value_type
&v
)
206 base_type::mark_empty (v
.val
);
209 static bool is_deleted (const value_type
&v
)
211 return base_type::is_deleted (v
.val
);
214 static bool is_empty (const value_type
&v
)
216 return base_type::is_empty (v
.val
);
219 static void remove (value_type
&v
)
226 test_set_of_type_with_ctor_and_dtor ()
228 typedef hash_set
<val_t
, false, value_hash_traits
> Set
;
235 ASSERT_TRUE (val_t::ndefault
== 0);
236 ASSERT_TRUE (val_t::ncopy
== 0);
237 ASSERT_TRUE (val_t::nassign
== 0);
238 ASSERT_TRUE (val_t::ndtor
== 0);
242 ASSERT_EQ (false, s
.add (val_t ()));
243 ASSERT_EQ (true, 1 == s
.elements ());
246 ASSERT_TRUE (val_t::ndefault
+ val_t::ncopy
== val_t::ndtor
);
250 ASSERT_EQ (false, s
.add (val_t ()));
251 ASSERT_EQ (true, s
.add (val_t ()));
252 ASSERT_EQ (true, 1 == s
.elements ());
255 ASSERT_TRUE (val_t::ndefault
+ val_t::ncopy
== val_t::ndtor
);
259 val_t
v1 (1), v2 (2), v3 (3);
260 int ndefault
= val_t::ndefault
;
261 int nassign
= val_t::nassign
;
263 ASSERT_EQ (false, s
.add (v1
));
264 ASSERT_EQ (true, s
.contains (v1
));
265 ASSERT_EQ (true, 1 == s
.elements ());
267 ASSERT_EQ (false, s
.add (v2
));
268 ASSERT_EQ (true, s
.contains (v2
));
269 ASSERT_EQ (true, 2 == s
.elements ());
271 ASSERT_EQ (false, s
.add (v3
));
272 ASSERT_EQ (true, s
.contains (v3
));
273 ASSERT_EQ (true, 3 == s
.elements ());
275 ASSERT_EQ (true, s
.add (v2
));
276 ASSERT_EQ (true, s
.contains (v2
));
277 ASSERT_EQ (true, 3 == s
.elements ());
280 ASSERT_EQ (true, 2 == s
.elements ());
282 ASSERT_EQ (true, 1 == s
.elements ());
284 /* Verify that no default ctors or assignment operators have
286 ASSERT_EQ (true, ndefault
== val_t::ndefault
);
287 ASSERT_EQ (true, nassign
== val_t::nassign
);
290 ASSERT_TRUE (val_t::ndefault
+ val_t::ncopy
== val_t::ndtor
);
293 /* Run all of the selftests within this file. */
296 hash_set_tests_cc_tests ()
298 test_set_of_strings ();
299 test_set_of_type_with_ctor_and_dtor ();
302 } // namespace selftest
304 #endif /* #if CHECKING_P */