[ox/mc] Fix string support in MC and add support for ox::BasicString

This commit is contained in:
2022-01-27 20:58:33 -06:00
parent fd7510d14f
commit df782129bb
6 changed files with 119 additions and 51 deletions

View File

@@ -60,6 +60,9 @@ class MetalClawWriter {
template<typename T>
Error field(const char*, HashMap<String, T> *val) noexcept;
template<std::size_t SmallStringSize>
Error field(const char*, BasicString<SmallStringSize> *val) noexcept;
template<std::size_t L>
Error field(const char*, BString<L> *val) noexcept;
@@ -75,7 +78,7 @@ class MetalClawWriter {
void setTypeInfo(const char *name = T::TypeName, int fields = countFields<T>()) noexcept;
[[nodiscard]]
std::size_t size() noexcept;
std::size_t size() const noexcept;
[[nodiscard]]
static constexpr auto opType() noexcept {
@@ -88,6 +91,28 @@ class MetalClawWriter {
};
template<std::size_t SmallStringSize>
Error MetalClawWriter::field(const char*, BasicString<SmallStringSize> *val) noexcept {
bool fieldSet = false;
if (val->len() && (m_unionIdx == -1 || m_unionIdx == m_field)) {
// write the length
const auto strLen = mc::encodeInteger(val->len());
if (m_buffIt + strLen.length + static_cast<std::size_t>(val->len()) < m_buffLen) {
memcpy(&m_buff[m_buffIt], strLen.data, strLen.length);
m_buffIt += strLen.length;
// write the string
memcpy(&m_buff[m_buffIt], val->c_str(), static_cast<std::size_t>(val->len()));
m_buffIt += static_cast<std::size_t>(val->len());
fieldSet = true;
} else {
return OxError(MC_BUFFENDED);
}
}
oxReturnError(m_fieldPresence.set(static_cast<std::size_t>(m_field), fieldSet));
++m_field;
return OxError(0);
}
template<std::size_t L>
Error MetalClawWriter::field(const char *name, BString<L> *val) noexcept {
return field(name, SerStr(val->data(), val->cap()));
@@ -108,7 +133,7 @@ Error MetalClawWriter::field(const char*, T *val) noexcept {
}
}
oxReturnError(m_fieldPresence.set(static_cast<std::size_t>(m_field), fieldSet));
m_field++;
++m_field;
return OxError(0);
}
}