From 24fda7d58966d7690940f3009dce5efcd1816645 Mon Sep 17 00:00:00 2001 From: Gary Talent Date: Sun, 11 Feb 2024 19:39:29 -0600 Subject: [PATCH] [ox] Make serialize and allocate Writer_c functions take refs --- deps/ox/src/ox/preloader/preloader.hpp | 27 ++++++++++++++----------- deps/ox/src/ox/std/reader.hpp | 15 -------------- deps/ox/src/ox/std/serialize.hpp | 28 +++++++++++++------------- deps/ox/src/ox/std/writer.hpp | 12 +++++------ 4 files changed, 35 insertions(+), 47 deletions(-) diff --git a/deps/ox/src/ox/preloader/preloader.hpp b/deps/ox/src/ox/preloader/preloader.hpp index 1f1df9fb..59b761b3 100644 --- a/deps/ox/src/ox/preloader/preloader.hpp +++ b/deps/ox/src/ox/preloader/preloader.hpp @@ -174,12 +174,12 @@ constexpr ox::Error Preloader::field(CRStringView name, const T *val) } oxReturnError(pad(val)); if constexpr(ox::is_integral_v) { - return ox::serialize(&m_writer, PlatSpec::correctEndianness(*val)); + return ox::serialize(m_writer, PlatSpec::correctEndianness(*val)); } else if constexpr(ox::is_pointer_v) { const PtrType a = startAlloc(sizeOf(val), alignOf(*val), m_writer.tellp()) + PlatSpec::RomStart; oxReturnError(field(name, *val)); oxReturnError(endAlloc()); - return ox::serialize(&m_writer, PlatSpec::correctEndianness(a)); + return ox::serialize(m_writer, PlatSpec::correctEndianness(a)); } else if constexpr(ox::isVector_v) { return fieldVector(name, val); } else if constexpr(ox::is_same_v) { @@ -212,7 +212,7 @@ constexpr ox::Error Preloader::field(CRStringView, const ox::BasicStri const auto restore = m_writer.tellp(); std::size_t a = 0; if (sz && sz >= SmallStringSize) { - oxReturnError(ox::allocate(&m_writer, sz).moveTo(a)); + oxReturnError(ox::allocate(m_writer, sz).moveTo(a)); } else { a = restore; } @@ -220,7 +220,7 @@ constexpr ox::Error Preloader::field(CRStringView, const ox::BasicStri oxReturnError(m_writer.seekp(a)); oxReturnError(m_writer.write(val->data(), sz)); oxReturnError(m_writer.seekp(restore)); - oxReturnError(serialize(&m_writer, vecVal)); + oxReturnError(serialize(m_writer, vecVal)); m_ptrs.emplace_back(restore + offsetof(VecMap, items), vecVal.items); return {}; } @@ -266,7 +266,7 @@ constexpr ox::Result Preloader::startAlloc(size_t sz, siz m_allocStack.emplace_back(static_cast(m_writer.tellp())); oxReturnError(m_writer.seekp(0, ox::ios_base::end)); const auto padding = m_writer.tellp() % align; - oxRequireM(a, ox::allocate(&m_writer, sz + padding)); + oxRequireM(a, ox::allocate(m_writer, sz + padding)); a += padding; oxReturnError(m_writer.seekp(a)); m_allocStart.push_back(a); @@ -274,11 +274,12 @@ constexpr ox::Result Preloader::startAlloc(size_t sz, siz } template -constexpr ox::Result Preloader::startAlloc(std::size_t sz, size_t align, std::size_t restore) noexcept { +constexpr ox::Result Preloader::startAlloc( + std::size_t sz, size_t align, std::size_t restore) noexcept { m_allocStack.emplace_back(restore, ox::ios_base::beg); oxReturnError(m_writer.seekp(0, ox::ios_base::end)); const auto padding = m_writer.tellp() % align; - oxRequireM(a, ox::allocate(&m_writer, sz + padding)); + oxRequireM(a, ox::allocate(m_writer, sz + padding)); a += padding; oxReturnError(m_writer.seekp(a)); m_allocStart.push_back(a); @@ -301,8 +302,9 @@ template constexpr ox::Error Preloader::offsetPtrs(std::size_t offset) noexcept { for (const auto &p : m_ptrs) { oxReturnError(m_writer.seekp(p.loc)); - const auto val = PlatSpec::template correctEndianness(static_cast(p.value + offset)); - oxReturnError(ox::serialize(&m_writer, val)); + const auto val = PlatSpec::template correctEndianness( + static_cast(p.value + offset)); + oxReturnError(ox::serialize(m_writer, val)); } oxReturnError(m_writer.seekp(0, ox::ios_base::end)); return {}; @@ -321,7 +323,8 @@ constexpr ox::Error Preloader::pad(const T *v) noexcept { } template -constexpr ox::Error Preloader::fieldVector(CRStringView name, const ox::ModelValueVector *val) noexcept { +constexpr ox::Error Preloader::fieldVector( + CRStringView name, const ox::ModelValueVector *val) noexcept { // serialize the Vector ox::VectorMemMap vecVal{ .size = PlatSpec::correctEndianness(static_cast(val->size())), @@ -356,7 +359,7 @@ constexpr ox::Error Preloader::fieldVector( const auto align = alignOf((*val)[0]); oxReturnError(m_writer.seekp(0, ox::ios_base::end)); const auto padding = m_writer.tellp() % align; - oxRequireM(p, ox::allocate(&m_writer, sz + padding)); + oxRequireM(p, ox::allocate(m_writer, sz + padding)); p += padding; oxReturnError(m_writer.seekp(p)); m_unionIdx.emplace_back(-1); @@ -371,7 +374,7 @@ constexpr ox::Error Preloader::fieldVector( vecVal.items = 0; } // serialize the Vector - oxReturnError(serialize(&m_writer, vecVal)); + oxReturnError(serialize(m_writer, vecVal)); m_ptrs.emplace_back(m_writer.tellp() - PtrSize, vecVal.items); return {}; } diff --git a/deps/ox/src/ox/std/reader.hpp b/deps/ox/src/ox/std/reader.hpp index 3eacb8f4..8a67a37f 100644 --- a/deps/ox/src/ox/std/reader.hpp +++ b/deps/ox/src/ox/std/reader.hpp @@ -78,19 +78,4 @@ class FileReader: public Reader_v { }; #endif -/** - * Allocates the specified amount of data at the end of the current read stream. - * @param reader - * @param sz - * @return - */ -constexpr ox::Result allocate(Reader_c auto *reader, std::size_t sz) noexcept { - const auto p = reader->tellg(); - oxReturnError(reader->seekg(0, ios_base::end)); - const auto out = reader->tellg(); - oxReturnError(reader->read(nullptr, sz)); - oxReturnError(reader->seekg(p)); - return out; -} - } diff --git a/deps/ox/src/ox/std/serialize.hpp b/deps/ox/src/ox/std/serialize.hpp index ca68ba06..23e34817 100644 --- a/deps/ox/src/ox/std/serialize.hpp +++ b/deps/ox/src/ox/std/serialize.hpp @@ -54,42 +54,42 @@ constexpr auto alignOf(const VectorMemMap&) noexcept { } template -constexpr ox::Error pad(Writer_c auto *w, const T *v) noexcept { +constexpr ox::Error pad(Writer_c auto &w, const T *v) noexcept { const auto a = PlatSpec::alignOf(*v); - const auto excess = w->tellp() % a; + const auto excess = w.tellp() % a; if (excess) { - return w->write(nullptr, a - excess); + return w.write(nullptr, a - excess); } else { return {}; } } template -constexpr ox::Error serialize(Writer_c auto *buff, const VectorMemMap &vm) noexcept { - oxReturnError(buff->write(nullptr, vm.smallVecSize)); - oxReturnError(serialize(buff, PlatSpec::correctEndianness(vm.allocator))); - oxReturnError(pad(buff, &vm.size)); - oxReturnError(serialize(buff, PlatSpec::correctEndianness(vm.size))); - oxReturnError(serialize(buff, PlatSpec::correctEndianness(vm.cap))); - oxReturnError(serialize(buff, PlatSpec::correctEndianness(vm.items))); +constexpr ox::Error serialize(Writer_c auto &w, const VectorMemMap &vm) noexcept { + oxReturnError(w.write(nullptr, vm.smallVecSize)); + oxReturnError(serialize(w, PlatSpec::correctEndianness(vm.allocator))); + oxReturnError(pad(w, &vm.size)); + oxReturnError(serialize(w, PlatSpec::correctEndianness(vm.size))); + oxReturnError(serialize(w, PlatSpec::correctEndianness(vm.cap))); + oxReturnError(serialize(w, PlatSpec::correctEndianness(vm.items))); return {}; } template -constexpr ox::Error serialize(Writer_c auto *buff, T val) noexcept requires(is_integer_v) { +constexpr ox::Error serialize(Writer_c auto &w, T val) noexcept requires(is_integer_v) { ox::Array tmp; for (auto i = 0u; i < sizeof(T); ++i) { tmp[i] = static_cast((val >> i * 8) & 255); } - return buff->write(tmp.data(), tmp.size()); + return w.write(tmp.data(), tmp.size()); }; template constexpr ox::Result> serialize(const T &in) noexcept { ox::Array out = {}; CharBuffWriter w(out); - oxReturnError(serialize(&w, in)); + oxReturnError(serialize(w, in)); return out; }; -} \ No newline at end of file +} diff --git a/deps/ox/src/ox/std/writer.hpp b/deps/ox/src/ox/std/writer.hpp index 18a44831..53fbb7a8 100644 --- a/deps/ox/src/ox/std/writer.hpp +++ b/deps/ox/src/ox/std/writer.hpp @@ -72,12 +72,12 @@ class WriterT: public Writer_v { * @param sz * @return */ -constexpr ox::Result allocate(Writer_c auto *writer, std::size_t sz) noexcept { - const auto p = writer->tellp(); - oxReturnError(writer->seekp(0, ios_base::end)); - const auto out = writer->tellp(); - oxReturnError(writer->write(nullptr, sz)); - oxReturnError(writer->seekp(p)); +constexpr ox::Result allocate(Writer_c auto &writer, std::size_t sz) noexcept { + const auto p = writer.tellp(); + oxReturnError(writer.seekp(0, ios_base::end)); + const auto out = writer.tellp(); + oxReturnError(writer.write(nullptr, sz)); + oxReturnError(writer.seekp(p)); return out; }