File: Processors.hpp

package info (click to toggle)
reflect-cpp 0.21.0%2Bds-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 13,128 kB
  • sloc: cpp: 50,336; python: 139; makefile: 30; sh: 3
file content (82 lines) | stat: -rw-r--r-- 3,014 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#ifndef RFL_INTERNAL_PROCESSORS_HPP_
#define RFL_INTERNAL_PROCESSORS_HPP_

#include <type_traits>

#include "internal/is_add_tags_to_variants_v.hpp"
#include "internal/is_allow_raw_ptrs_v.hpp"
#include "internal/is_default_if_missing_v.hpp"
#include "internal/is_no_extra_fields_v.hpp"
#include "internal/is_no_field_names_v.hpp"
#include "internal/is_no_optionals_v.hpp"
#include "internal/is_underlying_enums_v.hpp"

namespace rfl {

template <class... Ps>
struct Processors;

template <>
struct Processors<> {
  static constexpr bool add_tags_to_variants_ = false;
  static constexpr bool add_namespaced_tags_to_variants_ = false;
  static constexpr bool allow_raw_ptrs_ = false;
  static constexpr bool all_required_ = false;
  static constexpr bool default_if_missing_ = false;
  static constexpr bool no_extra_fields_ = false;
  static constexpr bool no_field_names_ = false;
  static constexpr bool underlying_enums_ = false;

  template <class T, class NamedTupleType>
  static auto process(NamedTupleType&& _named_tuple) {
    return _named_tuple;
  }
};

template <class Head, class... Tail>
struct Processors<Head, Tail...> {
  static constexpr bool add_tags_to_variants_ =
      std::disjunction_v<internal::is_add_tags_to_variants<Head>,
                         internal::is_add_tags_to_variants<Tail>...>;

  static constexpr bool add_namespaced_tags_to_variants_ =
      std::disjunction_v<internal::is_add_namespaced_tags_to_variants<Head>,
                         internal::is_add_namespaced_tags_to_variants<Tail>...>;

  static constexpr bool allow_raw_ptrs_ =
      std::disjunction_v<internal::is_allow_raw_ptrs<Head>,
                         internal::is_allow_raw_ptrs<Tail>...>;

  static constexpr bool all_required_ =
      std::disjunction_v<internal::is_no_optionals<Head>,
                         internal::is_no_optionals<Tail>...>;

  static constexpr bool default_if_missing_ =
      std::disjunction_v<internal::is_default_if_missing<Head>,
                         internal::is_default_if_missing<Tail>...>;

  static constexpr bool no_extra_fields_ =
      std::disjunction_v<internal::is_no_extra_fields<Head>,
                         internal::is_no_extra_fields<Tail>...>;

  static constexpr bool no_field_names_ =
      std::disjunction_v<internal::is_no_field_names<Head>,
                         internal::is_no_field_names<Tail>...>;

  static constexpr bool underlying_enums_ =
      std::disjunction_v<internal::is_underlying_enums<Head>,
                         internal::is_underlying_enums<Tail>...>;

  template <class T, class NamedTupleType>
  static auto process(NamedTupleType&& _named_tuple) {
    static_assert(!add_tags_to_variants_ || !add_namespaced_tags_to_variants_,  
                  "You cannot add both rfl::AddTagsToVariants and "  
                  "rfl::AddNamespacedTagsToVariants.");  
    return Processors<Tail...>::template process<T>(
        Head::template process<T>(std::move(_named_tuple)));
  }
};

}  // namespace rfl

#endif