summaryrefslogtreecommitdiffstats
path: root/src/core/hle/result.h
diff options
context:
space:
mode:
authorYuri Kunde Schlesner <yuriks@yuriks.net>2017-06-06 17:04:02 +0200
committerGitHub <noreply@github.com>2017-06-06 17:04:02 +0200
commitfc1bd06192a10b52425b76880531b520dd68e86d (patch)
treebe459930c35e50f698ef7747730092116eea6a74 /src/core/hle/result.h
parentMerge pull request #2752 from yuriks/move-session-request-handler (diff)
parentKernel: Add a dedicated SetHleHandler method to ServerPort/ServerSession (diff)
downloadyuzu-fc1bd06192a10b52425b76880531b520dd68e86d.tar
yuzu-fc1bd06192a10b52425b76880531b520dd68e86d.tar.gz
yuzu-fc1bd06192a10b52425b76880531b520dd68e86d.tar.bz2
yuzu-fc1bd06192a10b52425b76880531b520dd68e86d.tar.lz
yuzu-fc1bd06192a10b52425b76880531b520dd68e86d.tar.xz
yuzu-fc1bd06192a10b52425b76880531b520dd68e86d.tar.zst
yuzu-fc1bd06192a10b52425b76880531b520dd68e86d.zip
Diffstat (limited to 'src/core/hle/result.h')
-rw-r--r--src/core/hle/result.h19
1 files changed, 19 insertions, 0 deletions
diff --git a/src/core/hle/result.h b/src/core/hle/result.h
index c49650f7d..5f2cdbb96 100644
--- a/src/core/hle/result.h
+++ b/src/core/hle/result.h
@@ -416,6 +416,16 @@ ResultVal<T> MakeResult(Args&&... args) {
}
/**
+ * Deducible overload of MakeResult, allowing the template parameter to be ommited if you're just
+ * copy or move constructing.
+ */
+template <typename Arg>
+ResultVal<std::remove_reference_t<Arg>> MakeResult(Arg&& arg) {
+ return ResultVal<std::remove_reference_t<Arg>>::WithCode(RESULT_SUCCESS,
+ std::forward<Arg>(arg));
+}
+
+/**
* Check for the success of `source` (which must evaluate to a ResultVal). If it succeeds, unwraps
* the contained value and assigns it to `target`, which can be either an l-value expression or a
* variable declaration. If it fails the return code is returned from the current function. Thus it
@@ -426,3 +436,12 @@ ResultVal<T> MakeResult(Args&&... args) {
if (CONCAT2(check_result_L, __LINE__).Failed()) \
return CONCAT2(check_result_L, __LINE__).Code(); \
target = std::move(*CONCAT2(check_result_L, __LINE__))
+
+/**
+ * Analogous to CASCADE_RESULT, but for a bare ResultCode. The code will be propagated if
+ * non-success, or discarded otherwise.
+ */
+#define CASCADE_CODE(source) \
+ auto CONCAT2(check_result_L, __LINE__) = source; \
+ if (CONCAT2(check_result_L, __LINE__).IsError()) \
+ return CONCAT2(check_result_L, __LINE__);