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