From 960889749db46d984f763768ff228da5d499ba4c Mon Sep 17 00:00:00 2001 From: Gary Talent Date: Wed, 13 Dec 2023 22:44:54 -0600 Subject: [PATCH] [ox] Fix some template issue that come up with some versions of Clang, fix empty string read in OC --- deps/ox/src/ox/mc/read.hpp | 9 ++------ deps/ox/src/ox/model/descwrite.hpp | 4 ++-- deps/ox/src/ox/model/modelhandleradaptor.hpp | 21 ++++++++++++------- deps/ox/src/ox/oc/read.hpp | 2 +- deps/ox/src/ox/oc/write.hpp | 10 ++++----- deps/ox/src/ox/preloader/alignmentcatcher.hpp | 7 +------ deps/ox/src/ox/preloader/platspecs.hpp | 1 + deps/ox/src/ox/preloader/preloader.cpp | 2 ++ deps/ox/src/ox/preloader/preloader.hpp | 12 ++++------- deps/ox/src/ox/preloader/sizecatcher.hpp | 7 +------ deps/ox/src/ox/preloader/unionsizecatcher.hpp | 7 +------ deps/ox/src/ox/std/span.hpp | 18 +++++++++------- deps/ox/src/ox/std/types.hpp | 2 ++ 13 files changed, 45 insertions(+), 57 deletions(-) diff --git a/deps/ox/src/ox/mc/read.hpp b/deps/ox/src/ox/mc/read.hpp index e2c8c20a..a8ff438c 100644 --- a/deps/ox/src/ox/mc/read.hpp +++ b/deps/ox/src/ox/mc/read.hpp @@ -27,7 +27,7 @@ namespace ox { template -class MetalClawReaderTemplate: public ModelHandlerBase> { +class MetalClawReaderTemplate: public ModelHandlerBase, ox::OpType::Read> { private: FieldBitmapReader m_fieldPresence; @@ -127,11 +127,6 @@ class MetalClawReaderTemplate: public ModelHandlerBase constexpr Error readInteger(I *val) noexcept; @@ -533,7 +528,7 @@ template Error readMC(const char *buff, std::size_t buffLen, T *val) noexcept { BufferReader br(buff, buffLen); MetalClawReader reader(br); - ModelHandlerInterface handler(&reader); + ModelHandlerInterface handler(&reader); return model(&handler, val); } diff --git a/deps/ox/src/ox/model/descwrite.hpp b/deps/ox/src/ox/model/descwrite.hpp index c7603acc..cfd7b127 100644 --- a/deps/ox/src/ox/model/descwrite.hpp +++ b/deps/ox/src/ox/model/descwrite.hpp @@ -357,7 +357,7 @@ constexpr const DescriptorType *TypeDescWriter::getType(CRStringView tn, int typ template constexpr Result buildTypeDef(TypeStore *typeStore) noexcept { TypeDescWriter writer(typeStore); - ModelHandlerInterface handler(&writer); + ModelHandlerInterface handler(&writer); if (std::is_constant_evaluated()) { std::allocator a; T *t = a.allocate(1); @@ -373,7 +373,7 @@ constexpr Result buildTypeDef(TypeStore *typeStore) noexcept { template constexpr Result buildTypeDef(TypeStore *typeStore, T *val) noexcept { TypeDescWriter writer(typeStore); - ModelHandlerInterface handler(&writer); + ModelHandlerInterface handler(&writer); oxReturnError(model(&handler, val)); return writer.definition(); } diff --git a/deps/ox/src/ox/model/modelhandleradaptor.hpp b/deps/ox/src/ox/model/modelhandleradaptor.hpp index d63f5d1e..f3a1c987 100644 --- a/deps/ox/src/ox/model/modelhandleradaptor.hpp +++ b/deps/ox/src/ox/model/modelhandleradaptor.hpp @@ -14,7 +14,7 @@ namespace ox { -template +template class ModelHandlerInterface { private: Handler *m_handler = nullptr; @@ -46,7 +46,7 @@ class ModelHandlerInterface { } template - constexpr Error fieldCString(const char *name, const char val[len]) noexcept requires(Handler::opType() != OpType::Read) { + constexpr Error fieldCString(const char *name, const char val[len]) noexcept requires(opType_v != OpType::Read) { return m_handler->fieldCString(name, &val[0], len); } @@ -54,11 +54,11 @@ class ModelHandlerInterface { return m_handler->fieldCString(name, val); } - constexpr Error fieldCString(const char *name, const char *const*val) noexcept requires(Handler::opType() != OpType::Read) { + constexpr Error fieldCString(const char *name, const char *const*val) noexcept requires(opType_v != OpType::Read) { return m_handler->fieldCString(name, val); } - constexpr Error fieldCString(const char *name, const char **val) noexcept requires(Handler::opType() != OpType::Read) { + constexpr Error fieldCString(const char *name, const char **val) noexcept requires(opType_v != OpType::Read) { return m_handler->fieldCString(name, val); } @@ -66,7 +66,7 @@ class ModelHandlerInterface { return m_handler->fieldCString(name, val, buffLen); } - constexpr Error fieldCString(const char *name, const char **val, std::size_t buffLen) noexcept requires(Handler::opType() != OpType::Read) { + constexpr Error fieldCString(const char *name, const char **val, std::size_t buffLen) noexcept requires(opType_v != OpType::Read) { return m_handler->fieldCString(name, val, buffLen); } @@ -103,7 +103,7 @@ class ModelHandlerInterface { case ModelValue::Type::Union: { auto &u = v->template get(); - if constexpr(Handler::opType() == OpType::Read) { + if constexpr(opType_v == OpType::Read) { u.setActiveField(m_handler->whichFieldPresent(name, u)); return m_handler->field(name, UnionView(&u, u.unionIdx())); } else { @@ -180,10 +180,10 @@ class ModelHandlerInterface { }; -template +template class ModelHandlerBase { private: - ModelHandlerInterface m_interface; + ModelHandlerInterface m_interface; public: constexpr ModelHandlerBase() noexcept: m_interface(static_cast(this)) {} constexpr ModelHandlerBase(const ModelHandlerBase&) noexcept: m_interface(static_cast(this)) {} @@ -192,6 +192,11 @@ class ModelHandlerBase { constexpr auto interface() noexcept { return &m_interface; } + [[nodiscard]] + static constexpr ox::OpType opType() noexcept { + return opType_v; + } + }; } diff --git a/deps/ox/src/ox/oc/read.hpp b/deps/ox/src/ox/oc/read.hpp index ba636c10..2b55a436 100644 --- a/deps/ox/src/ox/oc/read.hpp +++ b/deps/ox/src/ox/oc/read.hpp @@ -194,7 +194,7 @@ Error OrganicClawReader::field(const char *key, BasicString *val) noexcept { if (targetValid()) { const auto &jv = value(key); if (jv.empty()) { - *val = 0; + *val = BasicString{}; } else if (jv.isString()) { *val = jv.asString().c_str(); } else { diff --git a/deps/ox/src/ox/oc/write.hpp b/deps/ox/src/ox/oc/write.hpp index f636ce53..77bb8cfc 100644 --- a/deps/ox/src/ox/oc/write.hpp +++ b/deps/ox/src/ox/oc/write.hpp @@ -117,7 +117,7 @@ class OrganicClawWriter { if (targetValid()) { const auto &keys = val->keys(); OrganicClawWriter w; - ModelHandlerInterface handler{&w}; + ModelHandlerInterface handler{&w}; for (std::size_t i = 0; i < keys.size(); ++i) { const auto k = keys[i].c_str(); if (k) [[likely]] { @@ -197,7 +197,7 @@ template Error OrganicClawWriter::field(const char *key, const T *val, std::size_t len) noexcept { if (targetValid() && len) { OrganicClawWriter w((Json::Value(Json::arrayValue))); - ModelHandlerInterface handler{&w}; + ModelHandlerInterface handler{&w}; for (std::size_t i = 0; i < len; ++i) { oxReturnError(handler.field("", &val[i])); } @@ -213,7 +213,7 @@ Error OrganicClawWriter::field(const char *key, const T *val) noexcept { return field(key, val->data(), val->size()); } else if (val && targetValid()) { OrganicClawWriter w; - ModelHandlerInterface handler{&w}; + ModelHandlerInterface handler{&w}; oxReturnError(model(&handler, val)); if (!w.m_json.isNull()) { value(key) = w.m_json; @@ -227,7 +227,7 @@ template Error OrganicClawWriter::field(const char *key, UnionView val) noexcept { if (targetValid()) { OrganicClawWriter w(val.idx()); - ModelHandlerInterface handler{&w}; + ModelHandlerInterface handler{&w}; oxReturnError(model(&handler, val.get())); if (!w.m_json.isNull()) { value(key) = w.m_json; @@ -239,7 +239,7 @@ Error OrganicClawWriter::field(const char *key, UnionView val) noexcep Result writeOC(const auto &val) noexcept { OrganicClawWriter writer; - ModelHandlerInterface handler(&writer); + ModelHandlerInterface handler(&writer); oxReturnError(model(&handler, &val)); Json::StreamWriterBuilder jsonBuilder; const auto str = Json::writeString(jsonBuilder, writer.m_json); diff --git a/deps/ox/src/ox/preloader/alignmentcatcher.hpp b/deps/ox/src/ox/preloader/alignmentcatcher.hpp index 4dab6b15..d6756f70 100644 --- a/deps/ox/src/ox/preloader/alignmentcatcher.hpp +++ b/deps/ox/src/ox/preloader/alignmentcatcher.hpp @@ -22,7 +22,7 @@ template constexpr std::size_t sizeOf(const T *t) noexcept; template -struct AlignmentCatcher: public ModelHandlerBase> { +struct AlignmentCatcher: public ModelHandlerBase, OpType::Reflect> { std::size_t biggestAlignment = 1; template @@ -64,11 +64,6 @@ struct AlignmentCatcher: public ModelHandlerBase> { return {}; } - [[nodiscard]] - static constexpr auto opType() noexcept { - return ox::OpType::Reflect; - } - }; } diff --git a/deps/ox/src/ox/preloader/platspecs.hpp b/deps/ox/src/ox/preloader/platspecs.hpp index 08fcc109..805df0d8 100644 --- a/deps/ox/src/ox/preloader/platspecs.hpp +++ b/deps/ox/src/ox/preloader/platspecs.hpp @@ -13,6 +13,7 @@ namespace ox { struct NativePlatSpec { + static constexpr std::size_t RomStart = 1024; using PtrType = uintptr_t; using size_t = std::size_t; diff --git a/deps/ox/src/ox/preloader/preloader.cpp b/deps/ox/src/ox/preloader/preloader.cpp index b7d1d578..e9cf68e7 100644 --- a/deps/ox/src/ox/preloader/preloader.cpp +++ b/deps/ox/src/ox/preloader/preloader.cpp @@ -6,4 +6,6 @@ namespace ox { +template class Preloader; + } diff --git a/deps/ox/src/ox/preloader/preloader.hpp b/deps/ox/src/ox/preloader/preloader.hpp index 579c26cc..7a0057d4 100644 --- a/deps/ox/src/ox/preloader/preloader.hpp +++ b/deps/ox/src/ox/preloader/preloader.hpp @@ -15,7 +15,6 @@ #include #include -#include "preloader.hpp" #include "platspecs.hpp" namespace ox { @@ -24,7 +23,7 @@ template class Preloader; template -class Preloader: public ModelHandlerBase> { +class Preloader: public ModelHandlerBase, OpType::Reflect> { private: using PtrType = typename PlatSpec::PtrType; static constexpr auto PtrSize = sizeof(PtrType); @@ -115,11 +114,6 @@ class Preloader: public ModelHandlerBase> { return m_buff; } - [[nodiscard]] - static constexpr auto opType() noexcept { - return ox::OpType::Write; - } - template constexpr ox::Error pad(const T*) noexcept; @@ -272,7 +266,7 @@ constexpr ox::Error Preloader::endAlloc() noexcept { return m_writer.seekp(0, ox::ios_base::end); } const auto &si = *m_allocStack.back().unwrap(); - oxReturnError(m_writer.seekp(si.restore, si.seekdir)); + oxReturnError(m_writer.seekp(static_cast(si.restore), si.seekdir)); m_allocStack.pop_back(); return {}; } @@ -364,4 +358,6 @@ constexpr ox::Error preload(Preloader *pl, ox::CommonPtrWith auto * return pl->pad(obj); } +extern template class Preloader; + } diff --git a/deps/ox/src/ox/preloader/sizecatcher.hpp b/deps/ox/src/ox/preloader/sizecatcher.hpp index 1a5da480..3668c6bd 100644 --- a/deps/ox/src/ox/preloader/sizecatcher.hpp +++ b/deps/ox/src/ox/preloader/sizecatcher.hpp @@ -24,7 +24,7 @@ template constexpr std::size_t sizeOf(const T *t) noexcept; template -class SizeCatcher: public ModelHandlerBase> { +class SizeCatcher: public ModelHandlerBase, OpType::Reflect> { private: std::size_t m_size = 0; @@ -61,11 +61,6 @@ class SizeCatcher: public ModelHandlerBase> { return m_size; } - [[nodiscard]] - static constexpr auto opType() noexcept { - return ox::OpType::Reflect; - } - private: constexpr void pad(const auto *val) noexcept; }; diff --git a/deps/ox/src/ox/preloader/unionsizecatcher.hpp b/deps/ox/src/ox/preloader/unionsizecatcher.hpp index cb3317b2..5a9c7673 100644 --- a/deps/ox/src/ox/preloader/unionsizecatcher.hpp +++ b/deps/ox/src/ox/preloader/unionsizecatcher.hpp @@ -14,7 +14,7 @@ namespace ox { template -class UnionSizeCatcher: public ModelHandlerBase> { +class UnionSizeCatcher: public ModelHandlerBase, OpType::Reflect> { private: std::size_t m_size = 0; @@ -55,11 +55,6 @@ class UnionSizeCatcher: public ModelHandlerBase> { return m_size; } - [[nodiscard]] - static constexpr auto opType() noexcept { - return ox::OpType::Reflect; - } - private: template constexpr ox::Error fieldStr(CRStringView, const ox::BasicString *val) noexcept; diff --git a/deps/ox/src/ox/std/span.hpp b/deps/ox/src/ox/std/span.hpp index 357bf198..f58edc4d 100644 --- a/deps/ox/src/ox/std/span.hpp +++ b/deps/ox/src/ox/std/span.hpp @@ -28,27 +28,29 @@ class SpanView { template using iterator = SpanIterator; + constexpr SpanView() noexcept {} + template constexpr SpanView(ox::Array const&a) noexcept: - m_items(a.data()), - m_size(a.size()) { + m_items(a.data()), + m_size(a.size()) { } template constexpr SpanView(ox::Vector const&v) noexcept: - m_items(v.data()), - m_size(v.size()) { + m_items(v.data()), + m_size(v.size()) { } template constexpr SpanView(const T a[sz]) noexcept: - m_items(a), - m_size(sz) { + m_items(a), + m_size(sz) { } constexpr SpanView(const T *a, std::size_t sz) noexcept: - m_items(a), - m_size(sz) { + m_items(a), + m_size(sz) { } constexpr iterator<> begin() noexcept { diff --git a/deps/ox/src/ox/std/types.hpp b/deps/ox/src/ox/std/types.hpp index b35d0f45..0eba4f0a 100644 --- a/deps/ox/src/ox/std/types.hpp +++ b/deps/ox/src/ox/std/types.hpp @@ -159,6 +159,8 @@ struct ResizedInt { template using ResizedInt_t = typename ResizedInt::type; +using ssize_t = Signed; + }