diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..4075734 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,407 @@ +# Header file `expected.hpp` + +
#define TL_EXPECTED_HPP
+
+#define TL_EXPECTED_GCC49
+
+#define TL_EXPECTED_NO_CONSTRR
+
+#define TL_EXPECTED_CXX14
+
+#define TL_IN_PLACE_MONOSTATE_DEFINED
+
+namespace tl
+{
+ class monostate;
+
+ struct in_place_t;
+
+ constexpr in_place_t{} in_place;
+
+ template <class E>
+ class unexpected;
+
+ template <class E>
+ constexpr bool operator==(const unexpected<E>& lhs, const unexpected<E>& rhs);
+ template <class E>
+ constexpr bool operator!=(const unexpected<E>& lhs, const unexpected<E>& rhs);
+ template <class E>
+ constexpr bool operator<(const unexpected<E>& lhs, const unexpected<E>& rhs);
+ template <class E>
+ constexpr bool operator<=(const unexpected<E>& lhs, const unexpected<E>& rhs);
+ template <class E>
+ constexpr bool operator>(const unexpected<E>& lhs, const unexpected<E>& rhs);
+ template <class E>
+ constexpr bool operator>=(const unexpected<E>& lhs, const unexpected<E>& rhs);
+
+ template <class E>
+ unexpected<E> make_unexpected(E&& e);
+
+ struct unexpect_t;
+
+ constexpr unexpect_t{} unexpect;
+
+ template <class E>
+ class bad_expected_access;
+
+ template <class T, class E>
+ class expected;
+
+ template <class T, class E, class U, class F>
+ constexpr bool operator==(const expected<T, E>& lhs, const expected<U, F>& rhs);
+
+ template <class T, class E, class U, class F>
+ constexpr bool operator!=(const expected<T, E>& lhs, const expected<U, F>& rhs);
+
+ template <class T, class E, class U, class F>
+ constexpr bool operator<(const expected<T, E>& lhs, const expected<U, F>& rhs);
+
+ template <class T, class E, class U, class F>
+ constexpr bool operator>(const expected<T, E>& lhs, const expected<U, F>& rhs);
+
+ template <class T, class E, class U, class F>
+ constexpr bool operator<=(const expected<T, E>& lhs, const expected<U, F>& rhs);
+
+ template <class T, class E, class U, class F>
+ constexpr bool operator>=(const expected<T, E>& lhs, const expected<U, F>& rhs);
+
+ template <class T, class E, class U>
+ constexpr bool operator==(const expected<T, E>& x, const U& v);
+
+ template <class T, class E, class U>
+ constexpr bool operator==(const U& v, const expected<T, E>& x);
+
+ template <class T, class E, class U>
+ constexpr bool operator!=(const expected<T, E>& x, const U& v);
+
+ template <class T, class E, class U>
+ constexpr bool operator!=(const U& v, const expected<T, E>& x);
+
+ template <class T, class E, class U>
+ constexpr bool operator<(const expected<T, E>& x, const U& v);
+
+ template <class T, class E, class U>
+ constexpr bool operator<(const U& v, const expected<T, E>& x);
+
+ template <class T, class E, class U>
+ constexpr bool operator<=(const expected<T, E>& x, const U& v);
+
+ template <class T, class E, class U>
+ constexpr bool operator<=(const U& v, const expected<T, E>& x);
+
+ template <class T, class E, class U>
+ constexpr bool operator>(const expected<T, E>& x, const U& v);
+
+ template <class T, class E, class U>
+ constexpr bool operator>(const U& v, const expected<T, E>& x);
+
+ template <class T, class E, class U>
+ constexpr bool operator>=(const expected<T, E>& x, const U& v);
+
+ template <class T, class E, class U>
+ constexpr bool operator>=(const U& v, const expected<T, E>& x);
+
+ template <class T, class E>
+ constexpr bool operator==(const expected<T, E>& x, const unexpected<E>& e);
+
+ template <class T, class E>
+ constexpr bool operator==(const unexpected<E>& e, const expected<T, E>& x);
+
+ template <class T, class E>
+ constexpr bool operator!=(const expected<T, E>& x, const unexpected<E>& e);
+
+ template <class T, class E>
+ constexpr bool operator!=(const unexpected<E>& e, const expected<T, E>& x);
+
+ template <class T, class E>
+ constexpr bool operator<(const expected<T, E>& x, const unexpected<E>& e);
+
+ template <class T, class E>
+ constexpr bool operator<(const unexpected<E>& e, const expected<T, E>& x);
+
+ template <class T, class E>
+ constexpr bool operator<=(const expected<T, E>& x, const unexpected<E>& e);
+
+ template <class T, class E>
+ constexpr bool operator<=(const unexpected<E>& e, const expected<T, E>& x);
+
+ template <class T, class E>
+ constexpr bool operator>(const expected<T, E>& x, const unexpected<E>& e);
+
+ template <class T, class E>
+ constexpr bool operator>(const unexpected<E>& e, const expected<T, E>& x);
+
+ template <class T, class E>
+ constexpr bool operator>=(const expected<T, E>& x, const unexpected<E>& e);
+
+ template <class T, class E>
+ constexpr bool operator>=(const unexpected<E>& e, const expected<T, E>& x);
+
+ template <class T, class E, 'hidden'>
+ void swap(expected<T, E>& lhs, expected<T, E>& rhs) noexcept(noexcept(lhs.swap(rhs)));
+}
+
+## Class `tl::monostate`
+
+class monostate
+{
+};
+
+Used to represent an expected with no data
+
+## Struct `tl::in_place_t`
+
+struct in_place_t
+{
+ in_place_t() = default;
+};
+
+A tag type to tell expected to construct its value in-place
+
+## Variable `tl::in_place`
+
+constexpr in_place_t{} in_place;
+
+A tag to tell expected to construct its value in-place
+
+## Class template `tl::unexpected`
+
+template <class E>
+class unexpected
+{
+public:
+ unexpected() = delete;
+
+ constexpr unexpected(const E& e);
+
+ constexpr unexpected(E&& e);
+
+ constexpr const E& value() const &;
+ constexpr E& value() &;
+ constexpr E&& value() &&;
+};
+
+Used as a wrapper to store the unexpected value
+
+### Function `tl::unexpected::value`
+
+(1) constexpr const E& value() const &;
+
+(2) constexpr E& value() &;
+
+(3) constexpr E&& value() &&;
+
+*Returns*: the contained value
+
+-----
+
+## Comparison operator `tl::operator==`
+
+(1) template <class E>
+ constexpr bool operator==(const unexpected<E>& lhs, const unexpected<E>& rhs);
+
+(2) template <class E>
+ constexpr bool operator!=(const unexpected<E>& lhs, const unexpected<E>& rhs);
+
+(3) template <class E>
+ constexpr bool operator<(const unexpected<E>& lhs, const unexpected<E>& rhs);
+
+(4) template <class E>
+ constexpr bool operator<=(const unexpected<E>& lhs, const unexpected<E>& rhs);
+
+(5) template <class E>
+ constexpr bool operator>(const unexpected<E>& lhs, const unexpected<E>& rhs);
+
+(6) template <class E>
+ constexpr bool operator>=(const unexpected<E>& lhs, const unexpected<E>& rhs);
+
+Compares two unexpected objects
+
+Simply compares lhs.value() to rhs.value()
+
+## Function template `tl::make_unexpected`
+
+template <class E>
+unexpected<E> make_unexpected(E&& e);
+
+Create an `unexpected` from `e`, deducing the return type
+
+*Example:* auto e1 = tl::make\_unexpected(42); unexpected\struct unexpect_t
+{
+ unexpect_t() = default;
+};
+
+A tag type to tell expected to construct the unexpected value
+
+## Variable `tl::unexpect`
+
+constexpr unexpect_t{} unexpect;
+
+A tag to tell expected to construct the unexpected value
+
+## Class template `tl::expected`
+
+template <class T, class E>
+class expected
+{
+public:
+ using value_type = T;
+
+ using error_type = E;
+
+ using unexpected_type = unexpected<E>;
+
+ template <class F>
+ 'hidden' and_then(F&& f) &;
+ template <class F>
+ constexpr auto and_then(F &&f) &&;
+ template <class F>
+ constexpr auto and_then(F &&f) const &;
+
+ template <class F> constexpr auto map(F &&f) &;
+ template <class F> constexpr auto map(F &&f) &&;
+ template <class F> constexpr auto map(F &&f) const &;
+
+ template <class F> constexpr auto map_error(F &&f) &;
+ template <class F> constexpr auto map_error(F &&f) &&;
+ template <class F> constexpr auto map_error(F &&f) const &;
+
+ constexpr expected() = default;
+
+ constexpr expected(const expected& rhs) = default;
+
+ constexpr expected(expected&& rhs) = default;
+
+ constexpr expected& operator=(const expected& rhs) = default;
+
+ constexpr expected& operator=(expected&& rhs) = default;
+
+ template <class ... Args, 'hidden' ... = nullptr>
+ constexpr expected(in_place_t, Args&&... args);
+
+ template <class U, class ... Args, 'hidden' ... = nullptr>
+ constexpr expected(in_place_t, std::initializer_list<U> il, Args&&... args);
+
+ EXPLICIT constexpr expected(const unexpected<G> &e);
+ EXPLICIT constexpr expected(unexpected<G> &&e);
+
+ template <class ... Args, 'hidden' ... = nullptr>
+ constexpr expected(unexpect_t, Args&&... args);
+
+ template <class U, class G, 'hidden'>
+ constexpr expected(const expected<U, G>& rhs);
+
+ template <class U, class G, 'hidden'>
+ constexpr expected(expected<U, G>&& rhs);
+
+ template <class U = T, 'hidden'>
+ constexpr expected(U&& v);
+
+ template <class U = T, 'hidden', 'hidden'>
+ expected& operator=(U&& v);
+
+ template <class G = E, 'hidden'>
+ expected& operator=(const unexpected<G>& rhs);
+
+ template <class G = E, 'hidden'>
+ expected& operator=(unexpected<G>&& rhs) noexcept;
+
+ template <class ... Args, 'hidden' ... = nullptr>
+ void emplace(Args&&... args);
+
+ template <class U, class ... Args, 'hidden' ... = nullptr>
+ void emplace(std::initializer_list<U> il, Args&&... args);
+
+ void swap(expected& rhs) noexcept(std::is_nothrow_move_constructible<T>::value&&noexcept(swap(std::declval<T&>(), std::declval<T&>()))&&std::is_nothrow_move_constructible<E>::value&&noexcept(swap(std::declval<E&>(), std::declval<E&>())));
+
+ constexpr const T* operator->() const;
+
+ constexpr T* operator->();
+
+ constexpr const T& operator*() const &;
+
+ constexpr T& operator*() &;
+
+ constexpr const T&& operator*() const &&;
+
+ constexpr T&& operator*() &&;
+
+ constexpr operator bool() const noexcept;
+
+ constexpr bool has_value() const noexcept;
+
+ constexpr const T& value() const &;
+
+ constexpr T& value() &;
+
+ constexpr const T&& value() const &&;
+
+ constexpr T&& value() &&;
+
+ constexpr const E& error() const &;
+
+ constexpr E& error() &;
+
+ constexpr const E&& error() const &&;
+
+ constexpr E&& error() &&;
+
+ template <class U>
+ constexpr T value_or(U&& v) const &;
+
+ template <class U>
+ T value_or(U&& v) &&;
+};
+
+An `expected(1) template <class F>
+ 'hidden' and_then(F&& f) &;
+
+(2) template <class F>
+ constexpr auto and_then(F &&f) &&;
+
+(3) template <class F>
+ constexpr auto and_then(F &&f) const &;
+
+Carries out some operation which returns an optional on the stored object if there is one. \\requires `std::invoke(std::forward(1) template <class F> constexpr auto map(F &&f) &;
+
+(2) template <class F> constexpr auto map(F &&f) &&;
+
+(3) template <class F> constexpr auto map(F &&f) const &;
+
+Carries out some operation on the stored object if there is one.
+
+*Returns*: Let `U` be the result of `std::invoke(std::forward(1) template <class F> constexpr auto map_error(F &&f) &;
+
+(2) template <class F> constexpr auto map_error(F &&f) &&;
+
+(3) template <class F> constexpr auto map_error(F &&f) const &;
+
+Carries out some operation on the stored unexpected object if there is one.
+
+*Returns*: Let `U` be the result of `std::invoke(std::forward(1) EXPLICIT constexpr expected(const unexpected<G> &e);
+
+(2) EXPLICIT constexpr expected(unexpected<G> &&e);
+
+-----
+
+-----
diff --git a/expected.hpp b/expected.hpp
index 57b7827..d212a12 100644
--- a/expected.hpp
+++ b/expected.hpp
@@ -139,8 +139,8 @@ public:
constexpr E &value() & { return m_val; }
/// \group unexpected_value
constexpr E &&value() && { return std::move(m_val); }
- /// \group unexpected_value
- constexpr E const &&value() const && { return std::move(m_val); }
+ /// \exclude
+ constexpr const E &&value() const && { return std::move(m_val); }
private:
E m_val;
@@ -374,7 +374,8 @@ template