From b7ecc52bb4ca76bd802e199928eef104c2e0b538 Mon Sep 17 00:00:00 2001 From: Stanislaw Halik Date: Mon, 14 Nov 2022 14:37:45 +0100 Subject: entity: get rid of inheritance --- src/entity.hpp | 50 +++++++++++++++++++++++--------------------------- 1 file 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 { } // namespace detail -template -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::read(x, reader); } - constexpr void write(Obj& x, move_qualified v) const { detail::write_field::write(x, writer, v); } - -protected: - constexpr field_(StringView name, Reader r, Writer w) noexcept : name{name}, reader{r}, writer{w} {} -}; - template requires std::is_same_v> struct Entity final { - template - requires std::is_same_v> - struct type { - template R, FieldWriter W> - struct field final : field_ { - constexpr field(StringView field_name, R r, W w) : field_{field_name, r, w} {} + template + requires std::is_same_v> + struct type final + { + template R, FieldWriter 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::read(x, reader); } + constexpr void write(Obj& x, move_qualified v) const { detail::write_field::write(x, writer, v); } + + constexpr field(StringView name, Reader r, Writer w) noexcept : name{name}, reader{r}, writer{w} {} }; - template R, FieldWriter W> + template R, FieldWriter W> field(StringView name, R r, W w) -> field; }; }; -- cgit v1.2.3