Make heterogeneous_container::get return pointers instead of copies

This commit is contained in:
Nikita Lisitsa 2021-05-07 17:35:11 +03:00
parent 5eb5174472
commit 1c4fbb1618

View file

@ -127,6 +127,10 @@ namespace psemek::util
using any = std::variant<Types...>;
using any_pointer = std::variant<Types *...>;
using any_const_pointer = std::variant<Types const *...>;
static constexpr std::size_t types_count = sizeof...(Types);
static_assert(types_count > 0);
@ -153,7 +157,8 @@ namespace psemek::util
void clear();
any get(handle h) const;
any_pointer get(handle h);
any_const_pointer get(handle h) const;
template <typename T>
std::enable_if_t<detail::one_of_v<T, Types...>, T const &>
@ -240,11 +245,20 @@ namespace psemek::util
}
template <typename Handle, typename ... Types>
typename heterogeneous_container<Handle, Types...>::any heterogeneous_container<Handle, Types...>::get(handle h) const
typename heterogeneous_container<Handle, Types...>::any_pointer heterogeneous_container<Handle, Types...>::get(handle h)
{
auto u = unpack_handle(h);
return detail::tuple_apply_at([&u](auto & t) -> any {
return t[u.second];
return detail::tuple_apply_at([&u](auto & t) -> any_pointer {
return &t[u.second];
}, storage_, u.first);
}
template <typename Handle, typename ... Types>
typename heterogeneous_container<Handle, Types...>::any_const_pointer heterogeneous_container<Handle, Types...>::get(handle h) const
{
auto u = unpack_handle(h);
return detail::tuple_apply_at([&u](auto & t) -> any_const_pointer {
return &t[u.second];
}, storage_, u.first);
}