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 class hash_map_test_val_t
114 hash_map_test_val_t ()
120 hash_map_test_val_t (const hash_map_test_val_t
&)
126 hash_map_test_val_t
& operator= (const hash_map_test_val_t
&)
132 ~hash_map_test_val_t ()
134 gcc_assert (ptr
== &ptr
);
147 test_map_of_type_with_ctor_and_dtor ()
149 typedef hash_map
<void *, val_t
> Map
;
152 /* Test default ctor. */
157 ASSERT_TRUE (val_t::ndefault
== 0);
158 ASSERT_TRUE (val_t::ncopy
== 0);
159 ASSERT_TRUE (val_t::nassign
== 0);
160 ASSERT_TRUE (val_t::ndtor
== 0);
163 /* Test single insertion. */
169 ASSERT_TRUE (val_t::ndefault
+ val_t::ncopy
== val_t::ndtor
);
172 /* Test copy ctor. */
175 val_t
&rv1
= m1
.get_or_insert (p
);
177 int ncopy
= val_t::ncopy
;
178 int nassign
= val_t::nassign
;
181 val_t
*pv2
= m2
.get (p
);
183 ASSERT_TRUE (ncopy
+ 1 == val_t::ncopy
);
184 ASSERT_TRUE (nassign
== val_t::nassign
);
186 ASSERT_TRUE (&rv1
!= pv2
);
187 ASSERT_TRUE (pv2
->ptr
== &pv2
->ptr
);
190 ASSERT_TRUE (val_t::ndefault
+ val_t::ncopy
== val_t::ndtor
);
192 #if 0 /* Avoid testing until bug 90959 is fixed. */
194 /* Test copy assignment into an empty map. */
197 val_t
&rv1
= m1
.get_or_insert (p
);
199 int ncopy
= val_t::ncopy
;
200 int nassign
= val_t::nassign
;
204 val_t
*pv2
= m2
.get (p
);
206 ASSERT_TRUE (ncopy
== val_t::ncopy
);
207 ASSERT_TRUE (nassign
+ 1 == val_t::nassign
);
209 ASSERT_TRUE (&rv1
!= pv2
);
210 ASSERT_TRUE (pv2
->ptr
== &pv2
->ptr
);
213 ASSERT_TRUE (val_t::ndefault
+ val_t::ncopy
== val_t::ndtor
);
219 void *p
= &p
, *q
= &q
;
220 val_t
&v1
= m
.get_or_insert (p
);
221 val_t
&v2
= m
.get_or_insert (q
);
223 ASSERT_TRUE (v1
.ptr
== &v1
.ptr
&& &v2
.ptr
== v2
.ptr
);
226 ASSERT_TRUE (val_t::ndefault
+ val_t::ncopy
== val_t::ndtor
);
230 void *p
= &p
, *q
= &q
;
236 ASSERT_TRUE (val_t::ndefault
+ val_t::ncopy
== val_t::ndtor
);
240 /* Run all of the selftests within this file. */
243 hash_map_tests_c_tests ()
245 test_map_of_strings_to_int ();
246 test_map_of_type_with_ctor_and_dtor ();
249 } // namespace selftest
251 #endif /* CHECKING_P */