[ox] Cleanup serialization writers, make MC and Claw use Writer_c
This commit is contained in:
50
deps/ox/src/ox/claw/write.hpp
vendored
50
deps/ox/src/ox/claw/write.hpp
vendored
@ -14,6 +14,7 @@
|
||||
#endif
|
||||
#include <ox/std/buffer.hpp>
|
||||
#include <ox/std/string.hpp>
|
||||
#include <ox/std/stringview.hpp>
|
||||
|
||||
#include "format.hpp"
|
||||
|
||||
@ -27,7 +28,11 @@ struct TypeInfoCatcher {
|
||||
int version = 0;
|
||||
|
||||
template<typename T = void>
|
||||
constexpr void setTypeInfo(const char *name = T::TypeName, int v = T::TypeVersion, const Vector<String>& = {}, std::size_t = 0) noexcept {
|
||||
constexpr void setTypeInfo(
|
||||
const char *name = T::TypeName,
|
||||
int v = T::TypeVersion,
|
||||
const Vector<String>& = {},
|
||||
std::size_t = 0) noexcept {
|
||||
this->name = name;
|
||||
this->version = v;
|
||||
}
|
||||
@ -53,57 +58,64 @@ struct type_version<T, decltype((void) T::TypeVersion, -1)> {
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
constexpr const char *getTypeName(T *t) noexcept {
|
||||
constexpr const char *getTypeName(const T *t) noexcept {
|
||||
TypeInfoCatcher tnc;
|
||||
oxIgnoreError(model(&tnc, t));
|
||||
return tnc.name;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
constexpr int getTypeVersion(T *t) noexcept {
|
||||
constexpr int getTypeVersion(const T *t) noexcept {
|
||||
TypeInfoCatcher tnc;
|
||||
oxIgnoreError(model(&tnc, t));
|
||||
return tnc.version;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
Result<String> writeClawHeader(T *t, ClawFormat fmt) noexcept {
|
||||
String out;
|
||||
ox::Error writeClawHeader(Writer_c auto &writer, T *t, ClawFormat fmt) noexcept {
|
||||
switch (fmt) {
|
||||
case ClawFormat::Metal:
|
||||
out += "M2;";
|
||||
oxReturnError(write(&writer, "M2;"));
|
||||
break;
|
||||
case ClawFormat::Organic:
|
||||
out += "O1;";
|
||||
oxReturnError(write(&writer, "O1;"));
|
||||
break;
|
||||
default:
|
||||
return OxError(1);
|
||||
}
|
||||
out += detail::getTypeName(t);
|
||||
out += ";";
|
||||
oxReturnError(write(&writer, detail::getTypeName(t)));
|
||||
oxReturnError(writer.put(';'));
|
||||
const auto tn = detail::getTypeVersion(t);
|
||||
if (tn > -1) {
|
||||
out += tn;
|
||||
oxReturnError(ox::itoa(tn, writer));
|
||||
}
|
||||
out += ";";
|
||||
return out;
|
||||
oxReturnError(writer.put(';'));
|
||||
return {};
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Result<Buffer> writeClaw(auto *t, ClawFormat fmt = ClawFormat::Metal) {
|
||||
oxRequire(header, detail::writeClawHeader(t, fmt));
|
||||
Result<Buffer> writeClaw(
|
||||
auto &t,
|
||||
ClawFormat fmt = ClawFormat::Metal,
|
||||
std::size_t buffReserveSz = 2 * units::KB) noexcept {
|
||||
Buffer out(buffReserveSz);
|
||||
BufferWriter bw(&out, 0);
|
||||
oxReturnError(detail::writeClawHeader(bw, &t, fmt));
|
||||
#ifdef OX_USE_STDLIB
|
||||
oxRequire(data, fmt == ClawFormat::Metal ? writeMC(t) : writeOC(t));
|
||||
if (fmt == ClawFormat::Metal) {
|
||||
oxReturnError(writeMC(bw, t));
|
||||
} else if (fmt == ClawFormat::Organic) {
|
||||
oxRequire(data, writeOC(t));
|
||||
oxReturnError(bw.write(data.data(), data.size()));
|
||||
}
|
||||
#else
|
||||
if (fmt != ClawFormat::Metal) {
|
||||
return OxError(1, "OC is not supported in this build");
|
||||
}
|
||||
oxRequire(data, writeMC(t));
|
||||
oxReturnError(writeMC(bw, t));
|
||||
#endif
|
||||
Buffer out(header.len() + data.size());
|
||||
memcpy(out.data(), header.data(), header.len());
|
||||
memcpy(out.data() + header.len(), data.data(), data.size());
|
||||
out.resize(bw.tellp());
|
||||
return out;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user