openblocks/src/objects/base/member.h

48 lines
1,012 B
C
Raw Normal View History

2025-01-28 19:14:12 +00:00
#pragma once
2025-01-29 21:41:24 +00:00
#include "../../datatypes/base.h"
#include "datatypes/meta.h"
2025-01-28 19:14:12 +00:00
#include <map>
#include <memory>
#include <optional>
#include <variant>
class Instance;
2025-01-29 21:41:24 +00:00
struct FieldCodec {
void (*write)(Data::Variant source, void* destination);
Data::Variant (*read)(void* source);
};
template <typename T, typename U>
void _writeCodec(Data::Variant source, void* destination) {
*(U*)destination = source.get<T>().value;
}
template <typename T, typename U>
Data::Variant _readCodec(void* source) {
return T(*(U*)source);
}
template <typename T, typename U>
constexpr FieldCodec fieldCodecOf() {
return FieldCodec {
.write = &_writeCodec<T, U>,
.read = &_readCodec<T, U>,
};
}
2025-01-28 19:14:12 +00:00
struct PropertyMeta {
void* backingField;
2025-01-29 21:41:24 +00:00
Data::TypeInfo type;
FieldCodec codec;
2025-01-28 19:14:12 +00:00
};
typedef std::variant<PropertyMeta> MemberMeta;
struct MemberMap {
std::optional<std::unique_ptr<MemberMap>> super;
std::map<std::string, PropertyMeta> members;
};
struct MemberNotFound {};