aboutsummaryrefslogtreecommitdiff
path: root/include/wanda/expected.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'include/wanda/expected.hpp')
-rw-r--r--include/wanda/expected.hpp256
1 files changed, 0 insertions, 256 deletions
diff --git a/include/wanda/expected.hpp b/include/wanda/expected.hpp
deleted file mode 100644
index fff0d81..0000000
--- a/include/wanda/expected.hpp
+++ /dev/null
@@ -1,256 +0,0 @@
-/**
- * @file expected.hpp
- * @author Felix Morgner (felix.morgner@gmail.com)
- * @since 1.0.0
- */
-
-#ifndef WANDA_EXPECTED_HPP
-#define WANDA_EXPECTED_HPP
-
-#include <initializer_list>
-#include <type_traits>
-#include <utility>
-
-namespace wanda
-{
- /**
- * @brief A type to represent the error case of a computation based on #wanda::expected
- */
- template<typename ErrorType>
- struct unexpected
- {
- static_assert(!std::is_same_v<ErrorType, void>, "ErrorType can not be 'void'!");
- static_assert(!std::is_array_v<ErrorType>, "ErrorType can not be an array type!");
-
- /**
- * @brief Copy construct a new @p unexpected from another @p unexpected
- */
- constexpr unexpected(unexpected const &) = default;
-
- /**
- * @brief Move construct a new @p unexpected from another @p unexpected
- */
- constexpr unexpected(unexpected &&) = default;
-
- /**
- * @brief Construct a new @p unexpected by direct initializing the error object from @p args
- */
- template<typename... Args>
- constexpr explicit unexpected(std::in_place_t, Args &&... args)
- : m_error(std::forward<Args>(args)...)
- {
- }
-
- /**
- * @brief Construct a new @p unexpected by direct initializing the error object from @p il and @p args
- */
- template<
- typename U,
- typename... Args,
- std::enable_if_t<std::is_constructible_v<ErrorType, std::initializer_list<U>, Args...>> * = nullptr>
- constexpr explicit unexpected(std::in_place_t, std::initializer_list<U> il, Args &&... args)
- : m_error(il, std::forward<Args>(args)...)
- {
- }
-
- /**
- * @brief Construct a new @p unexpected by direct initializing the error object from @p error
- */
- template<
- typename Err = ErrorType,
- std::enable_if_t<std::is_constructible_v<ErrorType, Err> &&
- !std::is_same_v<std::remove_cv_t<std::remove_reference_t<Err>>, std::in_place_t> &&
- !std::is_same_v<std::remove_cv_t<std::remove_reference_t<Err>>, unexpected>> * = nullptr>
- constexpr explicit unexpected(Err && error)
- : m_error(std::forward<Err>(error))
- {
- }
-
- /**
- * @brief Construct a new @p unexpected by copying the value of another @p unexpected of different error type
- */
- template<
- typename Err,
- std::enable_if_t<!(
- std::is_constructible_v<ErrorType, Err> &&
- !std::is_constructible_v<ErrorType, unexpected<Err> &> &&
- !std::is_constructible_v<ErrorType, unexpected<Err>> &&
- !std::is_constructible_v<ErrorType, unexpected<Err> const &> &&
- !std::is_constructible_v<ErrorType, unexpected<Err> const> &&
- !std::is_convertible_v<unexpected<Err> &, ErrorType> &&
- !std::is_convertible_v<unexpected<Err>, ErrorType> &&
- !std::is_convertible_v<unexpected<Err> const &, ErrorType> &&
- !std::is_convertible_v<unexpected<Err> const, ErrorType>)> * = nullptr,
- std::enable_if_t<!std::is_convertible_v<Err, ErrorType>> * = nullptr>
- constexpr explicit unexpected(unexpected<Err> const & error)
- : m_error(error.m_error)
- {
- }
-
- /**
- * @brief Construct a new @p unexpected by copying the value of another @p unexpected of different error type
- */
- template<
- typename Err,
- std::enable_if_t<!(
- std::is_constructible_v<ErrorType, Err> &&
- !std::is_constructible_v<ErrorType, unexpected<Err> &> &&
- !std::is_constructible_v<ErrorType, unexpected<Err>> &&
- !std::is_constructible_v<ErrorType, unexpected<Err> const &> &&
- !std::is_constructible_v<ErrorType, unexpected<Err> const> &&
- !std::is_convertible_v<unexpected<Err> &, ErrorType> &&
- !std::is_convertible_v<unexpected<Err>, ErrorType> &&
- !std::is_convertible_v<unexpected<Err> const &, ErrorType> &&
- !std::is_convertible_v<unexpected<Err> const, ErrorType>)> * = nullptr,
- std::enable_if_t<std::is_convertible_v<Err, ErrorType>> * = nullptr>
- constexpr unexpected(unexpected<Err> const & error)
- : m_error(error.m_error)
- {
- }
-
- /**
- * @brief Construct a new @p unexpected by moving the value of another @p unexpected of different error type
- */
- template<
- typename Err,
- std::enable_if_t<!(
- std::is_constructible_v<ErrorType, Err> &&
- !std::is_constructible_v<ErrorType, unexpected<Err> &> &&
- !std::is_constructible_v<ErrorType, unexpected<Err>> &&
- !std::is_constructible_v<ErrorType, unexpected<Err> const &> &&
- !std::is_constructible_v<ErrorType, unexpected<Err> const> &&
- !std::is_convertible_v<unexpected<Err> &, ErrorType> &&
- !std::is_convertible_v<unexpected<Err>, ErrorType> &&
- !std::is_convertible_v<unexpected<Err> const &, ErrorType> &&
- !std::is_convertible_v<unexpected<Err> const, ErrorType>)> * = nullptr,
- std::enable_if_t<!std::is_convertible_v<Err, ErrorType>> * = nullptr>
- constexpr explicit unexpected(unexpected<Err> && error)
- : m_error(std::move(error.m_error))
- {
- }
-
- /**
- * @brief Construct a new @p unexpected by moving the value of another @p unexpected of different error type
- */
- template<
- typename Err,
- std::enable_if_t<!(
- std::is_constructible_v<ErrorType, Err> &&
- !std::is_constructible_v<ErrorType, unexpected<Err> &> &&
- !std::is_constructible_v<ErrorType, unexpected<Err>> &&
- !std::is_constructible_v<ErrorType, unexpected<Err> const &> &&
- !std::is_constructible_v<ErrorType, unexpected<Err> const> &&
- !std::is_convertible_v<unexpected<Err> &, ErrorType> &&
- !std::is_convertible_v<unexpected<Err>, ErrorType> &&
- !std::is_convertible_v<unexpected<Err> const &, ErrorType> &&
- !std::is_convertible_v<unexpected<Err> const, ErrorType>)> * = nullptr,
- std::enable_if_t<std::is_convertible_v<Err, ErrorType>> * = nullptr>
- constexpr unexpected(unexpected<Err> && error)
- : m_error(std::move(error.m_error))
- {
- }
-
- /**
- * @brief Get the error value contained in this @p unexpected instance
- */
- constexpr ErrorType const & value() const &
- {
- return m_error;
- }
-
- /**
- * @brief Get the error value contained in this @p unexpected instance
- */
- constexpr ErrorType & value() &
- {
- return m_error;
- }
-
- /**
- * @brief Get the error value contained in this @p unexpected instance
- */
- constexpr ErrorType && value() &&
- {
- return std::move(m_error);
- }
-
- /**
- * @brief Get the error value contained in this @p unexpected instance
- */
- constexpr ErrorType const && value() const &&
- {
- return std::move(m_error);
- }
-
- /**
- * @brief Swap the error value of this @p unexpected instance with the one of @p other
- */
- void swap(unexpected & other) noexcept(std::is_nothrow_swappable_v<ErrorType>)
- {
- using std::swap;
- swap(m_error, other.m_error);
- }
-
- template<typename ErrorType1, typename ErrorType2>
- friend constexpr bool operator==(unexpected<ErrorType1> const & lhs, unexpected<ErrorType2> const & rhs);
-
- template<typename ErrorType1, typename ErrorType2>
- friend constexpr bool operator!=(unexpected<ErrorType1> const & lhs, unexpected<ErrorType2> const & rhs);
-
- template<
- typename Err,
- std::enable_if_t<std::is_swappable_v<Err>> *>
- friend void swap(unexpected<Err> & lhs, unexpected<Err> & rhs);
-
- private:
- ErrorType m_error;
- };
-
- template<typename ErrorType>
- unexpected(ErrorType)->unexpected<ErrorType>;
-
- /**
- * @brief Compare two @p unexpected instances for equality
- */
- template<typename ErrorType1, typename ErrorType2>
- constexpr bool operator==(unexpected<ErrorType1> const & lhs, unexpected<ErrorType2> const & rhs)
- {
- return lhs.m_error == rhs.m_error;
- }
-
- /**
- * @brief Compare two @p unexpected instances for inequality
- */
- template<typename ErrorType1, typename ErrorType2>
- constexpr bool operator!=(unexpected<ErrorType1> const & lhs, unexpected<ErrorType2> const & rhs)
- {
- return lhs.m_error != rhs.m_error;
- }
-
- /**
- * @brief Swap the error values of two @p unexpected instances
- */
- template<
- typename Err,
- std::enable_if_t<std::is_swappable_v<Err>> * = nullptr>
- void swap(unexpected<Err> & lhs, unexpected<Err> & rhs)
- {
- lhs.swap(rhs);
- }
-
- /**
- * @brief A tag type for @p unexpected
- */
- struct unexpect_t
- {
- explicit unexpect_t() = default;
- };
-
- /**
- * @brief A tap for @p unexpected
- */
- inline constexpr unexpect_t unexpect{};
-
-} // namespace wanda
-
-#endif \ No newline at end of file