diff options
Diffstat (limited to 'src/core')
| -rw-r--r-- | src/core/hle/result.h | 28 | 
1 files changed, 24 insertions, 4 deletions
| diff --git a/src/core/hle/result.h b/src/core/hle/result.h index a755008d5..2c6b24848 100644 --- a/src/core/hle/result.h +++ b/src/core/hle/result.h @@ -206,7 +206,7 @@ public:          return result;      } -    ResultVal(const ResultVal& o) : result_code(o.result_code) { +    ResultVal(const ResultVal& o) noexcept : result_code(o.result_code) {          if (!o.empty()) {              new (&object) T(o.object);          } @@ -224,7 +224,7 @@ public:          }      } -    ResultVal& operator=(const ResultVal& o) { +    ResultVal& operator=(const ResultVal& o) noexcept {          if (this == &o) {              return *this;          } @@ -244,6 +244,26 @@ public:          return *this;      } +    ResultVal& operator=(ResultVal&& o) noexcept { +        if (this == &o) { +            return *this; +        } +        if (!empty()) { +            if (!o.empty()) { +                object = std::move(o.object); +            } else { +                object.~T(); +            } +        } else { +            if (!o.empty()) { +                new (&object) T(std::move(o.object)); +            } +        } +        result_code = o.result_code; + +        return *this; +    } +      /**       * Replaces the current result with a new constructed result value in-place. The code must not       * be an error code. @@ -329,8 +349,8 @@ template <typename T, typename... Args>   * copy or move constructing.   */  template <typename Arg> -[[nodiscard]] ResultVal<std::remove_reference_t<Arg>> MakeResult(Arg&& arg) { -    return ResultVal<std::remove_reference_t<Arg>>::WithCode(ResultSuccess, std::forward<Arg>(arg)); +[[nodiscard]] ResultVal<std::remove_cvref_t<Arg>> MakeResult(Arg&& arg) { +    return ResultVal<std::remove_cvref_t<Arg>>::WithCode(ResultSuccess, std::forward<Arg>(arg));  }  /** | 
