* Implemented helper to check if a generic_predicate can be executed with certain valuesmaster
| @@ -1,10 +1,26 @@ | |||||
| #pragma once | #pragma once | ||||
| #include <cppmp/core/types.h> | #include <cppmp/core/types.h> | ||||
| #include <cppmp/core/checker.h> | |||||
| namespace cppmp | namespace cppmp | ||||
| { | { | ||||
| namespace __impl | |||||
| { | |||||
| template<typename X, typename = void> | |||||
| struct is_valid_builder | |||||
| : public cppmp::true_t | |||||
| { }; | |||||
| template<typename X> | |||||
| struct is_valid_builder<X, cppmp::void_t<typename X::is_default>> | |||||
| : public cppmp::false_t | |||||
| { }; | |||||
| } | |||||
| /** | /** | ||||
| * @brief Helper class to create generic predicates. | * @brief Helper class to create generic predicates. | ||||
| * | * | ||||
| @@ -13,6 +29,20 @@ namespace cppmp | |||||
| template<template<typename...> class T_builder> | template<template<typename...> class T_builder> | ||||
| struct generic_predicate | struct generic_predicate | ||||
| { | { | ||||
| /** | |||||
| * @brief Helper class to check if the passed arguments would create a valid object. | |||||
| */ | |||||
| template<typename... T_args> | |||||
| struct is_valid | |||||
| : public __impl::is_valid_builder<T_builder<list<T_args...>>> | |||||
| { }; | |||||
| /** | |||||
| * @brief Evaluates to true if the passed arguments would create a valid object, false otherwise. | |||||
| */ | |||||
| template<typename... T_args> | |||||
| static constexpr bool is_valid_v = is_valid<T_args...>::value; | |||||
| /** | /** | ||||
| * @brief Invoke the builder to create the requested object. | * @brief Invoke the builder to create the requested object. | ||||
| * | * | ||||
| @@ -5,12 +5,16 @@ | |||||
| namespace cppmp | 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 */ | /* getter_builder */ | ||||
| @@ -11,16 +11,13 @@ namespace cppmp | |||||
| namespace __impl | namespace __impl | ||||
| { | { | ||||
| /* tag_getter */ | |||||
| struct tag_getter | |||||
| { }; | |||||
| /* getter_builder - default */ | /* getter_builder - default */ | ||||
| template<typename X, typename> | template<typename X, typename> | ||||
| struct getter_builder | struct getter_builder | ||||
| { | { | ||||
| using is_default = cppmp::true_t; | |||||
| template<typename... T_args> | template<typename... T_args> | ||||
| static constexpr decltype(auto) apply(T_args&&...) | static constexpr decltype(auto) apply(T_args&&...) | ||||
| { static_assert(sizeof...(T_args) == -1, "Invalid parameters for make_getter(...)!"); } | { static_assert(sizeof...(T_args) == -1, "Invalid parameters for make_getter(...)!"); } | ||||
| @@ -46,6 +43,7 @@ namespace cppmp | |||||
| { | { | ||||
| struct getter_member_var | struct getter_member_var | ||||
| : public tag_getter | : public tag_getter | ||||
| , public tag_getter_member_var | |||||
| { | { | ||||
| using object_type = T_object; | using object_type = T_object; | ||||
| using value_type = T_value; | using value_type = T_value; | ||||
| @@ -83,9 +81,10 @@ namespace cppmp | |||||
| { | { | ||||
| struct getter_member_func | struct getter_member_func | ||||
| : public tag_getter | : public tag_getter | ||||
| , public tag_getter_member_func | |||||
| { | { | ||||
| using object_type = decay_t<T_object>; | |||||
| using value_type = decay_t<T_value>; | |||||
| using object_type = T_object; | |||||
| using value_type = T_value; | |||||
| using member_type = T_member; | using member_type = T_member; | ||||
| member_type member; | member_type member; | ||||
| @@ -124,7 +123,7 @@ namespace cppmp | |||||
| struct getter_builder< | struct getter_builder< | ||||
| list<T_value (T_object::*)() const>, | list<T_value (T_object::*)() const>, | ||||
| void> | void> | ||||
| : public getter_builder_member_func<T_object, T_value, T_value (T_object::*)() const> | |||||
| : public getter_builder_member_func<const T_object, T_value, T_value (T_object::*)() const> | |||||
| { }; | { }; | ||||
| /* getter_builder - lambda/static */ | /* getter_builder - lambda/static */ | ||||
| @@ -139,11 +138,12 @@ namespace cppmp | |||||
| { | { | ||||
| struct getter_lambda | struct getter_lambda | ||||
| : public tag_getter | : public tag_getter | ||||
| , public tag_getter_lambda | |||||
| { | { | ||||
| using lambda_type = T_lambda; | using lambda_type = T_lambda; | ||||
| using lambda_traits_type = lambda_traits<lambda_type>; | using lambda_traits_type = lambda_traits<lambda_type>; | ||||
| using object_type = decay_t<typename lambda_traits_type::template argument_t<0>>; | |||||
| using value_type = decay_t<typename lambda_traits_type::return_type>; | |||||
| using object_type = typename lambda_traits_type::template argument_t<0>; | |||||
| using value_type = typename lambda_traits_type::return_type; | |||||
| lambda_type lambda; | lambda_type lambda; | ||||
| @@ -181,6 +181,7 @@ namespace cppmp | |||||
| { | { | ||||
| struct getter_chain | struct getter_chain | ||||
| : public tag_getter | : public tag_getter | ||||
| , public tag_getter_chain | |||||
| { | { | ||||
| using first_getter_type = decltype(make_getter(std::declval<T_first>())); | using first_getter_type = decltype(make_getter(std::declval<T_first>())); | ||||
| using second_getter_type = decltype(make_getter(std::declval<T_second>(), std::declval<T_rest>()...)); | using second_getter_type = decltype(make_getter(std::declval<T_second>(), std::declval<T_rest>()...)); | ||||
| @@ -223,7 +224,7 @@ namespace cppmp | |||||
| template<typename T> | template<typename T> | ||||
| struct is_getter | struct is_getter | ||||
| : public is_base_of<__impl::tag_getter, T> | |||||
| : public is_base_of<tag_getter, T> | |||||
| { }; | { }; | ||||
| } | } | ||||
| @@ -5,12 +5,15 @@ | |||||
| namespace cppmp | 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 */ | /* setter_builder */ | ||||
| @@ -10,16 +10,13 @@ namespace cppmp | |||||
| namespace __impl | namespace __impl | ||||
| { | { | ||||
| /* tag_setter */ | |||||
| struct tag_setter | |||||
| { }; | |||||
| /* setter_builder - default */ | /* setter_builder - default */ | ||||
| template<typename X, typename> | template<typename X, typename> | ||||
| struct setter_builder | struct setter_builder | ||||
| { | { | ||||
| using is_default = cppmp::true_t; | |||||
| template<typename... T_args> | template<typename... T_args> | ||||
| static constexpr decltype(auto) apply(T_args&&...) | static constexpr decltype(auto) apply(T_args&&...) | ||||
| { static_assert(sizeof...(T_args) == -1, "Invalid parameters for make_setter(...)!"); } | { static_assert(sizeof...(T_args) == -1, "Invalid parameters for make_setter(...)!"); } | ||||
| @@ -45,6 +42,7 @@ namespace cppmp | |||||
| { | { | ||||
| struct setter_member_var | struct setter_member_var | ||||
| : public tag_setter | : public tag_setter | ||||
| , public tag_setter_member_var | |||||
| { | { | ||||
| using object_type = T_object; | using object_type = T_object; | ||||
| using value_type = T_value; | using value_type = T_value; | ||||
| @@ -82,9 +80,10 @@ namespace cppmp | |||||
| { | { | ||||
| struct setter_member_func | struct setter_member_func | ||||
| : public tag_setter | : public tag_setter | ||||
| , public tag_setter_member_func | |||||
| { | { | ||||
| using object_type = decay_t<T_object>; | |||||
| using value_type = decay_t<T_value>; | |||||
| using object_type = T_object; | |||||
| using value_type = T_value; | |||||
| using member_type = T_member; | using member_type = T_member; | ||||
| member_type member; | member_type member; | ||||
| @@ -123,7 +122,7 @@ namespace cppmp | |||||
| struct setter_builder< | struct setter_builder< | ||||
| list<void (T_object::*)(T_value) const>, | list<void (T_object::*)(T_value) const>, | ||||
| void> | void> | ||||
| : public setter_builder_member_func<T_object, T_value, void (T_object::*)(T_value) const> | |||||
| : public setter_builder_member_func<const T_object, T_value, void (T_object::*)(T_value) const> | |||||
| { }; | { }; | ||||
| /* setter_builder - lambda/static */ | /* setter_builder - lambda/static */ | ||||
| @@ -137,11 +136,12 @@ namespace cppmp | |||||
| { | { | ||||
| struct setter_lambda | struct setter_lambda | ||||
| : public tag_setter | : public tag_setter | ||||
| , public tag_setter_lambda | |||||
| { | { | ||||
| using lambda_type = T_lambda; | using lambda_type = T_lambda; | ||||
| using lambda_traits_type = lambda_traits<lambda_type>; | using lambda_traits_type = lambda_traits<lambda_type>; | ||||
| using object_type = decay_t<typename lambda_traits_type::template argument_t<0>>; | |||||
| using value_type = decay_t<typename lambda_traits_type::template argument_t<1>>; | |||||
| 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; | lambda_type lambda; | ||||
| @@ -172,7 +172,7 @@ namespace cppmp | |||||
| template<typename T> | template<typename T> | ||||
| struct is_setter | struct is_setter | ||||
| : public is_base_of<__impl::tag_setter, T> | |||||
| : public is_base_of<tag_setter, T> | |||||
| { }; | { }; | ||||
| } | } | ||||