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.
This commit is contained in:
		| @@ -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 | ||||
|   | ||||
		Reference in New Issue
	
	Block a user