diff options
Diffstat (limited to 'entity/accessor.hpp')
-rw-r--r-- | entity/accessor.hpp | 77 |
1 files changed, 60 insertions, 17 deletions
diff --git a/entity/accessor.hpp b/entity/accessor.hpp index f069cb5b..5e6a60ce 100644 --- a/entity/accessor.hpp +++ b/entity/accessor.hpp @@ -1,36 +1,62 @@ #pragma once #include "util.hpp" +#include "erased-constraints.hpp" #include <type_traits> +#include <utility> #include <Corrade/Containers/StringView.h> +namespace floormat::erased_constraints { + +struct range; +struct max_length; +struct group; + +} // namespace floormat::erased_constraints + namespace floormat::entities { enum class field_status : unsigned char { enabled, hidden, readonly, }; struct erased_accessor final { - using erased_reader_t = void; - using erased_writer_t = void; - using erased_predicate_t = void; + using reader_t = void; + using writer_t = void; + using predicate_t = void; + using c_range_t = void; + using c_length_t = void; + using c_group_t = void; using Object = void; using Value = void; - const erased_reader_t* reader; - const erased_writer_t* writer; - const erased_predicate_t* predicate; + const reader_t* reader; + const writer_t* writer; + const predicate_t* predicate; + const c_range_t* range; + const c_length_t* length; + const c_group_t* group; + StringView field_name, object_type, field_type; - void(*read_fun)(const Object*, const erased_reader_t*, Value*); - void(*write_fun)(Object*, const erased_writer_t*, Value*); - field_status(*predicate_fun)(const Object*, const erased_predicate_t*); + void(*read_fun)(const Object*, const reader_t*, Value*); + void(*write_fun)(Object*, const writer_t*, Value*); + field_status(*predicate_fun)(const Object*, const predicate_t*); + erased_constraints::range(*range_fun)(const Object*, const c_range_t*); + erased_constraints::max_length(*length_fun)(const Object*, const c_length_t*); + erased_constraints::group(*group_fun)(const Object*, const c_group_t*); constexpr erased_accessor(const erased_accessor&) = default; - constexpr erased_accessor(const erased_reader_t* reader, const erased_writer_t* writer, const erased_predicate_t* predicate, + constexpr erased_accessor(const reader_t* reader, const writer_t* writer, const predicate_t* predicate, + const c_range_t* range, const c_length_t* length, const c_group_t* group, StringView field_name, StringView object_name, StringView field_type_name, - void(*read_fun)(const Object*, const erased_reader_t*, Value*), - void(*write_fun)(Object*, const erased_writer_t*, Value*), - field_status(*predicate_fun)(const Object*, const erased_predicate_t*)) : + void(*read_fun)(const Object*, const reader_t*, Value*), + void(*write_fun)(Object*, const writer_t*, Value*), + field_status(*predicate_fun)(const Object*, const predicate_t*), + erased_constraints::range(*range_fun)(const Object*, const c_range_t*), + erased_constraints::max_length(*length_fun)(const Object*, const c_length_t*), + erased_constraints::group(*group_fun)(const Object*, const c_group_t*)) : reader{reader}, writer{writer}, predicate{predicate}, + range{range}, length{length}, group{group}, field_name{field_name}, object_type{object_name}, field_type{field_type_name}, - read_fun{read_fun}, write_fun{write_fun}, predicate_fun{predicate_fun} + read_fun{read_fun}, write_fun{write_fun}, predicate_fun{predicate_fun}, + range_fun{range_fun}, length_fun{length_fun}, group_fun{group_fun} {} template<typename T, typename FieldType> @@ -39,6 +65,9 @@ struct erased_accessor final { template<typename T, typename FieldType> constexpr bool check_name() const noexcept; + template<typename Obj> + constexpr void do_asserts() const; + template<typename Obj, typename FieldType> constexpr void assert_name() const noexcept; template<typename Obj, typename FieldType> void read_unchecked(const Obj& x, FieldType& value) const noexcept; template<typename Obj, typename FieldType> requires std::is_default_constructible_v<FieldType> FieldType read_unchecked(const Obj& x) const noexcept; @@ -46,8 +75,12 @@ struct erased_accessor final { template<typename Obj, typename FieldType> requires std::is_default_constructible_v<FieldType> FieldType read(const Obj& x) const noexcept; template<typename Obj, typename FieldType> void read(const Obj& x, FieldType& value) const noexcept; template<typename Obj, typename FieldType> void write(Obj& x, move_qualified<FieldType> value) const noexcept; + template<typename Obj> field_status is_enabled(const Obj& x) const noexcept; constexpr bool can_write() const noexcept { return writer != nullptr; } + template<typename Obj> erased_constraints::range get_range(const Obj& x) const noexcept; + template<typename Obj> erased_constraints::max_length get_max_length(const Obj& x) const noexcept; + template<typename Obj> erased_constraints::group get_group(const Obj& x) const noexcept; }; template<typename T, typename FieldType> @@ -57,6 +90,14 @@ constexpr bool erased_accessor::check_name_static() !std::is_pointer_v<FieldType> && !std::is_reference_v<T>; } +template<typename Obj> +constexpr void erased_accessor::do_asserts() const +{ + static_assert(!std::is_pointer_v<Obj> && !std::is_reference_v<Obj>); + constexpr auto obj = name_of<Obj>; + fm_assert(obj.data() == object_type.data() || obj == object_type); +} + template<typename T, typename FieldType> constexpr bool erased_accessor::check_name() const noexcept { @@ -120,10 +161,12 @@ void erased_accessor::write(Obj& x, move_qualified<FieldType> value) const noexc template<typename Obj> field_status erased_accessor::is_enabled(const Obj& x) const noexcept { - static_assert(!std::is_pointer_v<Obj> && !std::is_reference_v<Obj>); - constexpr auto obj = name_of<Obj>; - fm_assert(obj.data() == object_type.data() || obj == object_type); + do_asserts<Obj>(); return predicate_fun(&x, predicate); } +template<typename T> erased_constraints::range erased_accessor::get_range(const T& x) const noexcept { do_asserts<T>();return range_fun(&x,range); } +template<typename T> erased_constraints::max_length erased_accessor::get_max_length(const T& x) const noexcept { do_asserts<T>();return length_fun(&x,length); } +template<typename T> erased_constraints::group erased_accessor::get_group(const T& x) const noexcept { do_asserts<T>();return group_fun(&x, group); } + } // namespace floormat::entities |