summaryrefslogtreecommitdiff
path: root/include/fud_result.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'include/fud_result.hpp')
-rw-r--r--include/fud_result.hpp21
1 files changed, 17 insertions, 4 deletions
diff --git a/include/fud_result.hpp b/include/fud_result.hpp
index 0f501e8..88d0dc4 100644
--- a/include/fud_result.hpp
+++ b/include/fud_result.hpp
@@ -60,7 +60,7 @@ class [[nodiscard]] Result {
constexpr Result(Okay<T>&& value) : m_data{}, m_discriminant{Discriminant::Okay}
{
- auto ptrValue = new (m_data.data()) T(std::move(value.value));
+ auto ptrValue = new (m_data.data()) T(std::move(value).value);
fudAssert(ptrValue != nullptr);
}
@@ -72,7 +72,7 @@ class [[nodiscard]] Result {
constexpr Result(E&& value) : m_data{}, m_discriminant{Discriminant::Error}
{
- auto ptrValue = new (m_data.data()) E(std::move(value.value));
+ auto ptrValue = new (m_data.data()) E(std::move(value).value);
fudAssert(ptrValue != nullptr);
}
@@ -170,7 +170,7 @@ class [[nodiscard]] Result {
template <typename F>
static constexpr ResultType okay(Result<T, F>&& okayRes)
{
- return ResultType::okay(okayRes.takeOkay());
+ return ResultType::okay(std::move(okayRes).takeOkay());
}
template <typename U>
@@ -182,7 +182,7 @@ class [[nodiscard]] Result {
template <typename U>
static constexpr ResultType error(Result<U, E>&& errorRes)
{
- return ResultType::error(errorRes.takeError());
+ return ResultType::error(std::move(errorRes).takeError());
}
[[nodiscard]] constexpr bool isOkay() const
@@ -200,34 +200,41 @@ class [[nodiscard]] Result {
[[nodiscard]] constexpr const T& getOkay() const&
{
fudAssert(isOkay());
+ // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
return *reinterpret_cast<const T*>(m_data.data());
}
[[nodiscard]] constexpr const T& getOkayOr(const T& alternative) const&
{
if (!isOkay()) {
+ // NOLINTNEXTLINE(bugprone-return-const-ref-from-parameter)
return alternative;
}
+ // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
return *reinterpret_cast<const T*>(m_data.data());
}
[[nodiscard]] constexpr const E& getError() const&
{
fudAssert(isError());
+ // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
return *reinterpret_cast<const E*>(m_data.data());
}
[[nodiscard]] constexpr const E& getErrorOr(const E& alternative) const&
{
if (!isError()) {
+ // NOLINTNEXTLINE(bugprone-return-const-ref-from-parameter)
return alternative;
}
+ // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
return *reinterpret_cast<const E*>(m_data.data());
}
[[nodiscard]] constexpr T&& takeOkay()
{
fudAssert(isOkay());
+ // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
return std::move(*reinterpret_cast<T*>(m_data.data()));
}
@@ -236,12 +243,14 @@ class [[nodiscard]] Result {
if (!isOkay()) {
return std::move(alternative);
}
+ // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
return std::move(*reinterpret_cast<T*>(m_data.data()));
}
[[nodiscard]] constexpr E&& takeError()
{
fudAssert(isError());
+ // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
return std::move(*reinterpret_cast<E*>(m_data.data()));
}
@@ -250,6 +259,7 @@ class [[nodiscard]] Result {
if (!isError()) {
return std::move(alternative);
}
+ // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
return std::move(*reinterpret_cast<E*>(m_data.data()));
}
@@ -297,9 +307,11 @@ class [[nodiscard]] Result {
constexpr void destroy() noexcept
{
if (m_discriminant == Discriminant::Okay) {
+ // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
reinterpret_cast<T*>(m_data.data())->~T();
m_discriminant = Discriminant::Invalid;
} else if (m_discriminant == Discriminant::Error) {
+ // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
reinterpret_cast<E*>(m_data.data())->~E();
m_discriminant = Discriminant::Invalid;
}
@@ -317,6 +329,7 @@ class [[nodiscard]] Result {
} m_discriminant{Discriminant::Invalid};
};
+// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
#define M_TakeOrReturn(HYGIENE_RESULT_TYPE, HYGIENE_EXPRESSION) \
({ \
auto HYGIENE_RESULT{(HYGIENE_EXPRESSION)}; \