* Implemented helper to check if a generic_predicate can be executed with certain valuesmaster
@@ -1,10 +1,26 @@ | |||
#pragma once | |||
#include <cppmp/core/types.h> | |||
#include <cppmp/core/checker.h> | |||
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. | |||
* | |||
@@ -13,6 +29,20 @@ namespace cppmp | |||
template<template<typename...> class T_builder> | |||
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. | |||
* | |||
@@ -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 */ | |||
@@ -11,16 +11,13 @@ namespace cppmp | |||
namespace __impl | |||
{ | |||
/* tag_getter */ | |||
struct tag_getter | |||
{ }; | |||
/* getter_builder - default */ | |||
template<typename X, typename> | |||
struct getter_builder | |||
{ | |||
using is_default = cppmp::true_t; | |||
template<typename... T_args> | |||
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<T_object>; | |||
using value_type = decay_t<T_value>; | |||
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<T_value (T_object::*)() const>, | |||
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 */ | |||
@@ -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<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; | |||
@@ -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<T_first>())); | |||
using second_getter_type = decltype(make_getter(std::declval<T_second>(), std::declval<T_rest>()...)); | |||
@@ -223,7 +224,7 @@ namespace cppmp | |||
template<typename T> | |||
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 __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 */ | |||
@@ -10,16 +10,13 @@ namespace cppmp | |||
namespace __impl | |||
{ | |||
/* tag_setter */ | |||
struct tag_setter | |||
{ }; | |||
/* setter_builder - default */ | |||
template<typename X, typename> | |||
struct setter_builder | |||
{ | |||
using is_default = cppmp::true_t; | |||
template<typename... T_args> | |||
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<T_object>; | |||
using value_type = decay_t<T_value>; | |||
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 (T_object::*)(T_value) const>, | |||
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 */ | |||
@@ -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<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; | |||
@@ -172,7 +172,7 @@ namespace cppmp | |||
template<typename T> | |||
struct is_setter | |||
: public is_base_of<__impl::tag_setter, T> | |||
: public is_base_of<tag_setter, T> | |||
{ }; | |||
} |