Browse Source

* Improved handling of getter and setter

* Implemented helper to check if a generic_predicate can be executed with certain values
master
bergmann 4 years ago
parent
commit
00b34b10bb
5 changed files with 68 additions and 30 deletions
  1. +30
    -0
      include/cppmp/misc/generic_predicate.h
  2. +8
    -4
      include/cppmp/misc/getter.h
  3. +12
    -11
      include/cppmp/misc/getter.inl
  4. +7
    -4
      include/cppmp/misc/setter.h
  5. +11
    -11
      include/cppmp/misc/setter.inl

+ 30
- 0
include/cppmp/misc/generic_predicate.h View File

@@ -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.
*


+ 8
- 4
include/cppmp/misc/getter.h View File

@@ -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 */



+ 12
- 11
include/cppmp/misc/getter.inl View File

@@ -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>
{ };

}

+ 7
- 4
include/cppmp/misc/setter.h View File

@@ -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 */



+ 11
- 11
include/cppmp/misc/setter.inl View File

@@ -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>
{ };

}

Loading…
Cancel
Save