1 /* Unit tests for hash-map.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"
26 #include "fixed-value.h"
30 #include "tree-core.h"
31 #include "stor-layout.h"
33 #include "stringpool.h"
40 /* Construct a hash_map <const char *, int> and verify that
41 various operations work correctly. */
44 test_map_of_strings_to_int ()
46 hash_map
<const char *, int> m
;
48 const char *ostrich
= "ostrich";
49 const char *elephant
= "elephant";
50 const char *ant
= "ant";
51 const char *spider
= "spider";
52 const char *millipede
= "Illacme plenipes";
53 const char *eric
= "half a bee";
55 /* A fresh hash_map should be empty. */
56 ASSERT_TRUE (m
.is_empty ());
57 ASSERT_EQ (NULL
, m
.get (ostrich
));
59 /* Populate the hash_map. */
60 ASSERT_EQ (false, m
.put (ostrich
, 2));
61 ASSERT_EQ (false, m
.put (elephant
, 4));
62 ASSERT_EQ (false, m
.put (ant
, 6));
63 ASSERT_EQ (false, m
.put (spider
, 8));
64 ASSERT_EQ (false, m
.put (millipede
, 750));
65 ASSERT_EQ (false, m
.put (eric
, 3));
67 /* Verify that we can recover the stored values. */
68 ASSERT_EQ (6, m
.elements ());
69 ASSERT_EQ (2, *m
.get (ostrich
));
70 ASSERT_EQ (4, *m
.get (elephant
));
71 ASSERT_EQ (6, *m
.get (ant
));
72 ASSERT_EQ (8, *m
.get (spider
));
73 ASSERT_EQ (750, *m
.get (millipede
));
74 ASSERT_EQ (3, *m
.get (eric
));
76 /* Verify removing an item. */
78 ASSERT_EQ (5, m
.elements ());
79 ASSERT_EQ (NULL
, m
.get (eric
));
82 ASSERT_EQ (5, m
.elements ());
83 ASSERT_EQ (NULL
, m
.get (eric
));
85 /* A plain char * key is hashed based on its value (address), rather
86 than the string it points to. */
87 char *another_ant
= static_cast <char *> (xcalloc (4, 1));
92 ASSERT_NE (ant
, another_ant
);
93 unsigned prev_size
= m
.elements ();
94 ASSERT_EQ (false, m
.put (another_ant
, 7));
95 ASSERT_EQ (prev_size
+ 1, m
.elements ());
97 /* Need to use string_hash or nofree_string_hash key types to hash
98 based on the string contents. */
99 hash_map
<nofree_string_hash
, int> string_map
;
100 ASSERT_EQ (false, string_map
.put (ant
, 1));
101 ASSERT_EQ (1, string_map
.elements ());
102 ASSERT_EQ (true, string_map
.put (another_ant
, 5));
103 ASSERT_EQ (1, string_map
.elements ());
106 typedef struct hash_map_test_val_t
113 hash_map_test_val_t ()
119 hash_map_test_val_t (const hash_map_test_val_t
&)
125 hash_map_test_val_t
& operator= (const hash_map_test_val_t
&)
131 ~hash_map_test_val_t ()
133 gcc_assert (ptr
== &ptr
);
146 test_map_of_type_with_ctor_and_dtor ()
148 typedef hash_map
<void *, val_t
> Map
;
151 /* Test default ctor. */
156 ASSERT_TRUE (val_t::ndefault
== 0);
157 ASSERT_TRUE (val_t::ncopy
== 0);
158 ASSERT_TRUE (val_t::nassign
== 0);
159 ASSERT_TRUE (val_t::ndtor
== 0);
162 /* Test single insertion. */
168 ASSERT_TRUE (val_t::ndefault
+ val_t::ncopy
== val_t::ndtor
);
171 /* Test copy ctor. */
174 val_t
&rv1
= m1
.get_or_insert (p
);
176 int ncopy
= val_t::ncopy
;
177 int nassign
= val_t::nassign
;
180 val_t
*pv2
= m2
.get (p
);
182 ASSERT_TRUE (ncopy
+ 1 == val_t::ncopy
);
183 ASSERT_TRUE (nassign
== val_t::nassign
);
185 ASSERT_TRUE (&rv1
!= pv2
);
186 ASSERT_TRUE (pv2
->ptr
== &pv2
->ptr
);
189 ASSERT_TRUE (val_t::ndefault
+ val_t::ncopy
== val_t::ndtor
);
191 #if 0 /* Avoid testing until bug 90959 is fixed. */
193 /* Test copy assignment into an empty map. */
196 val_t
&rv1
= m1
.get_or_insert (p
);
198 int ncopy
= val_t::ncopy
;
199 int nassign
= val_t::nassign
;
203 val_t
*pv2
= m2
.get (p
);
205 ASSERT_TRUE (ncopy
== val_t::ncopy
);
206 ASSERT_TRUE (nassign
+ 1 == val_t::nassign
);
208 ASSERT_TRUE (&rv1
!= pv2
);
209 ASSERT_TRUE (pv2
->ptr
== &pv2
->ptr
);
212 ASSERT_TRUE (val_t::ndefault
+ val_t::ncopy
== val_t::ndtor
);
218 void *p
= &p
, *q
= &q
;
219 val_t
&v1
= m
.get_or_insert (p
);
220 val_t
&v2
= m
.get_or_insert (q
);
222 ASSERT_TRUE (v1
.ptr
== &v1
.ptr
&& &v2
.ptr
== v2
.ptr
);
225 ASSERT_TRUE (val_t::ndefault
+ val_t::ncopy
== val_t::ndtor
);
229 void *p
= &p
, *q
= &q
;
235 ASSERT_TRUE (val_t::ndefault
+ val_t::ncopy
== val_t::ndtor
);
239 /* Run all of the selftests within this file. */
242 hash_map_tests_c_tests ()
244 test_map_of_strings_to_int ();
245 test_map_of_type_with_ctor_and_dtor ();
248 } // namespace selftest
250 #endif /* CHECKING_P */