|
|
|
@ -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 |
|
|
|
|