diff --git a/CMakeLists.txt b/CMakeLists.txt index 4c4cd13..70ade9a 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.3.8) +set(BLT_VERSION 5.4.0) set(BLT_TARGET BLT) diff --git a/include/blt/std/utility.h b/include/blt/std/utility.h index 2104233..49139bc 100644 --- a/include/blt/std/utility.h +++ b/include/blt/std/utility.h @@ -67,31 +67,6 @@ namespace blt return typeid(T).name(); } -//#define BLT_LAMBDA(type, var, code) [](const type& var) -> auto { return code; } -//#define BLT_LAMBDA(var, code) [](var) -> auto { return code; } - -/* - * std::visit(blt::lambda_visitor{ - * lambdas... - * }, data_variant); - */ - -// TODO: WTF - template - struct lambda_visitor : TLambdas ... - { - using TLambdas::operator()...; - }; - -#if __cplusplus < 202002L - - // explicit deduction guide (not needed as of C++20) - template - lambda_visitor(TLambdas...) -> lambda_visitor; - -#endif - - #if defined(__GNUC__) || defined(__llvm__) #define BLT_UNREACHABLE __builtin_unreachable() #define BLT_ATTRIB_NO_INLINE __attribute__ ((noinline)) diff --git a/include/blt/std/variant.h b/include/blt/std/variant.h index 4676c35..2ddd893 100644 --- a/include/blt/std/variant.h +++ b/include/blt/std/variant.h @@ -25,6 +25,26 @@ namespace blt { + /* + * std::visit(blt::lambda_visitor{ + * lambdas... + * }, data_variant); + */ + + template + struct lambda_visitor : TLambdas... + { + using TLambdas::operator()...; + }; + +#if __cplusplus < 202002L + + // explicit deduction guide (not needed as of C++20) + template + lambda_visitor(TLambdas...) -> lambda_visitor; + +#endif + template class variant_t { @@ -119,6 +139,46 @@ namespace blt return std::visit(std::forward(visitor), m_variant); } + /** + * Automatic visitor generation with empty default behavior + * @param visitees user lambdas + */ + template + constexpr void visit_empty(Visitee&&... visitees) + { + std::visit(lambda_visitor{ + std::forward(visitees)..., + [](auto) + { + } + }, m_variant); + } + + template + constexpr auto visit_value(Default&& default_value, Visitee&&... visitees) -> decltype(auto) + { + return std::visit(lambda_visitor{ + std::forward(visitees)..., + [default_value=std::forward(default_value)](auto&& value) + { + return std::forward(value); + } + }); + } + + template + constexpr auto visit_lambda(Default&& default_lambda, Visitee&&... visitees) -> decltype(auto) + { + return std::visit(lambda_visitor{ + std::forward(visitees)..., + [default_lambda=std::forward(default_lambda)](auto&& value) + { + return std::forward(default_lambda)(std::forward(value)); + } + }); + } + + template [[nodiscard]] constexpr bool has_index() const noexcept { @@ -255,33 +315,32 @@ namespace blt namespace detail { - template + template class variant_is_base_of - {}; + { + }; - template + template class variant_is_base_of> { public: - template + using value_type = bool; + template static constexpr bool value = std::conjunction_v...>; }; - template + template class variant_is_base_of> { public: - template + using value_type = bool; + template static constexpr bool value = std::conjunction_v...>; }; - template + template static constexpr bool variant_is_base_of_v = variant_is_base_of::value; } - - template - class variant_wrapper_t : public Subclasses... - {}; } #endif //BLT_STD_VARIANT_H