1- // #include <core/containers/hashset.h>
2- // #include <core/traits/is_same.h>
3-
4- // GTEST_TEST(hashset, hashset_value_type_is_correct)
5- // {
6- // hud_assert_true((hud::is_same_v<i64, hud::hashset<i64>::key_type>));
7- // hud_assert_true((hud::is_same_v<const i64, hud::hashset<const i64>::key_type>));
8- // }
1+ #include < core/containers/hashset.h>
2+ #include < core/traits/is_same.h>
3+
4+ GTEST_TEST (hashset, hashmap_value_type_is_correct)
5+ {
6+ hud_assert_true ((hud::is_same_v<i64 , hud::hashset<i64 , i32 >::key_type>));
7+ hud_assert_true ((hud::is_same_v<const i64 , hud::hashset<const i64 , i32 >::key_type>));
8+ }
9+
10+ GTEST_TEST (hashset, metadata)
11+ {
12+ // Testing metadata byte filtering
13+ using control_type = hud::details::hashset::control_type;
14+ hud_assert_true (hud::details::hashset::control::is_byte_empty (hud::details::hashset::empty_byte));
15+ hud_assert_false (hud::details::hashset::control::is_byte_empty (hud::details::hashset::deleted_byte));
16+ hud_assert_false (hud::details::hashset::control::is_byte_empty (hud::details::hashset::sentinel_byte));
17+ hud_assert_false (hud::details::hashset::control::is_byte_empty (0x7F ));
18+
19+ hud_assert_false (hud::details::hashset::control::is_byte_deleted (hud::details::hashset::empty_byte));
20+ hud_assert_true (hud::details::hashset::control::is_byte_deleted (hud::details::hashset::deleted_byte));
21+ hud_assert_false (hud::details::hashset::control::is_byte_deleted (hud::details::hashset::sentinel_byte));
22+ hud_assert_false (hud::details::hashset::control::is_byte_deleted (0x7F ));
23+
24+ hud_assert_true (hud::details::hashset::control::is_byte_empty_or_deleted (hud::details::hashset::empty_byte));
25+ hud_assert_true (hud::details::hashset::control::is_byte_empty_or_deleted (hud::details::hashset::deleted_byte));
26+ hud_assert_false (hud::details::hashset::control::is_byte_empty_or_deleted (hud::details::hashset::sentinel_byte));
27+ hud_assert_false (hud::details::hashset::control::is_byte_empty_or_deleted (0x7F ));
28+
29+ hud_assert_false (hud::details::hashset::control::is_byte_full (hud::details::hashset::empty_byte));
30+ hud_assert_false (hud::details::hashset::control::is_byte_full (hud::details::hashset::deleted_byte));
31+ hud_assert_false (hud::details::hashset::control::is_byte_full (hud::details::hashset::sentinel_byte));
32+ hud_assert_true (hud::details::hashset::control::is_byte_full (0x7F ));
33+
34+ // Testing metadata group
35+ using group_type = hud::details::hashset::group_type;
36+ using mask_type = group_type::mask;
37+ using mask_empty_type = group_type::empty_mask;
38+ using mask_empty_or_deleted_type = group_type::empty_or_deleted_mask;
39+ using mask_full_type = group_type::full_mask;
40+
41+ u64 group_value = 0x80FEFF7F80FEFF7F ;
42+ group_type g {reinterpret_cast <control_type *>(&group_value)};
43+ hud_assert_eq (g.match (0x7F ), mask_type {0x0000008000000080 });
44+ hud_assert_eq (g.mask_of_empty_or_deleted_slot (), mask_empty_or_deleted_type {0x8080000080800000 });
45+ hud_assert_eq (g.mask_of_empty_slot (), mask_empty_type {0x8000000080000000 });
46+ hud_assert_eq (g.mask_of_full_slot (), mask_full_type {0x0000008000000080 });
47+
48+ // Test group at index
49+ // empty (0x80), deleted (0xFE), sentinel (0xFF)
50+ u64 two_group[2 ] = {0x7F00806DFE002A6D , 0x807B00800000FEFF };
51+ control_type *metadata_ptr (reinterpret_cast <control_type *>(&two_group));
52+ group_type g0 {metadata_ptr};
53+ // Read first group
54+ hud_assert_eq (g0.match (0x7F ), mask_type {0x8000000000000000 });
55+ hud_assert_eq (g0.match (0x2A ), mask_type {0x0000000000008000 });
56+ hud_assert_eq (g0.match (0x6D ), mask_type {0x0000008000000080 });
57+ hud_assert_eq (g0.mask_of_empty_or_deleted_slot (), mask_empty_or_deleted_type {0x0000800080000000 });
58+ hud_assert_eq (g0.mask_of_empty_slot (), mask_empty_type {0x0000800000000000 });
59+ hud_assert_eq (g0.mask_of_full_slot (), mask_full_type {0x8080008000808080 });
60+
61+ group_type g1 {metadata_ptr + group_type::SLOT_PER_GROUP * 1 };
62+ // Read second group
63+ hud_assert_eq (g1.match (0x7B ), mask_type {0x0080000000000000 });
64+ hud_assert_eq (g1.mask_of_empty_or_deleted_slot (), mask_empty_or_deleted_type {0x8000008000008000 });
65+ hud_assert_eq (g1.mask_of_empty_slot (), mask_empty_type {0x8000008000000000 });
66+ hud_assert_eq (g1.mask_of_full_slot (), mask_full_type {0x0080800080800000 });
67+
68+ // Test find with group and iteration
69+ // Find the 2 indices of 0x6D in the group and iterate over it
70+ // Expect to have index 0 and 4 in the group 0x7F00806DFE002A6D
71+ group_type::mask h2_match_mask = g0.match (0x6D );
72+ u32 indices[2 ] = {hud::u32_max, hud::u32_max};
73+ u32 current_index = 0 ;
74+ for (u32 value : h2_match_mask)
75+ {
76+ hud_assert_ne (current_index, 2 );
77+ indices[current_index] = value;
78+ ++current_index;
79+ }
80+ hud_assert_eq (indices[0 ], 0 );
81+ hud_assert_eq (indices[1 ], 4 );
82+ }
83+
84+ GTEST_TEST (hashset, count_return_count_of_element)
85+ {
86+ using type = usize;
87+ using HashMapType = hud::hashset<type>;
88+
89+ const auto test = []()
90+ {
91+ HashMapType set;
92+
93+ // Count return 0 if array is empty
94+ bool empty_ok = set.count () == 0 ;
95+
96+ // Count return number of element if not empty
97+ constexpr usize COUNT = 256 ;
98+ for (usize value = 0 ; value < COUNT; value++)
99+ {
100+ set.add (value);
101+ }
102+ bool return_correct_count = set.count () == COUNT;
103+
104+ // Count return number of element after remove
105+ // Remove half
106+ for (usize value = 0 ; value < COUNT; value += 2 )
107+ {
108+ set.remove (value);
109+ }
110+ bool return_correct_count_after_erase_some = (set.count () == COUNT / 2 );
111+ return std::tuple {empty_ok, return_correct_count, return_correct_count_after_erase_some};
112+ };
113+
114+ // Non constant
115+ {
116+ const auto result = test ();
117+ hud_assert_true (std::get<0 >(result));
118+ hud_assert_true (std::get<1 >(result));
119+ hud_assert_true (std::get<2 >(result));
120+ }
121+
122+ // Constant
123+ {
124+ constexpr auto result = test ();
125+ hud_assert_true (std::get<0 >(result));
126+ hud_assert_true (std::get<1 >(result));
127+ hud_assert_true (std::get<2 >(result));
128+ }
129+ }
0 commit comments