#pragma once #include "../../datatypes/base.h" #include "datatypes/meta.h" #include #include #include #include class Instance; struct FieldCodec { void (*write)(Data::Variant source, void* destination); Data::Variant (*read)(void* source); }; template void _writeCodec(Data::Variant source, void* destination) { *(U*)destination = source.get().value; } template Data::Variant _readCodec(void* source) { return T(*(U*)source); } template constexpr FieldCodec fieldCodecOf() { return FieldCodec { .write = &_writeCodec, .read = &_readCodec, }; } struct PropertyMeta { void* backingField; Data::TypeInfo type; FieldCodec codec; }; typedef std::variant MemberMeta; struct MemberMap { std::optional> super; std::map members; }; struct MemberNotFound {};