Make heterogeneous_container::get return pointers instead of copies
This commit is contained in:
parent
5eb5174472
commit
1c4fbb1618
1 changed files with 18 additions and 4 deletions
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue