From 0474ef756cd7462b990da7b4703ad3cc6ea69419 Mon Sep 17 00:00:00 2001 From: Stanislaw Halik Date: Sat, 19 Nov 2022 13:24:38 +0100 Subject: entity/metadata: detect ignored arguments --- entity/metadata.hpp | 19 ++++++++++++++++--- test/entity.cpp | 2 +- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/entity/metadata.hpp b/entity/metadata.hpp index 5aa1febf..a402a2a3 100644 --- a/entity/metadata.hpp +++ b/entity/metadata.hpp @@ -79,18 +79,31 @@ struct entity_field : entity_field_base { private: static constexpr auto default_predicate = detail::constantly; using default_predicate_t = std::decay_t; - using predicate_ = detail::find_reader; + using c_predicate = detail::find_reader; + using c_range = detail::find_reader, constraints::range, 0, Ts...>; + using c_length = detail::find_reader; + using c_group = detail::find_reader; + static constexpr std::size_t good_arguments = + unsigned(c_predicate::index != sizeof...(Ts)) + + unsigned(c_range::index != sizeof...(Ts)) + + unsigned(c_length::index != sizeof...(Ts)) + + unsigned(c_group::index != sizeof...(Ts)); + static_assert(sizeof...(Ts) == good_arguments, "ignored arguments"); + public: using ObjectType = Obj; using FieldType = Type; using Reader = R; using Writer = W; - using Predicate = typename predicate_::type; + using Predicate = typename c_predicate::type; StringView name; [[no_unique_address]] R reader; [[no_unique_address]] W writer; [[no_unique_address]] Predicate predicate; + [[no_unique_address]] c_range range; + [[no_unique_address]] c_length length; + [[no_unique_address]] c_group group; constexpr entity_field(const entity_field&) = default; constexpr entity_field& operator=(const entity_field&) = default; @@ -102,7 +115,7 @@ public: static constexpr field_status is_enabled(const Predicate & p, const Obj& x); constexpr entity_field(StringView name, R r, W w, Ts&&... ts) noexcept : name{name}, reader{r}, writer{w}, - predicate{std::get(std::forward_as_tuple(ts..., default_predicate))} + predicate{std::get(std::forward_as_tuple(ts..., default_predicate))} {} constexpr erased_accessor erased() const; }; diff --git a/test/entity.cpp b/test/entity.cpp index ec22f3fc..e1f221f1 100644 --- a/test/entity.cpp +++ b/test/entity.cpp @@ -28,7 +28,7 @@ constexpr auto TestAccessors::accessors() noexcept constexpr auto tuple = std::make_tuple( entity::type::field{"foo"_s, &TestAccessors::foo, &TestAccessors::foo}, entity::type::field{"bar"_s, &TestAccessors::bar, &TestAccessors::set_bar}, - entity::type::field("baz"_s, r_baz, w_baz, std::tuple<>{}) + entity::type::field("baz"_s, r_baz, w_baz) ); return tuple; } -- cgit v1.2.3