[ox/mc] Switch Vector detection over to isVector_v

This commit is contained in:
Gary Talent 2021-05-03 13:13:40 -04:00
parent e2e62a235a
commit 704b94f471
2 changed files with 40 additions and 45 deletions

View File

@ -63,9 +63,6 @@ class MetalClawReader {
template<typename T, typename Handler> template<typename T, typename Handler>
Error field(const char*, Handler handler); Error field(const char*, Handler handler);
template<typename T>
Error field(const char*, ox::Vector<T> *val);
template<typename T> template<typename T>
Error field(const char*, T *val); Error field(const char*, T *val);
@ -73,7 +70,7 @@ class MetalClawReader {
Error field(const char*, UnionView<U> val); Error field(const char*, UnionView<U> val);
template<std::size_t L> template<std::size_t L>
Error field(const char*, ox::BString<L> *val); Error field(const char*, BString<L> *val);
Error field(const char*, SerStr val); Error field(const char*, SerStr val);
@ -86,7 +83,8 @@ class MetalClawReader {
/** /**
* Reads an string length from the current location in the buffer. * Reads an string length from the current location in the buffer.
*/ */
[[nodiscard]] StringLength stringLength(const char *name); [[nodiscard]]
StringLength stringLength(const char *name);
template<typename T = std::nullptr_t> template<typename T = std::nullptr_t>
void setTypeInfo(const char *name = T::TypeName, int fields = T::Fields); 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. * 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. * Indicates whether or not the next field to be read is present.
@ -119,13 +118,26 @@ class MetalClawReader {
}; };
template<typename T> template<typename T>
Error MetalClawReader::field(const char*, T *val) { Error MetalClawReader::field(const char *name, T *val) {
if ((m_unionIdx == -1 || m_unionIdx == m_field) && val && m_fieldPresence.get(m_field)) { if constexpr(isVector_v<T>) {
auto reader = child(""); if (m_unionIdx == -1 || m_unionIdx == m_field) {
oxReturnError(model(&reader, val)); // 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<typename U> template<typename U>
@ -139,7 +151,7 @@ Error MetalClawReader::field(const char*, UnionView<U> val) {
} }
template<std::size_t L> template<std::size_t L>
Error MetalClawReader::field(const char *name, ox::BString<L> *val) { Error MetalClawReader::field(const char *name, BString<L> *val) {
return field(name, SerStr(val->data(), val->cap())); return field(name, SerStr(val->data(), val->cap()));
} }
@ -250,19 +262,6 @@ Error MetalClawReader::field(const char*, Handler handler) {
return OxError(0); return OxError(0);
} }
template<typename T>
Error MetalClawReader::field(const char* name, ox::Vector<T> *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<typename T> template<typename T>
void MetalClawReader::setTypeInfo(const char*, int fields) { void MetalClawReader::setTypeInfo(const char*, int fields) {
m_fields = fields; m_fields = fields;
@ -281,7 +280,7 @@ template<typename T>
Result<T> readMC(const char *buff, std::size_t buffLen) { Result<T> readMC(const char *buff, std::size_t buffLen) {
T val; T val;
oxReturnError(readMC(buff, buffLen, &val)); oxReturnError(readMC(buff, buffLen, &val));
return ox::move(val); return move(val);
} }
template<typename T> template<typename T>

View File

@ -56,9 +56,6 @@ class MetalClawWriter {
template<typename T> template<typename T>
Error field(const char*, T *val, std::size_t len); Error field(const char*, T *val, std::size_t len);
template<typename T>
Error field(const char*, Vector<T> *val);
template<typename T> template<typename T>
Error field(const char*, HashMap<String, T> *val); Error field(const char*, HashMap<String, T> *val);
@ -95,18 +92,22 @@ Error MetalClawWriter::field(const char *name, ox::BString<L> *val) noexcept {
template<typename T> template<typename T>
Error MetalClawWriter::field(const char*, T *val) { Error MetalClawWriter::field(const char*, T *val) {
bool fieldSet = false; if constexpr(isVector_v<T>) {
if (val && (m_unionIdx == -1 || m_unionIdx == m_field)) { return field(nullptr, val->data(), val->size());
MetalClawWriter writer(m_buff + m_buffIt, m_buffLen - m_buffIt); } else {
oxReturnError(model(&writer, val)); bool fieldSet = false;
if (static_cast<std::size_t>(writer.m_fieldPresence.getMaxLen()) < writer.m_buffIt) { if (val && (m_unionIdx == -1 || m_unionIdx == m_field)) {
m_buffIt += writer.m_buffIt; MetalClawWriter writer(m_buff + m_buffIt, m_buffLen - m_buffIt);
fieldSet = true; oxReturnError(model(&writer, val));
if (static_cast<std::size_t>(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<typename U> template<typename U>
@ -156,11 +157,6 @@ Error MetalClawWriter::field(const char*, T *val, std::size_t len) {
return OxError(0); return OxError(0);
} }
template<typename T>
Error MetalClawWriter::field(const char*, Vector<T> *val) {
return field(nullptr, val->data(), val->size());
}
template<typename T> template<typename T>
Error MetalClawWriter::field(const char*, HashMap<String, T> *val) { Error MetalClawWriter::field(const char*, HashMap<String, T> *val) {
auto &keys = val->keys(); auto &keys = val->keys();