From 1c4fbb16187e97ae088df1c58e21442746f73352 Mon Sep 17 00:00:00 2001 From: lisyarus Date: Fri, 7 May 2021 17:35:11 +0300 Subject: [PATCH] Make heterogeneous_container::get return pointers instead of copies --- .../psemek/util/heterogeneous_container.hpp | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/libs/util/include/psemek/util/heterogeneous_container.hpp b/libs/util/include/psemek/util/heterogeneous_container.hpp index 8bf93c09..ba98de1b 100644 --- a/libs/util/include/psemek/util/heterogeneous_container.hpp +++ b/libs/util/include/psemek/util/heterogeneous_container.hpp @@ -127,6 +127,10 @@ namespace psemek::util using any = std::variant; + using any_pointer = std::variant; + + using any_const_pointer = std::variant; + 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 std::enable_if_t, T const &> @@ -240,11 +245,20 @@ namespace psemek::util } template - typename heterogeneous_container::any heterogeneous_container::get(handle h) const + typename heterogeneous_container::any_pointer heterogeneous_container::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 heterogeneous_container::any_const_pointer heterogeneous_container::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); }