From 704b94f47151f58890ea8fffb6dc21e956109eb3 Mon Sep 17 00:00:00 2001 From: Gary Talent Date: Mon, 3 May 2021 13:13:40 -0400 Subject: [PATCH] [ox/mc] Switch Vector detection over to isVector_v --- deps/ox/src/ox/mc/read.hpp | 53 ++++++++++++++++++------------------- deps/ox/src/ox/mc/write.hpp | 32 ++++++++++------------ 2 files changed, 40 insertions(+), 45 deletions(-) diff --git a/deps/ox/src/ox/mc/read.hpp b/deps/ox/src/ox/mc/read.hpp index d05f95b1..816be0d4 100644 --- a/deps/ox/src/ox/mc/read.hpp +++ b/deps/ox/src/ox/mc/read.hpp @@ -63,9 +63,6 @@ class MetalClawReader { template Error field(const char*, Handler handler); - template - Error field(const char*, ox::Vector *val); - template Error field(const char*, T *val); @@ -73,7 +70,7 @@ class MetalClawReader { Error field(const char*, UnionView val); template - Error field(const char*, ox::BString *val); + Error field(const char*, BString *val); Error field(const char*, SerStr val); @@ -86,7 +83,8 @@ class MetalClawReader { /** * Reads an string length from the current location in the buffer. */ - [[nodiscard]] StringLength stringLength(const char *name); + [[nodiscard]] + StringLength stringLength(const char *name); template void setTypeInfo(const char *name = T::TypeName, int fields = T::Fields); @@ -94,7 +92,8 @@ class MetalClawReader { /** * Returns a MetalClawReader to parse a child object. */ - [[nodiscard]] MetalClawReader child(const char *name, int unionIdx = -1); + [[nodiscard]] + MetalClawReader child(const char *name, int unionIdx = -1); /** * Indicates whether or not the next field to be read is present. @@ -119,13 +118,26 @@ class MetalClawReader { }; template -Error MetalClawReader::field(const char*, T *val) { - if ((m_unionIdx == -1 || m_unionIdx == m_field) && val && m_fieldPresence.get(m_field)) { - auto reader = child(""); - oxReturnError(model(&reader, val)); +Error MetalClawReader::field(const char *name, T *val) { + if constexpr(isVector_v) { + if (m_unionIdx == -1 || m_unionIdx == m_field) { + // set size of val if the field is present, don't worry about it if not + if (m_fieldPresence.get(m_field)) { + oxRequire(len, arrayLength(name, false)); + val->resize(len); + } + return field(name, val->data(), val->size()); + } + ++m_field; + return OxError(0); + } else { + if ((m_unionIdx == -1 || m_unionIdx == m_field) && val && m_fieldPresence.get(m_field)) { + auto reader = child(""); + oxReturnError(model(&reader, val)); + } + ++m_field; + return OxError(0); } - ++m_field; - return OxError(0); } template @@ -139,7 +151,7 @@ Error MetalClawReader::field(const char*, UnionView val) { } template -Error MetalClawReader::field(const char *name, ox::BString *val) { +Error MetalClawReader::field(const char *name, BString *val) { return field(name, SerStr(val->data(), val->cap())); } @@ -250,19 +262,6 @@ Error MetalClawReader::field(const char*, Handler handler) { return OxError(0); } -template -Error MetalClawReader::field(const char* name, ox::Vector *val) { - if (m_unionIdx == -1 || m_unionIdx == m_field) { - // set size of val if the field is present, don't worry about it if not - if (m_fieldPresence.get(m_field)) { - oxRequire(len, arrayLength(name, false)); - val->resize(len); - } - return field(name, val->data(), val->size()); - } - return OxError(0); -} - template void MetalClawReader::setTypeInfo(const char*, int fields) { m_fields = fields; @@ -281,7 +280,7 @@ template Result readMC(const char *buff, std::size_t buffLen) { T val; oxReturnError(readMC(buff, buffLen, &val)); - return ox::move(val); + return move(val); } template diff --git a/deps/ox/src/ox/mc/write.hpp b/deps/ox/src/ox/mc/write.hpp index c10c44d5..0c1f97c6 100644 --- a/deps/ox/src/ox/mc/write.hpp +++ b/deps/ox/src/ox/mc/write.hpp @@ -56,9 +56,6 @@ class MetalClawWriter { template Error field(const char*, T *val, std::size_t len); - template - Error field(const char*, Vector *val); - template Error field(const char*, HashMap *val); @@ -95,18 +92,22 @@ Error MetalClawWriter::field(const char *name, ox::BString *val) noexcept { template Error MetalClawWriter::field(const char*, T *val) { - bool fieldSet = false; - if (val && (m_unionIdx == -1 || m_unionIdx == m_field)) { - MetalClawWriter writer(m_buff + m_buffIt, m_buffLen - m_buffIt); - oxReturnError(model(&writer, val)); - if (static_cast(writer.m_fieldPresence.getMaxLen()) < writer.m_buffIt) { - m_buffIt += writer.m_buffIt; - fieldSet = true; + if constexpr(isVector_v) { + return field(nullptr, val->data(), val->size()); + } else { + bool fieldSet = false; + if (val && (m_unionIdx == -1 || m_unionIdx == m_field)) { + MetalClawWriter writer(m_buff + m_buffIt, m_buffLen - m_buffIt); + oxReturnError(model(&writer, val)); + if (static_cast(writer.m_fieldPresence.getMaxLen()) < writer.m_buffIt) { + m_buffIt += writer.m_buffIt; + fieldSet = true; + } } + oxReturnError(m_fieldPresence.set(m_field, fieldSet)); + m_field++; + return OxError(0); } - oxReturnError(m_fieldPresence.set(m_field, fieldSet)); - m_field++; - return OxError(0); } template @@ -156,11 +157,6 @@ Error MetalClawWriter::field(const char*, T *val, std::size_t len) { return OxError(0); } -template -Error MetalClawWriter::field(const char*, Vector *val) { - return field(nullptr, val->data(), val->size()); -} - template Error MetalClawWriter::field(const char*, HashMap *val) { auto &keys = val->keys();