From a9d88987926853d162fa7201a43b5098be589fd3 Mon Sep 17 00:00:00 2001 From: seelabs Date: Wed, 19 Oct 2022 11:48:08 -0400 Subject: [PATCH 1/2] Improve move semantics in Expected: This patch unconditionally moves an `Unexpected` value parameter as long as `U` is not a reference. If `U` is a reference the code should not compile. An error type that holds a reference is a strange use-case, and an overload is not provided. If it is required in the future it can be added. The `Expected(U r)` overload should take a forwarding ref. --- src/ripple/basics/Expected.h | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/ripple/basics/Expected.h b/src/ripple/basics/Expected.h index 09d2bdc5042..a53200a35f6 100644 --- a/src/ripple/basics/Expected.h +++ b/src/ripple/basics/Expected.h @@ -135,14 +135,15 @@ class [[nodiscard]] Expected template < typename U, typename = std::enable_if_t>> - constexpr Expected(U r) : Base(T{std::forward(r)}) + constexpr Expected(U && r) : Base(T{std::forward(r)}) { } template < typename U, - typename = std::enable_if_t>> - constexpr Expected(Unexpected e) : Base(E{std::forward(e.value())}) + typename = std::enable_if_t< + std::is_convertible_v && !std::is_reference_v>> + constexpr Expected(Unexpected e) : Base(E{std::move(e.value())}) { } @@ -217,8 +218,9 @@ class [[nodiscard]] Expected template < typename U, - typename = std::enable_if_t>> - constexpr Expected(Unexpected e) : Base(E{std::forward(e.value())}) + typename = std::enable_if_t< + std::is_convertible_v && !std::is_reference_v>> + constexpr Expected(Unexpected e) : Base(E{std::move(e.value())}) { } From 4b288aa950fdb9ad013df35f045431d13170fc81 Mon Sep 17 00:00:00 2001 From: seelabs Date: Wed, 19 Oct 2022 15:40:03 -0400 Subject: [PATCH 2/2] Replace enable_if with concepts in Expected --- src/ripple/basics/Expected.h | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/ripple/basics/Expected.h b/src/ripple/basics/Expected.h index a53200a35f6..8dc368eefd7 100644 --- a/src/ripple/basics/Expected.h +++ b/src/ripple/basics/Expected.h @@ -21,7 +21,10 @@ #define RIPPLE_BASICS_EXPECTED_H_INCLUDED #include + #include + +#include #include #include @@ -132,18 +135,16 @@ class [[nodiscard]] Expected using Base = boost::outcome_v2::result; public: - template < - typename U, - typename = std::enable_if_t>> - constexpr Expected(U && r) : Base(T{std::forward(r)}) + template + requires std::convertible_to constexpr Expected(U && r) + : Base(T{std::forward(r)}) { } - template < - typename U, - typename = std::enable_if_t< - std::is_convertible_v && !std::is_reference_v>> - constexpr Expected(Unexpected e) : Base(E{std::move(e.value())}) + template + requires std::convertible_to && + (!std::is_reference_v)constexpr Expected(Unexpected e) + : Base(E{std::move(e.value())}) { } @@ -216,11 +217,10 @@ class [[nodiscard]] Expected { } - template < - typename U, - typename = std::enable_if_t< - std::is_convertible_v && !std::is_reference_v>> - constexpr Expected(Unexpected e) : Base(E{std::move(e.value())}) + template + requires std::convertible_to && + (!std::is_reference_v)constexpr Expected(Unexpected e) + : Base(E{std::move(e.value())}) { }