diff --git a/CMakeLists.txt b/CMakeLists.txt index 870bed4..eeb3489 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.20) include(cmake/color.cmake) -set(BLT_VERSION 5.4.1) +set(BLT_VERSION 5.4.2) set(BLT_TARGET BLT) diff --git a/include/blt/std/variant.h b/include/blt/std/variant.h index 03b827a..5ed5bb8 100644 --- a/include/blt/std/variant.h +++ b/include/blt/std/variant.h @@ -26,6 +26,8 @@ #include #include +#include "blt/logging/logging.h" + namespace blt { /* @@ -191,6 +193,8 @@ namespace blt template constexpr auto call_member(const MemberFuncs... funcs) { + static_assert(std::conjunction_v>...>, + "Must provide only pointers to member functions!"); return std::visit([=](auto&& value) { using ValueType = std::decay_t; @@ -206,13 +210,22 @@ namespace blt using ReturnType = std::invoke_result_t; if constexpr (std::is_invocable_v) { - return std::make_optional(std::invoke(func, value)); + return std::make_optional(((value).*(func))()); } return std::optional{}; - }(std::forward(funcs)))); + }(cast_member_ptr>(std::forward(funcs))))); }, m_variant); } + template + constexpr auto call_member_args(const MemberFunc func, Args&&... args) + { + return std::visit([=](auto&& value) + { + using ValueType = std::decay_t; + return ((value).*(cast_member_ptr(func)))(std::forward(args)...); + }, m_variant); + } template [[nodiscard]] constexpr bool has_index() const noexcept @@ -345,6 +358,12 @@ namespace blt } private: + template + static auto cast_member_ptr(ReturnType (Base::*base_func)(Args...)) + { + return reinterpret_cast(base_func); + } + value_type m_variant; }; diff --git a/libraries/parallel-hashmap b/libraries/parallel-hashmap index d88c5e1..8a889d3 160000 --- a/libraries/parallel-hashmap +++ b/libraries/parallel-hashmap @@ -1 +1 @@ -Subproject commit d88c5e15079047777b418132ece5879e7c9aaa2b +Subproject commit 8a889d3699b3c09ade435641fb034427f3fd12b6