[ox/mc] Fix string support in MC and add support for ox::BasicString
This commit is contained in:
29
deps/ox/src/ox/mc/write.hpp
vendored
29
deps/ox/src/ox/mc/write.hpp
vendored
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user