From 5be8ed533ea888d371b573ec2197a8ef39b3027e Mon Sep 17 00:00:00 2001 From: Gary Talent Date: Thu, 1 Dec 2022 01:59:27 -0600 Subject: [PATCH] [ox/preloader] Fix alignment and add preload function --- deps/ox/src/ox/preloader/preloader.hpp | 47 ++++++++++++++++---------- 1 file changed, 29 insertions(+), 18 deletions(-) diff --git a/deps/ox/src/ox/preloader/preloader.hpp b/deps/ox/src/ox/preloader/preloader.hpp index 02f02811..c8fe0ab2 100644 --- a/deps/ox/src/ox/preloader/preloader.hpp +++ b/deps/ox/src/ox/preloader/preloader.hpp @@ -20,6 +20,12 @@ namespace ox { +template +class Preloader; + +template +constexpr ox::Error preload(Preloader *pl, ox::CommonPtrWith auto *obj) noexcept; + template class Preloader: public ModelHandlerBase> { private: @@ -59,7 +65,7 @@ class Preloader: public ModelHandlerBase> { std::size_t sz = 0) noexcept; template - constexpr void setTypeInfo(const char* = T::TypeName, int = T::TypeVersion, + constexpr void setTypeInfo(ox::CRStringView = T::TypeName, int = T::TypeVersion, const Vector& = {}, int = ModelFieldCount_v) noexcept {} template @@ -89,6 +95,9 @@ class Preloader: public ModelHandlerBase> { return ox::OpType::Write; } + template + constexpr ox::Error pad(const T*) noexcept; + private: constexpr ox::Error fieldVector(CRStringView name, const ox::ModelValueVector *val) noexcept; @@ -97,8 +106,6 @@ class Preloader: public ModelHandlerBase> { constexpr ox::Error fieldVector(CRStringView, const auto *val, ox::VectorMemMap vecVal) noexcept; - constexpr ox::Error pad(const auto *val) noexcept; - constexpr bool unionCheckAndIt() noexcept; }; @@ -126,7 +133,7 @@ constexpr ox::Error Preloader::field(CRStringView, const ox::UnionView } oxReturnError(pad(val.get())); m_unionIdx.emplace_back(val.idx()); - const auto err = model(this->interface(), val.get()); + const auto err = preload(this, val.get()); m_unionIdx.pop_back(); return err; } @@ -146,7 +153,7 @@ constexpr ox::Error Preloader::field(CRStringView name, const T *val) return fieldVector(name, val); } else { m_unionIdx.emplace_back(-1); - const auto out = model(this->interface(), val); + const auto out = preload(this, val); m_unionIdx.pop_back(); return out; } @@ -219,6 +226,18 @@ constexpr ox::Error Preloader::offsetPtrs(std::size_t offset) noexcept return {}; } +template +template +constexpr ox::Error Preloader::pad(const T *v) noexcept { + const auto a = alignOf(*v); + const auto excess = m_writer.tellp() % a; + if (excess) { + return m_writer.write(nullptr, a - excess); + } else { + return {}; + } +} + template constexpr ox::Error Preloader::fieldVector(CRStringView name, const ox::ModelValueVector *val) noexcept { // serialize the Vector @@ -266,25 +285,17 @@ constexpr ox::Error Preloader::fieldVector(CRStringView, const auto *v return {}; } -template -constexpr ox::Error Preloader::pad(const auto *val) noexcept { - constexpr auto a = alignOf_v; - const auto padding = a - m_writer.tellp() % a; - return m_writer.write(nullptr, padding); -} - template constexpr bool Preloader::unionCheckAndIt() noexcept { auto &u = m_unionIdx.back().unwrap(); return u.checkAndIterate(); } -template -constexpr ox::Result preload(const auto *obj) noexcept { - using Pl = Preloader; - oxRequireM(preloader, Pl::make(ox::ios_base::end)); - oxReturnError(model(preloader->interface(), obj)); - return preloader->buff(); +template +constexpr ox::Error preload(Preloader *pl, ox::CommonPtrWith auto *obj) noexcept { + auto i = pl->interface(); + oxReturnError(model(i, obj)); + return pl->pad(obj); } }