[ox/model] Add Reflect op type, fix union field type output, bump desc type versions
This commit is contained in:
parent
ff473bf465
commit
40cc222cd8
13
deps/ox/src/ox/model/desctypes.hpp
vendored
13
deps/ox/src/ox/model/desctypes.hpp
vendored
@ -35,7 +35,7 @@ struct DescriptorField {
|
||||
// order of fields matters
|
||||
|
||||
static constexpr auto TypeName = "net.drinkingtea.ox.DescriptorField";
|
||||
static constexpr auto TypeVersion = 1;
|
||||
static constexpr auto TypeVersion = 2;
|
||||
|
||||
// do not serialize type
|
||||
const struct DescriptorType *type = nullptr;
|
||||
@ -82,7 +82,7 @@ using FieldList = Vector<DescriptorField>;
|
||||
struct DescriptorType {
|
||||
|
||||
static constexpr auto TypeName = "net.drinkingtea.ox.DescriptorType";
|
||||
static constexpr auto TypeVersion = 1;
|
||||
static constexpr auto TypeVersion = 2;
|
||||
|
||||
String typeName;
|
||||
PrimitiveType primitiveType = PrimitiveType::UnsignedInteger;
|
||||
@ -117,9 +117,14 @@ template<typename T>
|
||||
constexpr Error model(T *io, DescriptorType *type) noexcept {
|
||||
io->template setTypeInfo<DescriptorType>();
|
||||
oxReturnError(io->field("typeName", &type->typeName));
|
||||
auto pt = static_cast<uint8_t>(type->primitiveType);
|
||||
if constexpr(ox_strcmp(T::opType(), "Reflect") == 0) {
|
||||
uint8_t pt = 0;
|
||||
oxReturnError(io->field("primitiveType", &pt));
|
||||
} else {
|
||||
auto pt = type ? static_cast<uint8_t>(type->primitiveType) : 0;
|
||||
oxReturnError(io->field("primitiveType", &pt));
|
||||
type->primitiveType = static_cast<PrimitiveType>(pt);
|
||||
}
|
||||
oxReturnError(io->field("fieldList", &type->fieldList));
|
||||
oxReturnError(io->field("length", &type->length));
|
||||
oxReturnError(io->field("preloadable", &type->preloadable));
|
||||
@ -128,7 +133,7 @@ constexpr Error model(T *io, DescriptorType *type) noexcept {
|
||||
|
||||
template<typename T>
|
||||
constexpr Error model(T *io, DescriptorField *field) noexcept {
|
||||
io->template setTypeInfo<DescriptorField>(DescriptorField::TypeName, 4);
|
||||
io->template setTypeInfo<DescriptorField>();
|
||||
oxReturnError(io->field("typeName", &field->typeName));
|
||||
oxReturnError(io->field("fieldName", &field->fieldName));
|
||||
oxReturnError(io->field("subscriptLevels", &field->subscriptLevels));
|
||||
|
6
deps/ox/src/ox/model/descwrite.hpp
vendored
6
deps/ox/src/ox/model/descwrite.hpp
vendored
@ -67,7 +67,7 @@ class TypeDescWriter {
|
||||
}
|
||||
|
||||
static constexpr auto opType() noexcept {
|
||||
return OpType::WriteDefinition;
|
||||
return OpType::Reflect;
|
||||
}
|
||||
|
||||
private:
|
||||
@ -121,7 +121,7 @@ constexpr Error TypeDescWriter::field(const char *name, T *val, std::size_t) noe
|
||||
if (t == nullptr) {
|
||||
type(p, &alreadyExisted);
|
||||
}
|
||||
m_type->fieldList.emplace_back(t, name, detail::indirectionLevels(val), alreadyExisted ? t->typeName : "");
|
||||
m_type->fieldList.emplace_back(t, name, detail::indirectionLevels(val), t->typeName);
|
||||
return OxError(0);
|
||||
}
|
||||
return OxError(1);
|
||||
@ -133,7 +133,7 @@ constexpr Error TypeDescWriter::field(const char *name, T val) noexcept {
|
||||
bool alreadyExisted = false;
|
||||
const auto t = type(val, &alreadyExisted);
|
||||
oxAssert(t != nullptr, "field(const char *name, T val): Type not found or generated");
|
||||
m_type->fieldList.emplace_back(t, name, 0, alreadyExisted ? t->typeName : "");
|
||||
m_type->fieldList.emplace_back(t, name, 0, t->typeName);
|
||||
return OxError(0);
|
||||
}
|
||||
return OxError(1);
|
||||
|
2
deps/ox/src/ox/model/fieldcounter.hpp
vendored
2
deps/ox/src/ox/model/fieldcounter.hpp
vendored
@ -43,7 +43,7 @@ class FieldCounter {
|
||||
}
|
||||
|
||||
static constexpr auto opType() {
|
||||
return OpType::Read;
|
||||
return OpType::Reflect;
|
||||
}
|
||||
};
|
||||
|
||||
|
8
deps/ox/src/ox/model/optype.hpp
vendored
8
deps/ox/src/ox/model/optype.hpp
vendored
@ -18,6 +18,7 @@ namespace OpType {
|
||||
constexpr auto Read = "Read";
|
||||
constexpr auto Write = "Write";
|
||||
constexpr auto WriteDefinition = "WriteDefinition";
|
||||
constexpr auto Reflect = "Reflect";
|
||||
}
|
||||
|
||||
// empty default implementations of model functions
|
||||
@ -39,6 +40,11 @@ constexpr Error modelWriteDefinition(T*, O*) noexcept {
|
||||
return OxError(1, "Model: modelWriteDefinition not implemented");
|
||||
}
|
||||
|
||||
template<typename T, typename O>
|
||||
constexpr Error modelReflect(T*, O*) noexcept {
|
||||
return OxError(1, "Model: modelReflect not implemented");
|
||||
}
|
||||
|
||||
template<typename T, typename O>
|
||||
constexpr Error model(T *io, O *obj) noexcept {
|
||||
if constexpr(ox_strcmp(T::opType(), OpType::Read) == 0) {
|
||||
@ -47,6 +53,8 @@ constexpr Error model(T *io, O *obj) noexcept {
|
||||
return modelWrite(io, obj);
|
||||
} else if constexpr(ox_strcmp(T::opType(), OpType::WriteDefinition) == 0) {
|
||||
return modelWriteDefinition(io, obj);
|
||||
} else if constexpr(ox_strcmp(T::opType(), OpType::Reflect) == 0) {
|
||||
return modelReflect(io, obj);
|
||||
} else {
|
||||
oxAssert(OxError(1), "Missing model function");
|
||||
return OxError(1);
|
||||
|
2
deps/ox/src/ox/model/typenamecatcher.hpp
vendored
2
deps/ox/src/ox/model/typenamecatcher.hpp
vendored
@ -46,7 +46,7 @@ struct TypeNameCatcher {
|
||||
}
|
||||
|
||||
static constexpr auto opType() noexcept {
|
||||
return OpType::WriteDefinition;
|
||||
return OpType::Reflect;
|
||||
}
|
||||
|
||||
};
|
||||
|
7
deps/ox/src/ox/model/typestore.hpp
vendored
7
deps/ox/src/ox/model/typestore.hpp
vendored
@ -11,6 +11,7 @@
|
||||
#include <ox/std/hashmap.hpp>
|
||||
#include <ox/std/memory.hpp>
|
||||
#include <ox/std/string.hpp>
|
||||
#include <ox/std/typetraits.hpp>
|
||||
|
||||
#include "typenamecatcher.hpp"
|
||||
#include "desctypes.hpp"
|
||||
@ -60,10 +61,14 @@ class TypeStore {
|
||||
const String name = nameCstr;
|
||||
auto [val, err] = m_cache.at(name);
|
||||
if (err) {
|
||||
if (!std::is_constant_evaluated()) {
|
||||
oxRequireM(dt, loadDescriptor(name));
|
||||
auto &out = m_cache[name];
|
||||
out = std::move(dt);
|
||||
return out.get();
|
||||
} else {
|
||||
return OxError(1, "Type not available");
|
||||
}
|
||||
}
|
||||
return val->get();
|
||||
}
|
||||
@ -87,7 +92,7 @@ class TypeStore {
|
||||
}
|
||||
|
||||
protected:
|
||||
constexpr virtual Result<UniquePtr<DescriptorType>> loadDescriptor(const ox::String&) noexcept {
|
||||
virtual Result<UniquePtr<DescriptorType>> loadDescriptor(const ox::String&) noexcept {
|
||||
return OxError(1);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user