[ox] Add HashMap<String, T> to serializaton handlers
This commit is contained in:
19
deps/ox/src/ox/oc/read.hpp
vendored
19
deps/ox/src/ox/oc/read.hpp
vendored
@@ -12,6 +12,7 @@
|
||||
#include <ox/model/optype.hpp>
|
||||
#include <ox/model/types.hpp>
|
||||
#include <ox/std/byteswap.hpp>
|
||||
#include <ox/std/hashmap.hpp>
|
||||
#include <ox/std/memops.hpp>
|
||||
#include <ox/std/string.hpp>
|
||||
#include <ox/std/vector.hpp>
|
||||
@@ -51,7 +52,10 @@ class OrganicClawReader {
|
||||
[[nodiscard]] Error field(const char *key, T *val, std::size_t len);
|
||||
|
||||
template<typename T>
|
||||
[[nodiscard]] Error field(const char *key, ox::Vector<T> *val);
|
||||
[[nodiscard]] Error field(const char *key, Vector<T> *val);
|
||||
|
||||
template<typename T>
|
||||
[[nodiscard]] Error field(const char*, HashMap<String, T> *val);
|
||||
|
||||
template<typename T>
|
||||
[[nodiscard]] Error field(const char *key, T *val);
|
||||
@@ -158,6 +162,19 @@ Error OrganicClawReader::field(const char *key, ox::Vector<T> *val) {
|
||||
return field(key, val->data(), val->size());
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
[[nodiscard]] Error OrganicClawReader::field(const char *key, HashMap<String, T> *val) {
|
||||
const auto &srcVal = value(key);
|
||||
auto keys = srcVal.getMemberNames();
|
||||
auto srcSize = srcVal.size();
|
||||
OrganicClawReader r(srcVal);
|
||||
for (decltype(srcSize) i = 0; i < srcSize; ++i) {
|
||||
auto k = keys[i].c_str();
|
||||
oxReturnError(r.field(k, &val->at(k)));
|
||||
}
|
||||
return OxError(0);
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
Error readOC(const char *json, std::size_t jsonSize, T *val) noexcept {
|
||||
// OrganicClawReader constructor can throw, but readOC should return its errors.
|
||||
|
8
deps/ox/src/ox/oc/test/tests.cpp
vendored
8
deps/ox/src/ox/oc/test/tests.cpp
vendored
@@ -45,6 +45,7 @@ struct TestStruct {
|
||||
char *CString = nullptr;
|
||||
ox::BString<32> String = "";
|
||||
uint32_t List[4] = {0, 0, 0, 0};
|
||||
ox::HashMap<ox::String, int> Map;
|
||||
TestStructNest EmptyStruct;
|
||||
TestStructNest Struct;
|
||||
|
||||
@@ -74,7 +75,7 @@ ox::Error model(T *io, TestStructNest *obj) {
|
||||
|
||||
template<typename T>
|
||||
ox::Error model(T *io, TestStruct *obj) {
|
||||
io->setTypeInfo("TestStruct", 16);
|
||||
io->setTypeInfo("TestStruct", 17);
|
||||
oxReturnError(io->field("Bool", &obj->Bool));
|
||||
oxReturnError(io->field("Int", &obj->Int));
|
||||
oxReturnError(io->field("Int1", &obj->Int1));
|
||||
@@ -89,6 +90,7 @@ ox::Error model(T *io, TestStruct *obj) {
|
||||
oxReturnError(io->field("CString", ox::SerStr(&obj->CString)));
|
||||
oxReturnError(io->field("String", &obj->String));
|
||||
oxReturnError(io->field("List", obj->List, 4));
|
||||
oxReturnError(io->field("Map", &obj->Map));
|
||||
oxReturnError(io->field("EmptyStruct", &obj->EmptyStruct));
|
||||
oxReturnError(io->field("Struct", &obj->Struct));
|
||||
return OxError(0);
|
||||
@@ -119,6 +121,8 @@ std::map<std::string, ox::Error(*)()> tests = {
|
||||
testIn.List[1] = 2;
|
||||
testIn.List[2] = 3;
|
||||
testIn.List[3] = 4;
|
||||
testIn.Map["asdf"] = 93;
|
||||
testIn.Map["aoeu"] = 94;
|
||||
testIn.Struct.Bool = false;
|
||||
testIn.Struct.Int = 300;
|
||||
testIn.Struct.String = "Test String 2";
|
||||
@@ -146,6 +150,8 @@ std::map<std::string, ox::Error(*)()> tests = {
|
||||
oxAssert(testIn.List[1] == testOut->List[1], "List[1] value mismatch");
|
||||
oxAssert(testIn.List[2] == testOut->List[2], "List[2] value mismatch");
|
||||
oxAssert(testIn.List[3] == testOut->List[3], "List[3] value mismatch");
|
||||
oxAssert(testIn.Map["asdf"] == testOut->Map["asdf"], "Map[\"asdf\"] value mismatch");
|
||||
oxAssert(testIn.Map["aoeu"] == testOut->Map["aoeu"], "Map[\"aoeu\"] value mismatch");
|
||||
oxAssert(testIn.EmptyStruct.Bool == testOut->EmptyStruct.Bool, "EmptyStruct.Bool value mismatch");
|
||||
oxAssert(testIn.EmptyStruct.Int == testOut->EmptyStruct.Int, "EmptyStruct.Int value mismatch");
|
||||
oxAssert(testIn.EmptyStruct.String == testOut->EmptyStruct.String, "EmptyStruct.String value mismatch");
|
||||
|
18
deps/ox/src/ox/oc/write.hpp
vendored
18
deps/ox/src/ox/oc/write.hpp
vendored
@@ -12,6 +12,7 @@
|
||||
|
||||
#include <ox/model/optype.hpp>
|
||||
#include <ox/model/types.hpp>
|
||||
#include <ox/std/hashmap.hpp>
|
||||
#include <ox/std/string.hpp>
|
||||
#include <ox/std/vector.hpp>
|
||||
|
||||
@@ -53,6 +54,9 @@ class OrganicClawWriter {
|
||||
template<typename T>
|
||||
[[nodiscard]] Error field(const char*, ox::Vector<T> *val);
|
||||
|
||||
template<typename T>
|
||||
[[nodiscard]] Error field(const char*, HashMap<String, T> *val);
|
||||
|
||||
template<std::size_t L>
|
||||
[[nodiscard]] Error field(const char*, ox::BString<L> *val);
|
||||
|
||||
@@ -129,6 +133,20 @@ Error OrganicClawWriter::field(const char *key, ox::Vector<T> *val) {
|
||||
return field(key, val->data(), val->size());
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
[[nodiscard]] Error OrganicClawWriter::field(const char *key, ox::HashMap<String, T> *val) {
|
||||
if (targetValid()) {
|
||||
auto &keys = val->keys();
|
||||
OrganicClawWriter w;
|
||||
for (std::size_t i = 0; i < keys.size(); ++i) {
|
||||
auto k = keys[i].c_str();
|
||||
oxReturnError(w.field(k, &val->at(k)));
|
||||
}
|
||||
value(key) = w.m_json;
|
||||
}
|
||||
++m_fieldIt;
|
||||
return OxError(0);
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
ValErr<Vector<char>> writeOC(T *val) {
|
||||
|
Reference in New Issue
Block a user