From 3bdd6d8e638ed19973b9df6a894e8b7966731b9c Mon Sep 17 00:00:00 2001 From: Stanislaw Halik Date: Sun, 13 Nov 2022 20:00:57 +0100 Subject: entity stuff --- src/entity.hpp | 42 +++++++++++++++++++++++++++++------------- 1 file changed, 29 insertions(+), 13 deletions(-) (limited to 'src') diff --git a/src/entity.hpp b/src/entity.hpp index 7d55bfd6..b46fefcc 100644 --- a/src/entity.hpp +++ b/src/entity.hpp @@ -1,8 +1,10 @@ #pragma once #include "compat/integer-types.hpp" -#include #include -#include +#include +#include +#include +#include #include @@ -10,9 +12,13 @@ namespace floormat {} namespace floormat::entities { -template using const_qualified = std::conditional_t, T, const T&>; -template using ref_qualified = std::conditional_t, T, T&>; -template using move_qualified = std::conditional_t, T, T&&>; +template struct pass_by_value : std::bool_constant> {}; +template constexpr inline bool pass_by_value_v = pass_by_value::value; +template<> struct pass_by_value : std::true_type {}; + +template using const_qualified = std::conditional_t, T, const T&>; +template using ref_qualified = std::conditional_t, T, T&>; +template using move_qualified = std::conditional_t, T, T&&>; template concept FieldReader_memfn = requires(const T x, F f) { @@ -95,8 +101,8 @@ struct field { using Writer = W; StringView name; - Reader reader; - Writer writer; + [[no_unique_address]] Reader reader; + [[no_unique_address]] Writer writer; constexpr field(StringView name, Reader r, Writer w) noexcept : name{name}, reader{r}, writer{w} {} decltype(auto) read(const Obj& x) const { return read_field::read(x, reader); } @@ -104,16 +110,26 @@ struct field { }; template -struct entity { +struct entity final { template struct Field { template R, FieldWriter W> - struct make final : field { - consteval make(StringView name_, R r, W w) noexcept : field{name_, r, w} {} - }; - template R, FieldWriter W> - make(StringView name, R r, W w) -> make; + static consteval auto make(StringView name, R r, W w) noexcept { + return field { name, r, w }; + } }; }; +template +struct assoc final { + template using Types = std::tuple; + consteval assoc(Xs&&... xs) { + + } + +private: + template struct cell { Key key; T value; }; + std::tuple...> _tuple; +}; + } // namespace floormat::entities -- cgit v1.2.3