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:
Morph 2022-05-02 03:15:10 -04:00
parent 16b7fd71a0
commit 08bddd7d79
1 changed files with 42 additions and 0 deletions

View File

@ -153,6 +153,48 @@ constexpr ResultCode ResultSuccess(0);
*/ */
constexpr ResultCode ResultUnknown(UINT32_MAX); 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 * 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 * also holds a result of type `T`. If the code is an error code (not ResultSuccess), then trying