From 08bddd7d79f76573fad12a35a35cafcb86c2c1b0 Mon Sep 17 00:00:00 2001
From: Morph <39850852+Morph1984@users.noreply.github.com>
Date: Mon, 2 May 2022 03:15:10 -0400
Subject: [PATCH] hle/result: Implement ResultRange

A ResultRange defines an inclusive range of error descriptions within an error module.
This can be used to check whether the description of a given ResultCode falls within the range.
The conversion function returns a ResultCode with its description set to description_start.
---
 src/core/hle/result.h | 42 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 42 insertions(+)

diff --git a/src/core/hle/result.h b/src/core/hle/result.h
index 3807b9aa82..8d38d0030c 100644
--- a/src/core/hle/result.h
+++ b/src/core/hle/result.h
@@ -153,6 +153,48 @@ constexpr ResultCode ResultSuccess(0);
  */
 constexpr ResultCode ResultUnknown(UINT32_MAX);
 
+/**
+ * A ResultRange defines an inclusive range of error descriptions within an error module.
+ * This can be used to check whether the description of a given ResultCode falls within the range.
+ * The conversion function returns a ResultCode with its description set to description_start.
+ *
+ * An example of how it could be used:
+ * \code
+ * constexpr ResultRange ResultCommonError{ErrorModule::Common, 0, 9999};
+ *
+ * ResultCode Example(int value) {
+ *     const ResultCode result = OtherExample(value);
+ *
+ *     // This will only evaluate to true if result.module is ErrorModule::Common and
+ *     // result.description is in between 0 and 9999 inclusive.
+ *     if (ResultCommonError.Includes(result)) {
+ *         // This returns ResultCode{ErrorModule::Common, 0};
+ *         return ResultCommonError;
+ *     }
+ *
+ *     return ResultSuccess;
+ * }
+ * \endcode
+ */
+class ResultRange {
+public:
+    consteval ResultRange(ErrorModule module, u32 description_start, u32 description_end_)
+        : code{module, description_start}, description_end{description_end_} {}
+
+    [[nodiscard]] consteval operator ResultCode() const {
+        return code;
+    }
+
+    [[nodiscard]] constexpr bool Includes(ResultCode other) const {
+        return code.module == other.module && code.description <= other.description &&
+               other.description <= description_end;
+    }
+
+private:
+    ResultCode code;
+    u32 description_end;
+};
+
 /**
  * This is an optional value type. It holds a `ResultCode` and, if that code is ResultSuccess, it
  * also holds a result of type `T`. If the code is an error code (not ResultSuccess), then trying