summaryrefslogtreecommitdiffstats
path: root/src/core
diff options
context:
space:
mode:
Diffstat (limited to 'src/core')
-rw-r--r--src/core/hle/result.h28
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));
}
/**