//
-BOOST_OUTCOME_REQUIRES(trait::type_can_be_used_in_basic_result && (std::is_void
::value || std::is_default_constructible
::value)) //
+template //
class basic_outcome;
namespace detail
@@ -87,7 +86,8 @@ namespace detail
static constexpr bool enable_exception_converting_constructor = //
implicit_constructors_enabled //
&& !is_in_place_type_t>::value // not in place construction
- && !detail::is_implicitly_constructible && !detail::is_implicitly_constructible && detail::is_implicitly_constructible;
+ && !detail::is_implicitly_constructible && !detail::is_implicitly_constructible &&
+ detail::is_implicitly_constructible;
// Predicate for the error + exception converting constructor to be available.
template
@@ -99,51 +99,66 @@ namespace detail
// Predicate for the converting copy constructor from a compatible outcome to be available.
template
- static constexpr bool enable_compatible_conversion = //
- (std::is_void::value || detail::is_explicitly_constructible::value_type>) // if our value types are constructible
- &&(std::is_void::value || detail::is_explicitly_constructible::error_type>) // if our error types are constructible
- &&(std::is_void::value || detail::is_explicitly_constructible::exception_type>) // if our exception types are constructible
+ static constexpr bool enable_compatible_conversion = //
+ (std::is_void::value ||
+ detail::is_explicitly_constructible::value_type>) // if our value types are constructible
+ &&(std::is_void::value ||
+ detail::is_explicitly_constructible::error_type>) // if our error types are constructible
+ &&(std::is_void::value ||
+ detail::is_explicitly_constructible::exception_type>) // if our exception types are constructible
;
// Predicate for the converting constructor from a make_error_code() of the input to be available.
template
- static constexpr bool enable_make_error_code_compatible_conversion = //
- trait::is_error_code_available>::value // if error type has an error code
- && !enable_compatible_conversion // and the normal compatible conversion is not available
- && (std::is_void::value || detail::is_explicitly_constructible::value_type>) // and if our value types are constructible
- &&detail::is_explicitly_constructible::type> // and our error type is constructible from a make_error_code()
- && (std::is_void::value || detail::is_explicitly_constructible::exception_type>); // and our exception types are constructible
+ static constexpr bool enable_make_error_code_compatible_conversion = //
+ trait::is_error_code_available>::value // if error type has an error code
+ && !enable_compatible_conversion // and the normal compatible conversion is not available
+ && (std::is_void::value ||
+ detail::is_explicitly_constructible::value_type>) // and if our value types are constructible
+ &&detail::is_explicitly_constructible::type> // and our error type is constructible from a make_error_code()
+ && (std::is_void::value ||
+ detail::is_explicitly_constructible::exception_type>); // and our exception types are constructible
// Predicate for the implicit converting inplace constructor from a compatible input to be available.
struct disable_inplace_value_error_exception_constructor;
template
- using choose_inplace_value_error_exception_constructor = std::conditional_t< //
- ((static_cast(std::is_constructible::value) + static_cast(std::is_constructible::value) + static_cast(std::is_constructible::value)) > 1), //
- disable_inplace_value_error_exception_constructor, //
- std::conditional_t< //
- std::is_constructible::value, //
- value_type, //
- std::conditional_t< //
- std::is_constructible::value, //
- error_type, //
- std::conditional_t< //
- std::is_constructible::value, //
- exception_type, //
+ using choose_inplace_value_error_exception_constructor = std::conditional_t< //
+ ((static_cast(std::is_constructible::value) + static_cast(std::is_constructible::value) +
+ static_cast(std::is_constructible::value)) > 1), //
+ disable_inplace_value_error_exception_constructor, //
+ std::conditional_t< //
+ std::is_constructible::value, //
+ value_type, //
+ std::conditional_t< //
+ std::is_constructible::value, //
+ error_type, //
+ std::conditional_t< //
+ std::is_constructible::value, //
+ exception_type, //
disable_inplace_value_error_exception_constructor>>>>;
template
static constexpr bool enable_inplace_value_error_exception_constructor = //
- implicit_constructors_enabled && !std::is_same, disable_inplace_value_error_exception_constructor>::value;
+ implicit_constructors_enabled &&
+ !std::is_same, disable_inplace_value_error_exception_constructor>::value;
};
// Select whether to use basic_outcome_failure_observers or not
template
using select_basic_outcome_failure_observers = //
- std::conditional_t::value && trait::is_exception_ptr_available::value, basic_outcome_failure_observers, Base>;
+ std::conditional_t::value && trait::is_exception_ptr_available::value,
+ basic_outcome_failure_observers, Base>;
template constexpr inline const V &extract_exception_from_failure(const failure_type &v) { return v.exception(); }
- template constexpr inline V &&extract_exception_from_failure(failure_type &&v) { return static_cast &&>(v).exception(); }
+ template constexpr inline V &&extract_exception_from_failure(failure_type &&v)
+ {
+ return static_cast &&>(v).exception();
+ }
template constexpr inline const U &extract_exception_from_failure(const failure_type &v) { return v.error(); }
- template constexpr inline U &&extract_exception_from_failure(failure_type &&v) { return static_cast &&>(v).error(); }
+ template constexpr inline U &&extract_exception_from_failure(failure_type &&v)
+ {
+ return static_cast &&>(v).error();
+ }
template struct is_basic_outcome
{
@@ -181,36 +196,41 @@ SIGNATURE NOT RECOGNISED
/*! AWAITING HUGO JSON CONVERSION TOOL
SIGNATURE NOT RECOGNISED
*/
- template constexpr inline void hook_outcome_in_place_construction(T * /*unused*/, in_place_type_t /*unused*/, Args &&... /*unused*/) noexcept {}
+ template
+ constexpr inline void hook_outcome_in_place_construction(T * /*unused*/, in_place_type_t /*unused*/, Args &&... /*unused*/) noexcept
+ {
+ }
/*! AWAITING HUGO JSON CONVERSION TOOL
SIGNATURE NOT RECOGNISED
*/
- template constexpr inline void override_outcome_exception(basic_outcome *o, U &&v) noexcept;
+ template
+ constexpr inline void override_outcome_exception(basic_outcome *o, U &&v) noexcept;
} // namespace hooks
/*! AWAITING HUGO JSON CONVERSION TOOL
type definition template basic_outcome. Potential doc page: `basic_outcome`
*/
-template //
-BOOST_OUTCOME_REQUIRES(trait::type_can_be_used_in_basic_result && (std::is_void
::value || std::is_default_constructible
::value)) //
+template //
class BOOST_OUTCOME_NODISCARD basic_outcome
#if defined(BOOST_OUTCOME_DOXYGEN_IS_IN_THE_HOUSE) || defined(BOOST_OUTCOME_STANDARDESE_IS_IN_THE_HOUSE)
: public detail::basic_outcome_failure_observers, R, S, P, NoValuePolicy>,
public detail::basic_outcome_exception_observers, R, S, P, NoValuePolicy>,
public detail::basic_result_final
#else
- : public detail::select_basic_outcome_failure_observers, R, S, P, NoValuePolicy>, R, S, P, NoValuePolicy>
+ : public detail::select_basic_outcome_failure_observers<
+ detail::basic_outcome_exception_observers, R, S, P, NoValuePolicy>, R, S, P, NoValuePolicy>
#endif
{
static_assert(trait::type_can_be_used_in_basic_result, "The exception_type cannot be used");
static_assert(std::is_void
::value || std::is_default_constructible
::value, "exception_type must be void or default constructible");
- using base = detail::select_basic_outcome_failure_observers, R, S, P, NoValuePolicy>, R, S, P, NoValuePolicy>;
+ using base = detail::select_basic_outcome_failure_observers<
+ detail::basic_outcome_exception_observers, R, S, P, NoValuePolicy>, R, S, P, NoValuePolicy>;
friend struct policy::base;
- template //
- BOOST_OUTCOME_REQUIRES(trait::type_can_be_used_in_basic_result && (std::is_void::value || std::is_default_constructible::value)) //
+ template //
friend class basic_outcome;
- template friend constexpr inline void hooks::override_outcome_exception(basic_outcome *o, X &&v) noexcept; // NOLINT
+ template
+ friend constexpr inline void hooks::override_outcome_exception(basic_outcome *o, X &&v) noexcept; // NOLINT
struct implicit_constructors_disabled_tag
{
@@ -276,9 +296,12 @@ protected:
using base = detail::outcome_predicates;
// Predicate for any constructors to be available at all
- static constexpr bool constructors_enabled = (!std::is_same, std::decay_t>::value || (std::is_void::value && std::is_void::value)) //
- && (!std::is_same, std::decay_t>::value || (std::is_void::value && std::is_void::value)) //
- && (!std::is_same, std::decay_t>::value || (std::is_void::value && std::is_void::value)) //
+ static constexpr bool constructors_enabled =
+ (!std::is_same, std::decay_t>::value || (std::is_void::value && std::is_void::value)) //
+ && (!std::is_same, std::decay_t>::value ||
+ (std::is_void::value && std::is_void::value)) //
+ && (!std::is_same, std::decay_t>::value ||
+ (std::is_void::value && std::is_void::value)) //
;
// Predicate for implicit constructors to be available at all
@@ -359,13 +382,17 @@ protected:
static constexpr bool enable_inplace_value_error_exception_constructor = //
constructors_enabled //
&&base::template enable_inplace_value_error_exception_constructor;
- template using choose_inplace_value_error_exception_constructor = typename base::template choose_inplace_value_error_exception_constructor;
+ template
+ using choose_inplace_value_error_exception_constructor = typename base::template choose_inplace_value_error_exception_constructor;
};
public:
- using value_type_if_enabled = std::conditional_t::value || std::is_same::value, disable_in_place_value_type, value_type>;
- using error_type_if_enabled = std::conditional_t::value || std::is_same::value, disable_in_place_error_type, error_type>;
- using exception_type_if_enabled = std::conditional_t::value || std::is_same::value, disable_in_place_exception_type, exception_type>;
+ using value_type_if_enabled =
+ std::conditional_t::value || std::is_same::value, disable_in_place_value_type, value_type>;
+ using error_type_if_enabled =
+ std::conditional_t::value || std::is_same::value, disable_in_place_error_type, error_type>;
+ using exception_type_if_enabled = std::conditional_t::value || std::is_same::value,
+ disable_in_place_exception_type, exception_type>;
protected:
detail::devoid _ptr;
@@ -383,15 +410,18 @@ SIGNATURE NOT RECOGNISED
*/
BOOST_OUTCOME_TEMPLATE(class T)
BOOST_OUTCOME_TREQUIRES(BOOST_OUTCOME_TPRED((predicate::constructors_enabled && !predicate::implicit_constructors_enabled //
- && (detail::is_implicitly_constructible || detail::is_implicitly_constructible || detail::is_implicitly_constructible) )))
- basic_outcome(T && /*unused*/, implicit_constructors_disabled_tag /*unused*/ = implicit_constructors_disabled_tag()) = delete; // NOLINT Implicit constructors disabled, use explicit in_place_type, success() or failure(). see docs!
+ && (detail::is_implicitly_constructible || detail::is_implicitly_constructible ||
+ detail::is_implicitly_constructible) )))
+ basic_outcome(T && /*unused*/, implicit_constructors_disabled_tag /*unused*/ = implicit_constructors_disabled_tag()) =
+ delete; // NOLINT Implicit constructors disabled, use explicit in_place_type, success() or failure(). see docs!
/*! AWAITING HUGO JSON CONVERSION TOOL
SIGNATURE NOT RECOGNISED
*/
BOOST_OUTCOME_TEMPLATE(class T)
BOOST_OUTCOME_TREQUIRES(BOOST_OUTCOME_TPRED(predicate::template enable_value_converting_constructor))
- constexpr basic_outcome(T &&t, value_converting_constructor_tag /*unused*/ = value_converting_constructor_tag()) noexcept(std::is_nothrow_constructible::value) // NOLINT
+ constexpr basic_outcome(T &&t, value_converting_constructor_tag /*unused*/ = value_converting_constructor_tag()) noexcept(
+ std::is_nothrow_constructible::value) // NOLINT
: base{in_place_type, static_cast(t)}
, _ptr()
{
@@ -403,7 +433,8 @@ SIGNATURE NOT RECOGNISED
*/
BOOST_OUTCOME_TEMPLATE(class T)
BOOST_OUTCOME_TREQUIRES(BOOST_OUTCOME_TPRED(predicate::template enable_error_converting_constructor))
- constexpr basic_outcome(T &&t, error_converting_constructor_tag /*unused*/ = error_converting_constructor_tag()) noexcept(std::is_nothrow_constructible::value) // NOLINT
+ constexpr basic_outcome(T &&t, error_converting_constructor_tag /*unused*/ = error_converting_constructor_tag()) noexcept(
+ std::is_nothrow_constructible::value) // NOLINT
: base{in_place_type, static_cast(t)}
, _ptr()
{
@@ -416,7 +447,8 @@ SIGNATURE NOT RECOGNISED
BOOST_OUTCOME_TEMPLATE(class ErrorCondEnum)
BOOST_OUTCOME_TREQUIRES(BOOST_OUTCOME_TEXPR(error_type(make_error_code(ErrorCondEnum()))), //
BOOST_OUTCOME_TPRED(predicate::template enable_error_condition_converting_constructor))
- constexpr basic_outcome(ErrorCondEnum &&t, error_condition_converting_constructor_tag /*unused*/ = error_condition_converting_constructor_tag()) noexcept(noexcept(error_type(make_error_code(static_cast(t))))) // NOLINT
+ constexpr basic_outcome(ErrorCondEnum &&t, error_condition_converting_constructor_tag /*unused*/ = error_condition_converting_constructor_tag()) noexcept(
+ noexcept(error_type(make_error_code(static_cast(t))))) // NOLINT
: base{in_place_type, make_error_code(t)}
{
using namespace hooks;
@@ -427,12 +459,13 @@ SIGNATURE NOT RECOGNISED
*/
BOOST_OUTCOME_TEMPLATE(class T)
BOOST_OUTCOME_TREQUIRES(BOOST_OUTCOME_TPRED(predicate::template enable_exception_converting_constructor))
- constexpr basic_outcome(T &&t, exception_converting_constructor_tag /*unused*/ = exception_converting_constructor_tag()) noexcept(std::is_nothrow_constructible::value) // NOLINT
+ constexpr basic_outcome(T &&t, exception_converting_constructor_tag /*unused*/ = exception_converting_constructor_tag()) noexcept(
+ std::is_nothrow_constructible::value) // NOLINT
: base()
, _ptr(static_cast(t))
{
using namespace hooks;
- this->_state._status |= detail::status_have_exception;
+ this->_state._status.set_have_exception(true);
hook_outcome_construction(this, static_cast(t));
}
/*! AWAITING HUGO JSON CONVERSION TOOL
@@ -440,12 +473,13 @@ SIGNATURE NOT RECOGNISED
*/
BOOST_OUTCOME_TEMPLATE(class T, class U)
BOOST_OUTCOME_TREQUIRES(BOOST_OUTCOME_TPRED(predicate::template enable_error_exception_converting_constructor))
- constexpr basic_outcome(T &&a, U &&b, error_exception_converting_constructor_tag /*unused*/ = error_exception_converting_constructor_tag()) noexcept(std::is_nothrow_constructible::value &&std::is_nothrow_constructible::value) // NOLINT
+ constexpr basic_outcome(T &&a, U &&b, error_exception_converting_constructor_tag /*unused*/ = error_exception_converting_constructor_tag()) noexcept(
+ std::is_nothrow_constructible::value &&std::is_nothrow_constructible::value) // NOLINT
: base{in_place_type, static_cast(a)}
, _ptr(static_cast(b))
{
using namespace hooks;
- this->_state._status |= detail::status_have_exception;
+ this->_state._status.set_have_exception(true);
hook_outcome_construction(this, static_cast(a), static_cast(b));
}
@@ -456,7 +490,8 @@ SIGNATURE NOT RECOGNISED
BOOST_OUTCOME_TREQUIRES(BOOST_OUTCOME_TPRED(convert::value_or_error>::enable_result_inputs || !is_basic_result_v), //
BOOST_OUTCOME_TPRED(convert::value_or_error>::enable_outcome_inputs || !is_basic_outcome_v), //
BOOST_OUTCOME_TEXPR(convert::value_or_error>{}(std::declval())))
- constexpr explicit basic_outcome(T &&o, explicit_valueorerror_converting_constructor_tag /*unused*/ = explicit_valueorerror_converting_constructor_tag()) // NOLINT
+ constexpr explicit basic_outcome(T &&o,
+ explicit_valueorerror_converting_constructor_tag /*unused*/ = explicit_valueorerror_converting_constructor_tag()) // NOLINT
: basic_outcome{convert::value_or_error>{}(static_cast(o))}
{
}
@@ -465,8 +500,11 @@ SIGNATURE NOT RECOGNISED
*/
BOOST_OUTCOME_TEMPLATE(class T, class U, class V, class W)
BOOST_OUTCOME_TREQUIRES(BOOST_OUTCOME_TPRED(predicate::template enable_compatible_conversion))
- constexpr explicit basic_outcome(const basic_outcome &o,
- explicit_compatible_copy_conversion_tag /*unused*/ = explicit_compatible_copy_conversion_tag()) noexcept(std::is_nothrow_constructible::value &&std::is_nothrow_constructible::value &&std::is_nothrow_constructible::value)
+ constexpr explicit basic_outcome(
+ const basic_outcome &o,
+ explicit_compatible_copy_conversion_tag /*unused*/ =
+ explicit_compatible_copy_conversion_tag()) noexcept(std::is_nothrow_constructible::value &&std::is_nothrow_constructible::value
+ &&std::is_nothrow_constructible::value)
: base{typename base::compatible_conversion_tag(), o}
, _ptr(o._ptr)
{
@@ -478,8 +516,11 @@ SIGNATURE NOT RECOGNISED
*/
BOOST_OUTCOME_TEMPLATE(class T, class U, class V, class W)
BOOST_OUTCOME_TREQUIRES(BOOST_OUTCOME_TPRED(predicate::template enable_compatible_conversion))
- constexpr explicit basic_outcome(basic_outcome &&o,
- explicit_compatible_move_conversion_tag /*unused*/ = explicit_compatible_move_conversion_tag()) noexcept(std::is_nothrow_constructible::value &&std::is_nothrow_constructible::value &&std::is_nothrow_constructible::value)
+ constexpr explicit basic_outcome(
+ basic_outcome &&o,
+ explicit_compatible_move_conversion_tag /*unused*/ =
+ explicit_compatible_move_conversion_tag()) noexcept(std::is_nothrow_constructible::value &&std::is_nothrow_constructible::value
+ &&std::is_nothrow_constructible::value)
: base{typename base::compatible_conversion_tag(), static_cast &&>(o)}
, _ptr(static_cast::exception_type &&>(o._ptr))
{
@@ -491,8 +532,11 @@ SIGNATURE NOT RECOGNISED
*/
BOOST_OUTCOME_TEMPLATE(class T, class U, class V)
BOOST_OUTCOME_TREQUIRES(BOOST_OUTCOME_TPRED(detail::result_predicates::template enable_compatible_conversion))
- constexpr explicit basic_outcome(const basic_result &o,
- explicit_compatible_copy_conversion_tag /*unused*/ = explicit_compatible_copy_conversion_tag()) noexcept(std::is_nothrow_constructible::value &&std::is_nothrow_constructible::value &&std::is_nothrow_constructible::value)
+ constexpr explicit basic_outcome(
+ const basic_result &o,
+ explicit_compatible_copy_conversion_tag /*unused*/ =
+ explicit_compatible_copy_conversion_tag()) noexcept(std::is_nothrow_constructible::value &&std::is_nothrow_constructible::value
+ &&std::is_nothrow_constructible::value)
: base{typename base::compatible_conversion_tag(), o}
, _ptr()
{
@@ -504,8 +548,11 @@ SIGNATURE NOT RECOGNISED
*/
BOOST_OUTCOME_TEMPLATE(class T, class U, class V)
BOOST_OUTCOME_TREQUIRES(BOOST_OUTCOME_TPRED(detail::result_predicates::template enable_compatible_conversion))
- constexpr explicit basic_outcome(basic_result &&o,
- explicit_compatible_move_conversion_tag /*unused*/ = explicit_compatible_move_conversion_tag()) noexcept(std::is_nothrow_constructible::value &&std::is_nothrow_constructible::value &&std::is_nothrow_constructible::value)
+ constexpr explicit basic_outcome(
+ basic_result &&o,
+ explicit_compatible_move_conversion_tag /*unused*/ =
+ explicit_compatible_move_conversion_tag()) noexcept(std::is_nothrow_constructible::value &&std::is_nothrow_constructible::value
+ &&std::is_nothrow_constructible::value)
: base{typename base::compatible_conversion_tag(), static_cast &&>(o)}
, _ptr()
{
@@ -517,8 +564,11 @@ SIGNATURE NOT RECOGNISED
*/
BOOST_OUTCOME_TEMPLATE(class T, class U, class V)
BOOST_OUTCOME_TREQUIRES(BOOST_OUTCOME_TPRED(detail::result_predicates::template enable_make_error_code_compatible_conversion))
- constexpr explicit basic_outcome(const basic_result &o, explicit_make_error_code_compatible_copy_conversion_tag /*unused*/ = explicit_make_error_code_compatible_copy_conversion_tag()) noexcept(std::is_nothrow_constructible::value &&noexcept(make_error_code(std::declval())) &&
- std::is_nothrow_constructible::value)
+ constexpr explicit basic_outcome(const basic_result &o,
+ explicit_make_error_code_compatible_copy_conversion_tag /*unused*/ =
+ explicit_make_error_code_compatible_copy_conversion_tag()) noexcept(std::is_nothrow_constructible::value
+ &&noexcept(make_error_code(std::declval())) &&
+ std::is_nothrow_constructible::value)
: base{typename base::make_error_code_compatible_conversion_tag(), o}
, _ptr()
{
@@ -530,8 +580,11 @@ SIGNATURE NOT RECOGNISED
*/
BOOST_OUTCOME_TEMPLATE(class T, class U, class V)
BOOST_OUTCOME_TREQUIRES(BOOST_OUTCOME_TPRED(detail::result_predicates::template enable_make_error_code_compatible_conversion))
- constexpr explicit basic_outcome(basic_result