Skip to content

Commit 4d31723

Browse files
author
Julian LALU
committed
Update hashmap
1 parent 7c1ead2 commit 4d31723

File tree

4 files changed

+99
-113
lines changed

4 files changed

+99
-113
lines changed

interface/core/containers/tuple.h

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -947,21 +947,11 @@ namespace hud
947947
return hud::forward<const type_t>(static_cast<const details::tuple_leaf<idx_to_reach, type_t> &&>(t).content);
948948
}
949949

950-
// template <size_t _Index, class... _Types>
951-
// _NODISCARD constexpr auto&& _Tuple_get(tuple<_Types...>&& _Tuple) noexcept {
952-
// // used by pair's piecewise constructor
953-
// using _Ty = tuple_element_t<_Index, tuple<_Types...>>;
954-
// using _Ttype = typename tuple_element<_Index, tuple<_Types...>>::_Ttype;
955-
// return static_cast<_Ty&&>(static_cast<_Ttype&>(_Tuple)._Myfirst._Val);
956-
// }
957-
958950
template<usize idx_to_reach, typename... types_t>
959-
[[nodiscard]] constexpr auto &&piecewise_get(hud::tuple<types_t...> &&tuple) noexcept
951+
[[nodiscard]] constexpr auto &&piecewise_get(hud::tuple<types_t...> &&t) noexcept
960952
{
961953
using type_t = tuple_element_t<idx_to_reach, hud::tuple<types_t...>>;
962-
return static_cast<type_t &&>(static_cast<details::tuple_leaf<idx_to_reach, type_t> &>(tuple).content);
963-
// using _Ttype = typename<_Index, tuple<_Types...>>::_Ttype;
964-
// return static_cast<type_t &&>(static_cast<type_t &>(tuple)._Myfirst._Val);
954+
return static_cast<type_t &&>(static_cast<details::tuple_leaf<idx_to_reach, type_t> &>(t).content);
965955
}
966956

