diff --git a/deps/ox/src/ox/preloader/preloader.hpp b/deps/ox/src/ox/preloader/preloader.hpp index 8f675bae..fd428bb3 100644 --- a/deps/ox/src/ox/preloader/preloader.hpp +++ b/deps/ox/src/ox/preloader/preloader.hpp @@ -94,7 +94,7 @@ class Preloader: public ModelHandlerBase, OpType::Reflect> { } template - constexpr ox::Error field(CRStringView, const ox::UnionView val) noexcept; + constexpr ox::Error field(CRStringView, ox::UnionView val) noexcept; template constexpr ox::Error field(CRStringView, const T *val) noexcept; @@ -135,6 +135,9 @@ class Preloader: public ModelHandlerBase, OpType::Reflect> { constexpr ox::Error fieldArray(CRStringView name, ox::ModelValueArray const*val) noexcept; constexpr bool unionCheckAndIt() noexcept; + + [[nodiscard]] + constexpr size_t calcPadding(size_t align) const noexcept; }; template @@ -265,7 +268,7 @@ template constexpr ox::Result Preloader::startAlloc(size_t sz, size_t align) noexcept { 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; + auto const padding = calcPadding(align); oxRequireM(a, ox::allocate(m_writer, sz + padding)); a += padding; oxReturnError(m_writer.seekp(a)); @@ -278,7 +281,7 @@ 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; + auto const padding = calcPadding(align); oxRequireM(a, ox::allocate(m_writer, sz + padding)); a += padding; oxReturnError(m_writer.seekp(a)); @@ -358,7 +361,7 @@ constexpr ox::Error Preloader::fieldVector( const auto sz = sizeOf(&(*val)[0]) * val->size(); const auto align = alignOf((*val)[0]); oxReturnError(m_writer.seekp(0, ox::ios_base::end)); - const auto padding = m_writer.tellp() % align; + auto const padding = calcPadding(align); oxRequireM(p, ox::allocate(m_writer, sz + padding)); p += padding; oxReturnError(m_writer.seekp(p)); @@ -394,6 +397,12 @@ constexpr bool Preloader::unionCheckAndIt() noexcept { return u.checkAndIterate(); } +template +constexpr size_t Preloader::calcPadding(size_t align) const noexcept { + auto const excess = m_writer.tellp() % align; + return (align * (excess != 0)) - excess; +} + template constexpr ox::Error preload(Preloader *pl, ox::CommonPtrWith auto *obj) noexcept { oxReturnError(model(pl->interface(), obj));