diff options
| author | Stanislaw Halik <sthalik@misaki.pl> | 2022-11-14 14:37:45 +0100 |
|---|---|---|
| committer | Stanislaw Halik <sthalik@misaki.pl> | 2022-11-14 15:20:29 +0100 |
| commit | b7ecc52bb4ca76bd802e199928eef104c2e0b538 (patch) | |
| tree | 6790dbeefbd18fd538fd95e7fd7fb1cb8da2eae5 | |
| parent | 8f0b22e3fe082c2b5c75a7fe3435f56a38cbc5a2 (diff) | |
entity: get rid of inheritance
| -rw-r--r-- | src/entity.hpp | 50 |
1 files changed, 23 insertions, 27 deletions
diff --git a/src/entity.hpp b/src/entity.hpp index 2bf52970..2eb99e27 100644 --- a/src/entity.hpp +++ b/src/entity.hpp @@ -94,38 +94,34 @@ struct write_field<Obj, FieldType, FieldType Obj::*> { } // namespace detail -template<typename Obj, typename FieldType, typename R, typename W> -struct field_ { - using Object = Obj; - using Type = FieldType; - using Reader = R; - using Writer = W; - - StringView name; - [[no_unique_address]] Reader reader; - [[no_unique_address]] Writer writer; - - constexpr field_(const field_&) = default; - constexpr field_& operator=(const field_&) = default; - constexpr decltype(auto) read(const Obj& x) const { return detail::read_field<Obj, FieldType, R>::read(x, reader); } - constexpr void write(Obj& x, move_qualified<FieldType> v) const { detail::write_field<Obj, FieldType, W>::write(x, writer, v); } - -protected: - constexpr field_(StringView name, Reader r, Writer w) noexcept : name{name}, reader{r}, writer{w} {} -}; - template<typename Obj> requires std::is_same_v<Obj, std::decay_t<Obj>> struct Entity final { - template<typename FieldType> - requires std::is_same_v<Obj, std::decay_t<Obj>> - struct type { - template<FieldReader<Obj, FieldType> R, FieldWriter<Obj, FieldType> W> - struct field final : field_<Obj, FieldType, R, W> { - constexpr field(StringView field_name, R r, W w) : field_<Obj, FieldType, R, W>{field_name, r, w} {} + template<typename Type> + requires std::is_same_v<Type, std::decay_t<Type>> + struct type final + { + template<FieldReader<Obj, Type> R, FieldWriter<Obj, Type> W> + struct field final + { + using ObjectType = Obj; + using FieldType = Type; + using Reader = R; + using Writer = W; + + StringView name; + [[no_unique_address]] Reader reader; + [[no_unique_address]] Writer writer; + + constexpr field(const field&) = default; + constexpr field& operator=(const field&) = default; + constexpr decltype(auto) read(const Obj& x) const { return detail::read_field<Obj, Type, R>::read(x, reader); } + constexpr void write(Obj& x, move_qualified<Type> v) const { detail::write_field<Obj, Type, W>::write(x, writer, v); } + + constexpr field(StringView name, Reader r, Writer w) noexcept : name{name}, reader{r}, writer{w} {} }; - template<FieldReader<Obj, FieldType> R, FieldWriter<Obj, FieldType> W> + template<FieldReader<Obj, Type> R, FieldWriter<Obj, Type> W> field(StringView name, R r, W w) -> field<R, W>; }; }; |
