Allow supplying a custom ResultValue result type and optimise span

This allows PosixResultValue to be created easily.
This commit is contained in:
Billy Laws 2021-07-17 14:01:39 +01:00 committed by ◱ Mark
parent 3d3c13f90c
commit 75a67dcfa5

View File

@ -84,26 +84,27 @@ namespace skyline {
/**
* @brief A wrapper around std::optional that also stores a HOS result code
* @tparam T The object type to hold
* @tparam ValueType The object type to hold
* @tparam ResultType The result type to hold
*/
template<typename T>
template<typename ValueType, typename ResultType = Result>
class ResultValue {
static_assert(!std::is_same<T, Result>::value);
static_assert(!std::is_same<ValueType, ResultType>::value);
private:
std::optional<T> value;
std::optional<ValueType> value;
public:
Result result;
ResultType result{};
constexpr ResultValue(T value) : value(value) {};
constexpr ResultValue(ValueType value) : value(value) {};
constexpr ResultValue(Result result) : result(result) {};
constexpr ResultValue(ResultType result) : result(result) {};
template<typename U>
constexpr ResultValue(ResultValue<U> result) : result(result) {};
constexpr operator Result() const {
constexpr operator ResultType() const {
return result;
}
@ -111,11 +112,11 @@ namespace skyline {
return value.has_value();
}
constexpr T& operator*() {
constexpr ValueType& operator*() {
return *value;
}
constexpr T* operator->() {
constexpr ValueType* operator->() {
return &*value;
}
};
@ -398,6 +399,9 @@ namespace skyline {
template<typename Out>
constexpr Out &as() {
if constexpr (Extent != std::dynamic_extent && sizeof(T) * Extent >= sizeof(Out))
return *reinterpret_cast<Out *>(span::data());
if (span::size_bytes() >= sizeof(Out))
return *reinterpret_cast<Out *>(span::data());
throw exception("Span size is less than Out type size (0x{:X}/0x{:X})", span::size_bytes(), sizeof(Out));