summaryrefslogtreecommitdiffhomepage
path: root/entity/entity.hpp
diff options
context:
space:
mode:
authorStanislaw Halik <sthalik@misaki.pl>2022-11-18 12:04:26 +0100
committerStanislaw Halik <sthalik@misaki.pl>2022-11-18 12:30:17 +0100
commit50d4d02508767ed3cb67bf1ed424c61c23e44117 (patch)
tree62e2cb6c4277877cfe68c01d36fb679e69d2403d /entity/entity.hpp
parent44b40de7fc70fe81757a0288422de1953a2f98cb (diff)
entity: add read-only property support
Diffstat (limited to 'entity/entity.hpp')
-rw-r--r--entity/entity.hpp9
1 files changed, 8 insertions, 1 deletions
diff --git a/entity/entity.hpp b/entity/entity.hpp
index 4eca858e..30c75c15 100644
--- a/entity/entity.hpp
+++ b/entity/entity.hpp
@@ -56,7 +56,8 @@ template<typename F, typename T, typename FieldType>
concept FieldWriter = requires {
requires FieldWriter_memfn<F, T, FieldType> ||
FieldWriter_ptr<F, T, FieldType> ||
- FieldWriter_function<F, T, FieldType>;
+ FieldWriter_function<F, T, FieldType> ||
+ std::same_as<F, std::nullptr_t>;
};
namespace detail {
@@ -100,6 +101,11 @@ struct write_field<Obj, Type, fu2::function_base<IsOwning, IsCopyable, Capacity,
template<typename F> static constexpr void write(Obj& x, F&& fun, move_qualified<Type> value) { fun(x, value); }
};
+template<typename Obj, typename FieldType>
+struct write_field<Obj, FieldType, std::nullptr_t> {
+ static constexpr void write(Obj&, std::nullptr_t, move_qualified<FieldType>) { fm_abort("no writing for this accessor"); }
+};
+
template<typename F, typename Tuple, std::size_t N>
requires std::invocable<F, decltype(std::get<N>(std::declval<Tuple>()))>
constexpr CORRADE_ALWAYS_INLINE void visit_tuple(F&& fun, Tuple&& tuple)
@@ -152,6 +158,7 @@ struct entity_field : entity_field_base<Obj, Type> {
static constexpr void write(const W& writer, Obj& x, move_qualified<Type> v) { detail::write_field<Obj, Type, W>::write(x, writer, v); }
constexpr decltype(auto) read(const Obj& x) const { return read(reader, x); }
constexpr void write(Obj& x, move_qualified<Type> value) const { write(writer, x, value); }
+ static constexpr bool can_write = !std::is_same_v<std::nullptr_t, decltype(entity_field<Obj, Type, R, W>::writer)>;
constexpr entity_field(StringView name, R r, W w) noexcept : name{name}, reader{r}, writer{w} {}
constexpr erased_accessor erased() const;
};