From 00b34b10bb8d24d2e7f37c39c88ca1ec10a98c6f Mon Sep 17 00:00:00 2001 From: bergmann Date: Fri, 27 Sep 2019 18:02:37 +0200 Subject: [PATCH] * Improved handling of getter and setter * Implemented helper to check if a generic_predicate can be executed with certain values --- include/cppmp/misc/generic_predicate.h | 30 ++++++++++++++++++++++++++ include/cppmp/misc/getter.h | 12 +++++++---- include/cppmp/misc/getter.inl | 23 ++++++++++---------- include/cppmp/misc/setter.h | 11 ++++++---- include/cppmp/misc/setter.inl | 22 +++++++++---------- 5 files changed, 68 insertions(+), 30 deletions(-) diff --git a/include/cppmp/misc/generic_predicate.h b/include/cppmp/misc/generic_predicate.h index 4ea970e..eb907bf 100644 --- a/include/cppmp/misc/generic_predicate.h +++ b/include/cppmp/misc/generic_predicate.h @@ -1,10 +1,26 @@ #pragma once #include +#include namespace cppmp { + namespace __impl + { + + template + struct is_valid_builder + : public cppmp::true_t + { }; + + template + struct is_valid_builder> + : public cppmp::false_t + { }; + + } + /** * @brief Helper class to create generic predicates. * @@ -13,6 +29,20 @@ namespace cppmp template class T_builder> struct generic_predicate { + /** + * @brief Helper class to check if the passed arguments would create a valid object. + */ + template + struct is_valid + : public __impl::is_valid_builder>> + { }; + + /** + * @brief Evaluates to true if the passed arguments would create a valid object, false otherwise. + */ + template + static constexpr bool is_valid_v = is_valid::value; + /** * @brief Invoke the builder to create the requested object. * diff --git a/include/cppmp/misc/getter.h b/include/cppmp/misc/getter.h index c87fc29..240898b 100644 --- a/include/cppmp/misc/getter.h +++ b/include/cppmp/misc/getter.h @@ -5,12 +5,16 @@ namespace cppmp { - namespace __impl - { + /* tags */ - /* tag_getter */ + struct tag_getter { }; + struct tag_getter_member_var { }; + struct tag_getter_member_func { }; + struct tag_getter_lambda { }; + struct tag_getter_chain { }; - struct tag_getter; + namespace __impl + { /* getter_builder */ diff --git a/include/cppmp/misc/getter.inl b/include/cppmp/misc/getter.inl index ce40246..9e07838 100644 --- a/include/cppmp/misc/getter.inl +++ b/include/cppmp/misc/getter.inl @@ -11,16 +11,13 @@ namespace cppmp namespace __impl { - /* tag_getter */ - - struct tag_getter - { }; - /* getter_builder - default */ template struct getter_builder { + using is_default = cppmp::true_t; + template static constexpr decltype(auto) apply(T_args&&...) { static_assert(sizeof...(T_args) == -1, "Invalid parameters for make_getter(...)!"); } @@ -46,6 +43,7 @@ namespace cppmp { struct getter_member_var : public tag_getter + , public tag_getter_member_var { using object_type = T_object; using value_type = T_value; @@ -83,9 +81,10 @@ namespace cppmp { struct getter_member_func : public tag_getter + , public tag_getter_member_func { - using object_type = decay_t; - using value_type = decay_t; + using object_type = T_object; + using value_type = T_value; using member_type = T_member; member_type member; @@ -124,7 +123,7 @@ namespace cppmp struct getter_builder< list, void> - : public getter_builder_member_func + : public getter_builder_member_func { }; /* getter_builder - lambda/static */ @@ -139,11 +138,12 @@ namespace cppmp { struct getter_lambda : public tag_getter + , public tag_getter_lambda { using lambda_type = T_lambda; using lambda_traits_type = lambda_traits; - using object_type = decay_t>; - using value_type = decay_t; + using object_type = typename lambda_traits_type::template argument_t<0>; + using value_type = typename lambda_traits_type::return_type; lambda_type lambda; @@ -181,6 +181,7 @@ namespace cppmp { struct getter_chain : public tag_getter + , public tag_getter_chain { using first_getter_type = decltype(make_getter(std::declval())); using second_getter_type = decltype(make_getter(std::declval(), std::declval()...)); @@ -223,7 +224,7 @@ namespace cppmp template struct is_getter - : public is_base_of<__impl::tag_getter, T> + : public is_base_of { }; } diff --git a/include/cppmp/misc/setter.h b/include/cppmp/misc/setter.h index 35dc0ec..ab4a9f4 100644 --- a/include/cppmp/misc/setter.h +++ b/include/cppmp/misc/setter.h @@ -5,12 +5,15 @@ namespace cppmp { - namespace __impl - { + /* tags */ - /* tag_setter */ + struct tag_setter { }; + struct tag_setter_member_var { }; + struct tag_setter_member_func { }; + struct tag_setter_lambda { }; - struct tag_setter; + namespace __impl + { /* setter_builder */ diff --git a/include/cppmp/misc/setter.inl b/include/cppmp/misc/setter.inl index 6574aad..c4ef1fc 100644 --- a/include/cppmp/misc/setter.inl +++ b/include/cppmp/misc/setter.inl @@ -10,16 +10,13 @@ namespace cppmp namespace __impl { - /* tag_setter */ - - struct tag_setter - { }; - /* setter_builder - default */ template struct setter_builder { + using is_default = cppmp::true_t; + template static constexpr decltype(auto) apply(T_args&&...) { static_assert(sizeof...(T_args) == -1, "Invalid parameters for make_setter(...)!"); } @@ -45,6 +42,7 @@ namespace cppmp { struct setter_member_var : public tag_setter + , public tag_setter_member_var { using object_type = T_object; using value_type = T_value; @@ -82,9 +80,10 @@ namespace cppmp { struct setter_member_func : public tag_setter + , public tag_setter_member_func { - using object_type = decay_t; - using value_type = decay_t; + using object_type = T_object; + using value_type = T_value; using member_type = T_member; member_type member; @@ -123,7 +122,7 @@ namespace cppmp struct setter_builder< list, void> - : public setter_builder_member_func + : public setter_builder_member_func { }; /* setter_builder - lambda/static */ @@ -137,11 +136,12 @@ namespace cppmp { struct setter_lambda : public tag_setter + , public tag_setter_lambda { using lambda_type = T_lambda; using lambda_traits_type = lambda_traits; - using object_type = decay_t>; - using value_type = decay_t>; + using object_type = typename lambda_traits_type::template argument_t<0>; + using value_type = typename lambda_traits_type::template argument_t<1>; lambda_type lambda; @@ -172,7 +172,7 @@ namespace cppmp template struct is_setter - : public is_base_of<__impl::tag_setter, T> + : public is_base_of { }; }