1+ #include < core/containers/hashmap.h>
2+ #include " ../misc/allocator_watcher.h"
3+
4+ GTEST_TEST (hashmap, destructor_call_elements_destructors)
5+ {
6+
7+ using key_type = hud_test::SetBoolToTrueWhenDestroyed;
8+ using value_type = hud_test::SetBoolToTrueWhenDestroyed;
9+ using hashmap_type = hud::hashmap<key_type, value_type>;
10+
11+ const auto test = []()
12+ {
13+ hashmap_type map;
14+
15+ const usize COUNT = 4 ;
16+ i32 *dtor_assigned_key_counter = nullptr ;
17+ i32 *dtor_assigned_value_counter = nullptr ;
18+
19+ dtor_assigned_key_counter = hud::memory::allocate_array<i32 >(COUNT );
20+ hud::memory::set_memory_zero_safe (dtor_assigned_key_counter, COUNT * sizeof (i32 ));
21+ dtor_assigned_value_counter = hud::memory::allocate_array<i32 >(COUNT );
22+ hud::memory::set_memory_zero_safe (dtor_assigned_value_counter, COUNT * sizeof (i32 ));
23+
24+ hud_test::LeakArrayGuard guard_assigned_key_counter (dtor_assigned_key_counter, COUNT );
25+ hud_test::LeakArrayGuard guard_assigned_value_counter (dtor_assigned_value_counter, COUNT );
26+
27+ bool all_keys_destructor_are_not_called = true ;
28+ bool all_values_destructor_are_not_called = true ;
29+ {
30+ hashmap_type map;
31+ map.reserve (COUNT );
32+ for (i32 i = 0 ; i < COUNT ; i++)
33+ {
34+ map.add ({i, dtor_assigned_key_counter + i}, {i, dtor_assigned_value_counter + i});
35+ }
36+
37+ // Ensure element's destructors are not called
38+ for (i32 i = 0 ; i < COUNT ; i++)
39+ {
40+ // Should be accepted with is_transparent
41+ // const auto it = map.find(i);
42+ const auto it = map.find ({i, dtor_assigned_key_counter + i});
43+ if (*(it->key ().ptr ()) != 0 )
44+ {
45+ all_keys_destructor_are_not_called = false ;
46+ }
47+ if ((*it->value ().ptr ()) != 0 )
48+ {
49+ all_values_destructor_are_not_called = false ;
50+ }
51+ }
52+ }
53+
54+ return std::tuple {
55+ all_keys_destructor_are_not_called, // 0
56+ all_values_destructor_are_not_called // 1
57+ };
58+ };
59+
60+ // Non constant
61+ {
62+ const auto result = test ();
63+ hud_assert_true (std::get<0 >(result));
64+ hud_assert_true (std::get<1 >(result));
65+ }
66+
67+ // Constant
68+ {
69+ // constexpr auto result = test();
70+ // hud_assert_true(std::get<0>(result));
71+ // hud_assert_true(std::get<1>(result));
72+ }
73+ }
0 commit comments