|
|
|
@ -65,7 +65,7 @@ struct no_init_t {
|
|
|
|
|
* Additionally, this requires E to be trivially destructible
|
|
|
|
|
*/
|
|
|
|
|
template <typename T, typename E, bool = std::is_trivially_destructible_v<T>>
|
|
|
|
|
requires std::is_trivially_destructible_v<E>
|
|
|
|
|
requires std::is_trivially_destructible_v<E>
|
|
|
|
|
struct expected_storage_base {
|
|
|
|
|
constexpr expected_storage_base() : m_val{T{}}, m_has_val{true} {}
|
|
|
|
|
|
|
|
|
@ -112,7 +112,7 @@ struct expected_storage_base {
|
|
|
|
|
* Additionally, this requires E to be trivially destructible
|
|
|
|
|
*/
|
|
|
|
|
template <typename T, typename E>
|
|
|
|
|
requires std::is_trivially_destructible_v<E>
|
|
|
|
|
requires std::is_trivially_destructible_v<E>
|
|
|
|
|
struct expected_storage_base<T, E, true> {
|
|
|
|
|
constexpr expected_storage_base() : m_val{T{}}, m_has_val{true} {}
|
|
|
|
|
|
|
|
|
@ -252,7 +252,7 @@ struct expected_operations_base : expected_storage_base<T, E> {
|
|
|
|
|
* Additionally, this requires E to be trivially copy constructible
|
|
|
|
|
*/
|
|
|
|
|
template <typename T, typename E, bool = std::is_trivially_copy_constructible_v<T>>
|
|
|
|
|
requires std::is_trivially_copy_constructible_v<E>
|
|
|
|
|
requires std::is_trivially_copy_constructible_v<E>
|
|
|
|
|
struct expected_copy_base : expected_operations_base<T, E> {
|
|
|
|
|
using expected_operations_base<T, E>::expected_operations_base;
|
|
|
|
|
};
|
|
|
|
@ -262,7 +262,7 @@ struct expected_copy_base : expected_operations_base<T, E> {
|
|
|
|
|
* Additionally, this requires E to be trivially copy constructible
|
|
|
|
|
*/
|
|
|
|
|
template <typename T, typename E>
|
|
|
|
|
requires std::is_trivially_copy_constructible_v<E>
|
|
|
|
|
requires std::is_trivially_copy_constructible_v<E>
|
|
|
|
|
struct expected_copy_base<T, E, false> : expected_operations_base<T, E> {
|
|
|
|
|
using expected_operations_base<T, E>::expected_operations_base;
|
|
|
|
|
|
|
|
|
@ -290,7 +290,7 @@ struct expected_copy_base<T, E, false> : expected_operations_base<T, E> {
|
|
|
|
|
* Additionally, this requires E to be trivially move constructible
|
|
|
|
|
*/
|
|
|
|
|
template <typename T, typename E, bool = std::is_trivially_move_constructible_v<T>>
|
|
|
|
|
requires std::is_trivially_move_constructible_v<E>
|
|
|
|
|
requires std::is_trivially_move_constructible_v<E>
|
|
|
|
|
struct expected_move_base : expected_copy_base<T, E> {
|
|
|
|
|
using expected_copy_base<T, E>::expected_copy_base;
|
|
|
|
|
};
|
|
|
|
@ -300,7 +300,7 @@ struct expected_move_base : expected_copy_base<T, E> {
|
|
|
|
|
* Additionally, this requires E to be trivially move constructible
|
|
|
|
|
*/
|
|
|
|
|
template <typename T, typename E>
|
|
|
|
|
requires std::is_trivially_move_constructible_v<E>
|
|
|
|
|
requires std::is_trivially_move_constructible_v<E>
|
|
|
|
|
struct expected_move_base<T, E, false> : expected_copy_base<T, E> {
|
|
|
|
|
using expected_copy_base<T, E>::expected_copy_base;
|
|
|
|
|
|
|
|
|
@ -331,9 +331,9 @@ template <typename T, typename E,
|
|
|
|
|
bool = std::conjunction_v<std::is_trivially_copy_assignable<T>,
|
|
|
|
|
std::is_trivially_copy_constructible<T>,
|
|
|
|
|
std::is_trivially_destructible<T>>>
|
|
|
|
|
requires std::conjunction_v<std::is_trivially_copy_assignable<E>,
|
|
|
|
|
std::is_trivially_copy_constructible<E>,
|
|
|
|
|
std::is_trivially_destructible<E>>
|
|
|
|
|
requires std::conjunction_v<std::is_trivially_copy_assignable<E>,
|
|
|
|
|
std::is_trivially_copy_constructible<E>,
|
|
|
|
|
std::is_trivially_destructible<E>>
|
|
|
|
|
struct expected_copy_assign_base : expected_move_base<T, E> {
|
|
|
|
|
using expected_move_base<T, E>::expected_move_base;
|
|
|
|
|
};
|
|
|
|
@ -343,9 +343,9 @@ struct expected_copy_assign_base : expected_move_base<T, E> {
|
|
|
|
|
* Additionally, this requires E to be trivially copy assignable
|
|
|
|
|
*/
|
|
|
|
|
template <typename T, typename E>
|
|
|
|
|
requires std::conjunction_v<std::is_trivially_copy_assignable<E>,
|
|
|
|
|
std::is_trivially_copy_constructible<E>,
|
|
|
|
|
std::is_trivially_destructible<E>>
|
|
|
|
|
requires std::conjunction_v<std::is_trivially_copy_assignable<E>,
|
|
|
|
|
std::is_trivially_copy_constructible<E>,
|
|
|
|
|
std::is_trivially_destructible<E>>
|
|
|
|
|
struct expected_copy_assign_base<T, E, false> : expected_move_base<T, E> {
|
|
|
|
|
using expected_move_base<T, E>::expected_move_base;
|
|
|
|
|
|
|
|
|
@ -372,9 +372,9 @@ template <typename T, typename E,
|
|
|
|
|
bool = std::conjunction_v<std::is_trivially_move_assignable<T>,
|
|
|
|
|
std::is_trivially_move_constructible<T>,
|
|
|
|
|
std::is_trivially_destructible<T>>>
|
|
|
|
|
requires std::conjunction_v<std::is_trivially_move_assignable<E>,
|
|
|
|
|
std::is_trivially_move_constructible<E>,
|
|
|
|
|
std::is_trivially_destructible<E>>
|
|
|
|
|
requires std::conjunction_v<std::is_trivially_move_assignable<E>,
|
|
|
|
|
std::is_trivially_move_constructible<E>,
|
|
|
|
|
std::is_trivially_destructible<E>>
|
|
|
|
|
struct expected_move_assign_base : expected_copy_assign_base<T, E> {
|
|
|
|
|
using expected_copy_assign_base<T, E>::expected_copy_assign_base;
|
|
|
|
|
};
|
|
|
|
@ -384,9 +384,9 @@ struct expected_move_assign_base : expected_copy_assign_base<T, E> {
|
|
|
|
|
* Additionally, this requires E to be trivially move assignable
|
|
|
|
|
*/
|
|
|
|
|
template <typename T, typename E>
|
|
|
|
|
requires std::conjunction_v<std::is_trivially_move_assignable<E>,
|
|
|
|
|
std::is_trivially_move_constructible<E>,
|
|
|
|
|
std::is_trivially_destructible<E>>
|
|
|
|
|
requires std::conjunction_v<std::is_trivially_move_assignable<E>,
|
|
|
|
|
std::is_trivially_move_constructible<E>,
|
|
|
|
|
std::is_trivially_destructible<E>>
|
|
|
|
|
struct expected_move_assign_base<T, E, false> : expected_copy_assign_base<T, E> {
|
|
|
|
|
using expected_copy_assign_base<T, E>::expected_copy_assign_base;
|
|
|
|
|
|
|
|
|
@ -413,7 +413,7 @@ struct expected_move_assign_base<T, E, false> : expected_copy_assign_base<T, E>
|
|
|
|
|
*/
|
|
|
|
|
template <typename T, typename E, bool EnableCopy = std::is_copy_constructible_v<T>,
|
|
|
|
|
bool EnableMove = std::is_move_constructible_v<T>>
|
|
|
|
|
requires std::conjunction_v<std::is_copy_constructible<E>, std::is_move_constructible<E>>
|
|
|
|
|
requires std::conjunction_v<std::is_copy_constructible<E>, std::is_move_constructible<E>>
|
|
|
|
|
struct expected_delete_ctor_base {
|
|
|
|
|
expected_delete_ctor_base() = default;
|
|
|
|
|
expected_delete_ctor_base(const expected_delete_ctor_base&) = default;
|
|
|
|
@ -423,7 +423,7 @@ struct expected_delete_ctor_base {
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
template <typename T, typename E>
|
|
|
|
|
requires std::conjunction_v<std::is_copy_constructible<E>, std::is_move_constructible<E>>
|
|
|
|
|
requires std::conjunction_v<std::is_copy_constructible<E>, std::is_move_constructible<E>>
|
|
|
|
|
struct expected_delete_ctor_base<T, E, true, false> {
|
|
|
|
|
expected_delete_ctor_base() = default;
|
|
|
|
|
expected_delete_ctor_base(const expected_delete_ctor_base&) = default;
|
|
|
|
@ -433,7 +433,7 @@ struct expected_delete_ctor_base<T, E, true, false> {
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
template <typename T, typename E>
|
|
|
|
|
requires std::conjunction_v<std::is_copy_constructible<E>, std::is_move_constructible<E>>
|
|
|
|
|
requires std::conjunction_v<std::is_copy_constructible<E>, std::is_move_constructible<E>>
|
|
|
|
|
struct expected_delete_ctor_base<T, E, false, true> {
|
|
|
|
|
expected_delete_ctor_base() = default;
|
|
|
|
|
expected_delete_ctor_base(const expected_delete_ctor_base&) = delete;
|
|
|
|
@ -443,7 +443,7 @@ struct expected_delete_ctor_base<T, E, false, true> {
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
template <typename T, typename E>
|
|
|
|
|
requires std::conjunction_v<std::is_copy_constructible<E>, std::is_move_constructible<E>>
|
|
|
|
|
requires std::conjunction_v<std::is_copy_constructible<E>, std::is_move_constructible<E>>
|
|
|
|
|
struct expected_delete_ctor_base<T, E, false, false> {
|
|
|
|
|
expected_delete_ctor_base() = default;
|
|
|
|
|
expected_delete_ctor_base(const expected_delete_ctor_base&) = delete;
|
|
|
|
@ -461,8 +461,8 @@ template <
|
|
|
|
|
typename T, typename E,
|
|
|
|
|
bool EnableCopy = std::conjunction_v<std::is_copy_constructible<T>, std::is_copy_assignable<T>>,
|
|
|
|
|
bool EnableMove = std::conjunction_v<std::is_move_constructible<T>, std::is_move_assignable<T>>>
|
|
|
|
|
requires std::conjunction_v<std::is_copy_constructible<E>, std::is_move_constructible<E>,
|
|
|
|
|
std::is_copy_assignable<E>, std::is_move_assignable<E>>
|
|
|
|
|
requires std::conjunction_v<std::is_copy_constructible<E>, std::is_move_constructible<E>,
|
|
|
|
|
std::is_copy_assignable<E>, std::is_move_assignable<E>>
|
|
|
|
|
struct expected_delete_assign_base {
|
|
|
|
|
expected_delete_assign_base() = default;
|
|
|
|
|
expected_delete_assign_base(const expected_delete_assign_base&) = default;
|
|
|
|
@ -472,8 +472,8 @@ struct expected_delete_assign_base {
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
template <typename T, typename E>
|
|
|
|
|
requires std::conjunction_v<std::is_copy_constructible<E>, std::is_move_constructible<E>,
|
|
|
|
|
std::is_copy_assignable<E>, std::is_move_assignable<E>>
|
|
|
|
|
requires std::conjunction_v<std::is_copy_constructible<E>, std::is_move_constructible<E>,
|
|
|
|
|
std::is_copy_assignable<E>, std::is_move_assignable<E>>
|
|
|
|
|
struct expected_delete_assign_base<T, E, true, false> {
|
|
|
|
|
expected_delete_assign_base() = default;
|
|
|
|
|
expected_delete_assign_base(const expected_delete_assign_base&) = default;
|
|
|
|
@ -483,8 +483,8 @@ struct expected_delete_assign_base<T, E, true, false> {
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
template <typename T, typename E>
|
|
|
|
|
requires std::conjunction_v<std::is_copy_constructible<E>, std::is_move_constructible<E>,
|
|
|
|
|
std::is_copy_assignable<E>, std::is_move_assignable<E>>
|
|
|
|
|
requires std::conjunction_v<std::is_copy_constructible<E>, std::is_move_constructible<E>,
|
|
|
|
|
std::is_copy_assignable<E>, std::is_move_assignable<E>>
|
|
|
|
|
struct expected_delete_assign_base<T, E, false, true> {
|
|
|
|
|
expected_delete_assign_base() = default;
|
|
|
|
|
expected_delete_assign_base(const expected_delete_assign_base&) = default;
|
|
|
|
@ -494,8 +494,8 @@ struct expected_delete_assign_base<T, E, false, true> {
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
template <typename T, typename E>
|
|
|
|
|
requires std::conjunction_v<std::is_copy_constructible<E>, std::is_move_constructible<E>,
|
|
|
|
|
std::is_copy_assignable<E>, std::is_move_assignable<E>>
|
|
|
|
|
requires std::conjunction_v<std::is_copy_constructible<E>, std::is_move_constructible<E>,
|
|
|
|
|
std::is_copy_assignable<E>, std::is_move_assignable<E>>
|
|
|
|
|
struct expected_delete_assign_base<T, E, false, false> {
|
|
|
|
|
expected_delete_assign_base() = default;
|
|
|
|
|
expected_delete_assign_base(const expected_delete_assign_base&) = default;
|
|
|
|
|