Adds new result class to show a functions success or failure.
continuous-integration/drone/push Build is passing Details

This commit is contained in:
Deukhoofd 2020-12-11 16:02:18 +01:00
parent 0116ed8f4c
commit f7a161c690
Signed by: Deukhoofd
GPG Key ID: F63E044490819F6F
1 changed files with 58 additions and 0 deletions

58
src/Result.hpp Normal file
View File

@ -0,0 +1,58 @@
#ifndef ARBUTILS_RESULT_HPP
#define ARBUTILS_RESULT_HPP
namespace ArbUt {
/// @brief Whether the result was okay, or was an error
enum class ResultStatus : uint8_t { Ok, Error };
/// @brief Simple data class to return a functions success or failure.
/// @tparam T The potential return value of the function.
template <class T> class Result<T> {
public:
/// @brief Return a success, along with the success value.
/// @param value The value to return.
/// @return The result class
inline static const Result& Ok(T value) { return Result(ResultStatus::Ok, value); }
/// @brief Return an error, along with an error message.
/// @param message The error message to return
/// @return The result class
inline static const Result& Error(const std::string& message) { return Result(message); }
/// @brief Returns whether or not the function succeeded,
/// @return Whether or not the function succeeded.
[[nodiscard]] inline ResultStatus GetStatus() const noexcept { return _resultStatus; }
/// @brief The value of the result if it was successful.
/// @return The value of the result if it was successful.
inline const T& GetValue() const noexcept {
Assert(_resultStatus == ResultStatus::Ok);
return _resultValue;
}
/// @brief The value of the result if it was successful.
/// @return The value of the result if it was successful.
inline T& GetValue() noexcept {
Assert(_resultStatus == ResultStatus::Ok);
return _resultValue;
}
/// @brief Returns the error message if it errored.
/// @return The error message if it errored.
[[nodiscard]] inline const std::string& GetErrorMessage() const noexcept {
Assert(_resultStatus == ResultStatus::Error);
return _errorMessage;
}
private:
Result(ResultStatus result, const T& value) : _resultStatus(result), _resultValue(value) {}
explicit Result(const std::string& error) : _resultStatus(ResultStatus::Error), _errorMessage(error) {}
ResultStatus _resultStatus;
union {
T _resultValue;
std::string _errorMessage{};
};
};
}
#endif // ARBUTILS_RESULT_HPP