forked from suyu/suyu
Merge pull request #8296 from Morph1984/result-range
hle/result: Implement ResultRange
This commit is contained in:
commit
8037f2eae8
1 changed files with 42 additions and 0 deletions
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue