#ifndef RFL_INTERNAL_PROCESSORS_HPP_ #define RFL_INTERNAL_PROCESSORS_HPP_ #include #include #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 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 static auto process(NamedTupleType&& _named_tuple) { return _named_tuple; } }; template struct Processors { static constexpr bool add_tags_to_variants_ = std::disjunction_v, internal::is_add_tags_to_variants...>; static constexpr bool add_namespaced_tags_to_variants_ = std::disjunction_v, internal::is_add_namespaced_tags_to_variants...>; static constexpr bool allow_raw_ptrs_ = std::disjunction_v, internal::is_allow_raw_ptrs...>; static constexpr bool all_required_ = std::disjunction_v, internal::is_no_optionals...>; static constexpr bool default_if_missing_ = std::disjunction_v, internal::is_default_if_missing...>; static constexpr bool no_extra_fields_ = std::disjunction_v, internal::is_no_extra_fields...>; static constexpr bool no_field_names_ = std::disjunction_v, internal::is_no_field_names...>; static constexpr bool underlying_enums_ = std::disjunction_v, internal::is_underlying_enums...>; template 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::template process( Head::template process(std::move(_named_tuple))); } }; } // namespace rfl #endif