967957
/**

test/hashmap/hashmap_add.cpp

Lines changed: 74 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -5056,78 +5056,78 @@ GTEST_TEST(hashmap, add_by_piecewise_construct_bitwise_different_type)
50565056

50575057
GTEST_TEST(hashmap, add_by_piecewise_construct_non_bitwise_same_type)
50585058
{
5059-
// using key_type = hud_test::non_bitwise_type;
5060-
// using value_type = hud_test::non_bitwise_type;
5061-
// using hashmap_type = hud::hashmap<key_type, value_type, hud::hash_64<key_type>, hud::equal<key_type>, hud_test::allocator_watcher<1>>;
5062-
5063-
// static_assert(hud::is_hashable_64_v<key_type, decltype(hud::forward_as_tuple(1, (i32 *)nullptr))>);
5064-
// static_assert(hud::is_hashable_64_v<key_type, decltype(hud::forward_as_tuple(1, (i32 *)nullptr))>);
5065-
// static_assert(hud::is_comparable_with_equal_v<key_type, decltype(hud::forward_as_tuple(1, (i32 *)nullptr))>);
5066-
// const auto test = []()
5067-
// {
5068-
// constexpr usize reserved_size = 2;
5069-
// i32 ptr[2];
5070-
// hashmap_type map;
5071-
// map.reserve(reserved_size);
5072-
5073-
// const auto it = map.add(hud::tag_piecewise_construct, hud::forward_as_tuple(1, ptr), hud::forward_as_tuple(2, ptr + 1));
5074-
5075-
// return std::tuple {
5076-
// map.count() == 1, // 0
5077-
// it->key().constructor_count() == 1, // 1
5078-
// it->key().move_constructor_count() == 0, // 2
5079-
// it->key().copy_constructor_count() == 0, // 3
5080-
// it->key().move_assign_count() == 0, // 4
5081-
// it->key().copy_assign_count() == 0, // 5
5082-
// it->key().id() == 1, // 6
5083-
// it->key().destructor_counter() == ptr, // 7
5084-
// it->value().constructor_count() == 1, // 8
5085-
// it->value().move_constructor_count() == 0, // 9
5086-
// it->value().copy_constructor_count() == 0, // 10
5087-
// it->value().move_assign_count() == 0, // 11
5088-
// it->value().copy_assign_count() == 0, // 12
5089-
// it->value().id() == 2, // 13
5090-
// it->value().destructor_counter() == ptr + 1 // 14
5091-
// };
5092-
// };
5093-
5094-
// // Non constant
5095-
// {
5096-
// const auto result = test();
5097-
// hud_assert_true(std::get<0>(result));
5098-
// hud_assert_true(std::get<1>(result));
5099-
// hud_assert_true(std::get<2>(result));
5100-
// hud_assert_true(std::get<3>(result));
5101-
// hud_assert_true(std::get<4>(result));
5102-
// hud_assert_true(std::get<5>(result));
5103-
// hud_assert_true(std::get<6>(result));
5104-
// hud_assert_true(std::get<7>(result));
5105-
// hud_assert_true(std::get<8>(result));
5106-
// hud_assert_true(std::get<9>(result));
5107-
// hud_assert_true(std::get<10>(result));
5108-
// hud_assert_true(std::get<11>(result));
5109-
// hud_assert_true(std::get<12>(result));
5110-
// hud_assert_true(std::get<13>(result));
5111-
// hud_assert_true(std::get<14>(result));
5112-
// }
5113-
5114-
// // Constant
5115-
// {
5116-
// constexpr auto result = test();
5117-
// hud_assert_true(std::get<0>(result));
5118-
// hud_assert_true(std::get<1>(result));
5119-
// hud_assert_true(std::get<2>(result));
5120-
// hud_assert_true(std::get<3>(result));
5121-
// hud_assert_true(std::get<4>(result));
5122-
// hud_assert_true(std::get<5>(result));
5123-
// hud_assert_true(std::get<6>(result));
5124-
// hud_assert_true(std::get<7>(result));
5125-
// hud_assert_true(std::get<8>(result));
5126-
// hud_assert_true(std::get<9>(result));
5127-
// hud_assert_true(std::get<10>(result));
5128-
// hud_assert_true(std::get<11>(result));
5129-
// hud_assert_true(std::get<12>(result));
5130-
// hud_assert_true(std::get<13>(result));
5131-
// hud_assert_true(std::get<14>(result));
5132-
// }
5059+
using key_type = hud_test::non_bitwise_type;
5060+
using value_type = hud_test::non_bitwise_type;
5061+
using hashmap_type = hud::hashmap<key_type, value_type, hud::hash_64<key_type>, hud::equal<key_type>, hud_test::allocator_watcher<1>>;
5062+
5063+
const auto test = []()
5064+
{
5065+
constexpr usize reserved_size = 2;
5066+
i32 ptr[2];
5067+
hashmap_type map;
5068+
map.reserve(reserved_size);
5069+
5070+
static_assert(hud::is_hashable_64_v<key_type, decltype(hud::forward_as_tuple(1, ptr))>);
5071+
static_assert(hud::is_comparable_with_equal_v<key_type, decltype(hud::forward_as_tuple(2, ptr + 1))>);
5072+
5073+
const auto it = map.add(hud::tag_piecewise_construct, hud::forward_as_tuple(1, ptr), hud::forward_as_tuple(2, ptr + 1));
5074+
5075+
return std::tuple {
5076+
map.count() == 1, // 0
5077+
it->key().constructor_count() == 1, // 1
5078+
it->key().move_constructor_count() == 0, // 2
5079+
it->key().copy_constructor_count() == 0, // 3
5080+
it->key().move_assign_count() == 0, // 4
5081+
it->key().copy_assign_count() == 0, // 5
5082+
it->key().id() == 1, // 6
5083+
it->key().destructor_counter() == ptr, // 7
5084+
it->value().constructor_count() == 1, // 8
5085+
it->value().move_constructor_count() == 0, // 9
5086+
it->value().copy_constructor_count() == 0, // 10
5087+
it->value().move_assign_count() == 0, // 11
5088+
it->value().copy_assign_count() == 0, // 12
5089+
it->value().id() == 2, // 13
5090+
it->value().destructor_counter() == ptr + 1 // 14
5091+
};
5092+
};
5093+
5094+
// Non constant
5095+
{
5096+
const auto result = test();
5097+
hud_assert_true(std::get<0>(result));
5098+
hud_assert_true(std::get<1>(result));
5099+
hud_assert_true(std::get<2>(result));
5100+
hud_assert_true(std::get<3>(result));
5101+
hud_assert_true(std::get<4>(result));
5102+
hud_assert_true(std::get<5>(result));
5103+
hud_assert_true(std::get<6>(result));
5104+
hud_assert_true(std::get<7>(result));
5105+
hud_assert_true(std::get<8>(result));
5106+
hud_assert_true(std::get<9>(result));
5107+
hud_assert_true(std::get<10>(result));
5108+
hud_assert_true(std::get<11>(result));
5109+
hud_assert_true(std::get<12>(result));
5110+
hud_assert_true(std::get<13>(result));
5111+
hud_assert_true(std::get<14>(result));
5112+
}
5113+
5114+
// Constant
5115+
{
5116+
constexpr auto result = test();
5117+
hud_assert_true(std::get<0>(result));
5118+
hud_assert_true(std::get<1>(result));
5119+
hud_assert_true(std::get<2>(result));
5120+
hud_assert_true(std::get<3>(result));
5121+
hud_assert_true(std::get<4>(result));
5122+
hud_assert_true(std::get<5>(result));
5123+
hud_assert_true(std::get<6>(result));
5124+
hud_assert_true(std::get<7>(result));
5125+
hud_assert_true(std::get<8>(result));
5126+
hud_assert_true(std::get<9>(result));
5127+
hud_assert_true(std::get<10>(result));
5128+
hud_assert_true(std::get<11>(result));
5129+
hud_assert_true(std::get<12>(result));
5130+
hud_assert_true(std::get<13>(result));
5131+
hud_assert_true(std::get<14>(result));
5132+
}
51335133
}

test/misc/non_bitwise_type.h

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,9 @@ namespace hud
260260
return lhs == rhs;
261261
}
262262

263-
[[nodiscard]] constexpr bool operator()(const hud_test::non_bitwise_type &lhs, const hud::tuple<i32 &&, i32 *&&> &rhs) const noexcept
263+
template<typename First, typename Second>
264+
requires std::convertible_to<First, i32>
265+
[[nodiscard]] constexpr u64 operator()(const hud_test::non_bitwise_type &lhs, hud::tuple<First, Second> const &rhs) const noexcept
264266
{
265267
return lhs == hud::get<0>(rhs);
266268
}
@@ -269,17 +271,19 @@ namespace hud
269271
template<>
270272
struct hash_32<hud_test::non_bitwise_type>
271273
{
272-
[[nodiscard]] constexpr u32 operator()(const hud_test::non_bitwise_type &custom) const
274+
[[nodiscard]] constexpr u32 operator()(const hud_test::non_bitwise_type &custom) const noexcept
273275
{
274276
return hud::hash_32<i32> {}(custom.id());
275277
}
276278

277-
[[nodiscard]] constexpr u32 operator()(const i32 id) const
279+
[[nodiscard]] constexpr u32 operator()(const i32 id) const noexcept
278280
{
279281
return hud::hash_32<i32> {}(id);
280282
}
281283

282-
[[nodiscard]] constexpr bool operator()(const hud::tuple<i32 &&, i32 *&&> &rhs) const noexcept
284+
template<typename First, typename Second>
285+
requires std::convertible_to<First, i32>
286+
[[nodiscard]] constexpr u64 operator()(hud::tuple<First, Second> const &rhs) const noexcept
283287
{
284288
return hud::hash_32<i32> {}(hud::get<0>(rhs));
285289
}
@@ -288,17 +292,19 @@ namespace hud
288292
template<>
289293
struct hash_64<hud_test::non_bitwise_type>
290294
{
291-
[[nodiscard]] constexpr u64 operator()(const hud_test::non_bitwise_type &custom) const
295+
[[nodiscard]] constexpr u64 operator()(const hud_test::non_bitwise_type &custom) const noexcept
292296
{
293297
return hud::hash_64<i32> {}(custom.id());
294298
}
295299

296-
[[nodiscard]] constexpr u64 operator()(const i32 id) const
300+
[[nodiscard]] constexpr u64 operator()(const i32 id) const noexcept
297301
{
298302
return hud::hash_64<i32> {}(id);
299303
}
300304

301-
[[nodiscard]] constexpr bool operator()(const hud::tuple<i32 &&, i32 *&&> &rhs) const noexcept
305+
template<typename First, typename Second>
306+
requires std::convertible_to<First, i32>
307+
[[nodiscard]] constexpr u64 operator()(hud::tuple<First, Second> const &rhs) const noexcept
302308
{
303309
return hud::hash_64<i32> {}(hud::get<0>(rhs));
304310
}
@@ -307,17 +313,19 @@ namespace hud
307313
template<>
308314
struct hash_32<hud_test::non_bitwise_type2>
309315
{
310-
[[nodiscard]] constexpr u32 operator()(const hud_test::non_bitwise_type2 &custom) const
316+
[[nodiscard]] constexpr u32 operator()(const hud_test::non_bitwise_type2 &custom) const noexcept
311317
{
312318
return hud::hash_32<i32> {}(custom.id());
313319
}
314320

315-
[[nodiscard]] constexpr u32 operator()(const i32 id) const
321+
[[nodiscard]] constexpr u32 operator()(const i32 id) const noexcept
316322
{
317323
return hud::hash_32<i32> {}(id);
318324
}
319325

320-
[[nodiscard]] constexpr bool operator()(const hud::tuple<i32 &&, i32 *&&> &rhs) const noexcept
326+
template<typename First, typename Second>
327+
requires std::convertible_to<First, i32>
328+
[[nodiscard]] constexpr u64 operator()(hud::tuple<First, Second> const &rhs) const noexcept
321329
{
322330
return hud::hash_32<i32> {}(hud::get<0>(rhs));
323331
}
@@ -336,7 +344,9 @@ namespace hud
336344
return hud::hash_64<i32> {}(id);
337345
}
338346

339-
[[nodiscard]] constexpr bool operator()(const hud::tuple<i32 &&, i32 *&&> &rhs) const noexcept
347+
template<typename First, typename Second>
348+
requires std::convertible_to<First, i32>
349+
[[nodiscard]] constexpr u64 operator()(hud::tuple<First, Second> const &rhs) const noexcept
340350
{
341351
return hud::hash_64<i32> {}(hud::get<0>(rhs));
342352
}

test/pair/pair_constructors.cpp

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1606,7 +1606,8 @@ GTEST_TEST(pair, piecewise_constructor_non_trivial_type_same_type)
16061606
const auto test = []()
16071607
{
16081608
using type = hud_test::non_bitwise_type;
1609-
hud::pair<type, type> pair {hud::tag_piecewise_construct, hud::forward_as_tuple(1, nullptr), hud::forward_as_tuple(2, nullptr)};
1609+
i32 ptr[2];
1610+
hud::pair<type, type> pair {hud::tag_piecewise_construct, hud::forward_as_tuple(1, ptr), hud::forward_as_tuple(2, ptr + 1)};
16101611
return std::tuple {
16111612
hud::get<0>(pair).id() == 1, // 0
16121613
hud::get<0>(pair).constructor_count() == 1, // 1
@@ -2081,19 +2082,4 @@ GTEST_TEST(pair, piecewise_constructor_non_trivial_move_constructible_type_diffe
20812082
hud_assert_true(std::get<3>(result));
20822083
}
20832084
}
2084-
2085-
using first_type = hud_test::non_bitwise_type;
2086-
using second_type = hud_test::non_bitwise_type;
2087-
i32 ptr[2];
2088-
2089-
// hud::pair<first_type, second_type> p(hud::tag_piecewise_construct, hud::forward_as_tuple(1, ptr), hud::forward_as_tuple(2, ptr + 1));
2090-
std::pair<first_type, second_type> p(std::piecewise_construct, std::forward_as_tuple(1, ptr), std::forward_as_tuple(2, ptr + 1));
2091-
2092-
// template <size_t _Index, class... _Types>
2093-
// _NODISCARD constexpr auto&& _Tuple_get(tuple<_Types...>&& _Tuple) noexcept {
2094-
// // used by pair's piecewise constructor
2095-
// using _Ty = tuple_element_t<_Index, tuple<_Types...>>;
2096-
// using _Ttype = typename tuple_element<_Index, tuple<_Types...>>::_Ttype;
2097-
// return static_cast<_Ty&&>(static_cast<_Ttype&>(_Tuple)._Myfirst._Val);
2098-
// }
20992085
}

0 commit comments

Comments
 (0)