20#ifndef Q23_TL_EXPECTED_HPP
21#define Q23_TL_EXPECTED_HPP
34#define Q23_TL_EXPECTED_VERSION_MAJOR 1
35#define Q23_TL_EXPECTED_VERSION_MINOR 1
36#define Q23_TL_EXPECTED_VERSION_PATCH 0
38#include <QtCore/private/qglobal_p.h>
39#include <QtCore/qassert.h>
40#include <QtCore/qtconfiginclude.h>
41#include <QtCore/qtconfigmacros.h>
48#define Q23_TL_ASSERT Q_ASSERT
50#if defined(__EXCEPTIONS
) || defined(_CPPUNWIND)
51#define Q23_TL_EXPECTED_EXCEPTIONS_ENABLED
54#if defined(Q23_TL_EXPECTED_EXCEPTIONS_ENABLED
) && defined(QT_NO_EXCEPTIONS)
55# undef Q23_TL_EXPECTED_EXCEPTIONS_ENABLED
58#if (defined(_MSC_VER) && _MSC_VER == 1900
)
59#define Q23_TL_EXPECTED_MSVC2015
60#define Q23_TL_EXPECTED_MSVC2015_CONSTEXPR
62#define Q23_TL_EXPECTED_MSVC2015_CONSTEXPR constexpr
65#if (defined(__GNUC__
) && __GNUC__
== 4
&& __GNUC_MINOR__
<= 9
&&
67#define Q23_TL_EXPECTED_GCC49
70#if (defined(__GNUC__
) && __GNUC__
== 5
&& __GNUC_MINOR__
<= 4
&&
72#define Q23_TL_EXPECTED_GCC54
75#if (defined(__GNUC__
) && __GNUC__
== 5
&& __GNUC_MINOR__
<= 5
&&
77#define Q23_TL_EXPECTED_GCC55
82#if (Q23_TL_CPLUSPLUS > 201103L
) && !defined(Q23_TL_EXPECTED_GCC49)
84#define Q23_TL_ASSERT(x) assert(x)
86#define Q23_TL_ASSERT(x)
90#if (defined(__GNUC__
) && __GNUC__
== 4
&& __GNUC_MINOR__
<= 9
&&
94#define Q23_TL_EXPECTED_NO_CONSTRR
96#define Q23_TL_EXPECTED_IS_TRIVIALLY_COPY_CONSTRUCTIBLE(T)
97 std::has_trivial_copy_constructor<T>
98#define Q23_TL_EXPECTED_IS_TRIVIALLY_COPY_ASSIGNABLE(T)
99 std::has_trivial_copy_assign<T>
102#define Q23_TL_EXPECTED_IS_TRIVIALLY_DESTRUCTIBLE(T)
103 std::is_trivially_destructible<T>
107#elif (defined(__GNUC__
) && __GNUC__
< 8
&& !defined(__clang__
))
108#ifndef Q23_TL_GCC_LESS_8_TRIVIALLY_COPY_CONSTRUCTIBLE_MUTEX
109#define Q23_TL_GCC_LESS_8_TRIVIALLY_COPY_CONSTRUCTIBLE_MUTEX
114struct is_trivially_copy_constructible
115 : std::is_trivially_copy_constructible<T> {};
116#ifdef _GLIBCXX_VECTOR
117template <
class T,
class A>
118struct is_trivially_copy_constructible<std::vector<T, A>> : std::false_type {};
125#define Q23_TL_EXPECTED_IS_TRIVIALLY_COPY_CONSTRUCTIBLE(T)
126 q23::detail::is_trivially_copy_constructible<T>
127#define Q23_TL_EXPECTED_IS_TRIVIALLY_COPY_ASSIGNABLE(T)
128 std::is_trivially_copy_assignable<T>
129#define Q23_TL_EXPECTED_IS_TRIVIALLY_DESTRUCTIBLE(T)
130 std::is_trivially_destructible<T>
132#define Q23_TL_EXPECTED_IS_TRIVIALLY_COPY_CONSTRUCTIBLE(T)
133 std::is_trivially_copy_constructible<T>
134#define Q23_TL_EXPECTED_IS_TRIVIALLY_COPY_ASSIGNABLE(T)
135 std::is_trivially_copy_assignable<T>
136#define Q23_TL_EXPECTED_IS_TRIVIALLY_DESTRUCTIBLE(T)
137 std::is_trivially_destructible<T>
141#define Q23_TL_CPLUSPLUS _MSVC_LANG
143#define Q23_TL_CPLUSPLUS __cplusplus
147#define Q23_TL_EXPECTED_CXX14
150#ifdef Q23_TL_EXPECTED_GCC49
151#define Q23_TL_EXPECTED_GCC49_CONSTEXPR
153#define Q23_TL_EXPECTED_GCC49_CONSTEXPR constexpr
157 defined(Q23_TL_EXPECTED_GCC49))
158#define Q23_TL_EXPECTED_11_CONSTEXPR
160#define Q23_TL_EXPECTED_11_CONSTEXPR constexpr
165template <
class T,
class E>
class expected;
167#ifndef Q23_TL_MONOSTATE_INPLACE_MUTEX
168#define Q23_TL_MONOSTATE_INPLACE_MUTEX
179 static_assert(!
std::is_same<E,
void>::value,
"E must not be void");
186 template <
class... Args,
typename std::enable_if<std::is_constructible<
187 E, Args &&...>::value>::type * =
nullptr>
189 : m_val(
std::forward<Args>(args)...) {}
192 class U,
class... Args,
193 typename std::enable_if<std::is_constructible<
194 E, std::initializer_list<U> &, Args &&...>::value>::type * =
nullptr>
197 : m_val(l,
std::forward<Args>(args)...) {}
199 constexpr const E &
error()
const & {
return m_val; }
202 constexpr const E &&
error()
const && {
return std::move(m_val); }
208#ifdef __cpp_deduction_guides
209template <
class E> unexpected(E) ->
unexpected<E>;
214 return lhs.error() == rhs.error();
218 return lhs.error() != rhs.error();
222 return lhs.error() < rhs.error();
226 return lhs.error() <= rhs.error();
230 return lhs.error() > rhs.error();
234 return lhs.error() >= rhs.error();
250#ifdef Q23_TL_EXPECTED_EXCEPTIONS_ENABLED
251 throw std::forward<E>(e);
262#ifndef Q23_TL_TRAITS_MUTEX
263#define Q23_TL_TRAITS_MUTEX
269template <
bool E,
class T =
void>
271template <
bool B,
class T,
class F>
277template <
class B,
class... Bs>
279 :
std::conditional<
bool(B::value),
conjunction<Bs...>, B>::type {};
281#if defined(_LIBCPP_VERSION) && __cplusplus
== 201103L
282#define Q23_TL_TRAITS_LIBCXX_MEM_FN_WORKAROUND
288#ifdef Q23_TL_TRAITS_LIBCXX_MEM_FN_WORKAROUND
291template <
class T,
class Ret,
class...
Args>
294template <
class T,
class Ret,
class...
Args>
297template <
class T,
class Ret,
class...
Args>
300template <
class T,
class Ret,
class...
Args>
303template <
class T,
class Ret,
class...
Args>
306template <
class T,
class Ret,
class...
Args>
318 typename Fn,
typename... Args,
319#ifdef Q23_TL_TRAITS_LIBCXX_MEM_FN_WORKAROUND
324constexpr auto invoke(Fn &&f, Args &&...args)
noexcept(
326 ->
decltype(
std::mem_fn(f)(
std::forward<Args>(args)...)) {
327 return std::mem_fn(f)(
std::forward<Args>(args)...);
330template <
typename Fn,
typename... Args,
332constexpr auto invoke(Fn &&f, Args &&...args)
noexcept(
334 ->
decltype(
std::forward<Fn>(f)(
std::forward<Args>(args)...)) {
335 return std::forward<Fn>(f)(
std::forward<Args>(args)...);
341template <
class F,
class... Us>
344 decltype(
detail::invoke(
std::declval<F>(),
std::declval<Us>()...),
void()),
347 decltype(
detail::invoke(
std::declval<F>(),
std::declval<Us>()...));
350template <
class F,
class... Us>
353template <
class F,
class...
Us>
356#if defined(_MSC_VER) && _MSC_VER <= 1900
369template <
class T,
std::size_t N>
tag swap(T (&a)[N], T (&b)[N]);
374template <
class T,
class U,
375 class =
decltype(swap(
std::declval<T &>(),
std::declval<U &>()))>
380template <
class T,
class U>
381std::is_same<
decltype(swap(
std::declval<T &>(),
std::declval<U &>())),
tag>
390template <
class T,
std::size_t N>
393template <
class T,
class U>
398template <
class T,
class U = T>
407template <
class T,
std::size_t N>
416template <
class T,
class U = T>
430template <
class T,
class E>
434template <
class T,
class E,
class U>
441template <
class T,
class E,
class U,
class G,
class UR,
class GR>
454template <
class T,
class U>
483template <
class T,
class E,
bool =
std::is_trivially_destructible<T>::value,
484 bool =
std::is_trivially_destructible<E>::value>
489 template <
class... Args,
490 detail::enable_if_t<std::is_constructible<T, Args &&...>::value> * =
495 template <
class U,
class... Args,
496 detail::enable_if_t<std::is_constructible<
497 T, std::initializer_list<U> &, Args &&...>::value> * =
nullptr>
501 template <
class... Args,
502 detail::enable_if_t<std::is_constructible<E, Args &&...>::value> * =
507 template <
class U,
class... Args,
508 detail::enable_if_t<std::is_constructible<
509 E, std::initializer_list<U> &, Args &&...>::value> * =
nullptr>
511 std::initializer_list<U> il,
536 template <
class... Args,
537 detail::enable_if_t<std::is_constructible<T, Args &&...>::value> * =
542 template <
class U,
class... Args,
543 detail::enable_if_t<std::is_constructible<
544 T, std::initializer_list<U> &, Args &&...>::value> * =
nullptr>
548 template <
class... Args,
549 detail::enable_if_t<std::is_constructible<E, Args &&...>::value> * =
554 template <
class U,
class... Args,
555 detail::enable_if_t<std::is_constructible<
556 E, std::initializer_list<U> &, Args &&...>::value> * =
nullptr>
558 std::initializer_list<U> il,
581 template <
class... Args,
582 detail::enable_if_t<std::is_constructible<T, Args &&...>::value> * =
587 template <
class U,
class... Args,
588 detail::enable_if_t<std::is_constructible<
589 T, std::initializer_list<U> &, Args &&...>::value> * =
nullptr>
593 template <
class... Args,
594 detail::enable_if_t<std::is_constructible<E, Args &&...>::value> * =
599 template <
class U,
class... Args,
600 detail::enable_if_t<std::is_constructible<
601 E, std::initializer_list<U> &, Args &&...>::value> * =
nullptr>
603 std::initializer_list<U> il,
630 template <
class... Args,
631 detail::enable_if_t<std::is_constructible<T, Args &&...>::value> * =
636 template <
class U,
class... Args,
637 detail::enable_if_t<std::is_constructible<
638 T, std::initializer_list<U> &, Args &&...>::value> * =
nullptr>
642 template <
class... Args,
643 detail::enable_if_t<std::is_constructible<E, Args &&...>::value> * =
648 template <
class U,
class... Args,
649 detail::enable_if_t<std::is_constructible<
650 E, std::initializer_list<U> &, Args &&...>::value> * =
nullptr>
652 std::initializer_list<U> il,
687 template <
class... Args,
688 detail::enable_if_t<std::is_constructible<E, Args &&...>::value> * =
693 template <
class U,
class... Args,
694 detail::enable_if_t<std::is_constructible<
695 E, std::initializer_list<U> &, Args &&...>::value> * =
nullptr>
697 std::initializer_list<U> il,
721 template <
class... Args,
722 detail::enable_if_t<std::is_constructible<E, Args &&...>::value> * =
727 template <
class U,
class... Args,
728 detail::enable_if_t<std::is_constructible<
729 E, std::initializer_list<U> &, Args &&...>::value> * =
nullptr>
731 std::initializer_list<U> il,
754template <
class T,
class E>
758 template <
class... Args>
void construct(Args &&...args)
noexcept {
759 new (
std::addressof(
this->m_val)) T(
std::forward<Args>(args)...);
760 this->m_has_val =
true;
764 new (
std::addressof(
this->m_val)) T(
std::forward<Rhs>(rhs).get());
765 this->m_has_val =
true;
769 new (
std::addressof(
this->m_unexpect))
771 this->m_has_val =
false;
774#ifdef Q23_TL_EXPECTED_EXCEPTIONS_ENABLED
782 template <
class U = T,
783 detail::enable_if_t<std::is_nothrow_copy_constructible<U>::value>
786 if (!
this->m_has_val && rhs.m_has_val) {
788 construct(rhs.get());
796 template <
class U = T,
797 detail::enable_if_t<!std::is_nothrow_copy_constructible<U>::value &&
798 std::is_nothrow_move_constructible<U>::value>
801 if (!
this->m_has_val && rhs.m_has_val) {
804 construct(
std::move(tmp));
815 template <
class U = T,
816 detail::enable_if_t<!std::is_nothrow_copy_constructible<U>::value &&
817 !std::is_nothrow_move_constructible<U>::value>
820 if (!
this->m_has_val && rhs.m_has_val) {
821 auto tmp =
std::move(geterr());
824#ifdef Q23_TL_EXPECTED_EXCEPTIONS_ENABLED
826 construct(rhs.get());
828 geterr() =
std::move(tmp);
832 construct(rhs.get());
840 template <
class U = T,
841 detail::enable_if_t<std::is_nothrow_move_constructible<U>::value>
844 if (!
this->m_has_val && rhs.m_has_val) {
846 construct(
std::move(rhs).get());
848 assign_common(
std::move(rhs));
852 template <
class U = T,
853 detail::enable_if_t<!std::is_nothrow_move_constructible<U>::value>
856 if (!
this->m_has_val && rhs.m_has_val) {
857 auto tmp =
std::move(geterr());
859#ifdef Q23_TL_EXPECTED_EXCEPTIONS_ENABLED
861 construct(
std::move(rhs).get());
863 geterr() =
std::move(tmp);
867 construct(std::move(rhs).get());
870 assign_common(
std::move(rhs));
899 if (
this->m_has_val) {
901 get() =
std::forward<Rhs>(rhs).get();
904 construct_error(
std::forward<Rhs>(rhs).geterr());
907 if (!rhs.m_has_val) {
908 geterr() =
std::forward<Rhs>(rhs).geterr();
916 constexpr const T &
get()
const & {
return this->m_val; }
918#ifndef Q23_TL_EXPECTED_NO_CONSTRR
919 constexpr const T &&
get()
const && {
return std::move(
this->m_val); }
923 return this->m_unexpect;
927 return std::move(
this->m_unexpect);
929#ifndef Q23_TL_EXPECTED_NO_CONSTRR
931 return std::move(
this->m_unexpect);
944 template <
class... Args>
void construct()
noexcept {
this->m_has_val =
true; }
949 this->m_has_val =
true;
953 new (
std::addressof(
this->m_unexpect))
955 this->m_has_val =
false;
958 template <
class Rhs>
void assign(Rhs &&rhs)
noexcept {
959 if (!
this->m_has_val) {
964 geterr() =
std::forward<Rhs>(rhs).geterr();
967 if (!rhs.m_has_val) {
968 construct_error(
std::forward<Rhs>(rhs).geterr());
976 return this->m_unexpect;
980 return std::move(
this->m_unexpect);
982#ifndef Q23_TL_EXPECTED_NO_CONSTRR
984 return std::move(
this->m_unexpect);
995template <
class T,
class E,
1005template <
class T,
class E>
1012 if (rhs.has_value()) {
1013 this->construct_with(rhs);
1015 this->construct_error(rhs.geterr());
1029#ifndef Q23_TL_EXPECTED_GCC49
1030template <
class T,
class E,
1039template <
class T,
class E>
1049 if (rhs.has_value()) {
1050 this->construct_with(
std::move(rhs));
1052 this->construct_error(
std::move(rhs.geterr()));
1060template <
class T,
class E,
1076template <
class T,
class E>
1097#ifndef Q23_TL_EXPECTED_GCC49
1098template <
class T,
class E,
1113template <
class T,
class E>
1130 this->assign(
std::move(rhs));
1137template <
class T,
class E,
1152template <
class T,
class E>
1163template <
class T,
class E>
1174template <
class T,
class E>
1188template <
class T,
class E,
1208template <
class T,
class E>
1220template <
class T,
class E>
1232template <
class T,
class E>
1253template <
class T,
class E,
1255 std::is_default_constructible<T>::value ||
std::is_void<T>::value>
1290 virtual const char *
what()
const noexcept override {
1291 return "Bad expected access";
1294 const E &
error()
const & {
return m_val; }
1296 const E &&
error()
const && {
return std::move(m_val); }
1310template <
class T,
class E>
1315 static_assert(!
std::is_reference<T>::value,
"T must not be a reference");
1317 "T must not be in_place_t");
1319 "T must not be unexpect_t");
1322 "T must not be unexpected<E>");
1323 static_assert(!
std::is_reference<E>::value,
"E must not be a reference");
1325 T *valptr() {
return std::addressof(
this->m_val); }
1326 const T *valptr()
const {
return std::addressof(
this->m_val); }
1327 unexpected<E> *errptr() {
return std::addressof(
this->m_unexpect); }
1329 return std::addressof(
this->m_unexpect);
1332 template <
class U = T,
1333 detail::enable_if_t<!std::is_void<U>::value> * =
nullptr>
1339 template <
class U = T,
1340 detail::enable_if_t<!std::is_void<U>::value> * =
nullptr>
1341 constexpr const U &val()
const {
1344 constexpr const unexpected<E> &err()
const {
return this->m_unexpect; }
1354#if defined(Q23_TL_EXPECTED_CXX14
) && !defined(Q23_TL_EXPECTED_GCC49) &&
1355 !defined(Q23_TL_EXPECTED_GCC54) && !defined(Q23_TL_EXPECTED_GCC55)
1357 return and_then_impl(*
this,
std::forward<F>(f));
1360 return and_then_impl(
std::move(*
this),
std::forward<F>(f));
1362 template <
class F>
constexpr auto and_then(F &&f)
const & {
1363 return and_then_impl(*
this,
std::forward<F>(f));
1366#ifndef Q23_TL_EXPECTED_NO_CONSTRR
1367 template <
class F>
constexpr auto and_then(F &&f)
const && {
1368 return and_then_impl(
std::move(*
this),
std::forward<F>(f));
1391#ifndef Q23_TL_EXPECTED_NO_CONSTRR
1400#if defined(Q23_TL_EXPECTED_CXX14
) && !defined(Q23_TL_EXPECTED_GCC49) &&
1401 !defined(Q23_TL_EXPECTED_GCC54) && !defined(Q23_TL_EXPECTED_GCC55)
1403 return expected_map_impl(*
this,
std::forward<F>(f));
1406 return expected_map_impl(
std::move(*
this),
std::forward<F>(f));
1408 template <
class F>
constexpr auto map(F &&f)
const & {
1409 return expected_map_impl(*
this,
std::forward<F>(f));
1411 template <
class F>
constexpr auto map(F &&f)
const && {
1412 return expected_map_impl(
std::move(*
this),
std::forward<F>(f));
1434#ifndef Q23_TL_EXPECTED_NO_CONSTRR
1444#if defined(Q23_TL_EXPECTED_CXX14
) && !defined(Q23_TL_EXPECTED_GCC49) &&
1445 !defined(Q23_TL_EXPECTED_GCC54) && !defined(Q23_TL_EXPECTED_GCC55)
1447 return expected_map_impl(*
this,
std::forward<F>(f));
1450 return expected_map_impl(
std::move(*
this),
std::forward<F>(f));
1452 template <
class F>
constexpr auto transform(F &&f)
const & {
1453 return expected_map_impl(*
this,
std::forward<F>(f));
1455 template <
class F>
constexpr auto transform(F &&f)
const && {
1456 return expected_map_impl(
std::move(*
this),
std::forward<F>(f));
1478#ifndef Q23_TL_EXPECTED_NO_CONSTRR
1488#if defined(Q23_TL_EXPECTED_CXX14
) && !defined(Q23_TL_EXPECTED_GCC49) &&
1489 !defined(Q23_TL_EXPECTED_GCC54) && !defined(Q23_TL_EXPECTED_GCC55)
1491 return map_error_impl(*
this,
std::forward<F>(f));
1494 return map_error_impl(
std::move(*
this),
std::forward<F>(f));
1496 template <
class F>
constexpr auto map_error(F &&f)
const & {
1497 return map_error_impl(*
this,
std::forward<F>(f));
1499 template <
class F>
constexpr auto map_error(F &&f)
const && {
1500 return map_error_impl(
std::move(*
this),
std::forward<F>(f));
1522#ifndef Q23_TL_EXPECTED_NO_CONSTRR
1531#if defined(Q23_TL_EXPECTED_CXX14
) && !defined(Q23_TL_EXPECTED_GCC49) &&
1532 !defined(Q23_TL_EXPECTED_GCC54) && !defined(Q23_TL_EXPECTED_GCC55)
1534 return map_error_impl(*
this,
std::forward<F>(f));
1537 return map_error_impl(
std::move(*
this),
std::forward<F>(f));
1539 template <
class F>
constexpr auto transform_error(F &&f)
const & {
1540 return map_error_impl(*
this,
std::forward<F>(f));
1542 template <
class F>
constexpr auto transform_error(F &&f)
const && {
1543 return map_error_impl(
std::move(*
this),
std::forward<F>(f));
1565#ifndef Q23_TL_EXPECTED_NO_CONSTRR
1575 return or_else_impl(*
this,
std::forward<F>(f));
1579 return or_else_impl(
std::move(*
this),
std::forward<F>(f));
1583 return or_else_impl(*
this,
std::forward<F>(f));
1586#ifndef Q23_TL_EXPECTED_NO_CONSTRR
1588 return or_else_impl(
std::move(*
this),
std::forward<F>(f));
1597 template <
class... Args,
1598 detail::enable_if_t<std::is_constructible<T, Args &&...>::value> * =
1604 template <
class U,
class... Args,
1605 detail::enable_if_t<std::is_constructible<
1606 T, std::initializer_list<U> &, Args &&...>::value> * =
nullptr>
1611 template <
class G = E,
1612 detail::enable_if_t<std::is_constructible<E,
const G &>::value> * =
1614 detail::enable_if_t<!std::is_convertible<
const G &, E>::value> * =
1622 detail::enable_if_t<std::is_constructible<E,
const G &>::value> * =
1624 detail::enable_if_t<std::is_convertible<
const G &, E>::value> * =
nullptr>
1631 detail::enable_if_t<std::is_constructible<E, G &&>::value> * =
nullptr,
1632 detail::enable_if_t<!std::is_convertible<G &&, E>::value> * =
nullptr>
1640 detail::enable_if_t<std::is_constructible<E, G &&>::value> * =
nullptr,
1641 detail::enable_if_t<std::is_convertible<G &&, E>::value> * =
nullptr>
1647 template <
class... Args,
1648 detail::enable_if_t<std::is_constructible<E, Args &&...>::value> * =
1654 template <
class U,
class... Args,
1655 detail::enable_if_t<std::is_constructible<
1656 E, std::initializer_list<U> &, Args &&...>::value> * =
nullptr>
1662 template <
class U,
class G,
1663 detail::enable_if_t<!(std::is_convertible<U
const &, T>::value &&
1664 std::is_convertible<G
const &, E>::value)> * =
1666 detail::expected_enable_from_other<T, E, U, G,
const U &,
const G &>
1670 if (rhs.has_value()) {
1671 this->construct(*rhs);
1673 this->construct_error(rhs.error());
1677 template <
class U,
class G,
1678 detail::enable_if_t<(std::is_convertible<U
const &, T>::value &&
1679 std::is_convertible<G
const &, E>::value)> * =
1681 detail::expected_enable_from_other<T, E, U, G,
const U &,
const G &>
1685 if (rhs.has_value()) {
1686 this->construct(*rhs);
1688 this->construct_error(rhs.error());
1694 detail::enable_if_t<!(std::is_convertible<U &&, T>::value &&
1695 std::is_convertible<G &&, E>::value)> * =
nullptr,
1696 detail::expected_enable_from_other<T, E, U, G, U &&, G &&> * =
nullptr>
1699 if (rhs.has_value()) {
1700 this->construct(
std::move(*rhs));
1702 this->construct_error(
std::move(rhs.error()));
1708 detail::enable_if_t<(std::is_convertible<U &&, T>::value &&
1709 std::is_convertible<G &&, E>::value)> * =
nullptr,
1710 detail::expected_enable_from_other<T, E, U, G, U &&, G &&> * =
nullptr>
1713 if (rhs.has_value()) {
1714 this->construct(
std::move(*rhs));
1716 this->construct_error(
std::move(rhs.error()));
1722 detail::enable_if_t<!std::is_convertible<U &&, T>::value> * =
nullptr,
1723 detail::expected_enable_forward_value<T, E, U> * =
nullptr>
1729 detail::enable_if_t<std::is_convertible<U &&, T>::value> * =
nullptr,
1730 detail::expected_enable_forward_value<T, E, U> * =
nullptr>
1735 class U = T,
class G = T,
1736 detail::enable_if_t<std::is_nothrow_constructible<T, U &&>::value> * =
1738 detail::enable_if_t<!std::is_void<G>::value> * =
nullptr,
1739 detail::enable_if_t<
1740 (!std::is_same<expected<T, E>, detail::decay_t<U>>::value &&
1741 !detail::conjunction<std::is_scalar<T>,
1742 std::is_same<T, detail::decay_t<U>>>::value &&
1743 std::is_constructible<T, U>::value &&
1744 std::is_assignable<G &, U>::value &&
1745 std::is_nothrow_move_constructible<E>::value)> * =
nullptr>
1748 val() =
std::forward<U>(v);
1751 ::
new (valptr()) T(
std::forward<U>(v));
1752 this->m_has_val =
true;
1759 class U = T,
class G = T,
1760 detail::enable_if_t<!std::is_nothrow_constructible<T, U &&>::value> * =
1762 detail::enable_if_t<!std::is_void<U>::value> * =
nullptr,
1763 detail::enable_if_t<
1764 (!std::is_same<expected<T, E>, detail::decay_t<U>>::value &&
1765 !detail::conjunction<std::is_scalar<T>,
1766 std::is_same<T, detail::decay_t<U>>>::value &&
1767 std::is_constructible<T, U>::value &&
1768 std::is_assignable<G &, U>::value &&
1769 std::is_nothrow_move_constructible<E>::value)> * =
nullptr>
1772 val() =
std::forward<U>(v);
1774 auto tmp =
std::move(err());
1777#ifdef Q23_TL_EXPECTED_EXCEPTIONS_ENABLED
1779 ::
new (valptr()) T(
std::forward<U>(v));
1780 this->m_has_val =
true;
1782 err() =
std::move(tmp);
1786 ::
new (valptr()) T(std::forward<U>(v));
1787 this->m_has_val =
true;
1794 template <
class G = E,
1795 detail::enable_if_t<std::is_nothrow_copy_constructible<G>::value &&
1796 std::is_assignable<G &, G>::value> * =
nullptr>
1801 this->destroy_val();
1803 this->m_has_val =
false;
1809 template <
class G = E,
1810 detail::enable_if_t<std::is_nothrow_move_constructible<G>::value &&
1811 std::is_move_assignable<G>::value> * =
nullptr>
1814 err() =
std::move(rhs);
1816 this->destroy_val();
1818 this->m_has_val =
false;
1824 template <
class... Args, detail::enable_if_t<std::is_nothrow_constructible<
1825 T, Args &&...>::value> * =
nullptr>
1831 this->m_has_val =
true;
1833 ::
new (valptr()) T(
std::forward<Args>(args)...);
1836 template <
class... Args, detail::enable_if_t<!std::is_nothrow_constructible<
1837 T, Args &&...>::value> * =
nullptr>
1841 ::
new (valptr()) T(
std::forward<Args>(args)...);
1843 auto tmp =
std::move(err());
1846#ifdef Q23_TL_EXPECTED_EXCEPTIONS_ENABLED
1848 ::
new (valptr()) T(
std::forward<Args>(args)...);
1849 this->m_has_val =
true;
1851 err() =
std::move(tmp);
1855 ::
new (valptr()) T(std::forward<Args>(args)...);
1856 this->m_has_val =
true;
1861 template <
class U,
class... Args,
1862 detail::enable_if_t<std::is_nothrow_constructible<
1863 T, std::initializer_list<U> &, Args &&...>::value> * =
nullptr>
1866 T t(il,
std::forward<Args>(args)...);
1867 val() =
std::move(t);
1870 ::
new (valptr()) T(il,
std::forward<Args>(args)...);
1871 this->m_has_val =
true;
1875 template <
class U,
class... Args,
1876 detail::enable_if_t<!std::is_nothrow_constructible<
1877 T, std::initializer_list<U> &, Args &&...>::value> * =
nullptr>
1880 T t(il,
std::forward<Args>(args)...);
1881 val() =
std::move(t);
1883 auto tmp =
std::move(err());
1886#ifdef Q23_TL_EXPECTED_EXCEPTIONS_ENABLED
1888 ::
new (valptr()) T(il,
std::forward<Args>(args)...);
1889 this->m_has_val =
true;
1891 err() =
std::move(tmp);
1895 ::
new (valptr()) T(il, std::forward<Args>(args)...);
1896 this->m_has_val =
true;
1909 void swap_where_both_have_value(
expected & , t_is_void)
noexcept {
1913 void swap_where_both_have_value(
expected &rhs, t_is_not_void) {
1915 swap(val(), rhs.val());
1918 void swap_where_only_one_has_value(
expected &rhs, t_is_void)
noexcept(
1919 std::is_nothrow_move_constructible<E>::value) {
1922 std::swap(
this->m_has_val, rhs.m_has_val);
1925 void swap_where_only_one_has_value(
expected &rhs, t_is_not_void) {
1926 swap_where_only_one_has_value_and_t_is_not_void(
1927 rhs,
typename std::is_nothrow_move_constructible<T>::type{},
1928 typename std::is_nothrow_move_constructible<E>::type{});
1931 void swap_where_only_one_has_value_and_t_is_not_void(
1932 expected &rhs, t_is_nothrow_move_constructible,
1933 e_is_nothrow_move_constructible)
noexcept {
1934 auto temp =
std::move(val());
1938 ::
new (rhs.valptr()) T(
std::move(temp));
1939 std::swap(
this->m_has_val, rhs.m_has_val);
1942 void swap_where_only_one_has_value_and_t_is_not_void(
1943 expected &rhs, t_is_nothrow_move_constructible,
1944 move_constructing_e_can_throw) {
1945 auto temp =
std::move(val());
1947#ifdef Q23_TL_EXPECTED_EXCEPTIONS_ENABLED
1951 ::
new (rhs.valptr()) T(
std::move(temp));
1952 std::swap(
this->m_has_val, rhs.m_has_val);
1954 val() =
std::move(temp);
1958 ::
new (errptr()) unexpected_type(std::move(rhs.err()));
1959 rhs.err().~unexpected_type();
1960 ::
new (rhs.valptr()) T(std::move(temp));
1961 std::swap(
this->m_has_val, rhs.m_has_val);
1965 void swap_where_only_one_has_value_and_t_is_not_void(
1966 expected &rhs, move_constructing_t_can_throw,
1967 e_is_nothrow_move_constructible) {
1968 auto temp =
std::move(rhs.err());
1970#ifdef Q23_TL_EXPECTED_EXCEPTIONS_ENABLED
1972 ::
new (rhs.valptr()) T(
std::move(val()));
1975 std::swap(
this->m_has_val, rhs.m_has_val);
1977 rhs.err() =
std::move(temp);
1981 ::
new (rhs.valptr()) T(std::move(val()));
1983 ::
new (errptr()) unexpected_type(std::move(temp));
1984 std::swap(
this->m_has_val, rhs.m_has_val);
1989 template <
class OT = T,
class OE = E>
2000 swap_where_both_have_value(rhs,
typename std::is_void<T>::type{});
2004 swap_where_only_one_has_value(rhs,
typename std::is_void<T>::type{});
2007 swap(err(), rhs.err());
2020 template <
class U = T,
2021 detail::enable_if_t<!std::is_void<U>::value> * =
nullptr>
2026 template <
class U = T,
2027 detail::enable_if_t<!std::is_void<U>::value> * =
nullptr>
2032 template <
class U = T,
2033 detail::enable_if_t<!std::is_void<U>::value> * =
nullptr>
2036 return std::move(val());
2038 template <
class U = T,
2039 detail::enable_if_t<!std::is_void<U>::value> * =
nullptr>
2042 return std::move(val());
2045 constexpr bool has_value()
const noexcept {
return this->m_has_val; }
2046 constexpr explicit operator bool()
const noexcept {
return this->m_has_val; }
2048 template <
class U = T,
2049 detail::enable_if_t<!std::is_void<U>::value> * =
nullptr>
2055 template <
class U = T,
2056 detail::enable_if_t<!std::is_void<U>::value> * =
nullptr>
2062 template <
class U = T,
2063 detail::enable_if_t<!std::is_void<U>::value> * =
nullptr>
2067 return std::move(val());
2069 template <
class U = T,
2070 detail::enable_if_t<!std::is_void<U>::value> * =
nullptr>
2074 return std::move(val());
2079 return err().error();
2083 return err().error();
2087 return std::move(err().error());
2091 return std::move(err().error());
2094 template <
class U>
constexpr T
value_or(U &&v)
const & {
2095 static_assert(
std::is_copy_constructible<T>::value &&
2096 std::is_convertible<U &&, T>::value,
2097 "T must be copy-constructible and convertible to from U&&");
2098 return bool(*
this) ? **
this :
static_cast<T>(
std::forward<U>(v));
2101 static_assert(
std::is_move_constructible<T>::value &&
2102 std::is_convertible<U &&, T>::value,
2103 "T must be move-constructible and convertible to from U&&");
2104 return bool(*
this) ?
std::move(**
this) :
static_cast<T>(
std::forward<U>(v));
2113#ifdef Q23_TL_EXPECTED_CXX14
2114template <
class Exp,
class F,
2115 detail::enable_if_t<!std::is_void<exp_t<Exp>>::value> * =
nullptr,
2116 class Ret =
decltype(
detail::invoke(
std::declval<F>(),
2117 *
std::declval<Exp>()))>
2118constexpr auto and_then_impl(Exp &&exp, F &&f) {
2119 static_assert(detail::is_expected<Ret>::value,
"F must return an expected");
2121 return exp.has_value()
2122 ?
detail::invoke(
std::forward<F>(f), *
std::forward<Exp>(exp))
2126template <
class Exp,
class F,
2127 detail::enable_if_t<std::is_void<exp_t<Exp>>::value> * =
nullptr,
2128 class Ret =
decltype(
detail::invoke(
std::declval<F>()))>
2129constexpr auto and_then_impl(Exp &&exp, F &&f) {
2130 static_assert(detail::is_expected<Ret>::value,
"F must return an expected");
2132 return exp.has_value() ?
detail::invoke(
std::forward<F>(f))
2136template <
class>
struct TC;
2137template <
class Exp,
class F,
2149template <
class Exp,
class F,
2160#ifdef Q23_TL_EXPECTED_CXX14
2161template <
class Exp,
class F,
2162 detail::enable_if_t<!std::is_void<exp_t<Exp>>::value> * =
nullptr,
2163 class Ret =
decltype(
detail::invoke(
std::declval<F>(),
2164 *
std::declval<Exp>())),
2165 detail::enable_if_t<!std::is_void<Ret>::value> * =
nullptr>
2166constexpr auto expected_map_impl(Exp &&exp, F &&f) {
2167 using result = ret_t<Exp, detail::decay_t<Ret>>;
2168 return exp.has_value() ? result(
detail::invoke(
std::forward<F>(f),
2169 *
std::forward<Exp>(exp)))
2170 : result(
unexpect,
std::forward<Exp>(exp).error());
2173template <
class Exp,
class F,
2174 detail::enable_if_t<!std::is_void<exp_t<Exp>>::value> * =
nullptr,
2175 class Ret =
decltype(
detail::invoke(
std::declval<F>(),
2176 *
std::declval<Exp>())),
2177 detail::enable_if_t<std::is_void<Ret>::value> * =
nullptr>
2178auto expected_map_impl(Exp &&exp, F &&f) {
2179 using result = expected<
void, err_t<Exp>>;
2180 if (exp.has_value()) {
2181 detail::invoke(
std::forward<F>(f), *
std::forward<Exp>(exp));
2185 return result(
unexpect,
std::forward<Exp>(exp).error());
2188template <
class Exp,
class F,
2189 detail::enable_if_t<std::is_void<exp_t<Exp>>::value> * =
nullptr,
2190 class Ret =
decltype(
detail::invoke(
std::declval<F>())),
2191 detail::enable_if_t<!std::is_void<Ret>::value> * =
nullptr>
2192constexpr auto expected_map_impl(Exp &&exp, F &&f) {
2193 using result = ret_t<Exp, detail::decay_t<Ret>>;
2194 return exp.has_value() ? result(
detail::invoke(
std::forward<F>(f)))
2195 : result(
unexpect,
std::forward<Exp>(exp).error());
2198template <
class Exp,
class F,
2199 detail::enable_if_t<std::is_void<exp_t<Exp>>::value> * =
nullptr,
2200 class Ret =
decltype(
detail::invoke(
std::declval<F>())),
2201 detail::enable_if_t<std::is_void<Ret>::value> * =
nullptr>
2202auto expected_map_impl(Exp &&exp, F &&f) {
2203 using result = expected<
void, err_t<Exp>>;
2204 if (exp.has_value()) {
2209 return result(
unexpect,
std::forward<Exp>(exp).error());
2212template <
class Exp,
class F,
2227template <
class Exp,
class F,
2242template <
class Exp,
class F,
2255template <
class Exp,
class F,
2270#if defined(Q23_TL_EXPECTED_CXX14
) && !defined(Q23_TL_EXPECTED_GCC49) &&
2271 !defined(Q23_TL_EXPECTED_GCC54) && !defined(Q23_TL_EXPECTED_GCC55)
2272template <
class Exp,
class F,
2273 detail::enable_if_t<!std::is_void<exp_t<Exp>>::value> * =
nullptr,
2274 class Ret =
decltype(
detail::invoke(
std::declval<F>(),
2275 std::declval<Exp>().error())),
2276 detail::enable_if_t<!std::is_void<Ret>::value> * =
nullptr>
2277constexpr auto map_error_impl(Exp &&exp, F &&f) {
2278 using result = expected<exp_t<Exp>, detail::decay_t<Ret>>;
2279 return exp.has_value()
2280 ? result(*
std::forward<Exp>(exp))
2282 std::forward<Exp>(exp).error()));
2284template <
class Exp,
class F,
2285 detail::enable_if_t<!std::is_void<exp_t<Exp>>::value> * =
nullptr,
2286 class Ret =
decltype(
detail::invoke(
std::declval<F>(),
2287 std::declval<Exp>().error())),
2288 detail::enable_if_t<std::is_void<Ret>::value> * =
nullptr>
2289auto map_error_impl(Exp &&exp, F &&f) {
2290 using result = expected<exp_t<Exp>, monostate>;
2291 if (exp.has_value()) {
2292 return result(*
std::forward<Exp>(exp));
2295 detail::invoke(
std::forward<F>(f),
std::forward<Exp>(exp).error());
2298template <
class Exp,
class F,
2299 detail::enable_if_t<std::is_void<exp_t<Exp>>::value> * =
nullptr,
2300 class Ret =
decltype(
detail::invoke(
std::declval<F>(),
2301 std::declval<Exp>().error())),
2302 detail::enable_if_t<!std::is_void<Ret>::value> * =
nullptr>
2303constexpr auto map_error_impl(Exp &&exp, F &&f) {
2304 using result = expected<exp_t<Exp>, detail::decay_t<Ret>>;
2305 return exp.has_value()
2308 std::forward<Exp>(exp).error()));
2310template <
class Exp,
class F,
2311 detail::enable_if_t<std::is_void<exp_t<Exp>>::value> * =
nullptr,
2312 class Ret =
decltype(
detail::invoke(
std::declval<F>(),
2313 std::declval<Exp>().error())),
2314 detail::enable_if_t<std::is_void<Ret>::value> * =
nullptr>
2315auto map_error_impl(Exp &&exp, F &&f) {
2316 using result = expected<exp_t<Exp>, monostate>;
2317 if (exp.has_value()) {
2321 detail::invoke(
std::forward<F>(f),
std::forward<Exp>(exp).error());
2325template <
class Exp,
class F,
2340template <
class Exp,
class F,
2355template <
class Exp,
class F,
2370template <
class Exp,
class F,
2386#ifdef Q23_TL_EXPECTED_CXX14
2387template <
class Exp,
class F,
2388 class Ret =
decltype(
detail::invoke(
std::declval<F>(),
2389 std::declval<Exp>().error())),
2390 detail::enable_if_t<!std::is_void<Ret>::value> * =
nullptr>
2391constexpr auto or_else_impl(Exp &&exp, F &&f) {
2392 static_assert(detail::is_expected<Ret>::value,
"F must return an expected");
2393 return exp.has_value() ?
std::forward<Exp>(exp)
2395 std::forward<Exp>(exp).error());
2398template <
class Exp,
class F,
2399 class Ret =
decltype(
detail::invoke(
std::declval<F>(),
2400 std::declval<Exp>().error())),
2401 detail::enable_if_t<std::is_void<Ret>::value> * =
nullptr>
2402detail::decay_t<Exp> or_else_impl(Exp &&exp, F &&f) {
2403 return exp.has_value() ?
std::forward<Exp>(exp)
2405 std::forward<Exp>(exp).error()),
2406 std::forward<Exp>(exp));
2409template <
class Exp,
class F,
2420template <
class Exp,
class F,
2433template <
class T,
class E,
class U,
class F>
2436 return (lhs.has_value() != rhs.has_value())
2438 : (!lhs.has_value() ? lhs.error() == rhs.error() : *lhs == *rhs);
2440template <
class T,
class E,
class U,
class F>
2443 return (lhs.has_value() != rhs.has_value())
2445 : (!lhs.has_value() ? lhs.error() != rhs.error() : *lhs != *rhs);
2447template <
class E,
class F>
2450 return (lhs.has_value() != rhs.has_value())
2452 : (!lhs.has_value() ? lhs.error() == rhs.error() :
true);
2454template <
class E,
class F>
2457 return (lhs.has_value() != rhs.has_value())
2459 : (!lhs.has_value() ? lhs.error() != rhs.error() :
false);
2462template <
class T,
class E,
class U>
2464 return x.has_value() ? *x == v :
false;
2466template <
class T,
class E,
class U>
2468 return x.has_value() ? *x == v :
false;
2470template <
class T,
class E,
class U>
2472 return x.has_value() ? *x != v :
true;
2474template <
class T,
class E,
class U>
2476 return x.has_value() ? *x != v :
true;
2479template <
class T,
class E>
2481 return x.has_value() ?
false : x.error() == e.error();
2483template <
class T,
class E>
2485 return x.has_value() ?
false : x.error() == e.error();
2487template <
class T,
class E>
2489 return x.has_value() ?
true : x.error() != e.error();
2491template <
class T,
class E>
2493 return x.has_value() ?
true : x.error() != e.error();
2496template <
class T,
class E,
2497 detail::enable_if_t<(std::is_void<T>::value ||
2498 std::is_move_constructible<T>::value) &&
2499 detail::is_swappable<T>::value &&
2500 std::is_move_constructible<E>::value &&
2501 detail::is_swappable<E>::value> * =
nullptr>
const E && error() const &&
virtual const char * what() const noexcept override
const E & error() const &
constexpr T value_or(U &&v) const &
constexpr const E && error() const &&
expected constexpr or_else(F &&f) const &&
constexpr expected(unexpect_t, Args &&...args)
expected Q23_TL_EXPECTED_11_CONSTEXPR or_else(F &&f) &
constexpr expected(in_place_t, std::initializer_list< U > il, Args &&...args)
constexpr const U & operator*() const &
Q23_TL_EXPECTED_11_CONSTEXPR T value_or(U &&v) &&
expected & operator=(const unexpected< G > &rhs)
Q23_TL_EXPECTED_11_CONSTEXPR const U & value() const &
expected Q23_TL_EXPECTED_11_CONSTEXPR or_else(F &&f) &&
constexpr expected(const expected &rhs)=default
Q23_TL_EXPECTED_11_CONSTEXPR expected(expected< U, G > &&rhs)
unexpected< E > unexpected_type
Q23_TL_EXPECTED_11_CONSTEXPR E && error() &&
Q23_TL_EXPECTED_11_CONSTEXPR U && value() &&
expected & operator=(expected &&rhs)=default
Q23_TL_EXPECTED_11_CONSTEXPR const U && value() const &&
Q23_TL_EXPECTED_11_CONSTEXPR expected(const expected< U, G > &rhs)
detail::enable_if_t< detail::is_swappable< OT >::value &&detail::is_swappable< OE >::value &&(std::is_nothrow_move_constructible< OT >::value||std::is_nothrow_move_constructible< OE >::value)> swap(expected &rhs) noexcept(std::is_nothrow_move_constructible< T >::value &&detail::is_nothrow_swappable< T >::value &&std::is_nothrow_move_constructible< E >::value &&detail::is_nothrow_swappable< E >::value)
Q23_TL_EXPECTED_11_CONSTEXPR U & operator*() &
void emplace(std::initializer_list< U > il, Args &&...args)
constexpr expected(unexpect_t, std::initializer_list< U > il, Args &&...args)
expected constexpr or_else(F &&f) const &
Q23_TL_EXPECTED_11_CONSTEXPR U && operator*() &&
constexpr bool has_value() const noexcept
constexpr expected()=default
constexpr expected(in_place_t, Args &&...args)
void emplace(Args &&...args)
Q23_TL_EXPECTED_11_CONSTEXPR E & error() &
constexpr const E & error() const &
constexpr expected(unexpected< G > &&e) noexcept(std::is_nothrow_constructible< E, G && >::value)
constexpr const T * operator->() const
expected & operator=(unexpected< G > &&rhs) noexcept
constexpr expected(const unexpected< G > &e)
constexpr const U && operator*() const &&
Q23_TL_EXPECTED_11_CONSTEXPR T * operator->()
expected & operator=(U &&v)
expected & operator=(const expected &rhs)=default
constexpr operator bool() const noexcept
constexpr expected(expected &&rhs)=default
Q23_TL_EXPECTED_MSVC2015_CONSTEXPR expected(U &&v)
Q23_TL_EXPECTED_11_CONSTEXPR U & value() &
constexpr unexpected(in_place_t, Args &&...args)
constexpr unexpected(const E &e)
constexpr const E & error() const &
Q23_TL_EXPECTED_11_CONSTEXPR E && error() &&
Q23_TL_EXPECTED_11_CONSTEXPR E & error() &
constexpr unexpected(in_place_t, std::initializer_list< U > l, Args &&...args)
constexpr const E && error() const &&
constexpr unexpected(E &&e)
std::is_same< decltype(swap(std::declval< T & >(), std::declval< U & >())), tag > uses_std(int)
std::false_type can_swap(...) noexcept(false)
tag swap(T(&a)[N], T(&b)[N])
std::true_type can_swap(int) noexcept(noexcept(swap(std::declval< T & >(), std::declval< U & >())))
std::false_type uses_std(...)
constexpr auto invoke(Fn &&f, Args &&...args) noexcept(noexcept(std::forward< Fn >(f)(std::forward< Args >(args)...))) -> decltype(std::forward< Fn >(f)(std::forward< Args >(args)...))
typename std::conditional< B, T, F >::type conditional_t
invoke_result_impl< F, void, Us... > invoke_result
typename std::remove_reference< T >::type remove_reference_t
typename std::enable_if< E, T >::type enable_if_t
static constexpr no_init_t no_init
typename std::decay< T >::type decay_t
Q23_TL_EXPECTED_11_CONSTEXPR void throw_exception(E &&e)
typename std::remove_const< T >::type remove_const_t
constexpr auto invoke(Fn &&f, Args &&...args) noexcept(noexcept(std::mem_fn(f)(std::forward< Args >(args)...))) -> decltype(std::mem_fn(f)(std::forward< Args >(args)...))
constexpr bool operator!=(const unexpected< E > &e, const expected< T, E > &x)
constexpr bool operator!=(const unexpected< E > &lhs, const unexpected< E > &rhs)
constexpr bool operator<(const unexpected< E > &lhs, const unexpected< E > &rhs)
constexpr bool operator>(const unexpected< E > &lhs, const unexpected< E > &rhs)
constexpr bool operator==(const unexpected< E > &lhs, const unexpected< E > &rhs)
constexpr bool operator==(const expected< void, E > &lhs, const expected< void, F > &rhs)
constexpr bool operator!=(const expected< T, E > &lhs, const expected< U, F > &rhs)
unexpected< typename std::decay< E >::type > make_unexpected(E &&e)
constexpr bool operator<=(const unexpected< E > &lhs, const unexpected< E > &rhs)
void swap(expected< T, E > &lhs, expected< T, E > &rhs) noexcept(noexcept(lhs.swap(rhs)))
constexpr bool operator!=(const expected< T, E > &x, const U &v)
constexpr bool operator==(const unexpected< E > &e, const expected< T, E > &x)
constexpr bool operator==(const expected< T, E > &x, const U &v)
constexpr bool operator==(const U &v, const expected< T, E > &x)
static constexpr unexpect_t unexpect
constexpr bool operator!=(const expected< T, E > &x, const unexpected< E > &e)
static constexpr in_place_t in_place
constexpr bool operator>=(const unexpected< E > &lhs, const unexpected< E > &rhs)
constexpr bool operator!=(const expected< void, E > &lhs, const expected< void, F > &rhs)
constexpr bool operator==(const expected< T, E > &x, const unexpected< E > &e)
constexpr bool operator==(const expected< T, E > &lhs, const expected< U, F > &rhs)
constexpr bool operator!=(const U &v, const expected< T, E > &x)
#define Q23_TL_EXPECTED_11_CONSTEXPR
#define Q23_TL_EXPECTED_IS_TRIVIALLY_COPY_CONSTRUCTIBLE(T)
#define Q23_TL_EXPECTED_IS_TRIVIALLY_DESTRUCTIBLE(T)
#define Q23_TL_EXPECTED_IS_TRIVIALLY_COPY_ASSIGNABLE(T)
#define Q23_TL_EXPECTED_MSVC2015_CONSTEXPR
constexpr default_constructor_tag()=default
expected_copy_assign_base(expected_copy_assign_base &&rhs)=default
expected_copy_assign_base(const expected_copy_assign_base &rhs)=default
expected_copy_assign_base()=default
expected_copy_assign_base & operator=(const expected_copy_assign_base &rhs)
expected_copy_assign_base & operator=(expected_copy_assign_base &&rhs)=default
expected_copy_base()=default
expected_copy_base & operator=(const expected_copy_base &rhs)=default
expected_copy_base(const expected_copy_base &rhs)
expected_copy_base(expected_copy_base &&rhs)=default
expected_copy_base & operator=(expected_copy_base &&rhs)=default
constexpr expected_default_ctor_base(expected_default_ctor_base const &) noexcept=default
constexpr expected_default_ctor_base(expected_default_ctor_base &&) noexcept=default
constexpr expected_default_ctor_base(default_constructor_tag)
expected_default_ctor_base & operator=(expected_default_ctor_base const &) noexcept=default
expected_default_ctor_base & operator=(expected_default_ctor_base &&) noexcept=default
constexpr expected_default_ctor_base() noexcept=delete
expected_default_ctor_base & operator=(expected_default_ctor_base &&) noexcept=default
constexpr expected_default_ctor_base(expected_default_ctor_base const &) noexcept=default
expected_default_ctor_base & operator=(expected_default_ctor_base const &) noexcept=default
constexpr expected_default_ctor_base(expected_default_ctor_base &&) noexcept=default
constexpr expected_default_ctor_base(default_constructor_tag)
constexpr expected_default_ctor_base() noexcept=default
expected_delete_assign_base(expected_delete_assign_base &&) noexcept=default
expected_delete_assign_base(const expected_delete_assign_base &)=default
expected_delete_assign_base & operator=(expected_delete_assign_base &&) noexcept=delete
expected_delete_assign_base()=default
expected_delete_assign_base & operator=(const expected_delete_assign_base &)=delete
expected_delete_assign_base(expected_delete_assign_base &&) noexcept=default
expected_delete_assign_base & operator=(expected_delete_assign_base &&) noexcept=default
expected_delete_assign_base & operator=(const expected_delete_assign_base &)=delete
expected_delete_assign_base(const expected_delete_assign_base &)=default
expected_delete_assign_base()=default
expected_delete_assign_base(expected_delete_assign_base &&) noexcept=default
expected_delete_assign_base & operator=(const expected_delete_assign_base &)=default
expected_delete_assign_base(const expected_delete_assign_base &)=default
expected_delete_assign_base()=default
expected_delete_assign_base & operator=(expected_delete_assign_base &&) noexcept=delete
expected_delete_assign_base(expected_delete_assign_base &&) noexcept=default
expected_delete_assign_base & operator=(const expected_delete_assign_base &)=default
expected_delete_assign_base()=default
expected_delete_assign_base & operator=(expected_delete_assign_base &&) noexcept=default
expected_delete_assign_base(const expected_delete_assign_base &)=default
expected_delete_ctor_base & operator=(expected_delete_ctor_base &&) noexcept=default
expected_delete_ctor_base & operator=(const expected_delete_ctor_base &)=default
expected_delete_ctor_base(expected_delete_ctor_base &&) noexcept=delete
expected_delete_ctor_base()=default
expected_delete_ctor_base(const expected_delete_ctor_base &)=delete
expected_delete_ctor_base(const expected_delete_ctor_base &)=delete
expected_delete_ctor_base()=default
expected_delete_ctor_base(expected_delete_ctor_base &&) noexcept=default
expected_delete_ctor_base & operator=(const expected_delete_ctor_base &)=default
expected_delete_ctor_base & operator=(expected_delete_ctor_base &&) noexcept=default
expected_delete_ctor_base(const expected_delete_ctor_base &)=default
expected_delete_ctor_base & operator=(expected_delete_ctor_base &&) noexcept=default
expected_delete_ctor_base(expected_delete_ctor_base &&) noexcept=delete
expected_delete_ctor_base()=default
expected_delete_ctor_base & operator=(const expected_delete_ctor_base &)=default
expected_delete_ctor_base & operator=(expected_delete_ctor_base &&) noexcept=default
expected_delete_ctor_base & operator=(const expected_delete_ctor_base &)=default
expected_delete_ctor_base()=default
expected_delete_ctor_base(const expected_delete_ctor_base &)=default
expected_delete_ctor_base(expected_delete_ctor_base &&) noexcept=default
expected_move_assign_base()=default
expected_move_assign_base & operator=(const expected_move_assign_base &rhs)=default
expected_move_assign_base & operator=(expected_move_assign_base &&rhs) noexcept(std::is_nothrow_move_constructible< T >::value &&std::is_nothrow_move_assignable< T >::value)
expected_move_assign_base(const expected_move_assign_base &rhs)=default
expected_move_assign_base(expected_move_assign_base &&rhs)=default
expected_move_base(expected_move_base &&rhs) noexcept(std::is_nothrow_move_constructible< T >::value)
expected_move_base(const expected_move_base &rhs)=default
expected_move_base & operator=(const expected_move_base &rhs)=default
expected_move_base & operator=(expected_move_base &&rhs)=default
expected_move_base()=default
constexpr const unexpected< E > && geterr() const &&
void assign(Rhs &&rhs) noexcept
void construct_with(Rhs &&) noexcept
Q23_TL_EXPECTED_11_CONSTEXPR unexpected< E > && geterr() &&
void construct_error(Args &&...args) noexcept
Q23_TL_EXPECTED_11_CONSTEXPR unexpected< E > & geterr() &
void construct() noexcept
constexpr const unexpected< E > & geterr() const &
Q23_TL_EXPECTED_11_CONSTEXPR void destroy_val()
constexpr const unexpected< E > && geterr() const &&
Q23_TL_EXPECTED_11_CONSTEXPR unexpected< E > & geterr() &
void construct(Args &&...args) noexcept
constexpr const unexpected< E > & geterr() const &
void construct_with(Rhs &&rhs) noexcept
Q23_TL_EXPECTED_11_CONSTEXPR unexpected< E > && geterr() &&
constexpr const T && get() const &&
constexpr const T & get() const &
Q23_TL_EXPECTED_11_CONSTEXPR T & get() &
void construct_error(Args &&...args) noexcept
void assign_common(Rhs &&rhs)
Q23_TL_EXPECTED_11_CONSTEXPR T && get() &&
Q23_TL_EXPECTED_11_CONSTEXPR void destroy_val()
expected_storage_base(expected_storage_base &&)=default
constexpr expected_storage_base(unexpect_t, std::initializer_list< U > il, Args &&...args)
constexpr expected_storage_base(no_init_t)
constexpr expected_storage_base(in_place_t, Args &&...args)
constexpr expected_storage_base(in_place_t, std::initializer_list< U > il, Args &&...args)
expected_storage_base & operator=(const expected_storage_base &)=default
constexpr expected_storage_base()
expected_storage_base & operator=(expected_storage_base &&)=default
expected_storage_base(const expected_storage_base &)=default
unexpected< E > m_unexpect
constexpr expected_storage_base(unexpect_t, Args &&...args)
expected_storage_base & operator=(const expected_storage_base &)=default
expected_storage_base(const expected_storage_base &)=default
constexpr expected_storage_base(unexpect_t, Args &&...args)
unexpected< E > m_unexpect
constexpr expected_storage_base()
expected_storage_base(expected_storage_base &&)=default
Q23_TL_EXPECTED_MSVC2015_CONSTEXPR expected_storage_base(no_init_t)
constexpr expected_storage_base(unexpect_t, std::initializer_list< U > il, Args &&...args)
constexpr expected_storage_base(in_place_t, std::initializer_list< U > il, Args &&...args)
constexpr expected_storage_base(in_place_t, Args &&...args)
expected_storage_base & operator=(expected_storage_base &&)=default
expected_storage_base(expected_storage_base &&)=default
~expected_storage_base()=default
constexpr expected_storage_base(no_init_t)
expected_storage_base & operator=(const expected_storage_base &)=default
constexpr expected_storage_base(in_place_t, std::initializer_list< U > il, Args &&...args)
constexpr expected_storage_base(unexpect_t, Args &&...args)
constexpr expected_storage_base()
expected_storage_base(const expected_storage_base &)=default
unexpected< E > m_unexpect
expected_storage_base & operator=(expected_storage_base &&)=default
constexpr expected_storage_base(unexpect_t, std::initializer_list< U > il, Args &&...args)
constexpr expected_storage_base(in_place_t, Args &&...args)
constexpr expected_storage_base(unexpect_t, std::initializer_list< U > il, Args &&...args)
expected_storage_base & operator=(expected_storage_base &&)=default
unexpected< E > m_unexpect
expected_storage_base(expected_storage_base &&)=default
constexpr expected_storage_base(no_init_t)
expected_storage_base & operator=(const expected_storage_base &)=default
constexpr expected_storage_base(in_place_t)
constexpr expected_storage_base()
constexpr expected_storage_base(unexpect_t, Args &&...args)
expected_storage_base(const expected_storage_base &)=default
~expected_storage_base()=default
expected_storage_base(expected_storage_base &&)=default
expected_storage_base & operator=(expected_storage_base &&)=default
expected_storage_base(const expected_storage_base &)=default
unexpected< E > m_unexpect
constexpr expected_storage_base(no_init_t)
constexpr expected_storage_base(in_place_t)
constexpr expected_storage_base(unexpect_t, std::initializer_list< U > il, Args &&...args)
expected_storage_base & operator=(const expected_storage_base &)=default
constexpr expected_storage_base(unexpect_t, Args &&...args)
constexpr expected_storage_base()
constexpr expected_storage_base(unexpect_t, std::initializer_list< U > il, Args &&...args)
constexpr expected_storage_base(in_place_t, std::initializer_list< U > il, Args &&...args)
unexpected< E > m_unexpect
constexpr expected_storage_base(no_init_t)
constexpr expected_storage_base(in_place_t, Args &&...args)
constexpr expected_storage_base(unexpect_t, Args &&...args)
decltype(detail::invoke(std::declval< F >(), std::declval< Us >()...)) type