1 /* Unit tests for hash-set.h.
2 Copyright (C) 2015-2019 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 void mark_empty (value_type
&v
)
204 base_type::mark_empty (v
.val
);
207 static bool is_deleted (const value_type
&v
)
209 return base_type::is_deleted (v
.val
);
212 static bool is_empty (const value_type
&v
)
214 return base_type::is_empty (v
.val
);
217 static void remove (value_type
&v
)
224 test_set_of_type_with_ctor_and_dtor ()
226 typedef hash_set
<val_t
, false, value_hash_traits
> Set
;
233 ASSERT_TRUE (val_t::ndefault
== 0);
234 ASSERT_TRUE (val_t::ncopy
== 0);
235 ASSERT_TRUE (val_t::nassign
== 0);
236 ASSERT_TRUE (val_t::ndtor
== 0);
240 ASSERT_EQ (false, s
.add (val_t ()));
241 ASSERT_EQ (true, 1 == s
.elements ());
244 ASSERT_TRUE (val_t::ndefault
+ val_t::ncopy
== val_t::ndtor
);
248 ASSERT_EQ (false, s
.add (val_t ()));
249 ASSERT_EQ (true, s
.add (val_t ()));
250 ASSERT_EQ (true, 1 == s
.elements ());
253 ASSERT_TRUE (val_t::ndefault
+ val_t::ncopy
== val_t::ndtor
);
257 val_t
v1 (1), v2 (2), v3 (3);
258 int ndefault
= val_t::ndefault
;
259 int nassign
= val_t::nassign
;
261 ASSERT_EQ (false, s
.add (v1
));
262 ASSERT_EQ (true, s
.contains (v1
));
263 ASSERT_EQ (true, 1 == s
.elements ());
265 ASSERT_EQ (false, s
.add (v2
));
266 ASSERT_EQ (true, s
.contains (v2
));
267 ASSERT_EQ (true, 2 == s
.elements ());
269 ASSERT_EQ (false, s
.add (v3
));
270 ASSERT_EQ (true, s
.contains (v3
));
271 ASSERT_EQ (true, 3 == s
.elements ());
273 ASSERT_EQ (true, s
.add (v2
));
274 ASSERT_EQ (true, s
.contains (v2
));
275 ASSERT_EQ (true, 3 == s
.elements ());
278 ASSERT_EQ (true, 2 == s
.elements ());
280 ASSERT_EQ (true, 1 == s
.elements ());
282 /* Verify that no default ctors or assignment operators have
284 ASSERT_EQ (true, ndefault
== val_t::ndefault
);
285 ASSERT_EQ (true, nassign
== val_t::nassign
);
288 ASSERT_TRUE (val_t::ndefault
+ val_t::ncopy
== val_t::ndtor
);
291 /* Run all of the selftests within this file. */
294 hash_set_tests_c_tests ()
296 test_set_of_strings ();
297 test_set_of_type_with_ctor_and_dtor ();
300 } // namespace selftest
302 #endif /* #if CHECKING_P */