ladybird/AK/Result.h

112 lines
1.8 KiB
C
Raw Normal View History

/*
* Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#include <AK/Assertions.h>
#include <AK/Optional.h>
namespace AK {
template<typename ValueType, typename ErrorType>
class [[nodiscard]] Result {
public:
Result(const ValueType& res)
: m_result(res)
{
}
Result(ValueType&& res)
2020-10-03 17:11:11 +00:00
: m_result(move(res))
{
}
Result(const ErrorType& error)
: m_error(error)
{
}
Result(ErrorType&& error)
2020-10-03 17:11:11 +00:00
: m_error(move(error))
{
}
Result(Result&& other) = default;
Result(const Result& other) = default;
~Result() = default;
ValueType& value()
{
return m_result.value();
}
ErrorType& error()
{
return m_error.value();
}
bool is_error() const
{
return m_error.has_value();
}
ValueType release_value()
{
return m_result.release_value();
}
ErrorType release_error()
{
return m_error.release_value();
}
private:
Optional<ValueType> m_result;
Optional<ErrorType> m_error;
};
// Partial specialization for void value type
template<typename ErrorType>
class [[nodiscard]] Result<void, ErrorType> {
public:
Result(const ErrorType& error)
: m_error(error)
{
}
Result(ErrorType&& error)
: m_error(move(error))
{
}
Result() = default;
Result(Result&& other) = default;
Result(const Result& other) = default;
~Result() = default;
ErrorType& error()
{
return m_error.value();
}
bool is_error() const
{
return m_error.has_value();
}
ErrorType release_error()
{
return m_error.release_value();
}
private:
Optional<ErrorType> m_error;
};
}
using AK::Result;