From d31938ba4f106b93b36366b0f445e2bfd8da408b Mon Sep 17 00:00:00 2001 From: Gary Talent Date: Thu, 14 Dec 2023 22:26:17 -0600 Subject: [PATCH] [ox] Make Result copyTo and moveTo take refs --- deps/ox/src/ox/model/typestore.hpp | 2 +- deps/ox/src/ox/oc/read.cpp | 2 +- deps/ox/src/ox/oc/test/tests.cpp | 2 +- deps/ox/src/ox/preloader/preloader.hpp | 2 +- deps/ox/src/ox/std/error.hpp | 30 ++++++++++++++++++++------ 5 files changed, 27 insertions(+), 11 deletions(-) diff --git a/deps/ox/src/ox/model/typestore.hpp b/deps/ox/src/ox/model/typestore.hpp index c8402708..4a2a5daa 100644 --- a/deps/ox/src/ox/model/typestore.hpp +++ b/deps/ox/src/ox/model/typestore.hpp @@ -58,7 +58,7 @@ class TypeStore { if (!std::is_constant_evaluated()) { oxRequireM(dt, loadDescriptor(typeId)); for (auto &f : dt->fieldList) { - oxReturnError(this->getLoad(f.typeId).moveTo(&f.type)); + oxReturnError(this->getLoad(f.typeId).moveTo(f.type)); } auto &out = m_cache[typeId]; out = std::move(dt); diff --git a/deps/ox/src/ox/oc/read.cpp b/deps/ox/src/ox/oc/read.cpp index afc1204c..33a7d057 100644 --- a/deps/ox/src/ox/oc/read.cpp +++ b/deps/ox/src/ox/oc/read.cpp @@ -265,7 +265,7 @@ Error OrganicClawReader::fieldCString(const char *key, char **val, std::size_t b Error OrganicClawReader::field(const char *key, UUID *val) noexcept { UUIDStr str; oxReturnError(field(key, &str)); - return UUID::fromString(str).moveTo(val); + return UUID::fromString(str).moveTo(*val); } Result OrganicClawReader::arrayLength(const char *key, bool) noexcept { diff --git a/deps/ox/src/ox/oc/test/tests.cpp b/deps/ox/src/ox/oc/test/tests.cpp index 79a88d3a..d0a1e5d7 100644 --- a/deps/ox/src/ox/oc/test/tests.cpp +++ b/deps/ox/src/ox/oc/test/tests.cpp @@ -205,7 +205,7 @@ const std::map tests = { testIn.Struct.String = "Test String 2"; testIn.unionIdx = 1; testIn.Union.Int = 93; - oxAssert(ox::writeOC(testIn).moveTo(&dataBuff), "Data generation failed"); + oxAssert(ox::writeOC(testIn).moveTo(dataBuff), "Data generation failed"); ox::TypeStore typeStore; auto type = ox::buildTypeDef(&typeStore, &testIn); oxAssert(type.error, "Descriptor write failed"); diff --git a/deps/ox/src/ox/preloader/preloader.hpp b/deps/ox/src/ox/preloader/preloader.hpp index 7a0057d4..3ae3a856 100644 --- a/deps/ox/src/ox/preloader/preloader.hpp +++ b/deps/ox/src/ox/preloader/preloader.hpp @@ -199,7 +199,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; } diff --git a/deps/ox/src/ox/std/error.hpp b/deps/ox/src/ox/std/error.hpp index 79b24723..cc530db9 100644 --- a/deps/ox/src/ox/std/error.hpp +++ b/deps/ox/src/ox/std/error.hpp @@ -165,23 +165,39 @@ struct [[nodiscard]] Result { return error == 0; } - constexpr Error copyTo(type *val) const noexcept { + constexpr Error copyTo(type &val) const & noexcept { + if (!error) [[likely]] { + *val = value; + } + return error; + } + + constexpr Error copyTo(type &val) const && noexcept { + if (!error) [[likely]] { + *val = value; + } + return error; + } + + constexpr Error copyTo(type &val) & noexcept { *val = value; return error; } - constexpr Error copyTo(type *val) noexcept { - *val = value; - return error; - } - - constexpr Error moveTo(type *val) noexcept { + constexpr Error copyTo(type &val) && noexcept { if (!error) [[likely]] { *val = std::move(value); } return error; } + constexpr Error moveTo(type &val) noexcept { + if (!error) [[likely]] { + val = std::move(value); + } + return error; + } + constexpr T &unwrap() & noexcept { if (error) { oxPanic(error, "Failed unwrap");