From 4e0def667c29ab5d9b9a6897cd509704d9ef58c8 Mon Sep 17 00:00:00 2001 From: Jenkins nedprod CI Date: Thu, 17 Oct 2024 20:15:02 +0000 Subject: [PATCH] CI regenerates Boost.Outcome docs --- doc/html/_footer.html | 21 + doc/html/_header.html | 22 + doc/html/abi-stability.html | 95 + doc/html/alternatives.html | 45 + doc/html/alternatives/error_code.html | 63 + doc/html/alternatives/exceptions.html | 57 + doc/html/alternatives/expected.html | 69 + doc/html/alternatives/leaf.html | 84 + doc/html/alternatives/outcome.html | 94 + doc/html/build.html | 220 ++ doc/html/categories.html | 67 + doc/html/categories/assignment.html | 51 + doc/html/categories/assignment/page/1.html | 1 + doc/html/categories/comparisons.html | 67 + doc/html/categories/comparisons/page/1.html | 1 + doc/html/categories/comparisons/page/2.html | 56 + doc/html/categories/constructors.html | 67 + doc/html/categories/constructors/page/1.html | 1 + doc/html/categories/constructors/page/2.html | 72 + doc/html/categories/constructors/page/3.html | 72 + doc/html/categories/constructors/page/4.html | 72 + doc/html/categories/constructors/page/5.html | 72 + doc/html/categories/constructors/page/6.html | 72 + doc/html/categories/constructors/page/7.html | 52 + .../categories/converting-constructors.html | 67 + .../converting-constructors/page/1.html | 1 + .../converting-constructors/page/2.html | 72 + .../converting-constructors/page/3.html | 52 + doc/html/categories/copy-assignment.html | 47 + .../categories/copy-assignment/page/1.html | 1 + doc/html/categories/copy-constructors.html | 47 + .../categories/copy-constructors/page/1.html | 1 + doc/html/categories/default-constructors.html | 47 + .../default-constructors/page/1.html | 1 + doc/html/categories/destructors.html | 47 + doc/html/categories/destructors/page/1.html | 1 + .../categories/disabling-constructors.html | 51 + .../disabling-constructors/page/1.html | 1 + .../categories/explicit-constructors.html | 67 + .../explicit-constructors/page/1.html | 1 + .../explicit-constructors/page/2.html | 72 + .../explicit-constructors/page/3.html | 56 + .../categories/implicit-constructors.html | 67 + .../implicit-constructors/page/1.html | 1 + .../implicit-constructors/page/2.html | 72 + .../implicit-constructors/page/3.html | 72 + .../implicit-constructors/page/4.html | 56 + doc/html/categories/inplace-constructors.html | 67 + .../inplace-constructors/page/1.html | 1 + .../inplace-constructors/page/2.html | 52 + doc/html/categories/modifiers.html | 59 + doc/html/categories/modifiers/page/1.html | 1 + doc/html/categories/move-assignment.html | 47 + .../categories/move-assignment/page/1.html | 1 + doc/html/categories/move-constructors.html | 47 + .../categories/move-constructors/page/1.html | 1 + doc/html/categories/observer-policies.html | 67 + .../categories/observer-policies/page/1.html | 1 + .../categories/observer-policies/page/2.html | 56 + doc/html/categories/observers.html | 67 + doc/html/categories/observers/page/1.html | 1 + doc/html/categories/observers/page/2.html | 72 + doc/html/categories/observers/page/3.html | 72 + doc/html/categories/observers/page/4.html | 72 + doc/html/categories/observers/page/5.html | 72 + doc/html/categories/observers/page/6.html | 72 + doc/html/categories/observers/page/7.html | 50 + doc/html/categories/operators.html | 51 + doc/html/categories/operators/page/1.html | 1 + doc/html/categories/page/1.html | 1 + doc/html/categories/page/2.html | 68 + doc/html/categories/special.html | 45 + doc/html/categories/special/page/1.html | 1 + doc/html/categories/tagged-constructors.html | 67 + .../tagged-constructors/page/1.html | 1 + .../tagged-constructors/page/2.html | 64 + doc/html/changelog.html | 883 +++++++ doc/html/changelog/upgrade_v21_v22.html | 107 + doc/html/changelog/v22.html | 83 + doc/html/credits.html | 228 ++ doc/html/css/boost.css | 1126 ++++++++ doc/html/css/local.css | 169 ++ doc/html/experimental.html | 112 + doc/html/experimental/advantages.html | 70 + doc/html/experimental/c-api.html | 58 + doc/html/experimental/c-api/from-c.html | 64 + .../experimental/c-api/from-c/declare.html | 52 + .../c-api/from-c/system_code.html | 117 + doc/html/experimental/c-api/from-c/try.html | 43 + doc/html/experimental/c-api/from-c/use.html | 53 + doc/html/experimental/c-api/from-cxx.html | 83 + .../experimental/c-api/from-cxx/example.html | 70 + .../experimental/c-api/from-cxx/example2.html | 77 + doc/html/experimental/differences.html | 103 + doc/html/experimental/map.html | 85 + doc/html/experimental/outcome.html | 101 + doc/html/experimental/status_result.html | 81 + .../experimental/worked-example-long.html | 57 + .../worked-example-long/constructor.html | 54 + .../implicit_conversion.html | 60 + .../worked-example-long/message.html | 63 + .../worked-example-long/preamble.html | 54 + .../worked-example-long/source.html | 37 + .../worked-example-long/string_ref.html | 51 + .../worked-example-long/value_type.html | 47 + doc/html/experimental/worked-example.html | 85 + .../worked-example/implicit-construction.html | 62 + doc/html/faq.html | 674 +++++ doc/html/faq/results_arm_a53_log.png | Bin 0 -> 22184 bytes doc/html/faq/results_arm_a72_log.png | Bin 0 -> 21664 bytes doc/html/faq/results_silvermont_log.png | Bin 0 -> 21940 bytes doc/html/faq/results_skylake_log.png | Bin 0 -> 23694 bytes doc/html/history.html | 213 ++ doc/html/history/graph.png | Bin 0 -> 76696 bytes doc/html/images/boost.png | Bin 0 -> 6308 bytes doc/html/images/caution.png | Bin 0 -> 7476 bytes doc/html/images/favicon.ico | Bin 0 -> 318 bytes doc/html/images/header-bg.png | Bin 0 -> 212 bytes doc/html/images/header-fg.png | Bin 0 -> 106318 bytes doc/html/images/home.png | Bin 0 -> 358 bytes doc/html/images/important.png | Bin 0 -> 7677 bytes doc/html/images/next.png | Bin 0 -> 336 bytes doc/html/images/next_disabled.png | Bin 0 -> 1110 bytes doc/html/images/note.png | Bin 0 -> 13625 bytes doc/html/images/prev.png | Bin 0 -> 334 bytes doc/html/images/prev_disabled.png | Bin 0 -> 1109 bytes doc/html/images/space.png | Bin 0 -> 150 bytes doc/html/images/up.png | Bin 0 -> 370 bytes doc/html/images/up_disabled.png | Bin 0 -> 1115 bytes doc/html/images/warning.png | Bin 0 -> 6955 bytes doc/html/index.html | 242 ++ doc/html/motivation.html | 57 + doc/html/motivation/errno.html | 70 + doc/html/motivation/error_codes.html | 63 + doc/html/motivation/exceptions.html | 79 + doc/html/motivation/narrow_contract.html | 131 + doc/html/motivation/plug_error_code.html | 187 ++ doc/html/motivation/plug_error_code2.html | 190 ++ doc/html/motivation/std_error_code.html | 70 + doc/html/recipes.html | 36 + doc/html/recipes/asio-integration-1-70.html | 294 +++ doc/html/recipes/asio-integration.html | 279 ++ doc/html/recipes/foreign-try.html | 178 ++ doc/html/reference.html | 208 ++ doc/html/reference/aliases.html | 56 + doc/html/reference/aliases/boost_checked.html | 33 + doc/html/reference/aliases/boost_outcome.html | 35 + doc/html/reference/aliases/boost_result.html | 33 + .../reference/aliases/boost_unchecked.html | 33 + doc/html/reference/aliases/checked.html | 29 + .../reference/aliases/default_policy.html | 45 + doc/html/reference/aliases/outcome.html | 30 + doc/html/reference/aliases/result.html | 30 + doc/html/reference/aliases/std_checked.html | 35 + doc/html/reference/aliases/std_outcome.html | 37 + doc/html/reference/aliases/std_result.html | 35 + doc/html/reference/aliases/std_unchecked.html | 35 + doc/html/reference/aliases/unchecked.html | 29 + doc/html/reference/concepts.html | 38 + .../reference/concepts/basic_outcome.html | 34 + doc/html/reference/concepts/basic_result.html | 34 + .../reference/concepts/value_or_error.html | 41 + .../reference/concepts/value_or_none.html | 39 + doc/html/reference/converters.html | 32 + .../reference/converters/value_or_error.html | 46 + doc/html/reference/functions.html | 106 + .../functions/error_from_exception.html | 47 + doc/html/reference/functions/failure.html | 38 + doc/html/reference/functions/hooks.html | 58 + .../hooks/hook_outcome_construction.html | 37 + .../hooks/hook_outcome_construction2.html | 37 + .../hooks/hook_outcome_copy_construction.html | 37 + .../hook_outcome_copy_construction2.html | 37 + .../hook_outcome_in_place_construction.html | 37 + .../hooks/hook_outcome_move_construction.html | 37 + .../hook_outcome_move_construction2.html | 37 + .../hooks/hook_result_construction.html | 37 + .../hooks/hook_result_copy_construction.html | 37 + .../hook_result_in_place_construction.html | 37 + .../hooks/hook_result_move_construction.html | 37 + .../hooks/override_outcome_exception.html | 40 + .../functions/hooks/set_spare_storage.html | 32 + .../functions/hooks/spare_storage.html | 32 + doc/html/reference/functions/iostream.html | 42 + .../iostream/outcome_operator_in.html | 36 + .../iostream/outcome_operator_out.html | 40 + .../functions/iostream/outcome_print.html | 31 + .../iostream/result_operator_in.html | 36 + .../iostream/result_operator_out.html | 40 + .../functions/iostream/result_print.html | 31 + doc/html/reference/functions/policy.html | 44 + ..._outcome_failure_exception_from_error.html | 38 + .../functions/policy/error_code.html | 33 + .../functions/policy/exception_ptr.html | 33 + ..._system_error_with_payload_boost_enum.html | 32 + ...m_error_with_payload_boost_error_code.html | 32 + ...as_system_error_with_payload_std_enum.html | 38 + ...tem_error_with_payload_std_error_code.html | 34 + doc/html/reference/functions/strong_swap.html | 34 + doc/html/reference/functions/success.html | 34 + .../try_operation_extract_value.html | 29 + .../functions/try_operation_has_value.html | 29 + .../functions/try_operation_return_as.html | 34 + .../try_throw_std_exception_from_error.html | 63 + doc/html/reference/macros.html | 82 + doc/html/reference/macros/co_try.html | 51 + .../macros/co_try_failure_likely.html | 51 + doc/html/reference/macros/co_tryv.html | 49 + doc/html/reference/macros/co_tryv2.html | 44 + .../macros/co_tryv2_failure_likely.html | 44 + .../macros/co_tryv_failure_likely.html | 49 + doc/html/reference/macros/co_tryx.html | 54 + .../macros/co_tryx_failure_likely.html | 54 + .../reference/macros/disable_execinfo.html | 31 + .../macros/enable_legacy_support_for.html | 29 + doc/html/reference/macros/in_place_type.html | 37 + .../macros/is_nothrow_swappable.html | 31 + doc/html/reference/macros/nodiscard.html | 29 + doc/html/reference/macros/requires.html | 29 + doc/html/reference/macros/symbol_visible.html | 34 + doc/html/reference/macros/template.html | 56 + doc/html/reference/macros/thread_local.html | 36 + .../reference/macros/throw_exception.html | 36 + doc/html/reference/macros/try.html | 51 + .../reference/macros/try_failure_likely.html | 51 + doc/html/reference/macros/tryv.html | 49 + doc/html/reference/macros/tryv2.html | 44 + .../macros/tryv2_failure_likely.html | 44 + .../reference/macros/tryv_failure_likely.html | 49 + doc/html/reference/macros/tryx.html | 54 + .../reference/macros/tryx_failure_likely.html | 54 + doc/html/reference/macros/version.html | 67 + doc/html/reference/policies.html | 100 + doc/html/reference/policies/all_narrow.html | 34 + doc/html/reference/policies/base.html | 107 + doc/html/reference/policies/base/error.html | 29 + .../reference/policies/base/exception.html | 29 + .../reference/policies/base/has_error.html | 29 + .../policies/base/has_error_is_errno.html | 29 + .../policies/base/has_exception.html | 29 + .../reference/policies/base/has_value.html | 29 + .../policies/base/narrow_error_check.html | 30 + .../policies/base/narrow_exception_check.html | 30 + .../policies/base/narrow_value_check.html | 30 + .../base/on_outcome_construction.html | 28 + .../base/on_outcome_construction2.html | 28 + .../base/on_outcome_copy_construction.html | 28 + .../base/on_outcome_copy_construction2.html | 28 + .../on_outcome_in_place_construction.html | 28 + .../base/on_outcome_move_construction.html | 28 + .../base/on_outcome_move_construction2.html | 28 + .../policies/base/on_result_construction.html | 28 + .../base/on_result_copy_construction.html | 28 + .../base/on_result_in_place_construction.html | 28 + .../base/on_result_move_construction.html | 28 + .../policies/base/set_has_error.html | 29 + .../policies/base/set_has_error_is_errno.html | 29 + .../policies/base/set_has_exception.html | 29 + .../policies/base/set_has_value.html | 29 + doc/html/reference/policies/base/ub.html | 35 + doc/html/reference/policies/base/value.html | 29 + ...or_code_throw_as_system_error_outcome.html | 41 + ...ror_code_throw_as_system_error_result.html | 38 + .../exception_ptr_rethrow_outcome.html | 43 + .../exception_ptr_rethrow_result.html | 40 + .../policies/fail_to_compile_observers.html | 36 + doc/html/reference/policies/terminate.html | 36 + .../policies/throw_bad_result_access.html | 44 + doc/html/reference/traits.html | 50 + .../reference/traits/is_basic_outcome.html | 33 + .../reference/traits/is_basic_result.html | 34 + .../traits/is_error_code_available.html | 36 + doc/html/reference/traits/is_error_type.html | 54 + .../reference/traits/is_error_type_enum.html | 45 + .../traits/is_exception_ptr_available.html | 36 + .../reference/traits/is_failure_type.html | 30 + .../reference/traits/is_move_bitcopying.html | 62 + .../reference/traits/is_success_type.html | 30 + .../type_can_be_used_in_basic_result.html | 43 + doc/html/reference/types.html | 332 +++ .../reference/types/awaitables/eager.html | 67 + .../reference/types/awaitables/generator.html | 71 + doc/html/reference/types/awaitables/lazy.html | 71 + .../reference/types/bad_outcome_access.html | 40 + .../reference/types/bad_result_access.html | 39 + .../types/bad_result_access_with.html | 37 + doc/html/reference/types/basic_outcome.html | 511 ++++ .../basic_outcome/as_failure_lvalue.html | 32 + .../basic_outcome/as_failure_rvalue.html | 32 + .../basic_outcome/assume_error_lvalue.html | 31 + .../assume_error_lvalue_const.html | 31 + .../basic_outcome/assume_error_rvalue.html | 31 + .../assume_error_rvalue_const.html | 31 + .../assume_exception_lvalue.html | 31 + .../assume_exception_lvalue_const.html | 31 + .../assume_exception_rvalue.html | 31 + .../assume_exception_rvalue_const.html | 31 + .../basic_outcome/assume_value_lvalue.html | 31 + .../assume_value_lvalue_const.html | 31 + .../basic_outcome/assume_value_rvalue.html | 31 + .../assume_value_rvalue_const.html | 31 + .../types/basic_outcome/copy_assignment.html | 29 + .../types/basic_outcome/copy_constructor.html | 29 + .../types/basic_outcome/default.html | 23 + .../types/basic_outcome/destructor.html | 27 + .../basic_outcome/disabling_catchall.html | 27 + .../disabling_implicit_constructor.html | 27 + .../basic_outcome/equality_basic_outcome.html | 29 + .../basic_outcome/equality_basic_result.html | 29 + .../basic_outcome/equality_failure_type.html | 29 + .../basic_outcome/equality_success_type.html | 30 + .../types/basic_outcome/error_lvalue.html | 31 + .../basic_outcome/error_lvalue_const.html | 31 + .../types/basic_outcome/error_rvalue.html | 31 + .../basic_outcome/error_rvalue_const.html | 31 + .../types/basic_outcome/exception_lvalue.html | 31 + .../basic_outcome/exception_lvalue_const.html | 31 + .../types/basic_outcome/exception_rvalue.html | 31 + .../basic_outcome/exception_rvalue_const.html | 31 + .../explicit_copy_converting_constructor.html | 30 + .../explicit_inplace_error_constructor.html | 30 + ...explicit_inplace_error_constructor_il.html | 30 + ...xplicit_inplace_exception_constructor.html | 30 + ...icit_inplace_exception_constructor_il.html | 30 + .../explicit_inplace_value_constructor.html | 30 + ...explicit_inplace_value_constructor_il.html | 30 + .../explicit_move_converting_constructor.html | 30 + ...it_result_copy_converting_constructor.html | 30 + ...rror_code_copy_converting_constructor.html | 30 + ...rror_code_move_converting_constructor.html | 30 + ...it_result_move_converting_constructor.html | 30 + ...t_valueorerror_converting_constructor.html | 32 + .../types/basic_outcome/failure.html | 41 + .../types/basic_outcome/has_error.html | 29 + .../types/basic_outcome/has_exception.html | 29 + .../types/basic_outcome/has_failure.html | 29 + .../types/basic_outcome/has_value.html | 30 + ...rror_condition_converting_constructor.html | 30 + ...implicit_error_converting_constructor.html | 28 + ...rror_exception_converting_constructor.html | 28 + ...icit_exception_converting_constructor.html | 28 + ...plicit_failure_error_copy_constructor.html | 29 + ...lure_error_exception_copy_constructor.html | 29 + ...lure_error_exception_move_constructor.html | 29 + ...rror_make_error_code_copy_constructor.html | 29 + ...rror_make_error_code_move_constructor.html | 29 + ...plicit_failure_error_move_constructor.html | 29 + ...it_failure_exception_copy_constructor.html | 29 + ...it_failure_exception_move_constructor.html | 29 + ...ace_value_error_exception_constructor.html | 29 + .../implicit_success_copy_constructor.html | 29 + .../implicit_success_move_constructor.html | 29 + ...implicit_value_converting_constructor.html | 28 + .../inequality_basic_outcome.html | 29 + .../inequality_basic_result.html | 29 + .../inequality_failure_type.html | 29 + .../inequality_success_type.html | 30 + .../types/basic_outcome/move_assignment.html | 29 + .../types/basic_outcome/move_constructor.html | 29 + .../types/basic_outcome/operator_bool.html | 30 + .../reference/types/basic_outcome/swap.html | 31 + .../types/basic_outcome/value_lvalue.html | 31 + .../basic_outcome/value_lvalue_const.html | 31 + .../types/basic_outcome/value_rvalue.html | 31 + .../basic_outcome/value_rvalue_const.html | 31 + doc/html/reference/types/basic_result.html | 425 +++ .../types/basic_result/as_failure_lvalue.html | 31 + .../types/basic_result/as_failure_rvalue.html | 31 + .../basic_result/assume_error_lvalue.html | 31 + .../assume_error_lvalue_const.html | 31 + .../basic_result/assume_error_rvalue.html | 31 + .../assume_error_rvalue_const.html | 31 + .../basic_result/assume_value_lvalue.html | 31 + .../assume_value_lvalue_const.html | 31 + .../basic_result/assume_value_rvalue.html | 31 + .../assume_value_rvalue_const.html | 31 + .../types/basic_result/copy_assignment.html | 29 + .../types/basic_result/copy_constructor.html | 29 + .../reference/types/basic_result/default.html | 23 + .../types/basic_result/destructor.html | 27 + .../basic_result/disabling_catchall.html | 27 + .../disabling_implicit_constructor.html | 27 + .../basic_result/equality_basic_result.html | 31 + .../basic_result/equality_failure_type.html | 30 + .../basic_result/equality_success_type.html | 30 + .../types/basic_result/error_lvalue.html | 31 + .../basic_result/error_lvalue_const.html | 31 + .../types/basic_result/error_rvalue.html | 31 + .../basic_result/error_rvalue_const.html | 31 + .../explicit_copy_converting_constructor.html | 30 + .../explicit_inplace_error_constructor.html | 30 + ...explicit_inplace_error_constructor_il.html | 30 + .../explicit_inplace_value_constructor.html | 30 + ...explicit_inplace_value_constructor_il.html | 30 + ...rror_code_copy_converting_constructor.html | 30 + ...rror_code_move_converting_constructor.html | 30 + ...ption_ptr_copy_converting_constructor.html | 30 + ...ption_ptr_move_converting_constructor.html | 30 + .../explicit_move_converting_constructor.html | 30 + ...t_valueorerror_converting_constructor.html | 31 + .../types/basic_result/has_error.html | 29 + .../types/basic_result/has_exception.html | 29 + .../types/basic_result/has_failure.html | 29 + .../basic_result/has_lost_consistency.html | 29 + .../types/basic_result/has_value.html | 30 + ...rror_condition_converting_constructor.html | 30 + ...implicit_error_converting_constructor.html | 28 + .../implicit_failure_copy_constructor.html | 29 + ...lure_make_error_code_copy_constructor.html | 29 + ...lure_make_error_code_move_constructor.html | 29 + ...e_make_exception_ptr_copy_constructor.html | 29 + ...e_make_exception_ptr_move_constructor.html | 29 + .../implicit_failure_move_constructor.html | 29 + ...licit_inplace_value_error_constructor.html | 29 + .../implicit_success_copy_constructor.html | 29 + .../implicit_success_move_constructor.html | 29 + ...implicit_value_converting_constructor.html | 28 + .../basic_result/inequality_basic_result.html | 31 + .../basic_result/inequality_failure_type.html | 30 + .../basic_result/inequality_success_type.html | 30 + .../types/basic_result/move_assignment.html | 29 + .../types/basic_result/move_constructor.html | 29 + .../types/basic_result/operator_bool.html | 30 + .../reference/types/basic_result/swap.html | 31 + .../types/basic_result/value_lvalue.html | 31 + .../basic_result/value_lvalue_const.html | 31 + .../types/basic_result/value_rvalue.html | 31 + .../basic_result/value_rvalue_const.html | 31 + doc/html/reference/types/failure_type.html | 45 + doc/html/reference/types/in_place_type_t.html | 33 + doc/html/reference/types/success_type.html | 43 + doc/html/requirements.html | 79 + doc/html/sitemap.xml | 2285 +++++++++++++++++ doc/html/tags.html | 67 + doc/html/tags/adl-bridging.html | 45 + doc/html/tags/adl-bridging/page/1.html | 1 + doc/html/tags/asio.html | 47 + doc/html/tags/asio/page/1.html | 1 + doc/html/tags/awaitables.html | 45 + doc/html/tags/awaitables/page/1.html | 1 + doc/html/tags/backtrace.html | 45 + doc/html/tags/backtrace/page/1.html | 1 + doc/html/tags/best-practice.html | 45 + doc/html/tags/best-practice/page/1.html | 1 + doc/html/tags/co_await.html | 45 + doc/html/tags/co_await/page/1.html | 1 + doc/html/tags/constructors.html | 45 + doc/html/tags/constructors/page/1.html | 1 + doc/html/tags/conventions.html | 45 + doc/html/tags/conventions/page/1.html | 1 + doc/html/tags/coroutines.html | 53 + doc/html/tags/coroutines/page/1.html | 1 + doc/html/tags/default-actions.html | 45 + doc/html/tags/default-actions/page/1.html | 1 + doc/html/tags/dual-api.html | 45 + doc/html/tags/dual-api/page/1.html | 1 + doc/html/tags/eager.html | 45 + doc/html/tags/eager/page/1.html | 1 + doc/html/tags/error.html | 47 + doc/html/tags/error/page/1.html | 1 + doc/html/tags/exception.html | 45 + doc/html/tags/exception/page/1.html | 1 + doc/html/tags/has_error_code.html | 45 + doc/html/tags/has_error_code/page/1.html | 1 + doc/html/tags/hooks.html | 45 + doc/html/tags/hooks/page/1.html | 1 + doc/html/tags/idioms.html | 45 + doc/html/tags/idioms/page/1.html | 1 + doc/html/tags/lazy.html | 45 + doc/html/tags/lazy/page/1.html | 1 + doc/html/tags/make_error_code.html | 45 + doc/html/tags/make_error_code/page/1.html | 1 + doc/html/tags/namespace.html | 47 + doc/html/tags/namespace/page/1.html | 1 + doc/html/tags/networking-ts.html | 47 + doc/html/tags/networking-ts/page/1.html | 1 + doc/html/tags/nodiscard.html | 45 + doc/html/tags/nodiscard/page/1.html | 1 + doc/html/tags/outcome.html | 47 + doc/html/tags/outcome/page/1.html | 1 + doc/html/tags/page/1.html | 1 + doc/html/tags/page/2.html | 72 + doc/html/tags/page/3.html | 68 + doc/html/tags/payload.html | 47 + doc/html/tags/payload/page/1.html | 1 + doc/html/tags/playpen.html | 45 + doc/html/tags/playpen/page/1.html | 1 + doc/html/tags/policies.html | 45 + doc/html/tags/policies/page/1.html | 1 + doc/html/tags/result.html | 45 + doc/html/tags/result/page/1.html | 1 + doc/html/tags/try.html | 57 + doc/html/tags/try/page/1.html | 1 + doc/html/tags/value-or-error.html | 45 + doc/html/tags/value-or-error/page/1.html | 1 + doc/html/tags/value.html | 49 + doc/html/tags/value/page/1.html | 1 + doc/html/tutorial.html | 54 + doc/html/tutorial/advanced.html | 64 + doc/html/tutorial/advanced/constructors.html | 38 + .../advanced/constructors/file_handle.html | 103 + .../advanced/constructors/metaprogrammg1.html | 54 + .../advanced/constructors/metaprogrammg2.html | 61 + .../advanced/constructors/metaprogrammg3.html | 56 + .../constructors/static-constructor.html | 86 + .../advanced/constructors/two-phase-init.html | 56 + doc/html/tutorial/advanced/hooks.html | 139 + .../tutorial/advanced/hooks/adl_bridging.html | 64 + .../tutorial/advanced/hooks/hook_outcome.html | 72 + .../tutorial/advanced/hooks/hook_result.html | 86 + .../advanced/hooks/keeping_state.html | 78 + .../advanced/hooks/poke_exception.html | 100 + doc/html/tutorial/advanced/interop.html | 55 + .../tutorial/advanced/interop/app-go.html | 86 + .../advanced/interop/app-map-filelib.html | 70 + .../advanced/interop/app-map-httplib1.html | 97 + .../advanced/interop/app-map-httplib2.html | 94 + .../advanced/interop/app-map-tidylib.html | 66 + doc/html/tutorial/advanced/interop/app.html | 67 + .../tutorial/advanced/interop/conclusion.html | 38 + .../tutorial/advanced/interop/filelib.html | 65 + .../tutorial/advanced/interop/httplib.html | 73 + .../tutorial/advanced/interop/problem.html | 82 + .../tutorial/advanced/interop/tidylib.html | 37 + .../advanced/interop/value-or-error.html | 68 + doc/html/tutorial/advanced/payload.html | 59 + .../tutorial/advanced/payload/copy_file.html | 59 + .../tutorial/advanced/payload/copy_file2.html | 62 + .../tutorial/advanced/payload/copy_file3.html | 100 + doc/html/tutorial/essential.html | 53 + doc/html/tutorial/essential/before.html | 92 + doc/html/tutorial/essential/conventions.html | 66 + doc/html/tutorial/essential/coroutines.html | 49 + .../essential/coroutines/awaitables.html | 62 + .../essential/coroutines/co_await.html | 34 + .../essential/coroutines/returning.html | 48 + .../tutorial/essential/coroutines/try.html | 35 + doc/html/tutorial/essential/no-value.html | 90 + .../tutorial/essential/no-value/builtin.html | 151 ++ .../tutorial/essential/no-value/custom.html | 60 + doc/html/tutorial/essential/outcome.html | 85 + .../essential/outcome/inspecting.html | 49 + .../essential/outcome/layer_chart.gif | Bin 0 -> 2770 bytes doc/html/tutorial/essential/result.html | 119 + .../tutorial/essential/result/inspecting.html | 74 + doc/html/tutorial/essential/result/try.html | 82 + .../tutorial/essential/result/try_greedy.html | 50 + .../tutorial/essential/result/try_ref.html | 42 + doc/html/videos.html | 75 + 549 files changed, 29657 insertions(+) create mode 100644 doc/html/_footer.html create mode 100644 doc/html/_header.html create mode 100644 doc/html/abi-stability.html create mode 100644 doc/html/alternatives.html create mode 100644 doc/html/alternatives/error_code.html create mode 100644 doc/html/alternatives/exceptions.html create mode 100644 doc/html/alternatives/expected.html create mode 100644 doc/html/alternatives/leaf.html create mode 100644 doc/html/alternatives/outcome.html create mode 100644 doc/html/build.html create mode 100644 doc/html/categories.html create mode 100644 doc/html/categories/assignment.html create mode 100644 doc/html/categories/assignment/page/1.html create mode 100644 doc/html/categories/comparisons.html create mode 100644 doc/html/categories/comparisons/page/1.html create mode 100644 doc/html/categories/comparisons/page/2.html create mode 100644 doc/html/categories/constructors.html create mode 100644 doc/html/categories/constructors/page/1.html create mode 100644 doc/html/categories/constructors/page/2.html create mode 100644 doc/html/categories/constructors/page/3.html create mode 100644 doc/html/categories/constructors/page/4.html create mode 100644 doc/html/categories/constructors/page/5.html create mode 100644 doc/html/categories/constructors/page/6.html create mode 100644 doc/html/categories/constructors/page/7.html create mode 100644 doc/html/categories/converting-constructors.html create mode 100644 doc/html/categories/converting-constructors/page/1.html create mode 100644 doc/html/categories/converting-constructors/page/2.html create mode 100644 doc/html/categories/converting-constructors/page/3.html create mode 100644 doc/html/categories/copy-assignment.html create mode 100644 doc/html/categories/copy-assignment/page/1.html create mode 100644 doc/html/categories/copy-constructors.html create mode 100644 doc/html/categories/copy-constructors/page/1.html create mode 100644 doc/html/categories/default-constructors.html create mode 100644 doc/html/categories/default-constructors/page/1.html create mode 100644 doc/html/categories/destructors.html create mode 100644 doc/html/categories/destructors/page/1.html create mode 100644 doc/html/categories/disabling-constructors.html create mode 100644 doc/html/categories/disabling-constructors/page/1.html create mode 100644 doc/html/categories/explicit-constructors.html create mode 100644 doc/html/categories/explicit-constructors/page/1.html create mode 100644 doc/html/categories/explicit-constructors/page/2.html create mode 100644 doc/html/categories/explicit-constructors/page/3.html create mode 100644 doc/html/categories/implicit-constructors.html create mode 100644 doc/html/categories/implicit-constructors/page/1.html create mode 100644 doc/html/categories/implicit-constructors/page/2.html create mode 100644 doc/html/categories/implicit-constructors/page/3.html create mode 100644 doc/html/categories/implicit-constructors/page/4.html create mode 100644 doc/html/categories/inplace-constructors.html create mode 100644 doc/html/categories/inplace-constructors/page/1.html create mode 100644 doc/html/categories/inplace-constructors/page/2.html create mode 100644 doc/html/categories/modifiers.html create mode 100644 doc/html/categories/modifiers/page/1.html create mode 100644 doc/html/categories/move-assignment.html create mode 100644 doc/html/categories/move-assignment/page/1.html create mode 100644 doc/html/categories/move-constructors.html create mode 100644 doc/html/categories/move-constructors/page/1.html create mode 100644 doc/html/categories/observer-policies.html create mode 100644 doc/html/categories/observer-policies/page/1.html create mode 100644 doc/html/categories/observer-policies/page/2.html create mode 100644 doc/html/categories/observers.html create mode 100644 doc/html/categories/observers/page/1.html create mode 100644 doc/html/categories/observers/page/2.html create mode 100644 doc/html/categories/observers/page/3.html create mode 100644 doc/html/categories/observers/page/4.html create mode 100644 doc/html/categories/observers/page/5.html create mode 100644 doc/html/categories/observers/page/6.html create mode 100644 doc/html/categories/observers/page/7.html create mode 100644 doc/html/categories/operators.html create mode 100644 doc/html/categories/operators/page/1.html create mode 100644 doc/html/categories/page/1.html create mode 100644 doc/html/categories/page/2.html create mode 100644 doc/html/categories/special.html create mode 100644 doc/html/categories/special/page/1.html create mode 100644 doc/html/categories/tagged-constructors.html create mode 100644 doc/html/categories/tagged-constructors/page/1.html create mode 100644 doc/html/categories/tagged-constructors/page/2.html create mode 100644 doc/html/changelog.html create mode 100644 doc/html/changelog/upgrade_v21_v22.html create mode 100644 doc/html/changelog/v22.html create mode 100644 doc/html/credits.html create mode 100644 doc/html/css/boost.css create mode 100644 doc/html/css/local.css create mode 100644 doc/html/experimental.html create mode 100644 doc/html/experimental/advantages.html create mode 100644 doc/html/experimental/c-api.html create mode 100644 doc/html/experimental/c-api/from-c.html create mode 100644 doc/html/experimental/c-api/from-c/declare.html create mode 100644 doc/html/experimental/c-api/from-c/system_code.html create mode 100644 doc/html/experimental/c-api/from-c/try.html create mode 100644 doc/html/experimental/c-api/from-c/use.html create mode 100644 doc/html/experimental/c-api/from-cxx.html create mode 100644 doc/html/experimental/c-api/from-cxx/example.html create mode 100644 doc/html/experimental/c-api/from-cxx/example2.html create mode 100644 doc/html/experimental/differences.html create mode 100644 doc/html/experimental/map.html create mode 100644 doc/html/experimental/outcome.html create mode 100644 doc/html/experimental/status_result.html create mode 100644 doc/html/experimental/worked-example-long.html create mode 100644 doc/html/experimental/worked-example-long/constructor.html create mode 100644 doc/html/experimental/worked-example-long/implicit_conversion.html create mode 100644 doc/html/experimental/worked-example-long/message.html create mode 100644 doc/html/experimental/worked-example-long/preamble.html create mode 100644 doc/html/experimental/worked-example-long/source.html create mode 100644 doc/html/experimental/worked-example-long/string_ref.html create mode 100644 doc/html/experimental/worked-example-long/value_type.html create mode 100644 doc/html/experimental/worked-example.html create mode 100644 doc/html/experimental/worked-example/implicit-construction.html create mode 100644 doc/html/faq.html create mode 100644 doc/html/faq/results_arm_a53_log.png create mode 100644 doc/html/faq/results_arm_a72_log.png create mode 100644 doc/html/faq/results_silvermont_log.png create mode 100644 doc/html/faq/results_skylake_log.png create mode 100644 doc/html/history.html create mode 100644 doc/html/history/graph.png create mode 100644 doc/html/images/boost.png create mode 100644 doc/html/images/caution.png create mode 100644 doc/html/images/favicon.ico create mode 100644 doc/html/images/header-bg.png create mode 100644 doc/html/images/header-fg.png create mode 100644 doc/html/images/home.png create mode 100644 doc/html/images/important.png create mode 100644 doc/html/images/next.png create mode 100644 doc/html/images/next_disabled.png create mode 100644 doc/html/images/note.png create mode 100644 doc/html/images/prev.png create mode 100644 doc/html/images/prev_disabled.png create mode 100644 doc/html/images/space.png create mode 100644 doc/html/images/up.png create mode 100644 doc/html/images/up_disabled.png create mode 100644 doc/html/images/warning.png create mode 100644 doc/html/index.html create mode 100644 doc/html/motivation.html create mode 100644 doc/html/motivation/errno.html create mode 100644 doc/html/motivation/error_codes.html create mode 100644 doc/html/motivation/exceptions.html create mode 100644 doc/html/motivation/narrow_contract.html create mode 100644 doc/html/motivation/plug_error_code.html create mode 100644 doc/html/motivation/plug_error_code2.html create mode 100644 doc/html/motivation/std_error_code.html create mode 100644 doc/html/recipes.html create mode 100644 doc/html/recipes/asio-integration-1-70.html create mode 100644 doc/html/recipes/asio-integration.html create mode 100644 doc/html/recipes/foreign-try.html create mode 100644 doc/html/reference.html create mode 100644 doc/html/reference/aliases.html create mode 100644 doc/html/reference/aliases/boost_checked.html create mode 100644 doc/html/reference/aliases/boost_outcome.html create mode 100644 doc/html/reference/aliases/boost_result.html create mode 100644 doc/html/reference/aliases/boost_unchecked.html create mode 100644 doc/html/reference/aliases/checked.html create mode 100644 doc/html/reference/aliases/default_policy.html create mode 100644 doc/html/reference/aliases/outcome.html create mode 100644 doc/html/reference/aliases/result.html create mode 100644 doc/html/reference/aliases/std_checked.html create mode 100644 doc/html/reference/aliases/std_outcome.html create mode 100644 doc/html/reference/aliases/std_result.html create mode 100644 doc/html/reference/aliases/std_unchecked.html create mode 100644 doc/html/reference/aliases/unchecked.html create mode 100644 doc/html/reference/concepts.html create mode 100644 doc/html/reference/concepts/basic_outcome.html create mode 100644 doc/html/reference/concepts/basic_result.html create mode 100644 doc/html/reference/concepts/value_or_error.html create mode 100644 doc/html/reference/concepts/value_or_none.html create mode 100644 doc/html/reference/converters.html create mode 100644 doc/html/reference/converters/value_or_error.html create mode 100644 doc/html/reference/functions.html create mode 100644 doc/html/reference/functions/error_from_exception.html create mode 100644 doc/html/reference/functions/failure.html create mode 100644 doc/html/reference/functions/hooks.html create mode 100644 doc/html/reference/functions/hooks/hook_outcome_construction.html create mode 100644 doc/html/reference/functions/hooks/hook_outcome_construction2.html create mode 100644 doc/html/reference/functions/hooks/hook_outcome_copy_construction.html create mode 100644 doc/html/reference/functions/hooks/hook_outcome_copy_construction2.html create mode 100644 doc/html/reference/functions/hooks/hook_outcome_in_place_construction.html create mode 100644 doc/html/reference/functions/hooks/hook_outcome_move_construction.html create mode 100644 doc/html/reference/functions/hooks/hook_outcome_move_construction2.html create mode 100644 doc/html/reference/functions/hooks/hook_result_construction.html create mode 100644 doc/html/reference/functions/hooks/hook_result_copy_construction.html create mode 100644 doc/html/reference/functions/hooks/hook_result_in_place_construction.html create mode 100644 doc/html/reference/functions/hooks/hook_result_move_construction.html create mode 100644 doc/html/reference/functions/hooks/override_outcome_exception.html create mode 100644 doc/html/reference/functions/hooks/set_spare_storage.html create mode 100644 doc/html/reference/functions/hooks/spare_storage.html create mode 100644 doc/html/reference/functions/iostream.html create mode 100644 doc/html/reference/functions/iostream/outcome_operator_in.html create mode 100644 doc/html/reference/functions/iostream/outcome_operator_out.html create mode 100644 doc/html/reference/functions/iostream/outcome_print.html create mode 100644 doc/html/reference/functions/iostream/result_operator_in.html create mode 100644 doc/html/reference/functions/iostream/result_operator_out.html create mode 100644 doc/html/reference/functions/iostream/result_print.html create mode 100644 doc/html/reference/functions/policy.html create mode 100644 doc/html/reference/functions/policy/basic_outcome_failure_exception_from_error.html create mode 100644 doc/html/reference/functions/policy/error_code.html create mode 100644 doc/html/reference/functions/policy/exception_ptr.html create mode 100644 doc/html/reference/functions/policy/outcome_throw_as_system_error_with_payload_boost_enum.html create mode 100644 doc/html/reference/functions/policy/outcome_throw_as_system_error_with_payload_boost_error_code.html create mode 100644 doc/html/reference/functions/policy/outcome_throw_as_system_error_with_payload_std_enum.html create mode 100644 doc/html/reference/functions/policy/outcome_throw_as_system_error_with_payload_std_error_code.html create mode 100644 doc/html/reference/functions/strong_swap.html create mode 100644 doc/html/reference/functions/success.html create mode 100644 doc/html/reference/functions/try_operation_extract_value.html create mode 100644 doc/html/reference/functions/try_operation_has_value.html create mode 100644 doc/html/reference/functions/try_operation_return_as.html create mode 100644 doc/html/reference/functions/try_throw_std_exception_from_error.html create mode 100644 doc/html/reference/macros.html create mode 100644 doc/html/reference/macros/co_try.html create mode 100644 doc/html/reference/macros/co_try_failure_likely.html create mode 100644 doc/html/reference/macros/co_tryv.html create mode 100644 doc/html/reference/macros/co_tryv2.html create mode 100644 doc/html/reference/macros/co_tryv2_failure_likely.html create mode 100644 doc/html/reference/macros/co_tryv_failure_likely.html create mode 100644 doc/html/reference/macros/co_tryx.html create mode 100644 doc/html/reference/macros/co_tryx_failure_likely.html create mode 100644 doc/html/reference/macros/disable_execinfo.html create mode 100644 doc/html/reference/macros/enable_legacy_support_for.html create mode 100644 doc/html/reference/macros/in_place_type.html create mode 100644 doc/html/reference/macros/is_nothrow_swappable.html create mode 100644 doc/html/reference/macros/nodiscard.html create mode 100644 doc/html/reference/macros/requires.html create mode 100644 doc/html/reference/macros/symbol_visible.html create mode 100644 doc/html/reference/macros/template.html create mode 100644 doc/html/reference/macros/thread_local.html create mode 100644 doc/html/reference/macros/throw_exception.html create mode 100644 doc/html/reference/macros/try.html create mode 100644 doc/html/reference/macros/try_failure_likely.html create mode 100644 doc/html/reference/macros/tryv.html create mode 100644 doc/html/reference/macros/tryv2.html create mode 100644 doc/html/reference/macros/tryv2_failure_likely.html create mode 100644 doc/html/reference/macros/tryv_failure_likely.html create mode 100644 doc/html/reference/macros/tryx.html create mode 100644 doc/html/reference/macros/tryx_failure_likely.html create mode 100644 doc/html/reference/macros/version.html create mode 100644 doc/html/reference/policies.html create mode 100644 doc/html/reference/policies/all_narrow.html create mode 100644 doc/html/reference/policies/base.html create mode 100644 doc/html/reference/policies/base/error.html create mode 100644 doc/html/reference/policies/base/exception.html create mode 100644 doc/html/reference/policies/base/has_error.html create mode 100644 doc/html/reference/policies/base/has_error_is_errno.html create mode 100644 doc/html/reference/policies/base/has_exception.html create mode 100644 doc/html/reference/policies/base/has_value.html create mode 100644 doc/html/reference/policies/base/narrow_error_check.html create mode 100644 doc/html/reference/policies/base/narrow_exception_check.html create mode 100644 doc/html/reference/policies/base/narrow_value_check.html create mode 100644 doc/html/reference/policies/base/on_outcome_construction.html create mode 100644 doc/html/reference/policies/base/on_outcome_construction2.html create mode 100644 doc/html/reference/policies/base/on_outcome_copy_construction.html create mode 100644 doc/html/reference/policies/base/on_outcome_copy_construction2.html create mode 100644 doc/html/reference/policies/base/on_outcome_in_place_construction.html create mode 100644 doc/html/reference/policies/base/on_outcome_move_construction.html create mode 100644 doc/html/reference/policies/base/on_outcome_move_construction2.html create mode 100644 doc/html/reference/policies/base/on_result_construction.html create mode 100644 doc/html/reference/policies/base/on_result_copy_construction.html create mode 100644 doc/html/reference/policies/base/on_result_in_place_construction.html create mode 100644 doc/html/reference/policies/base/on_result_move_construction.html create mode 100644 doc/html/reference/policies/base/set_has_error.html create mode 100644 doc/html/reference/policies/base/set_has_error_is_errno.html create mode 100644 doc/html/reference/policies/base/set_has_exception.html create mode 100644 doc/html/reference/policies/base/set_has_value.html create mode 100644 doc/html/reference/policies/base/ub.html create mode 100644 doc/html/reference/policies/base/value.html create mode 100644 doc/html/reference/policies/error_code_throw_as_system_error_outcome.html create mode 100644 doc/html/reference/policies/error_code_throw_as_system_error_result.html create mode 100644 doc/html/reference/policies/exception_ptr_rethrow_outcome.html create mode 100644 doc/html/reference/policies/exception_ptr_rethrow_result.html create mode 100644 doc/html/reference/policies/fail_to_compile_observers.html create mode 100644 doc/html/reference/policies/terminate.html create mode 100644 doc/html/reference/policies/throw_bad_result_access.html create mode 100644 doc/html/reference/traits.html create mode 100644 doc/html/reference/traits/is_basic_outcome.html create mode 100644 doc/html/reference/traits/is_basic_result.html create mode 100644 doc/html/reference/traits/is_error_code_available.html create mode 100644 doc/html/reference/traits/is_error_type.html create mode 100644 doc/html/reference/traits/is_error_type_enum.html create mode 100644 doc/html/reference/traits/is_exception_ptr_available.html create mode 100644 doc/html/reference/traits/is_failure_type.html create mode 100644 doc/html/reference/traits/is_move_bitcopying.html create mode 100644 doc/html/reference/traits/is_success_type.html create mode 100644 doc/html/reference/traits/type_can_be_used_in_basic_result.html create mode 100644 doc/html/reference/types.html create mode 100644 doc/html/reference/types/awaitables/eager.html create mode 100644 doc/html/reference/types/awaitables/generator.html create mode 100644 doc/html/reference/types/awaitables/lazy.html create mode 100644 doc/html/reference/types/bad_outcome_access.html create mode 100644 doc/html/reference/types/bad_result_access.html create mode 100644 doc/html/reference/types/bad_result_access_with.html create mode 100644 doc/html/reference/types/basic_outcome.html create mode 100644 doc/html/reference/types/basic_outcome/as_failure_lvalue.html create mode 100644 doc/html/reference/types/basic_outcome/as_failure_rvalue.html create mode 100644 doc/html/reference/types/basic_outcome/assume_error_lvalue.html create mode 100644 doc/html/reference/types/basic_outcome/assume_error_lvalue_const.html create mode 100644 doc/html/reference/types/basic_outcome/assume_error_rvalue.html create mode 100644 doc/html/reference/types/basic_outcome/assume_error_rvalue_const.html create mode 100644 doc/html/reference/types/basic_outcome/assume_exception_lvalue.html create mode 100644 doc/html/reference/types/basic_outcome/assume_exception_lvalue_const.html create mode 100644 doc/html/reference/types/basic_outcome/assume_exception_rvalue.html create mode 100644 doc/html/reference/types/basic_outcome/assume_exception_rvalue_const.html create mode 100644 doc/html/reference/types/basic_outcome/assume_value_lvalue.html create mode 100644 doc/html/reference/types/basic_outcome/assume_value_lvalue_const.html create mode 100644 doc/html/reference/types/basic_outcome/assume_value_rvalue.html create mode 100644 doc/html/reference/types/basic_outcome/assume_value_rvalue_const.html create mode 100644 doc/html/reference/types/basic_outcome/copy_assignment.html create mode 100644 doc/html/reference/types/basic_outcome/copy_constructor.html create mode 100644 doc/html/reference/types/basic_outcome/default.html create mode 100644 doc/html/reference/types/basic_outcome/destructor.html create mode 100644 doc/html/reference/types/basic_outcome/disabling_catchall.html create mode 100644 doc/html/reference/types/basic_outcome/disabling_implicit_constructor.html create mode 100644 doc/html/reference/types/basic_outcome/equality_basic_outcome.html create mode 100644 doc/html/reference/types/basic_outcome/equality_basic_result.html create mode 100644 doc/html/reference/types/basic_outcome/equality_failure_type.html create mode 100644 doc/html/reference/types/basic_outcome/equality_success_type.html create mode 100644 doc/html/reference/types/basic_outcome/error_lvalue.html create mode 100644 doc/html/reference/types/basic_outcome/error_lvalue_const.html create mode 100644 doc/html/reference/types/basic_outcome/error_rvalue.html create mode 100644 doc/html/reference/types/basic_outcome/error_rvalue_const.html create mode 100644 doc/html/reference/types/basic_outcome/exception_lvalue.html create mode 100644 doc/html/reference/types/basic_outcome/exception_lvalue_const.html create mode 100644 doc/html/reference/types/basic_outcome/exception_rvalue.html create mode 100644 doc/html/reference/types/basic_outcome/exception_rvalue_const.html create mode 100644 doc/html/reference/types/basic_outcome/explicit_copy_converting_constructor.html create mode 100644 doc/html/reference/types/basic_outcome/explicit_inplace_error_constructor.html create mode 100644 doc/html/reference/types/basic_outcome/explicit_inplace_error_constructor_il.html create mode 100644 doc/html/reference/types/basic_outcome/explicit_inplace_exception_constructor.html create mode 100644 doc/html/reference/types/basic_outcome/explicit_inplace_exception_constructor_il.html create mode 100644 doc/html/reference/types/basic_outcome/explicit_inplace_value_constructor.html create mode 100644 doc/html/reference/types/basic_outcome/explicit_inplace_value_constructor_il.html create mode 100644 doc/html/reference/types/basic_outcome/explicit_move_converting_constructor.html create mode 100644 doc/html/reference/types/basic_outcome/explicit_result_copy_converting_constructor.html create mode 100644 doc/html/reference/types/basic_outcome/explicit_result_make_error_code_copy_converting_constructor.html create mode 100644 doc/html/reference/types/basic_outcome/explicit_result_make_error_code_move_converting_constructor.html create mode 100644 doc/html/reference/types/basic_outcome/explicit_result_move_converting_constructor.html create mode 100644 doc/html/reference/types/basic_outcome/explicit_valueorerror_converting_constructor.html create mode 100644 doc/html/reference/types/basic_outcome/failure.html create mode 100644 doc/html/reference/types/basic_outcome/has_error.html create mode 100644 doc/html/reference/types/basic_outcome/has_exception.html create mode 100644 doc/html/reference/types/basic_outcome/has_failure.html create mode 100644 doc/html/reference/types/basic_outcome/has_value.html create mode 100644 doc/html/reference/types/basic_outcome/implicit_error_condition_converting_constructor.html create mode 100644 doc/html/reference/types/basic_outcome/implicit_error_converting_constructor.html create mode 100644 doc/html/reference/types/basic_outcome/implicit_error_exception_converting_constructor.html create mode 100644 doc/html/reference/types/basic_outcome/implicit_exception_converting_constructor.html create mode 100644 doc/html/reference/types/basic_outcome/implicit_failure_error_copy_constructor.html create mode 100644 doc/html/reference/types/basic_outcome/implicit_failure_error_exception_copy_constructor.html create mode 100644 doc/html/reference/types/basic_outcome/implicit_failure_error_exception_move_constructor.html create mode 100644 doc/html/reference/types/basic_outcome/implicit_failure_error_make_error_code_copy_constructor.html create mode 100644 doc/html/reference/types/basic_outcome/implicit_failure_error_make_error_code_move_constructor.html create mode 100644 doc/html/reference/types/basic_outcome/implicit_failure_error_move_constructor.html create mode 100644 doc/html/reference/types/basic_outcome/implicit_failure_exception_copy_constructor.html create mode 100644 doc/html/reference/types/basic_outcome/implicit_failure_exception_move_constructor.html create mode 100644 doc/html/reference/types/basic_outcome/implicit_inplace_value_error_exception_constructor.html create mode 100644 doc/html/reference/types/basic_outcome/implicit_success_copy_constructor.html create mode 100644 doc/html/reference/types/basic_outcome/implicit_success_move_constructor.html create mode 100644 doc/html/reference/types/basic_outcome/implicit_value_converting_constructor.html create mode 100644 doc/html/reference/types/basic_outcome/inequality_basic_outcome.html create mode 100644 doc/html/reference/types/basic_outcome/inequality_basic_result.html create mode 100644 doc/html/reference/types/basic_outcome/inequality_failure_type.html create mode 100644 doc/html/reference/types/basic_outcome/inequality_success_type.html create mode 100644 doc/html/reference/types/basic_outcome/move_assignment.html create mode 100644 doc/html/reference/types/basic_outcome/move_constructor.html create mode 100644 doc/html/reference/types/basic_outcome/operator_bool.html create mode 100644 doc/html/reference/types/basic_outcome/swap.html create mode 100644 doc/html/reference/types/basic_outcome/value_lvalue.html create mode 100644 doc/html/reference/types/basic_outcome/value_lvalue_const.html create mode 100644 doc/html/reference/types/basic_outcome/value_rvalue.html create mode 100644 doc/html/reference/types/basic_outcome/value_rvalue_const.html create mode 100644 doc/html/reference/types/basic_result.html create mode 100644 doc/html/reference/types/basic_result/as_failure_lvalue.html create mode 100644 doc/html/reference/types/basic_result/as_failure_rvalue.html create mode 100644 doc/html/reference/types/basic_result/assume_error_lvalue.html create mode 100644 doc/html/reference/types/basic_result/assume_error_lvalue_const.html create mode 100644 doc/html/reference/types/basic_result/assume_error_rvalue.html create mode 100644 doc/html/reference/types/basic_result/assume_error_rvalue_const.html create mode 100644 doc/html/reference/types/basic_result/assume_value_lvalue.html create mode 100644 doc/html/reference/types/basic_result/assume_value_lvalue_const.html create mode 100644 doc/html/reference/types/basic_result/assume_value_rvalue.html create mode 100644 doc/html/reference/types/basic_result/assume_value_rvalue_const.html create mode 100644 doc/html/reference/types/basic_result/copy_assignment.html create mode 100644 doc/html/reference/types/basic_result/copy_constructor.html create mode 100644 doc/html/reference/types/basic_result/default.html create mode 100644 doc/html/reference/types/basic_result/destructor.html create mode 100644 doc/html/reference/types/basic_result/disabling_catchall.html create mode 100644 doc/html/reference/types/basic_result/disabling_implicit_constructor.html create mode 100644 doc/html/reference/types/basic_result/equality_basic_result.html create mode 100644 doc/html/reference/types/basic_result/equality_failure_type.html create mode 100644 doc/html/reference/types/basic_result/equality_success_type.html create mode 100644 doc/html/reference/types/basic_result/error_lvalue.html create mode 100644 doc/html/reference/types/basic_result/error_lvalue_const.html create mode 100644 doc/html/reference/types/basic_result/error_rvalue.html create mode 100644 doc/html/reference/types/basic_result/error_rvalue_const.html create mode 100644 doc/html/reference/types/basic_result/explicit_copy_converting_constructor.html create mode 100644 doc/html/reference/types/basic_result/explicit_inplace_error_constructor.html create mode 100644 doc/html/reference/types/basic_result/explicit_inplace_error_constructor_il.html create mode 100644 doc/html/reference/types/basic_result/explicit_inplace_value_constructor.html create mode 100644 doc/html/reference/types/basic_result/explicit_inplace_value_constructor_il.html create mode 100644 doc/html/reference/types/basic_result/explicit_make_error_code_copy_converting_constructor.html create mode 100644 doc/html/reference/types/basic_result/explicit_make_error_code_move_converting_constructor.html create mode 100644 doc/html/reference/types/basic_result/explicit_make_exception_ptr_copy_converting_constructor.html create mode 100644 doc/html/reference/types/basic_result/explicit_make_exception_ptr_move_converting_constructor.html create mode 100644 doc/html/reference/types/basic_result/explicit_move_converting_constructor.html create mode 100644 doc/html/reference/types/basic_result/explicit_valueorerror_converting_constructor.html create mode 100644 doc/html/reference/types/basic_result/has_error.html create mode 100644 doc/html/reference/types/basic_result/has_exception.html create mode 100644 doc/html/reference/types/basic_result/has_failure.html create mode 100644 doc/html/reference/types/basic_result/has_lost_consistency.html create mode 100644 doc/html/reference/types/basic_result/has_value.html create mode 100644 doc/html/reference/types/basic_result/implicit_error_condition_converting_constructor.html create mode 100644 doc/html/reference/types/basic_result/implicit_error_converting_constructor.html create mode 100644 doc/html/reference/types/basic_result/implicit_failure_copy_constructor.html create mode 100644 doc/html/reference/types/basic_result/implicit_failure_make_error_code_copy_constructor.html create mode 100644 doc/html/reference/types/basic_result/implicit_failure_make_error_code_move_constructor.html create mode 100644 doc/html/reference/types/basic_result/implicit_failure_make_exception_ptr_copy_constructor.html create mode 100644 doc/html/reference/types/basic_result/implicit_failure_make_exception_ptr_move_constructor.html create mode 100644 doc/html/reference/types/basic_result/implicit_failure_move_constructor.html create mode 100644 doc/html/reference/types/basic_result/implicit_inplace_value_error_constructor.html create mode 100644 doc/html/reference/types/basic_result/implicit_success_copy_constructor.html create mode 100644 doc/html/reference/types/basic_result/implicit_success_move_constructor.html create mode 100644 doc/html/reference/types/basic_result/implicit_value_converting_constructor.html create mode 100644 doc/html/reference/types/basic_result/inequality_basic_result.html create mode 100644 doc/html/reference/types/basic_result/inequality_failure_type.html create mode 100644 doc/html/reference/types/basic_result/inequality_success_type.html create mode 100644 doc/html/reference/types/basic_result/move_assignment.html create mode 100644 doc/html/reference/types/basic_result/move_constructor.html create mode 100644 doc/html/reference/types/basic_result/operator_bool.html create mode 100644 doc/html/reference/types/basic_result/swap.html create mode 100644 doc/html/reference/types/basic_result/value_lvalue.html create mode 100644 doc/html/reference/types/basic_result/value_lvalue_const.html create mode 100644 doc/html/reference/types/basic_result/value_rvalue.html create mode 100644 doc/html/reference/types/basic_result/value_rvalue_const.html create mode 100644 doc/html/reference/types/failure_type.html create mode 100644 doc/html/reference/types/in_place_type_t.html create mode 100644 doc/html/reference/types/success_type.html create mode 100644 doc/html/requirements.html create mode 100644 doc/html/sitemap.xml create mode 100644 doc/html/tags.html create mode 100644 doc/html/tags/adl-bridging.html create mode 100644 doc/html/tags/adl-bridging/page/1.html create mode 100644 doc/html/tags/asio.html create mode 100644 doc/html/tags/asio/page/1.html create mode 100644 doc/html/tags/awaitables.html create mode 100644 doc/html/tags/awaitables/page/1.html create mode 100644 doc/html/tags/backtrace.html create mode 100644 doc/html/tags/backtrace/page/1.html create mode 100644 doc/html/tags/best-practice.html create mode 100644 doc/html/tags/best-practice/page/1.html create mode 100644 doc/html/tags/co_await.html create mode 100644 doc/html/tags/co_await/page/1.html create mode 100644 doc/html/tags/constructors.html create mode 100644 doc/html/tags/constructors/page/1.html create mode 100644 doc/html/tags/conventions.html create mode 100644 doc/html/tags/conventions/page/1.html create mode 100644 doc/html/tags/coroutines.html create mode 100644 doc/html/tags/coroutines/page/1.html create mode 100644 doc/html/tags/default-actions.html create mode 100644 doc/html/tags/default-actions/page/1.html create mode 100644 doc/html/tags/dual-api.html create mode 100644 doc/html/tags/dual-api/page/1.html create mode 100644 doc/html/tags/eager.html create mode 100644 doc/html/tags/eager/page/1.html create mode 100644 doc/html/tags/error.html create mode 100644 doc/html/tags/error/page/1.html create mode 100644 doc/html/tags/exception.html create mode 100644 doc/html/tags/exception/page/1.html create mode 100644 doc/html/tags/has_error_code.html create mode 100644 doc/html/tags/has_error_code/page/1.html create mode 100644 doc/html/tags/hooks.html create mode 100644 doc/html/tags/hooks/page/1.html create mode 100644 doc/html/tags/idioms.html create mode 100644 doc/html/tags/idioms/page/1.html create mode 100644 doc/html/tags/lazy.html create mode 100644 doc/html/tags/lazy/page/1.html create mode 100644 doc/html/tags/make_error_code.html create mode 100644 doc/html/tags/make_error_code/page/1.html create mode 100644 doc/html/tags/namespace.html create mode 100644 doc/html/tags/namespace/page/1.html create mode 100644 doc/html/tags/networking-ts.html create mode 100644 doc/html/tags/networking-ts/page/1.html create mode 100644 doc/html/tags/nodiscard.html create mode 100644 doc/html/tags/nodiscard/page/1.html create mode 100644 doc/html/tags/outcome.html create mode 100644 doc/html/tags/outcome/page/1.html create mode 100644 doc/html/tags/page/1.html create mode 100644 doc/html/tags/page/2.html create mode 100644 doc/html/tags/page/3.html create mode 100644 doc/html/tags/payload.html create mode 100644 doc/html/tags/payload/page/1.html create mode 100644 doc/html/tags/playpen.html create mode 100644 doc/html/tags/playpen/page/1.html create mode 100644 doc/html/tags/policies.html create mode 100644 doc/html/tags/policies/page/1.html create mode 100644 doc/html/tags/result.html create mode 100644 doc/html/tags/result/page/1.html create mode 100644 doc/html/tags/try.html create mode 100644 doc/html/tags/try/page/1.html create mode 100644 doc/html/tags/value-or-error.html create mode 100644 doc/html/tags/value-or-error/page/1.html create mode 100644 doc/html/tags/value.html create mode 100644 doc/html/tags/value/page/1.html create mode 100644 doc/html/tutorial.html create mode 100644 doc/html/tutorial/advanced.html create mode 100644 doc/html/tutorial/advanced/constructors.html create mode 100644 doc/html/tutorial/advanced/constructors/file_handle.html create mode 100644 doc/html/tutorial/advanced/constructors/metaprogrammg1.html create mode 100644 doc/html/tutorial/advanced/constructors/metaprogrammg2.html create mode 100644 doc/html/tutorial/advanced/constructors/metaprogrammg3.html create mode 100644 doc/html/tutorial/advanced/constructors/static-constructor.html create mode 100644 doc/html/tutorial/advanced/constructors/two-phase-init.html create mode 100644 doc/html/tutorial/advanced/hooks.html create mode 100644 doc/html/tutorial/advanced/hooks/adl_bridging.html create mode 100644 doc/html/tutorial/advanced/hooks/hook_outcome.html create mode 100644 doc/html/tutorial/advanced/hooks/hook_result.html create mode 100644 doc/html/tutorial/advanced/hooks/keeping_state.html create mode 100644 doc/html/tutorial/advanced/hooks/poke_exception.html create mode 100644 doc/html/tutorial/advanced/interop.html create mode 100644 doc/html/tutorial/advanced/interop/app-go.html create mode 100644 doc/html/tutorial/advanced/interop/app-map-filelib.html create mode 100644 doc/html/tutorial/advanced/interop/app-map-httplib1.html create mode 100644 doc/html/tutorial/advanced/interop/app-map-httplib2.html create mode 100644 doc/html/tutorial/advanced/interop/app-map-tidylib.html create mode 100644 doc/html/tutorial/advanced/interop/app.html create mode 100644 doc/html/tutorial/advanced/interop/conclusion.html create mode 100644 doc/html/tutorial/advanced/interop/filelib.html create mode 100644 doc/html/tutorial/advanced/interop/httplib.html create mode 100644 doc/html/tutorial/advanced/interop/problem.html create mode 100644 doc/html/tutorial/advanced/interop/tidylib.html create mode 100644 doc/html/tutorial/advanced/interop/value-or-error.html create mode 100644 doc/html/tutorial/advanced/payload.html create mode 100644 doc/html/tutorial/advanced/payload/copy_file.html create mode 100644 doc/html/tutorial/advanced/payload/copy_file2.html create mode 100644 doc/html/tutorial/advanced/payload/copy_file3.html create mode 100644 doc/html/tutorial/essential.html create mode 100644 doc/html/tutorial/essential/before.html create mode 100644 doc/html/tutorial/essential/conventions.html create mode 100644 doc/html/tutorial/essential/coroutines.html create mode 100644 doc/html/tutorial/essential/coroutines/awaitables.html create mode 100644 doc/html/tutorial/essential/coroutines/co_await.html create mode 100644 doc/html/tutorial/essential/coroutines/returning.html create mode 100644 doc/html/tutorial/essential/coroutines/try.html create mode 100644 doc/html/tutorial/essential/no-value.html create mode 100644 doc/html/tutorial/essential/no-value/builtin.html create mode 100644 doc/html/tutorial/essential/no-value/custom.html create mode 100644 doc/html/tutorial/essential/outcome.html create mode 100644 doc/html/tutorial/essential/outcome/inspecting.html create mode 100644 doc/html/tutorial/essential/outcome/layer_chart.gif create mode 100644 doc/html/tutorial/essential/result.html create mode 100644 doc/html/tutorial/essential/result/inspecting.html create mode 100644 doc/html/tutorial/essential/result/try.html create mode 100644 doc/html/tutorial/essential/result/try_greedy.html create mode 100644 doc/html/tutorial/essential/result/try_ref.html create mode 100644 doc/html/videos.html diff --git a/doc/html/_footer.html b/doc/html/_footer.html new file mode 100644 index 000000000..880859589 --- /dev/null +++ b/doc/html/_footer.html @@ -0,0 +1,21 @@ + + + - Boost.Outcome documentation + + + + + +
+Up + HomeNext
+

+ + +

Last revised: January 01, 0001 at 00:00:00 UTC

+
+
+Prev + Up + HomeNext
+ diff --git a/doc/html/_header.html b/doc/html/_header.html new file mode 100644 index 000000000..dd94cceb4 --- /dev/null +++ b/doc/html/_header.html @@ -0,0 +1,22 @@ + + + - Boost.Outcome documentation + + + + + +
+Up + HomeNext
+

+

Outcome 2.2 library documentation

+ + +

Last revised: January 01, 0001 at 00:00:00 UTC

+
+
+Prev + Up + HomeNext
+ diff --git a/doc/html/abi-stability.html b/doc/html/abi-stability.html new file mode 100644 index 000000000..374fbebf8 --- /dev/null +++ b/doc/html/abi-stability.html @@ -0,0 +1,95 @@ + + +Future ABI stability guarantees - Boost.Outcome documentation + + + + + +
+Prev + Up + HomeNext
+ +

Future ABI stability guarantees

+ + +

At the end of December 2021, as had been intended and signposted from the beginning of development, standalone Outcome v2.2.3 locked its ABI such that any code built with this Outcome release shall link, without recompilation, with any code built with any future Outcome release. This means that going forth, you are guaranteed that if your library returns an outcome::result<T, E = varies, NoValuePolicy = policy::default_policy<T, E, void>> + or outcome::outcome<T, EC = varies, EP = varies, NoValuePolicy = policy::default_policy<T, EC, EP>> + from a public API, consumers of your library are guaranteed 100% compatibility with unrecompiled library binaries when using any future version of Outcome in consuming code.

+ +

This is a critical use case for many large scale production use cases in industry, and to my knowledge, no other Outcome-like alternative implements this guarantee at the time of writing1. Note also that Boost.Outcome comes with no ABI guarantees, as the dependencies within Boost that Boost.Outcome uses do not have a stable ABI guarantee.

+ +

To ensure this guarantee going forth, a per commit CI step has been added which tests Outcome against the v2.2.3 ABI using these tools:

+ + + +

Both tools are independent of one another, and whilst they test using the same mechanism (DWARF debug info extracted from an unoptimised shared library object), they have different implementations.

+ +

ABI testing implementation notes

+ +

Outcome is a header only library, so to turn Outcome into a shared library suitable as input for these tools, we compile a dummy shared library which exports APIs which use Outcome. The coverage of that dummy shared library of Outcome is therefore what is actually ABI tested, rather than of Outcome itself. The dummy library locks the ABI for:

+ + + +

Obviously anything which any of these types touch in their implementation also gets locked in ABI, in so far as the ABI tool can deduce dependent types. If you examine the source code for the dummy shared library, you will see that we go out of our way to encode explicit lists of dependent types in template parameters, to ensure that the ABI tool definitely discovers everything.

+ +
+
note
+

Outcome.Experimental has no ABI guarantees, as WG21 LEWG is actively modifying its design as it approaches the C++ standard.

+
+
+ + +

The following targets are tested for ABI stability:

+ +
    +
  1. GCC 7.5 with libstdc++ configured with the C++ 14 standard and x64 architecture.

  2. + +
  3. GCC 9.3 with libstdc++ configured with the C++ 17 standard and x64 architecture.

  4. +
+ +

At the time of writing, no POSIX implementation has guaranteed stability on its C++ 20 standard library ABI, so we do not test that.

+ +

There is currently no CI coverage of MSVC ABI stability. The ABI compliance checker can test MSVC binaries for ABI stability, however raising the ABI compliance checker on a Github Actions Windows test runner is quite a lot of work. Donations of sufficient test scripting would be welcome. Note that because the Windows and POSIX implementation is almost the same, ABI stability on POSIX will have strong impact on MSVC ABI stability i.e. MSVC ABI is unlikely to break, albeit without CI testing there are no guarantees.

+
+ +
+ +
    +
  1. libstdc++ implements a strong ABI stability guarantee and thus any future std::expected<T, E> implementation it provides will be ABI stable. However Expected offers only a small subset of the functionality which outcome::result<T, E> provides. + [return]
  2. +
+
+ + + +

Last revised: December 15, 2021 at 11:47:12 UTC

+
+
+Prev + Up + HomeNext
+ diff --git a/doc/html/alternatives.html b/doc/html/alternatives.html new file mode 100644 index 000000000..336fdf99d --- /dev/null +++ b/doc/html/alternatives.html @@ -0,0 +1,45 @@ + + +Review of Error Handling Frameworks - Boost.Outcome documentation + + + + + +
+Prev + Up + HomeNext
+ +

Review of Error Handling Frameworks

+

Outcome started life in 2014, entered Boost as Boost.Outcome in 2018, and therefore was amongst the very first of the major alternative error handling frameworks to standard exception throws in C++. Since then, and sometimes in reaction to Outcome’s choice of design, alternative frameworks have appeared. This page tries to give a fairly even handed summary of those alternatives, and how they compare to Outcome in this author’s opinion.

+ +

These are listed in order of approximate availability to the C++ ecosystem i.e. in order of appearance.

+ +
  1. + std exception throws +

    Advantages and disadvantages of C++ exception throws

  2. + std error codes +

    Advantages and disadvantages of std::error_code

  3. + std expected +

    Advantages and disadvantages of std::expected<T, E>

  4. + Outcome (proposed std result) +

    Advantages and disadvantages of Outcome and its proposed std::result<T>

  5. + LEAF +

    Advantages and disadvantages of Lightweight Error Augmentation Framework

+ +

My thanks to Emil Dotchevski for reviewing this summary and providing notes.

+ + + + + + + +

Last revised: January 10, 2022 at 14:29:13 UTC

+
+
+Prev + Up + HomeNext
+ diff --git a/doc/html/alternatives/error_code.html b/doc/html/alternatives/error_code.html new file mode 100644 index 000000000..9140489af --- /dev/null +++ b/doc/html/alternatives/error_code.html @@ -0,0 +1,63 @@ + + +std error codes - Boost.Outcome documentation + + + + + +
+Prev + Up + HomeNext
+

std error codes

+ + +

std::error_code came originally from boost::error_code which was designed around 2008 as part of implementing Filesystem and Networking. They are a simple trivially copyable type offering improved type safety and functionality over C enumerations. You can read more about how std::error_code works here. They were standardised in the C++ 11 standard, and have been available in Boost since 2008.

+ +

Pros:

+ + + +

Cons:

+ + + +

(Note that this long list of design caveats is what led to the proposed superseding of std::error_code with std::error, which you can use today in Outcome.Experimental. See this page for more information).

+ + +

Last revised: January 10, 2022 at 14:29:13 UTC

+
+
+Prev + Up + HomeNext
+ diff --git a/doc/html/alternatives/exceptions.html b/doc/html/alternatives/exceptions.html new file mode 100644 index 000000000..25e911cdd --- /dev/null +++ b/doc/html/alternatives/exceptions.html @@ -0,0 +1,57 @@ + + +std exception throws - Boost.Outcome documentation + + + + + +
+Prev + Up + HomeNext
+

std exception throws

+ + +

(Note that we assume a table-based EH implementation here, a SJLJ EH implementaton would have even happy and sad path runtime overhead. Table-based EH implementations are almost universal on x64, ARM and AArch64 targets).

+ +

C++ exception throws came in the original C++ 98 standard – at that time, not all the major compilers implemented them yet, and several of those who did did not have efficient implementations, plus in the original days some compiler vendors still patented things like EH implementation techniques to try and maintain a competitive advantage over rival compilers. Unlike other C++ features, enabling C++ exceptions on a code base not written with them in mind is not safe, so this led to the C++ ecosystem becoming bifurcated into exceptions-enabled and exceptions-disabled camps.

+ +

Pros:

+ + + +

Cons:

+ + + + +

Last revised: January 10, 2022 at 14:29:13 UTC

+
+
+Prev + Up + HomeNext
+ diff --git a/doc/html/alternatives/expected.html b/doc/html/alternatives/expected.html new file mode 100644 index 000000000..50824d50d --- /dev/null +++ b/doc/html/alternatives/expected.html @@ -0,0 +1,69 @@ + + +std expected - Boost.Outcome documentation + + + + + +
+Prev + Up + HomeNext
+

std expected

+ + +

std::expected<T, E> came originally from an experimental monadic and generic programming library outside of Boost written by Boost and WG21 developers around 2013. Before Outcome v1, I deployed the then Expected into a large codebase and I was dismayed with the results, especially on build times. You can read here how those experiences led me to develop Outcome v1.

+ +

std::expected<T, E> is a constrained variant type with a strong preference for the successful type T which it models like a std::optional<T>. If, however, there is no T value then it supplies an ‘unexpected’ E value instead. std::expected<T, E> was standardised in the C++ 23 standard.

+ +

Outcome’s Result type can be configured to act just like Expected if you want that, however ultimately Outcome’s Result doesn’t solve the same problem as Expected, plus Outcome models std::variant<T, E> rather than std::optional<T> which we think much superior for many use cases, which to summarise:

+ + + +

Outcome recognises Expected-like types and will construct from them, which aids interoperability.

+ +

Pros:

+ + + +

Cons:

+ + + + +

Last revised: January 10, 2022 at 14:29:13 UTC

+
+
+Prev + Up + HomeNext
+ diff --git a/doc/html/alternatives/leaf.html b/doc/html/alternatives/leaf.html new file mode 100644 index 000000000..202c40767 --- /dev/null +++ b/doc/html/alternatives/leaf.html @@ -0,0 +1,84 @@ + + +LEAF - Boost.Outcome documentation + + + + + +
+Prev + Up + HomeNext
+

LEAF

+ + +

As much as Outcome originated in a negative reaction to the then originally proposed std::expected<T, E>, LEAF originated in a negative reaction to Outcome. Some of the perceived issues with Outcome were (LEAF’s own rendition of this can be viewed here):

+ + + +

LEAF therefore looks more like standard C++ exception handling, but without the non-deterministic sad path at the cost of a slight impact on happy path runtime performance. LEAF’s current design was completed in 2020.

+ +

If you need an error handling framework which has predictable sad path overhead unlike C++ exceptions, but you otherwise want similar syntax and use experience to C++ exceptions, LEAF is a very solid choice.

+ +

Pros:

+ + + +

Cons:

+ + +
+ +
+ +
    +
  1. In Outcome, it is strongly recommended that one chooses a single universal error type for all public APIs such as std::error_code or error from Experimental.Outcome, so if the programmer is disciplined then the function signature does not expose internal error types. Such single universal error types type erase the original error object, but still allow the original error object to be inspected. This avoids ‘exception specifications’ which are widely known to not scale well. + [return]
  2. +
  3. A global synchronised ring buffer implementation does not ship with LEAF, however LEAF exposes customisation points for a bespoke thread local storage implementation which makes implementing one very straightforward. + [return]
  4. +
  5. std::error_code construction touches a magic static or calls an extern function, and therefore Outcome when combined with std::error_code also sees a codegen pessimisation. Experimental Outcome’s error fixes this historical oversight. + [return]
  6. +
+
+ + +

Last revised: January 10, 2022 at 14:29:13 UTC

+
+
+Prev + Up + HomeNext
+ diff --git a/doc/html/alternatives/outcome.html b/doc/html/alternatives/outcome.html new file mode 100644 index 000000000..006586bbf --- /dev/null +++ b/doc/html/alternatives/outcome.html @@ -0,0 +1,94 @@ + + +Outcome (proposed std result) - Boost.Outcome documentation + + + + + +
+Prev + Up + HomeNext
+

Outcome (proposed std result)

+
+
+
+
+
+
+
+
Pros:
+
Cons:
+
+
+
+
+
+ + +

Outcome (the library described by this documentation) originated in a negative reaction to then originally proposed std::expected<T, E>, though what got eventually standardised as std::expected<T, E> looks much more like Outcome’s result<T, E> than the original Expected. You can read here how those experiences led me to develop Outcome v1. Outcome comes in both standalone and Boost editions, and its current design was completed in 2018.

+ +

Outcome’s core is two workhorse types and a macro:

+ + + +

These three core items are then mixed into a veritable cornucopia of convenience typedefs and variations to support a wide range of use cases, including in C++ coroutines, plus there is extensive plumbing and customisation points for deciding how incompatible types ought to interact, or being notified of lifecycle events (e.g. capture a stack backtrace if a result<T, E> is constructed with an error).

+ +

Outcome perfectly propagates constexpr, triviality and noexcept-ness of each individual operation of the types you configure it with. It never touches dynamic memory allocation, and it has been carefully written so the compiler will optimise it out of codegen entirely wherever that is possible. It is capable of ‘true moves’ for types which declare themselves ‘move bitcopying compatible’ i.e. destructor calls on moved-from values are elided. ‘True moves’ can have a game changing performance gain on types with virtual destructors.

+ +

Outcome takes a lot of care to have the least possible impact on build times, and it guarantees that a binary built with it will have stable ABI so it is safe to use in really large C++ codebases (standalone edition only). For interoperation with other languages, it guarantees that C code can work with Outcome data types, and it provides a C macro API header file to help with that.

+ +

Outcome recognises Expected-like types and will construct from them, which aids interoperability. A simplified Result type is proposed for standardisation as std::result<T> where the E type is hard coded to a proposed std::error. This proposed standardisation has been deployed on billions of devices at the time of writing, and you can use it today via Experimental.Outcome, the reference implementation.

+ +

Pros:

+ + + +

Cons:

+ + + + +

Last revised: January 10, 2022 at 14:29:13 UTC

+
+
+Prev + Up + HomeNext
+ diff --git a/doc/html/build.html b/doc/html/build.html new file mode 100644 index 000000000..063a725bb --- /dev/null +++ b/doc/html/build.html @@ -0,0 +1,220 @@ + + +Build and install - Boost.Outcome documentation + + + + + +
+Prev + Up + HomeNext
+ +

Build and install

+ + +

Usage as a single header file

+ +

Outcome v2 comes in single header file form. This is regenerated per commit. To fetch +on Linux:

+ +
wget https://github.com/ned14/outcome/raw/master/single-header/outcome.hpp
+
+ +

On BSD:

+ +
fetch https://github.com/ned14/outcome/raw/master/single-header/outcome.hpp
+
+ +

If you have curl installed:

+ +
curl -O -J -L https://github.com/ned14/outcome/raw/master/single-header/outcome.hpp
+
+ +

Otherwise, simply download the raw file from above and place it wherever it suits you. +If you might be debugging using Microsoft Visual Studio, you may find the debugger +visualisation file at https://github.com/ned14/outcome/raw/master/include/outcome/outcome.natvis +useful to include into your build.

+ +

Usage from the vcpkg package manager

+ +

This is particularly easy, and works on Mac OS, Linux and Microsoft Windows:

+ +
vcpkg install outcome
+
+ +

Outcome appears at <boost/outcome/outcome.hpp>. This is a full copy of Outcome, so +Experimental Outcome and all the usual headers are where you would expect.

+ +

Usage from the Conan package manager

+ +

(thanks to Théo Delrieu for contributing this support)

+ +

At the command line, add the bintray repo for Outcome to conan:

+ +
conan remote add outcome https://api.bintray.com/conan/ned14/Outcome
+
+ +

Now simply add this to your Conan build:

+ +
[requires]
+Outcome/master@ned14/stable
+
+ +

Outcome will be made available by Conan at <outcome.hpp>.

+ +

Usage from the cmake hunter package manager

+ +

Outcome has not been submitted to the main cmake hunter package manager repo yet. +You can however add it as a git submodule:

+ +
cd yourthirdpartyrepodir
+git submodule add https://github.com/ned14/quickcpplib
+git submodule add https://github.com/ned14/outcome
+cd ..
+git submodule update --init --recursive
+
+ +

Now tell cmake hunter about a git submoduled cmake hunter package by +adding to your project’s cmake/Hunter/config.cmake:

+ +
hunter_config(quickcpplib GIT_SUBMODULE "yourthirdpartyrepodir/quickcpplib")
+hunter_config(outcome GIT_SUBMODULE "yourthirdpartyrepodir/outcome")
+
+ +

… and finally to your CMakeLists.txt, now add outcome as if it were +an ordinary cmake hunter package:

+ +
hunter_add_package(quickcpplib)
+find_package(quickcpplib CONFIG REQUIRED)
+hunter_add_package(outcome)
+find_package(outcome CONFIG REQUIRED)
+
+ +

Now you tell cmake to link to outcome as usual (see below for cmake targets):

+ +
target_link_libraries(mytarget outcome::hl)
+
+ +

Usage as a git submodule

+ +

If you are very keen on tracking very latest Outcome, you can add it as a git +submodule to your project so you can keep abreast of bug fixes. Here is how:

+ +
git submodule add https://github.com/ned14/outcome
+cd outcome
+git checkout master
+git submodule update --init --recursive
+
+ +

After this you can bring Outcome into your code using:

+ +
#include "outcome/single-header/outcome.hpp"
+
+ +

That’s it, you are ready to go. From time to time, you may wish to update to +latest:

+ +
cd outcome
+git pull
+git submodule update
+
+ +

Usage as a stable source tarball

+ +

If you would prefer a single source tarball of the stable and develop branches +known to have had all unit tests passing on all platforms, containing all the +documentation, tests and sources, this can always be retrieved from:

+ +

https://github.com/ned14/outcome/releases

+ +

This tarball is automatically generated when Outcome fully compiles and passes +all unit tests on all platforms tested by the CIs. This currently includes:

+ + + +

All unit tests are executed under the Address and Undefined Behaviour sanitisers.

+ +

It should be emphasised that newer compilers are not tested, so there is +an unlikely chance that the tarball may not work on a newer compiler.

+ +
+ +

Running the unit test suite

+ +

To run the unit test suite you will need cmake 3.3 or later installed.

+ +
mkdir build
+cd build
+cmake ..
+cmake --build .
+ctest
+
+ +

On some cmake generators (Visual Studio, Xcode) you may need to tell cmake build a configuration +like Release or Debug. Similarly, ctest needs to be told the same e.g.

+ +
mkdir build
+cd build
+cmake ..
+cmake --build . --config Release
+ctest -C Release
+
+ +

Per commit, tests are run by Travis and uploaded to a CDash dashboard here.

+ +
+ +

CMake find_package() imported targets support

+ +

Outcome fully complies with cmake install, so by installing Outcome, it can be +found by cmake’s find_package().

+ +
mkdir build
+cd build
+cmake ..
+cmake --build .
+sudo cmake --build . --target install
+
+ +

Modular CMake build support

+ +

If you are using Outcome in a CMake project, Outcome is a “modular cmake” project +using only modern cmake 3 throughout. This lets you add the Outcome directory as a +cmake subdirectory with no unexpected consequence on the rest of your cmake. You will need +to be using cmake 3.3 or better.

+ +
add_subdirectory(
+  "${CMAKE_CURRENT_SOURCE_DIR}/outcome"  # path to outcome source
+  "${CMAKE_CURRENT_BINARY_DIR}/outcome"  # your choice of where to put binaries
+  EXCLUDE_FROM_ALL                       # please only lazy build outcome on demand
+)
+
+ +

Outcome’s cmake has the following useful products:

+ + + + + +

Last revised: April 02, 2021 at 11:06:20 +0100

+
+
+Prev + Up + HomeNext
+ diff --git a/doc/html/categories.html b/doc/html/categories.html new file mode 100644 index 000000000..81801c4bd --- /dev/null +++ b/doc/html/categories.html @@ -0,0 +1,67 @@ + + +Categories - Boost.Outcome documentation + + + + + +
+ + HomeNext
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +

Last revised: March 03, 2019 at 00:11:47 UTC

+
+
+Prev + + HomeNext
+ diff --git a/doc/html/categories/assignment.html b/doc/html/categories/assignment.html new file mode 100644 index 000000000..799cad3ca --- /dev/null +++ b/doc/html/categories/assignment.html @@ -0,0 +1,51 @@ + + +Assignment - Boost.Outcome documentation + + + + + +
+ + HomeNext
+ + + +
+ + +
+ + + + + + + + + + + +
+ + + + + + +

Last revised: March 03, 2019 at 00:11:47 UTC

+
+
+Prev + + HomeNext
+ diff --git a/doc/html/categories/assignment/page/1.html b/doc/html/categories/assignment/page/1.html new file mode 100644 index 000000000..fb68b01fe --- /dev/null +++ b/doc/html/categories/assignment/page/1.html @@ -0,0 +1 @@ +/categories/assignment.html \ No newline at end of file diff --git a/doc/html/categories/comparisons.html b/doc/html/categories/comparisons.html new file mode 100644 index 000000000..ea2ec1f81 --- /dev/null +++ b/doc/html/categories/comparisons.html @@ -0,0 +1,67 @@ + + +Comparisons - Boost.Outcome documentation + + + + + +
+ + HomeNext
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +

Last revised: January 20, 2019 at 16:02:33 UTC

+
+
+Prev + + HomeNext
+ diff --git a/doc/html/categories/comparisons/page/1.html b/doc/html/categories/comparisons/page/1.html new file mode 100644 index 000000000..44bb41aa3 --- /dev/null +++ b/doc/html/categories/comparisons/page/1.html @@ -0,0 +1 @@ +/categories/comparisons.html \ No newline at end of file diff --git a/doc/html/categories/comparisons/page/2.html b/doc/html/categories/comparisons/page/2.html new file mode 100644 index 000000000..110fa0539 --- /dev/null +++ b/doc/html/categories/comparisons/page/2.html @@ -0,0 +1,56 @@ + + +Comparisons - Boost.Outcome documentation + + + + + +
+Prev + + HomeNext
+ + + +
+ + +
+ + + + + + + + + + + +
+ + + + + + +

Last revised: January 31, 2019 at 01:07:35 UTC

+
+
+Prev + + HomeNext
+ diff --git a/doc/html/categories/constructors.html b/doc/html/categories/constructors.html new file mode 100644 index 000000000..033a1f8cf --- /dev/null +++ b/doc/html/categories/constructors.html @@ -0,0 +1,67 @@ + + +Constructors - Boost.Outcome documentation + + + + + +
+ + HomeNext
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +

Last revised: December 17, 2020 at 11:27:06 UTC

+
+
+Prev + + HomeNext
+ diff --git a/doc/html/categories/constructors/page/1.html b/doc/html/categories/constructors/page/1.html new file mode 100644 index 000000000..97279bd31 --- /dev/null +++ b/doc/html/categories/constructors/page/1.html @@ -0,0 +1 @@ +/categories/constructors.html \ No newline at end of file diff --git a/doc/html/categories/constructors/page/2.html b/doc/html/categories/constructors/page/2.html new file mode 100644 index 000000000..a4f45f3f9 --- /dev/null +++ b/doc/html/categories/constructors/page/2.html @@ -0,0 +1,72 @@ + + +Constructors - Boost.Outcome documentation + + + + + +
+Prev + + HomeNext
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +

Last revised: March 03, 2019 at 00:11:47 UTC

+
+
+Prev + + HomeNext
+ diff --git a/doc/html/categories/constructors/page/3.html b/doc/html/categories/constructors/page/3.html new file mode 100644 index 000000000..98a2bb54c --- /dev/null +++ b/doc/html/categories/constructors/page/3.html @@ -0,0 +1,72 @@ + + +Constructors - Boost.Outcome documentation + + + + + +
+Prev + + HomeNext
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +

Last revised: December 17, 2020 at 11:27:06 UTC

+
+
+Prev + + HomeNext
+ diff --git a/doc/html/categories/constructors/page/4.html b/doc/html/categories/constructors/page/4.html new file mode 100644 index 000000000..deba9937a --- /dev/null +++ b/doc/html/categories/constructors/page/4.html @@ -0,0 +1,72 @@ + + +Constructors - Boost.Outcome documentation + + + + + +
+Prev + + HomeNext
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +

Last revised: December 17, 2020 at 11:27:06 UTC

+
+
+Prev + + HomeNext
+ diff --git a/doc/html/categories/constructors/page/5.html b/doc/html/categories/constructors/page/5.html new file mode 100644 index 000000000..83f4652f0 --- /dev/null +++ b/doc/html/categories/constructors/page/5.html @@ -0,0 +1,72 @@ + + +Constructors - Boost.Outcome documentation + + + + + +
+Prev + + HomeNext
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +

Last revised: December 17, 2020 at 11:27:06 UTC

+
+
+Prev + + HomeNext
+ diff --git a/doc/html/categories/constructors/page/6.html b/doc/html/categories/constructors/page/6.html new file mode 100644 index 000000000..50af681fa --- /dev/null +++ b/doc/html/categories/constructors/page/6.html @@ -0,0 +1,72 @@ + + +Constructors - Boost.Outcome documentation + + + + + +
+Prev + + HomeNext
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +

Last revised: December 17, 2020 at 11:27:06 UTC

+
+
+Prev + + HomeNext
+ diff --git a/doc/html/categories/constructors/page/7.html b/doc/html/categories/constructors/page/7.html new file mode 100644 index 000000000..cdc876b62 --- /dev/null +++ b/doc/html/categories/constructors/page/7.html @@ -0,0 +1,52 @@ + + +Constructors - Boost.Outcome documentation + + + + + +
+Prev + + HomeNext
+ + + +
+ + +
+ + + + + + + +
+ + + + + + +

Last revised: December 17, 2020 at 11:27:06 UTC

+
+
+Prev + + HomeNext
+ diff --git a/doc/html/categories/converting-constructors.html b/doc/html/categories/converting-constructors.html new file mode 100644 index 000000000..5be5bf2e4 --- /dev/null +++ b/doc/html/categories/converting-constructors.html @@ -0,0 +1,67 @@ + + +Converting Constructors - Boost.Outcome documentation + + + + + +
+ + HomeNext
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +

Last revised: December 17, 2020 at 11:27:06 UTC

+
+
+Prev + + HomeNext
+ diff --git a/doc/html/categories/converting-constructors/page/1.html b/doc/html/categories/converting-constructors/page/1.html new file mode 100644 index 000000000..9faa210b3 --- /dev/null +++ b/doc/html/categories/converting-constructors/page/1.html @@ -0,0 +1 @@ +/categories/converting-constructors.html \ No newline at end of file diff --git a/doc/html/categories/converting-constructors/page/2.html b/doc/html/categories/converting-constructors/page/2.html new file mode 100644 index 000000000..e166ce5e7 --- /dev/null +++ b/doc/html/categories/converting-constructors/page/2.html @@ -0,0 +1,72 @@ + + +Converting Constructors - Boost.Outcome documentation + + + + + +
+Prev + + HomeNext
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +

Last revised: December 17, 2020 at 11:27:06 UTC

+
+
+Prev + + HomeNext
+ diff --git a/doc/html/categories/converting-constructors/page/3.html b/doc/html/categories/converting-constructors/page/3.html new file mode 100644 index 000000000..75e941515 --- /dev/null +++ b/doc/html/categories/converting-constructors/page/3.html @@ -0,0 +1,52 @@ + + +Converting Constructors - Boost.Outcome documentation + + + + + +
+Prev + + HomeNext
+ + + +
+ + +
+ + + + + + + +
+ + + + + + +

Last revised: December 17, 2020 at 11:27:06 UTC

+
+
+Prev + + HomeNext
+ diff --git a/doc/html/categories/copy-assignment.html b/doc/html/categories/copy-assignment.html new file mode 100644 index 000000000..5e30c7060 --- /dev/null +++ b/doc/html/categories/copy-assignment.html @@ -0,0 +1,47 @@ + + +Copy Assignment - Boost.Outcome documentation + + + + + +
+ + HomeNext
+ + + +
+ + +
+ + + + + + + +
+ + + + + + +

Last revised: March 03, 2019 at 00:11:47 UTC

+
+
+Prev + + HomeNext
+ diff --git a/doc/html/categories/copy-assignment/page/1.html b/doc/html/categories/copy-assignment/page/1.html new file mode 100644 index 000000000..cc49505a5 --- /dev/null +++ b/doc/html/categories/copy-assignment/page/1.html @@ -0,0 +1 @@ +/categories/copy-assignment.html \ No newline at end of file diff --git a/doc/html/categories/copy-constructors.html b/doc/html/categories/copy-constructors.html new file mode 100644 index 000000000..a85a8fc9c --- /dev/null +++ b/doc/html/categories/copy-constructors.html @@ -0,0 +1,47 @@ + + +Copy Constructors - Boost.Outcome documentation + + + + + +
+ + HomeNext
+ + + +
+ + +
+ + + + + + + +
+ + + + + + +

Last revised: March 03, 2019 at 00:11:47 UTC

+
+
+Prev + + HomeNext
+ diff --git a/doc/html/categories/copy-constructors/page/1.html b/doc/html/categories/copy-constructors/page/1.html new file mode 100644 index 000000000..f24eaeba2 --- /dev/null +++ b/doc/html/categories/copy-constructors/page/1.html @@ -0,0 +1 @@ +/categories/copy-constructors.html \ No newline at end of file diff --git a/doc/html/categories/default-constructors.html b/doc/html/categories/default-constructors.html new file mode 100644 index 000000000..9eeded737 --- /dev/null +++ b/doc/html/categories/default-constructors.html @@ -0,0 +1,47 @@ + + +Default Constructors - Boost.Outcome documentation + + + + + +
+ + HomeNext
+ + + +
+ + +
+ + + + + + + +
+ + + + + + +

Last revised: December 15, 2018 at 17:49:37 UTC

+
+
+Prev + + HomeNext
+ diff --git a/doc/html/categories/default-constructors/page/1.html b/doc/html/categories/default-constructors/page/1.html new file mode 100644 index 000000000..34fc2b4c1 --- /dev/null +++ b/doc/html/categories/default-constructors/page/1.html @@ -0,0 +1 @@ +/categories/default-constructors.html \ No newline at end of file diff --git a/doc/html/categories/destructors.html b/doc/html/categories/destructors.html new file mode 100644 index 000000000..5d7b80dbd --- /dev/null +++ b/doc/html/categories/destructors.html @@ -0,0 +1,47 @@ + + +Destructors - Boost.Outcome documentation + + + + + +
+ + HomeNext
+ + + +
+ + +
+ + + + + + + +
+ + + + + + +

Last revised: December 15, 2018 at 17:49:37 UTC

+
+
+Prev + + HomeNext
+ diff --git a/doc/html/categories/destructors/page/1.html b/doc/html/categories/destructors/page/1.html new file mode 100644 index 000000000..138208598 --- /dev/null +++ b/doc/html/categories/destructors/page/1.html @@ -0,0 +1 @@ +/categories/destructors.html \ No newline at end of file diff --git a/doc/html/categories/disabling-constructors.html b/doc/html/categories/disabling-constructors.html new file mode 100644 index 000000000..d102794cd --- /dev/null +++ b/doc/html/categories/disabling-constructors.html @@ -0,0 +1,51 @@ + + +Disabling Constructors - Boost.Outcome documentation + + + + + +
+ + HomeNext
+ + + +
+ + +
+ + + + + + + + + + + +
+ + + + + + +

Last revised: December 15, 2018 at 17:49:37 UTC

+
+
+Prev + + HomeNext
+ diff --git a/doc/html/categories/disabling-constructors/page/1.html b/doc/html/categories/disabling-constructors/page/1.html new file mode 100644 index 000000000..82d6024dd --- /dev/null +++ b/doc/html/categories/disabling-constructors/page/1.html @@ -0,0 +1 @@ +/categories/disabling-constructors.html \ No newline at end of file diff --git a/doc/html/categories/explicit-constructors.html b/doc/html/categories/explicit-constructors.html new file mode 100644 index 000000000..b2da0cff7 --- /dev/null +++ b/doc/html/categories/explicit-constructors.html @@ -0,0 +1,67 @@ + + +Explicit Constructors - Boost.Outcome documentation + + + + + +
+ + HomeNext
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +

Last revised: December 17, 2020 at 11:27:06 UTC

+
+
+Prev + + HomeNext
+ diff --git a/doc/html/categories/explicit-constructors/page/1.html b/doc/html/categories/explicit-constructors/page/1.html new file mode 100644 index 000000000..2930f6c8d --- /dev/null +++ b/doc/html/categories/explicit-constructors/page/1.html @@ -0,0 +1 @@ +/categories/explicit-constructors.html \ No newline at end of file diff --git a/doc/html/categories/explicit-constructors/page/2.html b/doc/html/categories/explicit-constructors/page/2.html new file mode 100644 index 000000000..bfa66c0fc --- /dev/null +++ b/doc/html/categories/explicit-constructors/page/2.html @@ -0,0 +1,72 @@ + + +Explicit Constructors - Boost.Outcome documentation + + + + + +
+Prev + + HomeNext
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +

Last revised: December 17, 2020 at 11:27:06 UTC

+
+
+Prev + + HomeNext
+ diff --git a/doc/html/categories/explicit-constructors/page/3.html b/doc/html/categories/explicit-constructors/page/3.html new file mode 100644 index 000000000..934c8e9e7 --- /dev/null +++ b/doc/html/categories/explicit-constructors/page/3.html @@ -0,0 +1,56 @@ + + +Explicit Constructors - Boost.Outcome documentation + + + + + +
+Prev + + HomeNext
+ + + +
+ + +
+ + + + + + + + + + + +
+ + + + + + +

Last revised: December 17, 2020 at 11:27:06 UTC

+
+
+Prev + + HomeNext
+ diff --git a/doc/html/categories/implicit-constructors.html b/doc/html/categories/implicit-constructors.html new file mode 100644 index 000000000..01ca0ed71 --- /dev/null +++ b/doc/html/categories/implicit-constructors.html @@ -0,0 +1,67 @@ + + +Implicit Constructors - Boost.Outcome documentation + + + + + +
+ + HomeNext
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +

Last revised: December 17, 2020 at 11:27:06 UTC

+
+
+Prev + + HomeNext
+ diff --git a/doc/html/categories/implicit-constructors/page/1.html b/doc/html/categories/implicit-constructors/page/1.html new file mode 100644 index 000000000..bd87ad19b --- /dev/null +++ b/doc/html/categories/implicit-constructors/page/1.html @@ -0,0 +1 @@ +/categories/implicit-constructors.html \ No newline at end of file diff --git a/doc/html/categories/implicit-constructors/page/2.html b/doc/html/categories/implicit-constructors/page/2.html new file mode 100644 index 000000000..f4aef37ef --- /dev/null +++ b/doc/html/categories/implicit-constructors/page/2.html @@ -0,0 +1,72 @@ + + +Implicit Constructors - Boost.Outcome documentation + + + + + +
+Prev + + HomeNext
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +

Last revised: December 17, 2020 at 11:27:06 UTC

+
+
+Prev + + HomeNext
+ diff --git a/doc/html/categories/implicit-constructors/page/3.html b/doc/html/categories/implicit-constructors/page/3.html new file mode 100644 index 000000000..76524e34b --- /dev/null +++ b/doc/html/categories/implicit-constructors/page/3.html @@ -0,0 +1,72 @@ + + +Implicit Constructors - Boost.Outcome documentation + + + + + +
+Prev + + HomeNext
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +

Last revised: January 17, 2019 at 21:24:36 UTC

+
+
+Prev + + HomeNext
+ diff --git a/doc/html/categories/implicit-constructors/page/4.html b/doc/html/categories/implicit-constructors/page/4.html new file mode 100644 index 000000000..63d77e3c6 --- /dev/null +++ b/doc/html/categories/implicit-constructors/page/4.html @@ -0,0 +1,56 @@ + + +Implicit Constructors - Boost.Outcome documentation + + + + + +
+Prev + + HomeNext
+ + + +
+ + +
+ + + + + + + + + + + +
+ + + + + + +

Last revised: December 17, 2020 at 11:27:06 UTC

+
+
+Prev + + HomeNext
+ diff --git a/doc/html/categories/inplace-constructors.html b/doc/html/categories/inplace-constructors.html new file mode 100644 index 000000000..46ea0cf44 --- /dev/null +++ b/doc/html/categories/inplace-constructors.html @@ -0,0 +1,67 @@ + + +Inplace Constructors - Boost.Outcome documentation + + + + + +
+ + HomeNext
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +

Last revised: December 17, 2020 at 11:27:06 UTC

+
+
+Prev + + HomeNext
+ diff --git a/doc/html/categories/inplace-constructors/page/1.html b/doc/html/categories/inplace-constructors/page/1.html new file mode 100644 index 000000000..636b25284 --- /dev/null +++ b/doc/html/categories/inplace-constructors/page/1.html @@ -0,0 +1 @@ +/categories/inplace-constructors.html \ No newline at end of file diff --git a/doc/html/categories/inplace-constructors/page/2.html b/doc/html/categories/inplace-constructors/page/2.html new file mode 100644 index 000000000..ac066bde0 --- /dev/null +++ b/doc/html/categories/inplace-constructors/page/2.html @@ -0,0 +1,52 @@ + + +Inplace Constructors - Boost.Outcome documentation + + + + + +
+Prev + + HomeNext
+ + + +
+ + +
+ + + + + + + +
+ + + + + + +

Last revised: December 17, 2020 at 11:27:06 UTC

+
+
+Prev + + HomeNext
+ diff --git a/doc/html/categories/modifiers.html b/doc/html/categories/modifiers.html new file mode 100644 index 000000000..36ca515f2 --- /dev/null +++ b/doc/html/categories/modifiers.html @@ -0,0 +1,59 @@ + + +Modifiers - Boost.Outcome documentation + + + + + +
+ + HomeNext
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + +
+ + + + + + +

Last revised: June 25, 2019 at 17:01:21 +0100

+
+
+Prev + + HomeNext
+ diff --git a/doc/html/categories/modifiers/page/1.html b/doc/html/categories/modifiers/page/1.html new file mode 100644 index 000000000..0ee7c9393 --- /dev/null +++ b/doc/html/categories/modifiers/page/1.html @@ -0,0 +1 @@ +/categories/modifiers.html \ No newline at end of file diff --git a/doc/html/categories/move-assignment.html b/doc/html/categories/move-assignment.html new file mode 100644 index 000000000..1044d19d5 --- /dev/null +++ b/doc/html/categories/move-assignment.html @@ -0,0 +1,47 @@ + + +Move Assignment - Boost.Outcome documentation + + + + + +
+ + HomeNext
+ + + +
+ + +
+ + + + + + + +
+ + + + + + +

Last revised: March 03, 2019 at 00:11:47 UTC

+
+
+Prev + + HomeNext
+ diff --git a/doc/html/categories/move-assignment/page/1.html b/doc/html/categories/move-assignment/page/1.html new file mode 100644 index 000000000..29462e714 --- /dev/null +++ b/doc/html/categories/move-assignment/page/1.html @@ -0,0 +1 @@ +/categories/move-assignment.html \ No newline at end of file diff --git a/doc/html/categories/move-constructors.html b/doc/html/categories/move-constructors.html new file mode 100644 index 000000000..ed02c92da --- /dev/null +++ b/doc/html/categories/move-constructors.html @@ -0,0 +1,47 @@ + + +Move Constructors - Boost.Outcome documentation + + + + + +
+ + HomeNext
+ + + +
+ + +
+ + + + + + + +
+ + + + + + +

Last revised: March 03, 2019 at 00:11:47 UTC

+
+
+Prev + + HomeNext
+ diff --git a/doc/html/categories/move-constructors/page/1.html b/doc/html/categories/move-constructors/page/1.html new file mode 100644 index 000000000..19bc87da0 --- /dev/null +++ b/doc/html/categories/move-constructors/page/1.html @@ -0,0 +1 @@ +/categories/move-constructors.html \ No newline at end of file diff --git a/doc/html/categories/observer-policies.html b/doc/html/categories/observer-policies.html new file mode 100644 index 000000000..b53becff0 --- /dev/null +++ b/doc/html/categories/observer-policies.html @@ -0,0 +1,67 @@ + + +Observer Policies - Boost.Outcome documentation + + + + + +
+ + HomeNext
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +

Last revised: December 17, 2020 at 11:27:06 UTC

+
+
+Prev + + HomeNext
+ diff --git a/doc/html/categories/observer-policies/page/1.html b/doc/html/categories/observer-policies/page/1.html new file mode 100644 index 000000000..426db3f18 --- /dev/null +++ b/doc/html/categories/observer-policies/page/1.html @@ -0,0 +1 @@ +/categories/observer-policies.html \ No newline at end of file diff --git a/doc/html/categories/observer-policies/page/2.html b/doc/html/categories/observer-policies/page/2.html new file mode 100644 index 000000000..0e02ae757 --- /dev/null +++ b/doc/html/categories/observer-policies/page/2.html @@ -0,0 +1,56 @@ + + +Observer Policies - Boost.Outcome documentation + + + + + +
+Prev + + HomeNext
+ + + +
+ + +
+ + + + + + + + + + + +
+ + + + + + +

Last revised: December 17, 2020 at 11:27:06 UTC

+
+
+Prev + + HomeNext
+ diff --git a/doc/html/categories/observers.html b/doc/html/categories/observers.html new file mode 100644 index 000000000..568817519 --- /dev/null +++ b/doc/html/categories/observers.html @@ -0,0 +1,67 @@ + + +Observers - Boost.Outcome documentation + + + + + +
+ + HomeNext
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +

Last revised: February 12, 2019 at 16:36:24 UTC

+
+
+Prev + + HomeNext
+ diff --git a/doc/html/categories/observers/page/1.html b/doc/html/categories/observers/page/1.html new file mode 100644 index 000000000..0512d38ef --- /dev/null +++ b/doc/html/categories/observers/page/1.html @@ -0,0 +1 @@ +/categories/observers.html \ No newline at end of file diff --git a/doc/html/categories/observers/page/2.html b/doc/html/categories/observers/page/2.html new file mode 100644 index 000000000..4308c1cc6 --- /dev/null +++ b/doc/html/categories/observers/page/2.html @@ -0,0 +1,72 @@ + + +Observers - Boost.Outcome documentation + + + + + +
+Prev + + HomeNext
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +

Last revised: February 12, 2019 at 16:36:24 UTC

+
+
+Prev + + HomeNext
+ diff --git a/doc/html/categories/observers/page/3.html b/doc/html/categories/observers/page/3.html new file mode 100644 index 000000000..e3e4db324 --- /dev/null +++ b/doc/html/categories/observers/page/3.html @@ -0,0 +1,72 @@ + + +Observers - Boost.Outcome documentation + + + + + +
+Prev + + HomeNext
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +

Last revised: February 12, 2019 at 16:36:24 UTC

+
+
+Prev + + HomeNext
+ diff --git a/doc/html/categories/observers/page/4.html b/doc/html/categories/observers/page/4.html new file mode 100644 index 000000000..3bae7086f --- /dev/null +++ b/doc/html/categories/observers/page/4.html @@ -0,0 +1,72 @@ + + +Observers - Boost.Outcome documentation + + + + + +
+Prev + + HomeNext
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +

Last revised: February 12, 2019 at 16:36:24 UTC

+
+
+Prev + + HomeNext
+ diff --git a/doc/html/categories/observers/page/5.html b/doc/html/categories/observers/page/5.html new file mode 100644 index 000000000..5fd025021 --- /dev/null +++ b/doc/html/categories/observers/page/5.html @@ -0,0 +1,72 @@ + + +Observers - Boost.Outcome documentation + + + + + +
+Prev + + HomeNext
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +

Last revised: February 12, 2019 at 16:36:24 UTC

+
+
+Prev + + HomeNext
+ diff --git a/doc/html/categories/observers/page/6.html b/doc/html/categories/observers/page/6.html new file mode 100644 index 000000000..a61ee5f74 --- /dev/null +++ b/doc/html/categories/observers/page/6.html @@ -0,0 +1,72 @@ + + +Observers - Boost.Outcome documentation + + + + + +
+Prev + + HomeNext
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +

Last revised: January 22, 2019 at 01:11:40 UTC

+
+
+Prev + + HomeNext
+ diff --git a/doc/html/categories/observers/page/7.html b/doc/html/categories/observers/page/7.html new file mode 100644 index 000000000..3e4029617 --- /dev/null +++ b/doc/html/categories/observers/page/7.html @@ -0,0 +1,50 @@ + + +Observers - Boost.Outcome documentation + + + + + +
+Prev + + HomeNext
+ + + +
+ + +
+ + + + + +
+ + + + + + +

Last revised: February 12, 2019 at 16:36:24 UTC

+
+
+Prev + + HomeNext
+ diff --git a/doc/html/categories/operators.html b/doc/html/categories/operators.html new file mode 100644 index 000000000..98d7bf0d8 --- /dev/null +++ b/doc/html/categories/operators.html @@ -0,0 +1,51 @@ + + +Operators - Boost.Outcome documentation + + + + + +
+ + HomeNext
+ + + +
+ + +
+ + + + + + + + + + + +
+ + + + + + +

Last revised: March 03, 2019 at 00:11:47 UTC

+
+
+Prev + + HomeNext
+ diff --git a/doc/html/categories/operators/page/1.html b/doc/html/categories/operators/page/1.html new file mode 100644 index 000000000..cf6890974 --- /dev/null +++ b/doc/html/categories/operators/page/1.html @@ -0,0 +1 @@ +/categories/operators.html \ No newline at end of file diff --git a/doc/html/categories/page/1.html b/doc/html/categories/page/1.html new file mode 100644 index 000000000..6ce8fc93f --- /dev/null +++ b/doc/html/categories/page/1.html @@ -0,0 +1 @@ +/categories.html \ No newline at end of file diff --git a/doc/html/categories/page/2.html b/doc/html/categories/page/2.html new file mode 100644 index 000000000..e4298d5f2 --- /dev/null +++ b/doc/html/categories/page/2.html @@ -0,0 +1,68 @@ + + +Categories - Boost.Outcome documentation + + + + + +
+Prev + + HomeNext
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +

Last revised: December 17, 2020 at 11:27:06 UTC

+
+
+Prev + + HomeNext
+ diff --git a/doc/html/categories/special.html b/doc/html/categories/special.html new file mode 100644 index 000000000..40e0ebe02 --- /dev/null +++ b/doc/html/categories/special.html @@ -0,0 +1,45 @@ + + +Special - Boost.Outcome documentation + + + + + +
+ + HomeNext
+ + + +
+ + +
+ + + + + +
+ + + + + + +

Last revised: December 16, 2023 at 20:51:26 UTC

+
+
+Prev + + HomeNext
+ diff --git a/doc/html/categories/special/page/1.html b/doc/html/categories/special/page/1.html new file mode 100644 index 000000000..ac3852f02 --- /dev/null +++ b/doc/html/categories/special/page/1.html @@ -0,0 +1 @@ +/categories/special.html \ No newline at end of file diff --git a/doc/html/categories/tagged-constructors.html b/doc/html/categories/tagged-constructors.html new file mode 100644 index 000000000..9f27f37e8 --- /dev/null +++ b/doc/html/categories/tagged-constructors.html @@ -0,0 +1,67 @@ + + +Tagged Constructors - Boost.Outcome documentation + + + + + +
+ + HomeNext
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +

Last revised: December 17, 2020 at 11:27:06 UTC

+
+
+Prev + + HomeNext
+ diff --git a/doc/html/categories/tagged-constructors/page/1.html b/doc/html/categories/tagged-constructors/page/1.html new file mode 100644 index 000000000..56693d10b --- /dev/null +++ b/doc/html/categories/tagged-constructors/page/1.html @@ -0,0 +1 @@ +/categories/tagged-constructors.html \ No newline at end of file diff --git a/doc/html/categories/tagged-constructors/page/2.html b/doc/html/categories/tagged-constructors/page/2.html new file mode 100644 index 000000000..c173c3565 --- /dev/null +++ b/doc/html/categories/tagged-constructors/page/2.html @@ -0,0 +1,64 @@ + + +Tagged Constructors - Boost.Outcome documentation + + + + + +
+Prev + + HomeNext
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + +
+ + + + + + +

Last revised: December 17, 2020 at 11:27:06 UTC

+
+
+Prev + + HomeNext
+ diff --git a/doc/html/changelog.html b/doc/html/changelog.html new file mode 100644 index 000000000..ef2d73dd4 --- /dev/null +++ b/doc/html/changelog.html @@ -0,0 +1,883 @@ + + +Changelog - Boost.Outcome documentation + + + + + +
+Prev + Up + HomeNext
+ +

Changelog

+ + + +
+ +

v2.2.11 ? (Boost 1.87) [release]

+ +

Enhancements:

+ + + +

It turns out there is more demand than expected for a more functional Result from within C, +so this release adds the power to create Results in success and two types of failure, semantic +comparison of Results, and printing of Result messages. You can also wrap a C enum into a +quick status code from enum, allowing easy custom C error coding from 100% within C.

+ +

The documentation for the C support has been updated +to reflect the new facilities.

+ +

Bug fixes:

+ + + +
+ +

v2.2.10 14th August 2024 (Boost 1.86) [release]

+ +

Enhancements:

+ + + +

Experimental Outcome’s status_code has also gained its own auto-loading GDB pretty printer +with display of strerror() if the code domain is POSIX or generic.

+ +

Bug fixes:

+ + + +
+ +

v2.2.9 15th April 2024 (Boost 1.85) [release]

+ +

Enhancements:

+ +

#293 +- Some users wished that Outcome would be clean with -Wpedantic, this is now turned on for +the test suite.

+ +

#294 +- All use of assert() has been replaced with BOOST_OUTCOME_ASSERT, which can be user overridden +at compile time.

+ +

#295 +- In git commit 12b14e1533848e9a0f7f3c38e41da0ee4e819770 (Aug 11 2022) status code had its +paths changed due to its headers not previously having the right path convention. It was not +realised at the time that in Boost.Outcome this resulted in +<boost/outcome/experimental/status-code/status-code/headers.hpp> which is not desirable. +This has now been remedied to remove the double status-code, which will obviously break +any Boost.Outcome code which relies on the double status-code. Standalone Outcome is unaffected.

+ +
+ +

v2.2.8 13th December 2023 (Boost 1.84) [release]

+ +

Enhancements:

+ + + +

Bug fixes:

+ + + +

#291 +- A Result or Outcome with void value type and move-only non-value type was only usable in +const use cases, due to the lack of provision of non-const member functions in relevant observers +injection layers for the void specialisation. The missing non-const member functions have now +been added.

+ +
+ +

v2.2.7 13th August 2023 (Boost 1.83) [release]

+ +

Enhancements:

+ + + +

Bug fixes:

+ +

#273 +- Changes to other Boost libraries had caused Boost.Outcome’s test suite to fail to compile for some +compiler and C++ language configurations in recent releases. Thanks to work contributed by @alandefreitas +and @pdimov, Boost.Outcome now CI tests a wide range of compilers and configurations and it +is believed all those corner case issues have been fixed or worked around, for the compilers +and configurations within that CI matrix.

+ +

Standalone Outcome’s test suite was never affected, as it did not have Boost changing underneath it. +Nevertheless, a few of the compiler parse bug workarounds will have improved compatibility there +too for atyical toolchain choices.

+ + + +
+ +

v2.2.6 24th March 2023 (Boost 1.82) [release]

+ +

Enhancements:

+ + + +

Bug fixes:

+ + + +
+ +

v2.2.4 11th August 2022 (Boost 1.80) [release]

+ +

Enhancements:

+ + + +

Bug fixes:

+ +
+
#261
+
Move assignable with move constructible not available did not work with void.
+
+ +
+ +

v2.2.3 17th March 2022 (Boost 1.79) [release]

+ +

Enhancements:

+ +
+
Standalone Outcome permanently locks ABI to v2.2.3 release
+
From this release onwards, you are guaranteed that any code compiled with v2.2.3 Outcome +or newer will link without issue with any code compiled with a different version of Outcome +after v2.2.3. As a result, BOOST_OUTCOME_UNSTABLE_VERSION is no longer defined by default, and +therefore BOOST_OUTCOME_V2_NAMESPACE is now hard coded to outcome_v2 rather than a namespace +which permutes per commit.
+
+ +

Bug fixes:

+ +
+
#255
+
Fix enabling of move assignable was not calculated correctly.
+
+ +
+ +

v2.2.2 8th December 2021 (Boost 1.78) [release]

+ +

Enhancements:

+ +
+
#255
+
Restore Experimental Outcome constexpr compatibility in C++ 20 which was an undocumented +property of the Outcome v2.1 series, and which had been dropped in the v2.2 series.
+
GCC Coroutines support
+
Coroutine support in GCCs after 10 is now correctly detected.
+
+ +

Bug fixes:

+ + + +
+ +

v2.2.1 13th August 2021 (Boost 1.77) [release]

+ +

Bug fixes:

+ +
+
#251
+

Fix failure to compile Boost.Outcome when the compiler declares support for C++ modules.

+

Don’t use [[likely]] in GCCs before 9.

+
#251
+

Make support for C++ modules opt-in.

+
+ +
+ +

v2.2.0 16th April 2021 (Boost 1.76) [release]

+ +
+
BREAKING CHANGE As announced for a year and three Boost releases, Outcome v2.2 became the default, replacing v2.1.
+
All v2.1 Outcome code will need to be upgraded as described in the v2.1 => v2.2 upgrade guide. +This branch has a number of major breaking changes to Outcome v2.1, see +the list of v2.2 major changes.
+
+ +

Enhancements:

+ +
+
VS2019.8 compatibility
+
VS2019.8 changed how to enable Coroutines, which caused Outcome to not compile on that compiler.
+
#237
+
If on C++ 20, we now use C++ 20 [[likely]] instead of compiler-specific markup to indicate +when TRY has likely success or failure.
+
BREAKING CHANGE #247
+

Previously the value of spare_storage(const basic_result|basic_outcome *) noexcept + was +not propagated over BOOST_OUTCOME_TRY, which causes things like stack backtraces captured at the point of +construction of an errored result to get dropped at every TRY point. This has been fixed by adding +an optional spare_storage to success_type<T> + and failure_type<T> +, as well +as to auto success(T &&, ...) + and auto failure(T &&, ...) +.

+ +

You should not notice this in your code, except that where before spare storage values did not +propagate through TRY, now they do, which is a breaking change.

+
+ +

Bug fixes:

+ +
+
BREAKING CHANGE #244
+

It came as a shock to learn that BOOST_OUTCOME_TRY had been broken since the inception of this +library for certain corner case code:

+
outcome::result<Foo>    get_foo();
+outcome::result<Foo>    filter1(outcome::result<Foo> &&);
+outcome::result<Foo> && filter2(outcome::result<Foo> &&);
+
+// This works fine, and always has
+BOOST_OUTCOME_TRY(auto v, filter1(get_foo()))
+
+// This causes UB due to result<Foo> being destructed before move of value into v
+BOOST_OUTCOME_TRY(auto v, filter2(get_foo()))
+
+

Whilst reference passthrough filter functions are not common, they can turn up in highly generic +code, where destruction before copy/move is not helpful.

+ +

The cause is that TRY used to work by binding the result of the expression to an auto &&unique, +testing if that unique if successful or not, and if successful then moving from unique.value() +into the user’s output variable. If the expression returned is a prvalue, the Result’s lifetime is +extended by the bound reference to outside of the statement, and all is good. If the expression +returned is an xvalue or lvalue, then the lifetime extension does not exceed that of the statement, +and the Result is destructed after the semicolon succeeding the assignment to auto &&unique.

+ +

This bug has been fixed by TRY deducing the value category +of its input expression as follows:

+ +
    +
  • prvalues => auto unique = (expr) (breaking change)
  • +
  • xvalue => auto unique = (expr) (breaking change)
  • +
  • lvalue => auto unique = (expr) (breaking change)
  • +
+ +

This ensures that xvalue and lvalue inputs do not cause unhelpfully early lifetime end, though it +does silently change the behaviour of existing code which relied on rvalues and lvalues being passed +through, as a new construct-move-destruct or construct-copy-destruct cycle is introduced to where +there was none before. Also, before C++ 17, there is now an added copy/move for prvalue inputs, +which does not affect runtime codegen due to Return Value Optimisation (RVO), but does cause +Results containing non-copying non-moving types to fail to compile, which is a breaking change +from beforehand.

+ +

If one wishes rvalues or lvalues to be passed through, one can avail of a new TRY syntax based on +preprocessor overloading:

+ +
    +
  • BOOST_OUTCOME_TRY((refspec, varname), expr)
  • +
  • BOOST_OUTCOME_TRYV2(refspec, expr)
  • +
+ +

Here refspec is the storage to be used for both the internal temporary unique, AND varname. +So if you write:

+
Foo &&foo;
+BOOST_OUTCOME_TRY((auto &&, v), filter2(foo))
+
+

… then the internal unique is declared as auto &&unique = (filter2(foo)), and the output variable +is declared as auto &&v = std::move(unique).assume_value(). This passes through the rvalue referencing, +and completely avoids copies and moves of Foo. If you wish to not extract the value but also +specify unique storage, there is a new BOOST_OUTCOME_TRYV2(refspec, expr).

+ +

My thanks to KamilCuk from https://stackoverflow.com/questions/66069152/token-detection-within-a-c-preprocessor-macro-argument +for all their help in designing the new overloaded TRY syntax. My thanks also to vasama for reporting this +issue and working through how best to fix it with me.

+
#249
+

The preprocessor logic for choosing when to use bool with concept on GCC was yet again refactored. +This should fix those choices of GCC configuration which caused failure due to the wrong combination +being chosen.

+
+ +
+ +

v2.1.5 11th December 2020 (Boost 1.75) [release]

+ +

Enhancements:

+ +
+
The ADL discovered event hooks have been replaced with policy-specified event hooks instead
+
This is due to brittleness (where hooks would quietly +self-disable if somebody changed something), compiler bugs (a difference in compiler settings causes +the wrong hooks, or some but not all hooks, to get discovered), and end user difficulty in using +them at all. The policy-specified event hooks can be told to default to ADL discovered hooks for +backwards compatibility: set BOOST_OUTCOME_ENABLE_LEGACY_SUPPORT_FOR + to less than 220 to +enable emulation.
+
Improve configuring BOOST_OUTCOME_GCC6_CONCEPT_BOOL
+
Older GCCs had boolean based concepts syntax, whereas newer GCCs are standards conforming. +However the precise logic of when to use legacy and conforming syntax was not well understood, +which caused Outcome to fail to compile depending on what options you pass to GCC. The new logic +always uses the legacy syntax if on GCC 8 or older, otherwise we use conforming syntax if and +only if GCC is in C++ 20 mode or later. This hopefully will resolve the corner case build +failures on GCC.
+
+ +

Bug fixes:

+ +
+
Boost.Outcome should now compile with BOOST_NO_EXCEPTIONS defined
+
Thanks to Emil, maintainer of Boost.Exception, making a change for me, Boost.Outcome +should now compile with C++ exceptions globally disabled. You won’t be able to use +boost::exception_ptr as it can’t be included if C++ exceptions are globally disabled.
+
#236
+
In the Coroutine support the final_suspend() was not noexcept, despite being required +to be so in the C++ 20 standard. This has been fixed, but only if your compiler implements +noop_coroutine. Additionally, if noop_coroutine is available, we use the much more +efficient coroutine handle returning variant of await_suspend() which should significantly +improve codegen and context switching performance.
+
+ +
+ +

v2.1.4 14th August 2020 (Boost 1.74) [release]

+ +

Enhancements:

+ +
+
BREAKING CHANGE void results and outcomes no longer default construct types during explicit construction
+
Previously if you explicitly constructed a result<T> from a non-errored +result<void>, it default constructed T. This was found to cause unhelpful +surprise, so it has been disabled.
+
New macro BOOST_OUTCOME_ENABLE_LEGACY_SUPPORT_FOR
+
The macro BOOST_OUTCOME_ENABLE_LEGACY_SUPPORT_FOR + can be used to +enable aliasing of older naming and features to newer naming and features when +using a newer version of Outcome.
+
Concepts now have snake case style naming instead of camel case style
+
When Outcome was first implemented, it was thought that C++ 20 concepts were +going to have camel case style. This was changed before the C++ 20 release, and +Outcome’s concepts have been renamed similarly. This won’t break any code in +Outcome v2.1, as compatibility aliases are provided. However code compiled +against Outcome v2.2 will need to be upgraded, unless BOOST_OUTCOME_ENABLE_LEGACY_SUPPORT_FOR +is set to less than 220.
+
Concepts now live in BOOST_OUTCOME_V2_NAMESPACE::concepts namespace
+
Previously concepts lived in the convert namespace, now they live in their +own namespace.
+
New concepts basic_result<T> + and basic_outcome<T> + added
+
End users were finding an unhelpful gap in between is_basic_result<T> + +and value_or_error<T> + where they wanted a concept that matched +types which were basic_result, but not exactly one of those. Concepts filling +that gap were added.
+
Operation TRY works differently from Outcome v2.2 onwards
+
This is a severely code breaking change which change the syntax of how one uses +BOOST_OUTCOME_TRY(). A regular expression suitable for upgrading code can be found in +the list of changes between Outcome v2.1 and v2.2.
+
+ +

Bug fixes:

+ +
+
#224
+
The clang Apple ships in Xcode 11.4 (currently the latest) has not been patched +with the fixes to LLVM clang that fix noexcept(std::is_constructible<T, void>) +failing to compile which I originally submitted years ago. So give up waiting on +Apple to fix their clang, add a workaround to Outcome.
+
Use of void in T or E caused noexcept(false)
+
Direct traits examination of void was causing nothrow detection to return false, +fixed.
+
Spare storage could not be used from within no-value policy classes
+
Due to an obvious brain fart when writing the code at the time, the spare storage +APIs had the wrong prototype which prevented them working from within policy classes. +Sorry.
+
+ +
+ +

v2.1.3 29th April 2020 (Boost 1.73) [release]

+ +

Enhancements:

+ +
+
Performance of Outcome-based code compiled by clang has been greatly improved
+

The previous implementation of Outcome’s status bitfield confused clang’s +optimiser, which caused low quality codegen. Unlike most codegen issues, this was +noticeably in empirical benchmarks of real world code, as was shown by +P1886 Error speed benchmarking.

+ +

The safe part of the better_optimisation +Outcome v2.2.0 future branch was merged to Outcome v2.1.3 which includes a new +status bitfield implementation. This appears to not confuse clang’s optimiser, +and clang 9 produces code which routinely beats GCC 9’s code for various canned +use cases.

+
Precompiled headers are automatically enabled on new enough cmake’s for standalone Outcome
+

If on cmake 3.16 or later, its new precompiled headers build support is used +to tell consumers of the outcome::hl cmake target to precompile Outcome, if +and only if outcome_IS_DEPENDENCY is false. outcome_IS_DEPENDENCY is set +by Outcome’s CMakeLists.txt if it detects that it was included using +add_subdirectory(), so for the vast majority of Outcome end users, the use +of precompiled headers will NOT be enabled.

+ +

Exported targets do NOT request precompilation of headers, as it is +assumed that importers of the Outcome cmake targets will configure their own +precompiled headers which incorporate Outcome.

+
Installability is now CI tested per commit
+

Due to installability of standalone Outcome (e.g. make install) breaking +itself rather more frequently than is ideal, installability is now tested on CI +per commit.

+
Coroutines support has been documented
+

The coroutines support added in v2.1.2 has now been properly documented.

+
+ +

Bug fixes:

+ +
+
#214
+
Newer Concepts implementing compilers were unhappy with the early check for +destructibility of T and E, so removed template constraints, falling back +to static assert which runs later in the type instantiation sequence.
+
#215
+
For standalone Outcome, CMAKE_TOOLCHAIN_FILE is now passed through during +dependency superbuild. This should solve build issues for some embedded toolchain +users.
+
#220
+
A false positive undefined behaviour sanitiser failure in some use cases of +Experimental Outcome was worked around to avoid the failure message.
+
#221
+
Restored compatibility with x86 on Windows, which was failing with link errors. +It was quite surprising that this bug was not reported sooner, but obviously +almost nobody is using Outcome with x86 on Windows.
+
#223
+
Fix a segfault in Debug builds only when cloning a status_code_ptr in +Experimental.Outcome only.
+
+ +
+ +

v2.1.2 11th December 2019 (Boost 1.72) [release]

+ +

Enhancements:

+ +
+
Improved compatibility with cmake tooling
+
Standalone outcome is now make install-able, and cmake find_package() can find it. +Note that you must separately install and find_package() Outcome’s dependency, quickcpplib, +else find_package() of Outcome will fail.
+
Non-permissive parsing is now default in Visual Studio
+
The default targets in standalone Outcome’s cmake now enable non-permissive parsing. +This was required partially because VS2019 16.3’s quite buggy Concepts implementation is +unusuable in permissive parsing mode. Even then, lazy ADL two phase lookup is broken +in VS2019 16.3 with /std:latest, you may wish to use an earlier language standard.
+
Breaking change!
+
The git submodule mechanism used by standalone Outcome of specifying dependent libraries +has been replaced with a cmake superbuild of dependencies mechanism instead. Upon cmake +configure, an internal copy of quickcpplib will be git cloned, built and installed into the +build directory from where an internal find_package() uses it. This breaks the use of +the unconfigured Outcome repo as an implementation of Outcome, one must now do one of: + +
    +
  1. Add Outcome as subdirectory to cmake build.
  2. +
  3. Use cmake superbuild (i.e. ExternalProject_Add()) to build and install Outcome into +a local installation.
  4. +
  5. Use one of the single header editions.
  6. +
+
Breaking change!
+
For standalone Outcome, the current compiler is now checked for whether it will compile +code containing C++ Concepts, and if it does, all cmake consumers of Outcome will enable +C++ Concepts. Set the cmake variable BOOST_OUTCOME_C_CONCEPTS_FLAGS to an empty string to prevent +auto detection and enabling of C++ Concepts support occurring.
+
BOOST_OUTCOME_TRY operation now hints to the compiler that operation will be successful
+
P1886 Error speed benchmarking showed that there is +considerable gain in very small functions by hinting to the compiler whether the expression +is expected to be successful or not. BOOST_OUTCOME_TRY previously did not hint to the compiler +at all, but now it does. A new suite of macros BOOST_OUTCOME_TRY_FAILURE_LIKELY hint to the +compiler that failure is expected. If you wish to return to the previously unhinted +behaviour, define BOOST_OUTCOME_TRY_LIKELY(expr) to (!!expr).
+
#199
+
Support for C++ Coroutines has been added. This comes in two parts, firstly there is +now an BOOST_OUTCOME_CO_TRY() operation suitable for performing the TRY operation from +within a C++ Coroutine. Secondly, in the header outcome/coroutine_support.hpp there are +implementations of eager<OutcomeType> and lazy<OutcomeType> which let you more +naturally and efficiently use basic_result or basic_outcome from within C++ +Coroutines – specifically, if the result or outcome will construct from an exception +pointer, exceptions thrown in the coroutine return an errored or excepted result with +the thrown exception instead of throwing the exception through the coroutine machinery +(which in current compilers, has a high likelihood of blowing up the program). Both +eager<T> and lazy<T> can accept any T as well. Both have been tested and found +working on VS2019 and clang 9.
+
#210
+
make_error_code() and make_exception_ptr() are now additionally considered for +compatible copy and move conversions for basic_result<>. This lets you construct +a basic_result<T, E> into a basic_result<T, error_code>, where E is a +custom type which has implemented the ADL discovered free function +error_code make_error_code(E), but is otherwise unrelated to error_code. +The same availability applies for exception_ptr with make_exception_ptr() being +the ADL discovered free function. basic_outcome<> has less support for this than +basic_result<> in order to keep constructor count down, but it will accept via +this mechanism conversions from basic_result<> and failure_type<>.
+
+ +

Bug fixes:

+ +
+
#184
+
The detection of [[nodiscard]] support in the compiler was very mildly broken.
+
+ +
+ +

v2.1.1 19th August 2019 (Boost 1.71) [release]

+ +

Enhancements:

+ +
+
#184
+
As per request from Boost release managers, relocated version.hpp and +revision.hpp into detail, and added the Boost licence boilerplate to the top +of every source file which was missing one (I think). Also took the opportunity +to run the licence restamping script over all Outcome, so copyright dates are now +up to date.
+
#185
+
Add FAQ item explaining issue #185, and why we will do nothing to +fix it right now.
+
#189
+
Refactored the BOOST_OUTCOME_TRY implementation to use more clarified +customisation points capable of accepting very foreign inputs. Removed the +std::experimental::expected<T, E> specialisations, as those are no longer +necessary. Fixed the documentation for the customisation points which +previously claimed that they are ADL discovered, which they are not. Added +a recipe describing how to add in support for foreign input types.
+
#183
+
Added a separate motivation/plug_error_code specifically for Boost.
+
+ +

Bug fixes:

+ +
+
-
+
BOOST_OUTCOME_VERSION_MINOR hadn’t been updated to 1.
+
#181
+
Fix issue #181 where Outcome didn’t actually implement the strong swap guarantee, +despite being documented as doing so.
+
#190
+
Fix issue #190 in Boost edition where unit test suite was not runnable from +the Boost release distro.
+
#182
+
Fix issue #182 where trait::is_exception_ptr_available<T> was always true, +thus causing much weirdness, like not printing diagnostics and trying to feed +everything to make_exception_ptr().
+
#194
+
Fix issue #192 where the std::basic_outcome_failure_exception_from_error() +was being defined twice for translation units which combine standalone and +Boost Outcome’s.
+
+ +
+ +

v2.1 12th Apr 2019 (Boost 1.70) [release]

+ + + +
+ +

v2.0 18th Jan 2018 [release]

+ + + + + +

Last revised: August 14, 2024 at 18:00:39 +0100

+
+
+Prev + Up + HomeNext
+ diff --git a/doc/html/changelog/upgrade_v21_v22.html b/doc/html/changelog/upgrade_v21_v22.html new file mode 100644 index 000000000..a4d20a277 --- /dev/null +++ b/doc/html/changelog/upgrade_v21_v22.html @@ -0,0 +1,107 @@ + + +Upgrade guide v2.1 => v2.2 - Boost.Outcome documentation + + + + + +
+Prev + Up + HomeNext
+

Upgrade guide v2.1 => v2.2

+

In the start of 2020, after a year of listening to user feedback since +entering Boost, Outcome v2.2 was published with a number of breaking source +changes from Outcome v2.1 The full year of 2020 (three Boost releases) was given to +announcing those upcoming changes, and testing the v2.2 branch in +production. In late December 2020, Outcome v2.2 became the default Outcome, +and all Outcome v2.1 code shall need to be upgraded to work with v2.2.

+ +

To upgrade an Outcome v2.1 based codebase to Outcome v2.2 is very easy:

+ +
    +
  1. You will need a tool capable of finding regular expressions in all source +files in a directory tree and replacing them – most IDEs such as Visual Studio +have such a tool with GUI, on POSIX a shell script such as this ought to work:

    + +
    find /path/to/project -type f -name "*.hpp" | xargs sed -i "s/_TRY\(([^(]*?),(.*?)\);/_TRY((auto &&, \1),\2);/g"
    +find /path/to/project -type f -name "*.cpp" | xargs sed -i "s/_TRY\(([^(]*?),(.*?)\);/_TRY((auto &&, \1),\2);/g"
    +find /path/to/project -type f -name "*.hpp" | xargs sed -i "s/_TRY\(([^(]*?)\);/_TRYV2(auto &&, \1);/g"
    +find /path/to/project -type f -name "*.cpp" | xargs sed -i "s/_TRY\(([^(]*?)\);/_TRYV2(auto &&, \1);/g"
    +
    + +

    The transformation needed are the regular expressions _TRY\(([^(]*?),(.*?)\); => +_TRY((auto &&, \1),\2); and TRY\(([^(]*?)\); => _TRYV2(auto &&, \1);. +This is because in Outcome v2.2 onwards, BOOST_OUTCOME_TRY(var, expr) +no longer implicitly declares the variable created as auto&& on your behalf, +now you must specify the storage of the variable. It also declares the internal +uniquely named temporary as a value rather than as a reference, the initial +brackets overrides this to force the use of a rvalue reference for the internal +uniquely named temporary instead.

    + +

    This makes use of Outcome’s new TRY syntax +to tell the TRY operation to use references rather than values for the internal +uniquely named temporary, thus avoiding any copies and moves. The only way to +override the storage of the internal uniquely named temporary for non-value +outputting TRY is via the new BOOST_OUTCOME_TRYV2() which takes the storage specifier +you desire as its first parameter.

    + +

    The principle advantage of this change is that you can now assign to +existing variables the successful results of expressions, instead of being +forced to TRY into a new variable, and move that variable into the destination +you intended. Also, because you can now specify storage, you can now assign +the result of a TRYied operation into static or thread local storage.

  2. + +
  3. The find regex and replace rule above is to preserve exact semantics with +Outcome v2.1 whereby the internal uniquely named temporary and the variable for +the value are both rvalue references. If you’re feeling like more work, it is +safer if you convert as many BOOST_OUTCOME_TRY((auto &&, v), expr) to +BOOST_OUTCOME_TRY(auto &&v, expr) as possible. This will mean that TRY ‘consumes’ +expr i.e. moves it into the internal uniquely named temporary, if expr is +an rvalue reference. Usually this does not affect existing code, but occasionally +it can, generally a bit of code reordering will fix it.

  4. + +
  5. If your code uses the ADL discovered event hooks +to intercept when basic_result and basic_outcome is constructed, copies or +moved, you will need to either define the macro BOOST_OUTCOME_ENABLE_LEGACY_SUPPORT_FOR + +to less than 220 to enable emulation, or upgrade the code to use the new mechanism.

    + +

    The hooks themselves have identical signature, only the name and location has +changed. Therefore upgrade is usually +a case of copy-pasting the hook implementation into a custom NoValuePolicy +implementation, and changing the ADL free function’s name from hook_* to on_*.

    + +

    You are recommended to upgrade if possible, as the ADL discovered hooks were +found in real world code usage to be brittle and surprising.

  6. + +
  7. Any usage of CamelCase named concepts from Outcome must be replaced with snake_case +named concepts instead:

    + +
      +
    • concepts::ValueOrError<T> => concepts::value_or_error<T>
    • +
    • concepts::ValueOrNone<T> => concepts::value_or_none<T>
    • +
    + +

    The CamelCase naming is aliased to the snake_case naming if the macro +BOOST_OUTCOME_ENABLE_LEGACY_SUPPORT_FOR + is defined to less than 220. +Nevertheless you ought to upgrade here is possible, as due to a late change +in C++ 20 all standard concepts are now snake_case named.

  8. + +
  9. Finally, despite that Outcome does not currently offer a stable ABI guarantee +(hoped to begin in 2022), v2.1 had a stable storage layout for basic_result and +basic_outcome. In v2.2 that storage layout has changed, so the ABIs generated by +use of v2.1 and v2.2 are incompatible i.e. you will need to recompile everything +using Outcome after you upgrade to v2.2.

  10. +
+ + +

Last revised: February 23, 2021 at 17:37:27 UTC

+
+
+Prev + Up + HomeNext
+ diff --git a/doc/html/changelog/v22.html b/doc/html/changelog/v22.html new file mode 100644 index 000000000..bb68d37ba --- /dev/null +++ b/doc/html/changelog/v22.html @@ -0,0 +1,83 @@ + + +v2.2 major changes - Boost.Outcome documentation + + + + + +
+Prev + Up + HomeNext
+

v2.2 major changes

+

Major changes in v2.2 over v2.1 are listed here.

+ +
    +
  1. A new trait is_move_bitcopying<T> is added, which opts types into a library-based emulation of +P1029 move = bitcopies. Experimental std::error is opted in by default. +If this trait is true for your T or E type, Outcome will track moved-from status for your type, +and will only call your type’s destructor if it was not moved from. If your compiler’s optimiser is +sufficiently able to fold code, this improves codegen quality for Experimental Outcome very considerably, +approaching the same gains as P1029 types would have. Note that the empirical performance difference +will likely be nil, but the codegen does look much more elegant.

  2. + +
  3. If for basic_result<T, E> both T and E are trivially copyable, union-based rather than +struct-based storage will be used. This significantly improves performance in synthetic benchmarks +which do nothing in deep call stacks of function calls except create and return result<T, E>, and +makes Outcome return competitive results to alternative error handling choices, improving comparative +optics. It is not expected that the performance difference will be detectable empirically in real +world code. It is expected that the build time impact of union storage won’t be noticeable, as +union storage for trivially copyable types is much easier than for non-TC types.

    + +

    Note that storage remains struct-based if either T or E is neither trivially copyable nor for +which trait is_move_bitcopying<T> is true. This is because union-based storage for complex +types has significant build time impact, as anyone who has deployed std::variant or +std::expected into globally visible public APIs will have noticed.

  4. + +
  5. The compile time requirement for E types to have a default constructor is removed.

  6. + +
  7. BOOST_OUTCOME_TRY(var, expr) no longer always declares var as auto &&var, but simply uses it +as is. This allows TRY to initialise or assign. You can use the macro OUTCOME21_TRY if you +want the pre-Outcome v2.2 behaviour. You may find the regular expression _TRY\(([^(]*?),(.*?)\); => +_TRY(auto &&\1,\2); of use to you when upgrading code.

  8. + +
  9. BOOST_OUTCOME_TRY now declares its internal uniquely named temporary variable which holds the result +of the expression as auto unique = expr instead of auto &&unique = expr. This will cause TRY of +result<UncopyableAndImmovable> and outcome<UncopyableAndImmovable> to fail to compile, whereas +previously they did compile. Another big change in semantic is that TRY now will ‘consume’ values +moved into it, whereas previously it did not/ The reason for this change was that the previous behaviour +produced undefined behaviour in various corner use cases, particulary in generic code. You can tell +TRY to use references instead of values for its uniquely named temporary using a special +syntax.

  10. + +
  11. BOOST_OUTCOME_TRY now propagates the value from spare_storage(const basic_result|basic_outcome *) noexcept + +of the input Result/Outcome into any failure_type<T> + returned by TRY. Result/Outcome +now sets its spare storage value from any success_type<T> + or failure_type<T> + +from which it is constructed. This is a breaking change, as spare storage values were not propagated +beforehand. However this change means that any stack backtrace identifier captured by a failed +result construction hook is now fully propagated from failure point up through all TRY operations +to the code which handles the failure.

  12. + +
  13. The ADL discovered event hooks have been replaced +with policy-specified event hooks instead. This is due to brittleness (where hooks would quietly +self-disable if somebody changed something), compiler bugs (a difference in compiler settings causes +the wrong hooks, or some but not all hooks, to get discovered), and end user difficulty in using +them at all. The policy-specified event hooks can be told to default to ADL discovered hooks for +backwards compatibility: set BOOST_OUTCOME_ENABLE_LEGACY_SUPPORT_FOR + to less than 220 to +enable emulation.

  14. +
+ + +

Last revised: February 23, 2021 at 17:37:27 UTC

+
+
+Prev + Up + HomeNext
+ diff --git a/doc/html/credits.html b/doc/html/credits.html new file mode 100644 index 000000000..917ce0ff8 --- /dev/null +++ b/doc/html/credits.html @@ -0,0 +1,228 @@ + + +Acknowledgements - Boost.Outcome documentation + + + + + +
+Up + HomeNext
+

Acknowledgements

+ + +

github contributors

+ + +
+ + +
+ + + 1518 commits +
+ +
+ + + 45 commits +
+ +
+ + + 9 commits +
+ +
+ + + 7 commits +
+ +
+ + + 7 commits +
+ +
+ + + 2 commits +
+ +
+ + + 2 commits +
+ +
+ + + 2 commits +
+ +
+ + + 1 commits +
+ +
+ + + 1 commits +
+ +
+ + + 1 commits +
+ +
+ + + 1 commits +
+ +
+ + + 1 commits +
+ +
+ + + 1 commits +
+ +
+ + + 1 commits +
+ +
+ + + 1 commits +
+ +
+ + + 1 commits +
+ +
+ + + 1 commits +
+ +
+ + + 1 commits +
+ +
+ +

This pretty, modern C++ documentation

+ + + +

Special thanks for Outcome v2.1

+ +

Once again Andrzej Krzemienski stands out for a never ceasing flow of excellent questions, +“what if?”’s, eagle eyed spotting of corner case logic bugs, and design contradictions. +Thank you Andrzej!

+ +

My thanks to the Microsoft Visual C++ compiler team for incorporating Outcome into the +MSVC test suite, and thus finding many interesting corner case quirks in how best to +interpret the C++ standard. In some cases, Outcome was refactored to be less ambiguous; +in others, defects had to be submitted to WG21 because the standard wording was not clear. +The Visual C++ compiler team were particularly generous with their time in helping track +down the cause of these issues, complete with submitting pull requests with bug fixes. +I am very grateful to them.

+ +

Special thanks for Outcome v2.0

+ +

For a second time, Charley Bay stepped up as review manager. Given how much work it was +for the v1 review, I can only say thank you.

+ +

Andrzej Krzemienski went far beyond the call of duty in the development of Outcome v2. +He wrote the front page, and the start of the tutorial. He thus set the tone, pacing, +style and form of the tutorial which I merely continued for the rest of the tutorial. +He also volunteered considerable amounts of his time as as primary peer reviewer for +the v2 design and implementation, asking many very valuable “stupid questions” at least +one of which caused a major rethink and refactor. If Outcome v2 passes its second peer +review, it’s because of Andrzej. Thank you.

+ +

Jonathan Müller invested countless hours in his doxygen replacement tool Standardese +which Outcome uses to generate the reference API docs, and a not insignificant number +of those went on fixing issues for Outcome. Thank you.

+ +

Special thanks for Outcome v1

+ +

To Paul Bristow who +proposed the name “Outcome” for the library after a very extended +period of name bikeshedding on boost-dev. I had been minded to call the library “Boost.Donkey” +just to shut everyone up because the name bike shedding was getting ridiculous. But +Outcome is a lot nicer, so thank you Paul.

+ +

My heartfelt thanks to Charley Bay for acting as review manager for Outcome in May 2017. +It is becoming ever harder to find a Boost review manager, so thank you! My thanks also +to the CppCast team Rob Irving and Jason Turner for so quickly getting me on to CppCast +to discuss expected<T, E> during the Outcome peer review to help publicise the review.

+ +

More general thanks are due to those on boost-dev, Reddit and SG14 for extensive and often very detailed +feedback on the library pretty much from its beginning. You are all too numerous to +remember, but certainly Tongari and Andrzej Krzemienski come to mind as having engaged +in particularly long discussion threads with tons of useful feedback which clarified my +thinking. Andrzej also went through the documentation with a fine toothed comb before the +review, finding many small errata and confusing wording.

+ +

Finally, my thanks to Vicente for driving Expected from its beginnings to hopefully +standardisation before 2020. It’s many years of work getting something standardised, even +more years than getting a library into Boost which as you can see from the history above +took about three years.

+ + +

Last revised: January 25, 2019 at 23:04:27 UTC

+
+
+Prev + Up + HomeNext
+ diff --git a/doc/html/css/boost.css b/doc/html/css/boost.css new file mode 100644 index 000000000..83eb7cd83 --- /dev/null +++ b/doc/html/css/boost.css @@ -0,0 +1,1126 @@ + +/*============================================================================= +Copyright (c) 2004 Joel de Guzman +http://spirit.sourceforge.net/ + +Copyright 2013 Niall Douglas additions for colors and alignment. +Copyright 2013 Paul A. Bristow additions for more colors and alignments. +Copyright 2017 Tom Westerhout font fixes to support Sphinx + +Distributed under the Boost Software License, Version 1.0. (See accompany- +ing file LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt) +=============================================================================*/ + +/*============================================================================= +Body defaults +=============================================================================*/ + + body + { + margin: 1em; + font-size: 16px; + font-family: sans-serif; + } + +/*============================================================================= +Paragraphs +=============================================================================*/ + + p, div.document, div.footer + { + text-align: left; + font-size: 10pt; + line-height: 1.15; + } + +/*============================================================================= +Program listings +=============================================================================*/ + + /* Code on paragraphs */ + p tt.computeroutput + { + font-size: 9pt; + } + + pre.synopsis + { + font-size: 9pt; + margin: 1pc 4% 0pc 4%; + padding: 0.5pc 0.5pc 0.5pc 0.5pc; + } + + div.highlight, + .programlisting, + .screen + { + font-size: 9pt; + display: block; + margin: 1pc 4% 0pc 4%; + padding: 0.5pc 0.5pc 0.5pc 0.5pc; + } + + /* Program listings in tables don't get borders */ + td .programlisting, + td .screen + { + margin: 0pc 0pc 0pc 0pc; + padding: 0pc 0pc 0pc 0pc; + } + +/*============================================================================= +Headings +=============================================================================*/ + + h1, h2, h3, h4, h5, h6 + { + text-align: left; + margin: 1em 0em 0.5em 0em; + font-weight: bold; + } + + h1 { font-size: 140%; } + h2 { font-weight: bold; font-size: 140%; } + h3 { font-weight: bold; font-size: 130%; } + h4 { font-weight: bold; font-size: 120%; } + h5 { font-weight: normal; font-style: italic; font-size: 110%; } + h6 { font-weight: normal; font-style: italic; font-size: 100%; } + + /* Top page titles */ + title, + h1.title, + h2.title + h3.title, + h4.title, + h5.title, + h6.title, + .refentrytitle + { + font-weight: bold; + margin-bottom: 1pc; + } + + h1.title { font-size: 140% } + h2.title { font-size: 140% } + h3.title { font-size: 130% } + h4.title { font-size: 120% } + h5.title { font-size: 110% } + h6.title { font-size: 100% } + + .section h1 + { + margin: 0em 0em 0.5em 0em; + font-size: 140%; + } + + .section h2 { font-size: 140% } + .section h3 { font-size: 130% } + .section h4 { font-size: 120% } + .section h5 { font-size: 110% } + .section h6 { font-size: 100% } + + /* Code on titles */ + h1 tt.computeroutput { font-size: 140% } + h2 tt.computeroutput { font-size: 140% } + h3 tt.computeroutput { font-size: 130% } + h4 tt.computeroutput { font-size: 130% } + h5 tt.computeroutput { font-size: 130% } + h6 tt.computeroutput { font-size: 130% } + + +/*============================================================================= +Author +=============================================================================*/ + + h3.author + { + font-size: 100% + } + +/*============================================================================= +Lists +=============================================================================*/ + + li + { + font-size: 10pt; + line-height: 1.3; + } + + /* Unordered lists */ + ul + { + text-align: left; + } + + /* Ordered lists */ + ol + { + text-align: left; + } + +/*============================================================================= +Links +=============================================================================*/ + + a + { + text-decoration: none; /* no underline */ + } + + a:hover + { + text-decoration: underline; + } + +/*============================================================================= +Spirit style navigation +=============================================================================*/ + + .spirit-nav + { + text-align: right; + } + + .spirit-nav a + { + color: white; + padding-left: 0.5em; + } + + .spirit-nav img + { + border-width: 0px; + } + +/*============================================================================= +Copyright footer +=============================================================================*/ + .copyright-footer + { + text-align: right; + font-size: 70%; + } + + .copyright-footer p + { + text-align: right; + font-size: 80%; + } + +/*============================================================================= +Table of contents +=============================================================================*/ + + div.toc + { + margin: 1pc 4% 0pc 4%; + padding: 0.1pc 1pc 0.1pc 1pc; + font-size: 80%; + line-height: 1.15; + } + + .boost-toc + { + float: right; + padding: 0.5pc; + } + + /* Code on toc */ + .toc .computeroutput { font-size: 120% } + + /* No margin on nested menus */ + + .toc dl dl { margin: 0; } + +/*============================================================================= +Tables +=============================================================================*/ + + .table-title, + div.table p.title + { + margin-left: 4%; + padding-right: 0.5em; + padding-left: 0.5em; + } + + .informaltable table, + .table table + { + width: 92%; + margin-left: 4%; + margin-right: 4%; + } + + div.informaltable table, + div.table table + { + padding: 4px; + } + + /* Table Cells */ + div.informaltable table tr td, + div.table table tr td + { + padding: 0.5em; + text-align: left; + font-size: 9pt; + } + + div.informaltable table tr th, + div.table table tr th + { + padding: 0.5em 0.5em 0.5em 0.5em; + border: 1pt solid white; + font-size: 80%; + } + + table.simplelist + { + width: auto !important; + margin: 0em !important; + padding: 0em !important; + border: none !important; + } + table.simplelist td + { + margin: 0em !important; + padding: 0em !important; + text-align: left !important; + font-size: 9pt !important; + border: none !important; + } + +/*============================================================================= +Suppress margins in tables +=============================================================================*/ + + table th > *:first-child, + table td > *:first-child + { + margin-top: 0; + } + + table th > *:last-child, + table td > *:last-child + { + margin-bottom: 0; + } + +/*============================================================================= +Blurbs +=============================================================================*/ + + div.note, + div.tip, + div.important, + div.caution, + div.warning, + div.blurb, + p.blurb + { + font-size: 9pt; /* A little bit smaller than the main text */ + line-height: 1.2; + display: block; + margin: 1pc 4% 0pc 4%; + padding: 0.5pc 0.5pc 0.5pc 0.5pc; + } + + div.blurb img, + p.blurb img + { + padding: 1pt; + } + +/*============================================================================= +Variable Lists +=============================================================================*/ + + div.variablelist + { + margin: 1em 0; + } + + /* Make the terms in definition lists bold */ + div.variablelist dl dt, + span.term + { + font-weight: bold; + font-size: 10pt; + } + + div.variablelist table tbody tr td + { + text-align: left; + vertical-align: top; + padding: 0em 2em 0em 0em; + font-size: 10pt; + margin: 0em 0em 0.5em 0em; + line-height: 1; + } + + div.variablelist dl dt + { + margin-bottom: 0.2em; + } + + div.variablelist dl dd + { + margin: 0em 0em 0.5em 2em; + font-size: 10pt; + } + + div.variablelist table tbody tr td p, + div.variablelist dl dd p + { + margin: 0em 0em 0.5em 0em; + line-height: 1; + } + +/*============================================================================= +Misc +=============================================================================*/ + + /* Title of books and articles in bibliographies */ + span.title + { + font-style: italic; + } + + span.underline + { + text-decoration: underline; + } + + span.strikethrough + { + text-decoration: line-through; + } + + /* Copyright, Legal Notice */ + div div.legalnotice p + { + text-align: left + } + +/*============================================================================= +Colors +=============================================================================*/ + + @media screen + { + body { + background-color: #FFFFFF; + color: #000000; + } + + /* Syntax Highlighting */ + .property, + .highlight .k, + .highlight .kc, + .highlight .kd, + .highlight .kn, + .highlight .kp, + .highlight .kr, + .highlight .kt, + .keyword { color: #0000AA; } + + .highlight .n, + .highlight .na, + .highlight .nb, + .highlight .bp, + .highlight .nc, + .highlight .no, + .highlight .nd, + .highlight .ni, + .highlight .ne, + .highlight .nf, + .highlight .py, + .highlight .nl, + .highlight .nn, + .highlight .nx, + .highlight .nt, + .highlight .nv, + .highlight .vc, + .highlight .vg, + .highlight .vi, + .identifier { color: #000000; } + + .special { color: #707070; } + + .highlight .cp, + .preprocessor { color: #402080; } + + .highlight .sc + .char { color: teal; } + + .highlight .c, + .highlight .ch, + .highlight .cm, + .highlight .cp, + .highlight .cpf, + .highlight .c1, + .highlight .cs, + .highlight .sd, + .highlight .sh, + .comment { color: #800000; } + + .highlight .s, + .highlight .sa, + .highlight .sb, + .highlight .dl, + .highlight .s2, + .highlight .se, + .highlight .si, + .highlight .sx, + .highlight .sr, + .highlight .s1, + .highlight .ss, + .string { color: teal; } + + .highlight .m, + .highlight .mf, + .highlight .mh, + .highlight .mi, + .highlight .mo, + .number { color: teal; } + + .highlight, + .white_bkd { background-color: #FFFFFF; } + + .highlight .hll, + .dk_grey_bkd { background-color: #999999; } + + /* Links */ + a, a .keyword, a .identifier, a .special, a .preprocessor + a .char, a .comment, a .string, a .number + { + color: #005a9c; + } + + a:visited, a:visited .keyword, a:visited .identifier, + a:visited .special, a:visited .preprocessor a:visited .char, + a:visited .comment, a:visited .string, a:visited .number + { + color: #9c5a9c; + } + + h1 a, h2 a, h3 a, h4 a, h5 a, h6 a, + h1 a:hover, h2 a:hover, h3 a:hover, h4 a:hover, h5 a:hover, h6 a:hover, + h1 a:visited, h2 a:visited, h3 a:visited, h4 a:visited, h5 a:visited, h6 a:visited + { + text-decoration: none; /* no underline */ + color: #000000; + } + + /* Copyright, Legal Notice */ + .copyright + { + color: #666666; + font-size: small; + } + + div div.legalnotice p + { + color: #666666; + } + + /* Program listing */ + pre.synopsis + { + border: 1px solid #DCDCDC; + } + + div.highlight, + .programlisting, + .screen + { + border: 1px solid #DCDCDC; + } + + td .programlisting, + td .screen + { + border: 0px solid #DCDCDC; + } + + /* Blurbs */ + div.note, + div.tip, + div.important, + div.caution, + div.warning, + div.blurb, + p.blurb + { + border: 1px solid #DCDCDC; + } + + /* Table of contents */ + div.toc + { + border: 1px solid #DCDCDC; + } + + /* Tables */ + div.informaltable table tr td, + div.table table tr td + { + border: 1px solid #DCDCDC; + } + + div.informaltable table tr th, + div.table table tr th + { + background-color: #F0F0F0; + border: 1px solid #DCDCDC; + } + + .copyright-footer + { + color: #8F8F8F; + } + + /* Misc */ + span.highlight + { + color: #00A000; + } + } + + @media print + { + /* Links */ + a + { + color: black; + } + + a:visited + { + color: black; + } + + .spirit-nav + { + display: none; + } + + /* Program listing */ + pre.synopsis + { + border: 1px solid gray; + } + + div.highlight, + .programlisting, + .screen + { + border: 1px solid gray; + } + + td .programlisting, + td .screen + { + border: 0px solid #DCDCDC; + } + + /* Table of contents */ + div.toc + { + border: 1px solid gray; + } + + .informaltable table, + .table table + { + border: 1px solid gray; + border-collapse: collapse; + } + + /* Tables */ + div.informaltable table tr td, + div.table table tr td + { + border: 1px solid gray; + } + + div.informaltable table tr th, + div.table table tr th + { + border: 1px solid gray; + } + + table.simplelist tr td + { + border: none !important; + } + + /* Misc */ + span.highlight + { + font-weight: bold; + } + } + +/*============================================================================= +Images +=============================================================================*/ + + span.inlinemediaobject img + { + vertical-align: middle; + } + +/*============================================================================== +Super and Subscript: style so that line spacing isn't effected, see +http://www.adobe.com/cfusion/communityengine/index.cfm?event=showdetails&productId=1&postId=5341 +==============================================================================*/ + +sup, +sub { +height: 0; +line-height: 1; +vertical-align: baseline; +position: relative; + +} + +/* For internet explorer: */ + +* html sup, +* html sub { +vertical-align: bottom; +} + +sup { +bottom: 1ex; +} + +sub { +top: .5ex; +} + +/*============================================================================== +Indexes: pretty much the same as the TOC. +==============================================================================*/ + + .index + { + font-size: 80%; + padding-top: 0px; + padding-bottom: 0px; + margin-top: 0px; + margin-bottom: 0px; + margin-left: 0px; + } + + .index ul + { + padding-left: 3em; + } + + .index p + { + padding: 2px; + margin: 2px; + } + + .index-entry-level-0 + { + font-weight: bold; + } + + .index em + { + font-weight: bold; + } + + +/*============================================================================== +Alignment and coloring use 'role' feature, available from Quickbook 1.6 up. +Added from Niall Douglas for role color and alignment. +http://article.gmane.org/gmane.comp.lib.boost.devel/243318 +*/ + +/* Add text alignment (see http://www.w3schools.com/cssref/pr_text_text-align.asp) */ +span.aligncenter +{ + display: inline-block; width: 100%; text-align: center; +} +span.alignright +{ + display: inline-block; width: 100%; text-align: right; +} +/* alignleft is the default. */ +span.alignleft +{ + display: inline-block; width: 100%; text-align: left; +} + +/* alignjustify stretches the word spacing so that each line has equal width +within a chosen fraction of page width (here arbitrarily 20%). +*Not* useful inside table items as the column width remains the total string width. +Nor very useful, except to temporarily restrict the width. +*/ +span.alignjustify +{ + display: inline-block; width: 20%; text-align: justify; +} + +/* Text colors. +Names at http://www.w3.org/TR/2002/WD-css3-color-20020219/ 4.3. X11 color keywords. +Quickbook Usage: [role red Some red text] + +*/ +span.red { inline-block; color: red; } +span.green { color: green; } +span.lime { color: #00FF00; } +span.blue { color: blue; } +span.navy { color: navy; } +span.yellow { color: yellow; } +span.magenta { color: magenta; } +span.indigo { color: #4B0082; } +span.cyan { color: cyan; } +span.purple { color: purple; } +span.gold { color: gold; } +span.silver { color: silver; } /* lighter gray */ +span.gray { color: #808080; } /* light gray */ + + + + + + +/* section-basic.css */ +/* + Copyright 2005-2008 Redshift Software, Inc. + Distributed under the Boost Software License, Version 1.0. + (See accompanying file LICENSE_1_0.txt or https://www.boost.org/LICENSE_1_0.txt) +*/ +/*@import url(css_0/header.css);*/ +/* + Copyright 2005-2008 Redshift Software, Inc. + Distributed under the Boost Software License, Version 1.0. + (See accompanying file LICENSE_1_0.txt or https://www.boost.org/LICENSE_1_0.txt) +*/ +/* Heading, title and logo. */ + +/* Position the common heading. This appears on pages which have their own + * markup. Since the body might have a margin this has to be absolutely + * positioned. The spacer then pushes the page content down so that it + * doesn't fall underneath the heading. */ +#boost-common-heading-doc { + position: absolute; + left: 0; + top: 0; +} +body.boost-asciidoctor #boost-common-heading-doc { + position: static; +} + +#boost-common-heading-doc-spacer { + height: 100px; +} +body.boost-asciidoctor #boost-common-heading-doc-spacer { + display: none; +} + +#boost-common-heading-doc, +#heading { + margin: 0em; + border-bottom: #000000 solid 1px; + width: 100%; + font-family: sans-serif; + font-size: 9.5pt; +} +#boost-common-heading-doc .heading-inner, +#heading .heading-inner { + height: 100px; + overflow: hidden; +} + +#boost-common-heading-doc *, +#heading * { + font-size: 100%; + font-weight: normal; + margin: 0; + padding: 0; + text-decoration: none; +} +#boost-common-heading-doc .heading-placard, +#heading .heading-placard { + display: none; +} +#boost-common-heading-doc .heading-title .heading-boost, +#boost-common-heading-doc .heading-title .heading-cpplibraries, +#heading .heading-title .heading-boost, +#heading .heading-title .heading-cpplibraries { + display: none; +} +#boost-common-heading-doc .heading-title, +#heading .heading-title { + float: left; +} +#boost-common-heading-doc .heading-title a, +#heading .heading-title a { +} +#boost-common-heading-doc .heading-logo, +#heading .heading-logo { + width: 270px; + height: 90px; + border: none; + vertical-align: bottom; + margin: 0px 0px 0px 1.5em; +} +#boost-common-heading-doc .heading-quote, +#heading .heading-quote { + text-align: right; + padding: 25px 1.5em 10px 0em; +} +#boost-common-heading-doc .heading-quote q, +#heading .heading-quote q { + font-size: 90%; + display: block; +} +#boost-common-heading-doc .heading-quote .heading-attribution, +#heading .heading-quote .heading-attribution { + font-size: 85%; + display: block; +} +@media (max-device-width: 480px) { + .heading-quote { + display: none; + } +} +#boost-common-heading-doc .heading-sections, +#heading .heading-sections { + display: none; +} +#boost-common-heading-doc .heading-search, +#heading .heading-search { + display: none; + text-align: right; + padding: 0em 1.5em 0em 0em; +} +#boost-common-heading-doc .heading-search #search-text .q, +#heading .heading-search #search-text .q { + background: transparent; + border: none; + border-bottom: 1px #BBBBBB solid; + margin-right: 0.25em; + font-size: 90%; +} +#boost-common-heading-doc .heading-search #search-text #q:hover, +#heading .heading-search #search-text #q:hover { + border-bottom: 1px #FFFFFF solid; +} + +.boost-common-header-notice { + font-family: sans-serif; + font-size: 13px; + border: 1px solid #aa5; + background: #ffc; + color: #000; +} + +a.boost-common-header-inner, +span.boost-common-header-inner, +div.boost-common-header-inner { + display: block; + padding: 10px 13px; + text-decoration: none; + color: #000; +} + +a.boost-common-header-inner:hover { + text-decoration: underline; +} + +@media all and (min-width: 550px) { + .boost-common-header-notice { + position: absolute; + top: 10px; + max-width: 400px; + max-height: 80px; + overflow: hidden; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.5); + margin-left: 300px; + } +} + + +/*@import url(css_0/theme_grape/header.css);*/ +/* + Copyright 2005-2006 Redshift Software, Inc. + Distributed under the Boost Software License, Version 1.0. + (See accompanying file LICENSE_1_0.txt or https://www.boost.org/LICENSE_1_0.txt) +*/ + +/* Heading, title and logo. */ +#heading, +#boost-common-heading-doc { + /*background: #574D74 url(/images/header-bg.png) repeat-x top left;*/ +} +#heading *, +#boost-common-heading-doc * { + color: #FFFFFF; +} +#heading .heading-inner, +#boost-common-heading-doc .heading-inner { + /*background: url(/images/header-fg.png) no-repeat top left;*/ + border: none; + border-bottom: #000000 solid 1px; +} +#boost-common-heading-doc .heading-logo, +#heading .heading-logo { + width: 236px; + height: 55px; + margin: 18px 0px 0px 24px; +} + +/* Links in the header. */ +#boost-common-heading-doc .heading-quote a, +#heading .heading-quote a { + border-bottom: 1px solid #BBBBBB; +} +#boost-common-heading-doc .heading-quote a:hover, +#heading .heading-quote a:hover { + border-bottom: 1px solid #FFFFFF; +} +#boost-common-heading-doc .heading-quote a:visited, +#heading .heading-quote a:visited { + border-bottom: 1px dotted #BBBBBB; +} +#boost-common-heading-doc .heading-quote a:visited:hover, +#heading .heading-quote a:visited:hover { + border-bottom: 1px dotted #FFFFFF; +} + + +pre, div.toc +{ + overflow: auto; +} + +div.note table, +div.tip table, +div.important table, +div.caution table, +div.warning table, +div.blurb table +{ + table-layout: fixed; + width: 100%; + overflow-wrap: break-word; +} + +span.inlinemediaobject img +{ + max-width: 100%; +} + + + + + + +/* Overrides to handle differences between BoostBook output and Hugo's. +*/ +h1 { font-size: 150%; } +/* Fix that Hugo always puts a

into each

  • */ +li p:first-child { + display: inline; + text-align: inherit; + font-size: inherit; + line-height: inherit; +} +/* Fix that raw dl is not styled */ +dl { + text-align: left; + font-size: 10pt; + line-height: 1.15; +} +/* Fix that preformatted outside div.highlight is not styled */ +pre { + font-size: 10pt; + margin: 1pc 4% 0pc 4%; + padding: 0.5pc 0.5pc 0.5pc 0.5pc; +} +div.highlight pre { + font-size: inherit; + margin: initial; + padding: initial; +} + +/* We don't use tables for notes like BoostBook */ +div.note, +div.tip, +div.important, +div.caution, +div.warning, +div.blurb { + position: relative; +} +div.notices div.heading { + margin-left: 40px; + text-transform: capitalize; + font-weight: bold; + font-size: larger; +} +div.notices div.message { + margin-left: 40px; +} + +/* Bits ported over from local.css for the DocDock theme. +This renders the "View on Github" link. +*/ +div.code-snippet { + position: relative; +} +div.code-snippet a.code-snippet-url { + font-size: 7pt; + position: absolute; + right: 4%; + top: 0.7em; + padding-right: 1em; +} +/* This renders the tutorial TOC */ +.children p { + margin-top: 0px; + margin-bottom: 0px; + padding-top: 0px; + padding-bottom: 0px; +} +.children-li p { + font-size: small; + font-style: italic; +} +ol.children li { + margin-top: 0.75em; +} +ol.children ol { + list-style-type: lower-alpha; +} +ol.children ol li { + margin-top: 0; +} +/* This styles captioned figures */ +figure { + margin: 1em 40px; +} +figure img { + border: 0; + max-width: 80%; + margin: 3rem auto; + display: block; + text-align: center; +} +figure figcaption { + margin-top: -2em; +} +figure figcaption h4 { + text-align: center; + font-size: small; +} diff --git a/doc/html/css/local.css b/doc/html/css/local.css new file mode 100644 index 000000000..b40ca553b --- /dev/null +++ b/doc/html/css/local.css @@ -0,0 +1,169 @@ +body { + text-align: justify; +} +h2, h3, h4, h5, h6 { + text-align: left; +} +article section.page h1:first-of-type { + font-weight: 900; + text-transform: inherit; + line-height: 3.25rem; +} +article > aside .menu { + text-align: left; +} +article > aside .menu code { + border-left: 0.25em solid transparent; + border-right: 0.25em solid transparent; +} +h1 { + font-weight: inherit; + line-height: 3.25rem; +} +h2 { + text-transform: none; + font-weight: inherit; + line-height: 2.55rem; +} +h4 { + line-height: 1.9rem; + font-size: small; +} +dd { + margin-inline-start: 40px; +} +blockquote { + border-left: 4px solid #ccc; + background: #f9f9f9; + font-style: italic; + padding-left: 4em; + padding-right: 4em; + quotes: "\201C""\201D""\2018""\2019"; +} +figure figcaption { + margin-top: -2em; +} +figure figcaption h4 { + text-align: center; +} +code, pre { + text-align: left; +} +a code { + color: inherit; +} +a.api-reference { + font-family: monospace; +} +div.footnotes { + font-size: 85%; +} +article section.page pre .copy-to-clipboard { + background-color: #eee; +} +div.code-snippet { + position: relative; +} +div.code-snippet a.code-snippet-url { + font-size: small; + position: absolute; + right: 3em; + top: 0.7em; +} + +/*nav#TableOfContents { + width: 30em; + float: right; + text-align: left; + font-size: inherit !important; +} +nav#TableOfContents > ul { + list-style: none; +} +nav#TableOfContents > ul > li > ul { + border-radius: 5px; + box-shadow: 0px 0px 10px #000000; + background-color: white; + padding-right: 1em; + list-style-type: lower-roman; +} +nav#TableOfContents > ul > li > ul > li { + line-height: normal; + margin-top: 0.25em; + margin-bottom: 0.25em; +} +nav#TableOfContents > ul > li > ul > li > a.highlight { + display: inline; +} +nav#TableOfContents > ul > li > ul > li > a.highlight code { + vertical-align: inherit; +}*/ + +#navigation a { + color: blue; +} + +.children p { + font-size: small; + margin-top: 0px; + margin-bottom: 0px; + padding-top: 0px; + padding-bottom: 0px; +} +.children-li p { + font-size: small; + font-style: italic; +} +ol.children li { + margin-top: 0.75em; +} +ol.children ol { + list-style-type: lower-alpha; +} +ol.children ol li { + margin-top: 0; +} + + +/* Background */ .chroma { background-color: #ffffff } +/* Error */ .chroma .err { } +/* LineTableTD */ .chroma .lntd { ; vertical-align: top; padding: 0; margin: 0; border: 0; } +/* LineTable */ .chroma .lntable { ; border-spacing: 0; padding: 0; margin: 0; border: 0; width: 100%; overflow: auto; display: block; } +/* LineHighlight */ .chroma .hl { background-color: #ffffcc; display: block; width: 100% } +/* LineNumbersTable */ .chroma .lnt { ; margin-right: 0.4em; padding: 0 0.4em 0 0.4em; display: block; } +/* LineNumbers */ .chroma .ln { ; margin-right: 0.4em; padding: 0 0.4em 0 0.4em; } +/* Keyword */ .chroma .k { color: #0000ff } +/* KeywordConstant */ .chroma .kc { color: #0000ff } +/* KeywordDeclaration */ .chroma .kd { color: #0000ff } +/* KeywordNamespace */ .chroma .kn { color: #0000ff } +/* KeywordPseudo */ .chroma .kp { color: #0000ff } +/* KeywordReserved */ .chroma .kr { color: #0000ff } +/* KeywordType */ .chroma .kt { color: #2b91af } +/* NameClass */ .chroma .nc { color: #2b91af } +/* LiteralString */ .chroma .s { color: #a31515 } +/* LiteralStringAffix */ .chroma .sa { color: #a31515 } +/* LiteralStringBacktick */ .chroma .sb { color: #a31515 } +/* LiteralStringChar */ .chroma .sc { color: #a31515 } +/* LiteralStringDelimiter */ .chroma .dl { color: #a31515 } +/* LiteralStringDoc */ .chroma .sd { color: #a31515 } +/* LiteralStringDouble */ .chroma .s2 { color: #a31515 } +/* LiteralStringEscape */ .chroma .se { color: #a31515 } +/* LiteralStringHeredoc */ .chroma .sh { color: #a31515 } +/* LiteralStringInterpol */ .chroma .si { color: #a31515 } +/* LiteralStringOther */ .chroma .sx { color: #a31515 } +/* LiteralStringRegex */ .chroma .sr { color: #a31515 } +/* LiteralStringSingle */ .chroma .s1 { color: #a31515 } +/* LiteralStringSymbol */ .chroma .ss { color: #a31515 } +/* OperatorWord */ .chroma .ow { color: #0000ff } +/* Comment */ .chroma .c { color: #008000 } +/* CommentHashbang */ .chroma .ch { color: #008000 } +/* CommentMultiline */ .chroma .cm { color: #008000 } +/* CommentSingle */ .chroma .c1 { color: #008000 } +/* CommentSpecial */ .chroma .cs { color: #008000 } +/* CommentPreproc */ .chroma .cp { color: #0000ff } +/* CommentPreprocFile */ .chroma .cpf { color: #0000ff } +/* GenericEmph */ .chroma .ge { font-style: italic } +/* GenericHeading */ .chroma .gh { font-weight: bold } +/* GenericPrompt */ .chroma .gp { font-weight: bold } +/* GenericStrong */ .chroma .gs { font-weight: bold } +/* GenericSubheading */ .chroma .gu { font-weight: bold } diff --git a/doc/html/experimental.html b/doc/html/experimental.html new file mode 100644 index 000000000..02c62c85a --- /dev/null +++ b/doc/html/experimental.html @@ -0,0 +1,112 @@ + + +Experimental - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    + +

    Experimental

    +

    In <boost/outcome/experimental>, there ships an Outcome-based simulation of +the proposed P1095 Zero overhead deterministic failure +specific implementation of P0709 Zero overhead exceptions: Throwing values. +This library-only implementation lets you use a close simulacrum +of potential future C++ lightweight exceptions today in any C++ 14 compiler +which Outcome supports.

    + +

    This Experimental Outcome implementation has been in production use for some +years now. It has shipped on at least one billion devices, as part of a +games suite very popular on Microsoft Windows, Apple iOS and Google Android +devices. It powers big iron enterprise applications as well, indeed all +trades including futures in the United States are captured live into a database +for the SEC by an Experimental Outcome based codebase. Finally, Experimental +Outcome is used in the firmware of parts of driver assisting cars where its +particularly rich and flexible failure added information combined with +compatibility with globally disabled C++ exceptions proved to be a big win.

    + +

    The base for failure handling in future C++ might be std::error from P1028 +status_code. This proposal is currently being +refined before WG21’s Library Evolution Working Group with the expectation that +it will be standardised as a large enhancement and backwards compatible superset +of std::error_code which is also capable of transporting any move-only type +such as std::exception_ptr. Like std::error_code, proposed std::error +occupies exactly two CPU registers of layout, and thus is extremely lightweight. +It can wrap arbitrary third party error handling systems, and automatically +constructs from std::error_code and std::exception_ptr, propagating the +original underlying implementations (no matter how customised) exactly (e.g. +boost::exception_ptr). Unlike <system_error>, std::error does not have +dependencies on expensive standard library headers, so including it into your +global build has a very low build time impact. std::error knows how to throw +itself as a conventional C++ exception, and knows how to losslessly consume +arbitrary C++ exception throws. Finally, std::error is ABI stable, and is +a P1029 move bitcopying type whereby moved-from +objects do not need to be destroyed.

    + +
    + +

    Experimental Outcome uses the same proposed std::error object as P1095 would do +for its E type by bundling internally a copy of +https://ned14.github.io/status-code/, the reference implementation library +for proposed std::error. Outcome emulates move bitcopying semantics for types +declaring themselves move bitcopying via the trait is_move_bitcopying<T> +, +and status codes opt into this. This greatly improves codegen to be no worse +than with std::error_code (a trivially copyable type), as https://godbolt.org/z/GEdEGc +demonstrates, despite that proposed std::error is a move-only type with +a non-trivial destructor.

    + +

    Outcome binds status_code into basic_result and basic_outcome customisations +via the following headers:

    + +
      +
    • <boost/outcome/experimental/status_result.hpp>
    • +
    • <boost/outcome/experimental/status_outcome.hpp>
    • +
    + +

    These headers import the entire contents of the BOOST_OUTCOME_SYSTEM_ERROR2_NAMESPACE +namespace into the BOOST_OUTCOME_V2_NAMESPACE::experimental namespace. You +can thus address everything in BOOST_OUTCOME_SYSTEM_ERROR2_NAMESPACE via +BOOST_OUTCOME_V2_NAMESPACE::experimental.

    + +

    As P1095 also proposes C language support for lightweight C++ exceptions, +experimental Outcome also has a macro-based C interface that enables C +code to work with the C-compatible subset of status_result<T, E>:

    + +
      +
    • <boost/outcome/experimental/result.h>
    • +
    + +

    For non-Windows non-POSIX platforms such as some embedded systems, standalone +Experimental Outcome can be used with the BOOST_OUTCOME_SYSTEM_ERROR2_NOT_POSIX macro +defined. This does not include POSIX headers, and makes available a high fidelity, +fully deterministic, alternative to C++ exceptions on such platforms.

    + +

    Finally, there is a single include edition of Experimental Outcome, which +can be found at https://github.com/ned14/outcome/blob/develop/single-header/outcome-experimental.hpp. +You can play with this on godbolt by #include <outcome-experimental.hpp>.

    + +
    +
    warning
    +

    It is stressed, in the strongest possible terms, that any item inside +<boost/outcome/experimental> is subject to unannounced breaking change based +on WG21 standards committee feedback. That said, the chances are high +that most of those breaking changes will be to naming rather than to +fundamental semantics, so you can upgrade with a bit of find and replace.

    +
    +
    + + + + +

    Last revised: December 17, 2020 at 11:27:06 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/experimental/advantages.html b/doc/html/experimental/advantages.html new file mode 100644 index 000000000..f05461d7f --- /dev/null +++ b/doc/html/experimental/advantages.html @@ -0,0 +1,70 @@ + + +The main advantages - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    The main advantages

    +

    The main advantages of choosing <boost/outcome/experimental> over default Outcome:

    + +
      +
    1. Codegen is tighter and less verbose1, sometimes remarkably so.

    2. + +
    3. Build time impact is markedly lower, barely above the inclusion of naked +<basic_result.hpp>, as the STL allocator machinery and std::string et al +is not dragged into inclusion by including <system_error>. Note that +<boost/outcome/experimental/status_outcome.hpp> bring in <exception>, +however <boost/outcome/experimental/status_result.hpp> brings in no extra system +headers.

    4. + +
    5. More discipline is imposed on your use of Outcome, leading to +less ambiguous code which is easier to optimise by the compiler, +lower cost to maintain, and lower cognitive load to audit code based on +experimental Outcome for correctness.

    6. + +
    7. Code written to <boost/outcome/experimental> can be fairly easily dual +targeted, with just a few switching type aliases, to default Outcome. +This author has several Outcome-based libraries with identical source code which +can target either configuration of Outcome. The experimental Outcome +build regularly beats the default Outcome build in benchmarks by 2-3%, +and the dual target source code, being written to tighter discipline, +is faster and more deterministic in the default target than it was before +the (non-trivial) port to <boost/outcome/experimental>.

    8. + +
    9. If you want ‘official’ C support, experimental Outcome is able to +provide that in a way not possible for default Outcome which cannot make +sufficiently strong C compatibility assumptions about std::error_code.

    10. +
    + +

    If you are building a codebase on top of Outcome expecting long term +maintenance, the author’s personal recommendation is that you design, write, test and +optimise it for <boost/outcome/experimental>. What you ship to your customers +ought to be targeted at default Outcome however, so employ type aliases and +macros as appropriate to switch the build configuration for production releases. +This is what the Outcome author does himself, to date with great success, +despite the fundamental architectural differences between <system_error> +and proposed <system_error2>.

    +
    + +
    + +
      +
    1. Boost.System’s error_code has incorporated some of the design improvements of experimental status_code, and produces codegen somewhere in between experimental status_code and std::error_code. + [return]
    2. +
    +
    + + +

    Last revised: July 16, 2024 at 21:33:35 +0100

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/experimental/c-api.html b/doc/html/experimental/c-api.html new file mode 100644 index 000000000..2a999e0bd --- /dev/null +++ b/doc/html/experimental/c-api.html @@ -0,0 +1,58 @@ + + +Using Outcome from C code - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    + +

    Using Outcome from C code

    +

    A long standing problem for C code (or more usually nowadays, the many other programming +languages which can speak the C ABI but not the C++ ABI) is how to interpret C++ exception throws. The answer +is of course that they cannot, thus requiring one to write C shim code on the C++ side +of things of the form:

    +
    // The API we wish to expose to C
    +const char *get_value(double v);
    +
    +// The C shim function for the C++ get_value() function.
    +extern "C" int c_get_value(const char **ret, double v)
    +{
    +  try
    +  {
    +    *ret = get_value(v);
    +    return 0;  // success
    +  }
    +  catch(const std::range_error &)
    +  {
    +    return ERANGE;
    +  }
    +  // More catch clauses may go in here ...
    +  catch(...)
    +  {
    +    return EAGAIN;
    +  }
    +}
    +
    +

    This is sufficiently painful that most reach for a bindings generator tool like +SWIG to automate this sort of tedious boilerplate generation. +And this is fine for larger projects, but for smaller projects the cost of +setting up and configuring SWIG is also non-trivial.

    + +

    What would be really great is if result<T> returning noexcept C++ functions +could be used straight from C. And indeed Experimental Outcome provides just that facility +which this section covers next.

    + + + +

    Last revised: February 05, 2019 at 17:14:18 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/experimental/c-api/from-c.html b/doc/html/experimental/c-api/from-c.html new file mode 100644 index 000000000..cd9bc2f29 --- /dev/null +++ b/doc/html/experimental/c-api/from-c.html @@ -0,0 +1,64 @@ + + +C Results - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    + +

    C Results

    +

    The C macro API header <boost/outcome/experimental/result.h> has some macros for working with any kind of Result:

    + +
    +
    BOOST_OUTCOME_C_DECLARE_RESULT(ident, T, E) +
    Declares to C a basic_result type uniquely +identified by ident. T is available at the +member variable .value, and E is available +at the member variable .error. If you call this from within +C++, make SURE it is not within a extern "C" block! + +
    BOOST_OUTCOME_C_RESULT(ident) +
    A reference to a previously declared result type with +unique ident. + +
    BOOST_OUTCOME_C_RESULT_HAS_VALUE(r) +
    Evaluates to 1 (true) if the input result has a value. + +
    BOOST_OUTCOME_C_RESULT_HAS_ERROR(r) +
    Evaluates to 1 (true) if the input result has an error. + +
    BOOST_OUTCOME_C_RESULT_ERROR_IS_ERRNO(r) +
    Evaluates to 1 (true) if the input result's error value +is a code in the POSIX errno domain. +
    + +

    The above let you work, somewhat awkwardly, with any C-compatible +basic_result<T, E>. basic_result<T, E> is trivially copyable and +standard layout if its T and E are both so, and it has the C layout:

    +
    struct cxx_result_##ident
    +{
    +  union
    +  {
    +    T value;
    +    E error;
    +  };
    +  unsigned flags;
    +};
    +
    +

    Note that this layout is different to that of BOOST_OUTCOME_C_DECLARE_STATUS_CODE +as the C++ result has a different layout if E is a status code.

    + + + +

    Last revised: July 17, 2024 at 17:54:05 +0100

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/experimental/c-api/from-c/declare.html b/doc/html/experimental/c-api/from-c/declare.html new file mode 100644 index 000000000..896be573a --- /dev/null +++ b/doc/html/experimental/c-api/from-c/declare.html @@ -0,0 +1,52 @@ + + +Declare a Result - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    Declare a Result

    +
    // Declare to C a Result with a happy value of intptr_t
    +BOOST_OUTCOME_C_DECLARE_RESULT_SYSTEM(result_int, intptr_t)
    +
    +// Save oneself typing out BOOST_OUTCOME_C_RESULT_SYSTEM(result_int) all the time
    +typedef BOOST_OUTCOME_C_RESULT_SYSTEM(result_int) result;
    +
    +// Our custom C enum
    +enum c_enum
    +{
    +  c_enum_not_found,
    +  c_enum_bad_argument
    +};
    +
    +// Make a custom status code domain for this C enum
    +BOOST_OUTCOME_C_DECLARE_RESULT_SYSTEM_FROM_ENUM(result_int,                                // The C Result type declared above
    +                                    c_enum,                                    // The C enum we wish to wrap
    +                                    "{74ceb994-7622-3a21-07f0-b016aa705585}",  // Unique UUID for this domain
    +                                    // Mappings of C enum values to textual description and semantic equivalances to generic codes
    +                                    {c_enum::c_enum_not_found, "item not found", {errc::no_such_file_or_directory}},
    +                                    {c_enum::c_enum_bad_argument, "invoked wrong", {errc::invalid_argument}})
    +
    +// Make helper macros
    +#define SUCCESS(v) BOOST_OUTCOME_C_MAKE_RESULT_SYSTEM_SUCCESS(result_int, (v))
    +#define FAILURE(v) BOOST_OUTCOME_C_MAKE_RESULT_SYSTEM_FROM_ENUM(result_int, c_enum, (v))
    +
    View this code on Github
    + + +

    The key to making C programming easy is to alias the long complex things +into short easy thing. Obviously SUCCESS(expr) and FAILURE(expr) is too +generic, but for the purposes of this documentation it makes thing easier.

    + + +

    Last revised: July 16, 2024 at 21:33:35 +0100

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/experimental/c-api/from-c/system_code.html b/doc/html/experimental/c-api/from-c/system_code.html new file mode 100644 index 000000000..c051742cd --- /dev/null +++ b/doc/html/experimental/c-api/from-c/system_code.html @@ -0,0 +1,117 @@ + + +C system error results - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    C system error results

    +

    In v2.2.11, C Result support went from second tier to first tier status, and +now you can create, query and manipulate a subset of Result types entirely from +within C by including <boost/outcome/experimental/result.h>.

    + +

    The subset supported are those result<T, E> which are a status_result<T> +i.e. the E is hardcoded to experimental::error which is the type erased runtime +polymorphic holder for any errored status_code whose payload is not bigger +than an intptr_t. This is the most useful subset of Outcome Experimental’s +possible Result types, allowing arbitrary custom error coding schemes from +any unknown source to work seamlessly with all others, including errors from +the system or third party libraries.

    + +

    The operations available to C are:

    + +
    +
    BOOST_OUTCOME_C_DECLARE_RESULT_SYSTEM(ident, T) +
    Declares to C a status_result type uniquely +identified by ident. T is available at the +member variable .value, and struct cxx_status_code_system +is available at the member variable .error. If in C++, +implements C extern functions for making successful and failure results +of this type. If you call this from within +C++, make SURE it is not within a extern "C" block! + +
    BOOST_OUTCOME_C_RESULT_SYSTEM(ident) +
    A reference to a previously declared status_result type with +unique ident. + +
    BOOST_OUTCOME_C_MAKE_RESULT_SYSTEM_SUCCESS(ident, expr) (needs C++ counterpart linked into final binary) +
    This invokes the aforementioned extern function which creates a status_result +with a successful value of type T. +
    BOOST_OUTCOME_C_MAKE_RESULT_SYSTEM_FAILURE_POSIX(ident, expr) (needs C++ counterpart linked into final binary) +
    This invokes the aforementioned extern function which creates a status_result +with a failure of type posix_code representing a POSIX errno. +
    BOOST_OUTCOME_C_MAKE_RESULT_SYSTEM_FAILURE_SYSTEM(ident, expr) (needs C++ counterpart linked into final binary) +
    This invokes the aforementioned extern function which creates a status_result +with a failure of type posix_code representing a POSIX errno +if on POSIX; if on Windows then a failure of type win32_code +representing a Win32 error code from a Windows API. + +

    +
    BOOST_OUTCOME_C_RESULT_HAS_VALUE(r) +
    Evaluates to 1 (true) if the input result has a value. + +
    BOOST_OUTCOME_C_RESULT_HAS_ERROR(r) +
    Evaluates to 1 (true) if the input result has an error. + +
    BOOST_OUTCOME_C_RESULT_ERROR_IS_ERRNO(r) +
    Evaluates to 1 (true) if the input result's error value +is a code in the POSIX errno domain. +

    +
    BOOST_OUTCOME_C_RESULT_SYSTEM_TRY(expr) +
    If the status_result returned by expr is +errored, exit the current function returning the result. This obviously +requires that the return type of the current function matches that of +expr. + +
    BOOST_OUTCOME_C_RESULT_SYSTEM_TRY(cleanup, expr) +
    Same as the above, but execute cleanup just before exiting the function +if returning failure. + +
    BOOST_OUTCOME_C_RESULT_SYSTEM_TRY(var, cleanup, expr) +
    Same as the above, but set var equal to the result's .value on success. + +
    BOOST_OUTCOME_C_RESULT_SYSTEM_TRY(var, ident, cleanup, expr) +
    Same as the above, but use ident as the return type instead. This allows +the return type of the calling function to differ from that of expr. +

    +
    BOOST_OUTCOME_C_DECLARE_RESULT_SYSTEM_FROM_ENUM(ident, enum_name, uuid, {enum mapping-sequence, ...}) +
    This declares to C an extern function which creates a status_result +from a C enum. If in C++, it implements a quick_status_code_from_enum for +the C enum and the associated extern function, and you will need to supply uuid +and the appropriate enum value mapping sequence +as per the quick_status_code_from_enum documentation. +
    BOOST_OUTCOME_C_MAKE_RESULT_SYSTEM_FROM_ENUM(ident, enum_name, expr) (needs C++ counterpart linked into final binary) +
    This invokes the aforementioned extern function which creates a status_result +from a C enum. +
    + +

    The operations available to C++ are:

    + +
    +
    BOOST_OUTCOME_C_TO_RESULT_SYSTEM_CODE(ident, status_code<T>) +
    Returns a previously declared C Result from its matching C++ status_code. +NOTE that the destructor of the C++ status code is NOT called. If this is important +to your status code, it is 100% on you to ensure that your C Result reenters a C++ +Result at the end of its lifetime. + +
    to_result(any C Result) +
    This is an overloaded C++ free function which returns the C++ status_code<T> +matching its input C Result. +
    + +

    Using the above you can write C code using Outcome.Experimental’s Result type +quite effectively. Let’s look at an example of use next.

    + + +

    Last revised: July 17, 2024 at 17:54:05 +0100

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/experimental/c-api/from-c/try.html b/doc/html/experimental/c-api/from-c/try.html new file mode 100644 index 000000000..13a9092c2 --- /dev/null +++ b/doc/html/experimental/c-api/from-c/try.html @@ -0,0 +1,43 @@ + + +TRY a C Result - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    TRY a C Result

    +

    Thanks to much of the magic of BOOST_OUTCOME_TRY(var, expr) + being implemented +using C preprocessor metaprogramming, we can offer a very similar experience for the +C try operation and without needing anything compiled in C++ as support functions:

    + +
    result test2(int x)
    +{
    +  BOOST_OUTCOME_C_RESULT_SYSTEM_TRY(int v,                                        // what to set to value if successful
    +                        fprintf(stderr, "Positive numbers only!\n"),  // what cleanup to run if unsuccessful
    +                        positive_only(x));
    +  return SUCCESS(v + 1);
    +}
    +
    View this code on Github
    + + +

    The principle difference is that you can specify a cleanup routine to perform if +failure is encountered. This is especially useful in C, which has no stack unwinding.

    + +

    Also due to lack of type sugaring and user defined implicit conversions, if your +callers result type isn’t your callee’s, you may need to specify what your caller’s +result type is so the error state can be correctly propagated.

    + + +

    Last revised: July 16, 2024 at 21:33:35 +0100

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/experimental/c-api/from-c/use.html b/doc/html/experimental/c-api/from-c/use.html new file mode 100644 index 000000000..bba38f581 --- /dev/null +++ b/doc/html/experimental/c-api/from-c/use.html @@ -0,0 +1,53 @@ + + +Using a Result - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    Using a Result

    +

    This models the earlier C++ example of use, +and its C equivalent isn’t much more verbose thanks to our helper typedefs and macros:

    + +
    result positive_only(int x)
    +{
    +  if(x < 0)
    +  {
    +    return FAILURE(c_enum_bad_argument);
    +  }
    +  return SUCCESS(x);
    +}
    +
    +bool test(int x)
    +{
    +  result r = positive_only(x);
    +  if(BOOST_OUTCOME_C_RESULT_HAS_ERROR(r))
    +  {
    +    if(outcome_status_code_equal_generic(&r.error, EINVAL))
    +    {
    +      fprintf(stderr, "Positive numbers only!\n");
    +      return false;
    +    }
    +  }
    +  return true;
    +}
    +
    View this code on Github
    + + +

    For this to link, the BOOST_OUTCOME_C_DECLARE_RESULT_SYSTEM_FROM_ENUM macro needs to be +compiled at least once within C++ within the final binary to emit the extern +functions needed by C.

    + + +

    Last revised: July 16, 2024 at 21:33:35 +0100

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/experimental/c-api/from-cxx.html b/doc/html/experimental/c-api/from-cxx.html new file mode 100644 index 000000000..4fe2be58d --- /dev/null +++ b/doc/html/experimental/c-api/from-cxx.html @@ -0,0 +1,83 @@ + + +Calling C++ from C - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    + +

    Calling C++ from C

    +

    C++ has excellent two-way compatibility with the C ABI, but there are some +limitations you must observe to write C++ code which C code can call without +marshalling at the ABI boundary:

    + +
      +
    1. A C++ function may not throw exceptions if it is safe to call from C, and +so should always be marked noexcept.

    2. + +
    3. A C++ function should be annotated with extern "C" to prevent its symbol +being mangled, and thus give it the C rather than C++ ABI.

    4. + +
    5. You cannot use overloading in your extern "C" functions.

    6. + +
    7. You may only use types in your C++ function declaration for which these traits are both true:

      + + + +

      (Note that std::is_trivially_copyable_v<T> requires trivial destruction, +but NOT trivial construction. This means that C++ can do non-trivial construction +of otherwise trivial types)

    8. +
    + +
    + +

    The above is what the standard officially requires for well defined C and C++ interop. +However, all of the three major compilers MSVC, GCC and clang are considerably more relaxed. +In those three major compilers, “almost-standard-layout” C++ types work fine in C.

    + +

    “Almost-standard-layout” C++ types have these requirements:

    + +
      +
    1. No virtual functions or virtual base classes i.e. +std::is_polymorphic_v<T> +must be false. This is because the vptrs offset the proper front of the data layout +in an unknowable way to C.
    2. +
    3. Non-static data members of reference type appear to C as pointers. You +must never supply from C to C++ a non-null pointer which is seen as a reference in C++.
    4. +
    5. C++ inheritance is seen in C data layout as if the most derived class has nested +variables of the inherited types at the top, in order of inheritance.
    6. +
    7. Types with non-trivial destructors work fine so long as at least move construction +and assignment is the same as +copying bits like memcpy(). You just need to make sure instances of the type return +to C++, and don’t get orphaned in C. This was referred to in previous pages in this +section as “move relocating” types.
    8. +
    + +

    Experimental Outcome’s support for being used from C does not meet the current strict +requirements, and thus relies on the (very common) implementation defined behaviour just +described (it is hoped that future C++ standards can relax the requirements to those +just described).

    + +

    Specifically, proposed status_code is an almost-standard-layout type, +and thus while it can’t be returned from extern "C" functions as the compiler +will complain, it is perfectly safe to return from C++ functions to C code on the +three major compilers, as it is an “almost-standard-layout” C++ type if T is +an “almost-standard-layout” C++ type.

    + + + +

    Last revised: July 16, 2024 at 21:33:35 +0100

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/experimental/c-api/from-cxx/example.html b/doc/html/experimental/c-api/from-cxx/example.html new file mode 100644 index 000000000..e004995f9 --- /dev/null +++ b/doc/html/experimental/c-api/from-cxx/example.html @@ -0,0 +1,70 @@ + + +Example C++ function - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    Example C++ function

    +

    Let us start with a simple C++ function which we wish to make available to C code:

    + +
    namespace outcome_e = BOOST_OUTCOME_V2_NAMESPACE::experimental;
    +
    +// Fill the supplied buffer with the integer v converted to a string,
    +// returning length of string minus null terminator
    +outcome_e::status_result<size_t> to_string(char *buffer, size_t bufferlen, int v) noexcept
    +{
    +  try
    +  {
    +    // Could throw an exception!
    +    std::string temp(std::to_string(v));
    +
    +    // Will this string exceed the supplied buffer?
    +    if(temp.size() + 1 > bufferlen)
    +      return outcome_e::errc::no_buffer_space;
    +
    +    // Copy the string into the supplied buffer, and return length of string
    +    memcpy(buffer, temp.data(), temp.size() + 1);
    +    return temp.size();
    +  }
    +  catch(...)
    +  {
    +    // This is the <system_error2> analogue of Standard Outcome's
    +    // error_from_exception() utility function. It consumes an exception
    +    // ptr (defaulted to current exception), and tries to match it to a
    +    // standard C++ library exception type, returning a system_code
    +    // with an appropriate code domain (generic_code, posix_code,
    +    // win32_code).
    +    //
    +    // Note that using this function requires including
    +    // <boost/outcome/experimental/system_code_from_exception.hpp>
    +    // It is NOT included by Experimental Outcome by default.
    +    return outcome_e::system_code_from_exception();
    +  }
    +}
    +
    View this code on Github
    + + +

    As the alias status_result<size_t> defaults the erased type to the alias system_code, +the to_string() function returns (in concrete types) basic_result<size_t, status_code<erased<intptr_t>>>.

    + +

    The standard Outcome function referenced is documented at + + std::error_code error_from_exception(std::exception_ptr &&ep = std::current_exception(), std::error_code not_matched = std::make_error_code(std::errc::resource_unavailable_try_again)) noexcept +. +The proposed <system_error2> reference library implementation provides an identically named +function taking similar parameters, but it returns a outcome_e::system_code (status_code<erased<intptr_t>>) instead of a std::error_code.

    + + +

    Last revised: July 16, 2024 at 21:33:35 +0100

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/experimental/c-api/from-cxx/example2.html b/doc/html/experimental/c-api/from-cxx/example2.html new file mode 100644 index 000000000..facaf3a87 --- /dev/null +++ b/doc/html/experimental/c-api/from-cxx/example2.html @@ -0,0 +1,77 @@ + + +Calling it from C - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    Calling it from C

    +

    Firstly we need to declare to C our result returning C++ function:

    + +
    // Declare our C++ function's returning result type. Only needs to be done once.
    +// This declares an `status_result<size_t, system_code>` which is an alias to
    +// `basic_result<size_t, status_code<erased<intptr_t>>>`.
    +//
    +// The first parameter is some unique identifier for this type which will be used
    +// whenever we reference this type in the future.
    +CXX_DECLARE_RESULT_SYSTEM(to_string_rettype, size_t)
    +
    +// Tell C about our extern C++ function `to_string()`
    +extern CXX_RESULT_SYSTEM(to_string_rettype) _Z9to_stringPcmi(char *buffer, size_t bufferlen, int v);
    +
    View this code on Github
    + + +

    Now let’s call the C++ function from C:

    + +
    void print(int v)
    +{
    +  char buffer[4];
    +  CXX_RESULT_SYSTEM(to_string_rettype) res;
    +
    +  res = _Z9to_stringPcmi(buffer, sizeof(buffer), v);
    +  if(CXX_RESULT_HAS_VALUE(res))
    +  {
    +    printf("to_string(%d) fills buffer with '%s' of %zu characters\n", v, buffer, res.value);
    +    return;
    +  }
    +  // Is the error returned in the POSIX domain and thus an errno?
    +  if(CXX_RESULT_ERROR_IS_ERRNO(res))
    +  {
    +    fprintf(stderr, "to_string(%d) failed with error code %d (%s)\n", v, (int) res.error.value, strerror((int) res.error.value));
    +    return;
    +  }
    +  fprintf(stderr, "to_string(%d) failed with unknown error code %lld\n", v, (long long) res.error.value);
    +}
    +
    +int main(void)
    +{
    +  print(9);
    +  print(99);
    +  print(999);
    +  print(9999);
    +  return 0;
    +}
    +
    View this code on Github
    + + +

    Running this C program yields:

    + +
    to_string(9) fills buffer with '9' of 1 characters
    +to_string(99) fills buffer with '99' of 2 characters
    +to_string(999) fills buffer with '999' of 3 characters
    +to_string(9999) failed with error code 105 (No buffer space available)
    +
    + + +

    Last revised: July 16, 2024 at 21:33:35 +0100

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/experimental/differences.html b/doc/html/experimental/differences.html new file mode 100644 index 000000000..053536c71 --- /dev/null +++ b/doc/html/experimental/differences.html @@ -0,0 +1,103 @@ + + +Major differences - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    Major differences

    +

    The major design differences between <system_error> and proposed <system_error2> are +as follows:

    + +
      +
    1. experimental::status_code<DomainType> can represent warnings +and form-of-success codes as well as failure codes. experimental::errored_status_code<DomainType> +is more similar to std::error_code, in that it can only represent failures +(this is enforced by C++ 20 contract or runtime assertion check).

    2. + +
    3. The code’s domain implementation defines the payload type to be transported around by +experimental::status_code<DomainType>, rather than it being +hardcoded to int as in std::error_code. The payload type can be anything +you like, including non-trivially-copyable, move-only, complex etc types.

      + +

      This facility is extremely useful. Extra failure metadata such as stack +backtraces can be returned, for example. You can absolutely vary the payload +depending on whether NDEBUG or _DEBUG is defined, too.

    4. + +
    5. If your domain defines a payload type which is trivially copyable or +move relocating1, it gains an implicit convertibility to a move-only +experimental::status_code<erased<T>> where T is another +trivially copyable or move relocating type. This permits global headers +to use a single, common, type erased, status code type which is highly +desirable for code bases of any complexity. However, unlike std::error_code, +which fulfils the exact same role in <system_error> based code, the type +erased payload can be bigger than the hardcoded int in std::error_code.

      + +

      This facility is also extremely useful, as extra failure metadata can be +type erased, transported through code with no knowledge of such things, +and the original type with failure metadata resurrected at the handling point. +Indeed P1095 proposed std::error is a type alias to +experimental::status_code<erased<intptr_t>>, and it can transport erased +std::exception_ptr instances, POSIX error codes, and much more besides.

    6. + +
    7. Equality comparisons between status code’s with non-identical domains are +always semantic i.e. are they semantically equivalent, rather than exactly +equal? This mirrors when you compare std::error_code to a std::error_condition, +but as there is no equivalent for the latter in <system_error2>, this means +that when you see the code:

      +
      if(code1 == code2) ...
      +
      +

      … you can be highly confident that this is an inexact, semantic, match operation. +The same code under <system_error> is highly ambiguous as to whether exact +or inexact comparison is being performed (after all, all there is is “code1 == code2”, +so it depends on the types of code1 and code2 which usually is not obvious).

      + +

      The ambiguity, and high cognitive load during auditing <system_error> code for correctness, has +led to many surprising and unexpected failure handling bugs during the past +decade in production C++.

    8. + +
    9. <system_error2>, being a new design, has all-constexpr construction and +destruction which avoids the need for static global variables, as <system_error> +has. Each of those static global variables requires an atomic fence just in +case it has not been initialised, thus every retrieval of an error category bloats +code and inhibits optimisation, plus makes the use of custom error code categories +in header-only libraries unreliable. Boost.System has replicated the all-constexpr +construction and destruction from <system_error2>, and thus now has similar +characteristics in this regard.

    10. + +
    11. Finally, this is a small but important difference. Under <system_error>, +this extremely common use case is ambiguous:

      +
      if(ec) ...
      +
      +

      Does this code mean “if there was an error?”, or “if the error code is set?”, +or “is the error code non-zero?”. The correct answer according to the standard is the last choice, but +a quick survey of open source <system_error> based code on github quickly +demonstrates there is widespread confusion regarding correct usage.

      + +

      <system_error2> solves this by removing the boolean test entirely. One +now writes if(sc.success()) ..., if(sc.failure()) ..., if(sc.empty()) ... +and so on, thus eliminating ambiguity.

    12. +
    +
    + +
    + +
      +
    1. Move relocating is not in the standard, it is currently within WG21 Evolution Working Group Incubator. It is defined to be a type whose move constructor memcpy()’s the bits from source to destination, followed by memcpy() of the bits of a default constructed instance to source, and with a programmer-given guarantee that the destructor, when called on a default constructed instance, has no observable side effects. A surprising number of standard library types can meet this definition of move relocating, including std::vector<T>, std::shared_ptr<T>, and std::exception_ptr. + [return]
    2. +
    +
    + + +

    Last revised: December 16, 2020 at 14:14:42 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/experimental/map.html b/doc/html/experimental/map.html new file mode 100644 index 000000000..e1789b112 --- /dev/null +++ b/doc/html/experimental/map.html @@ -0,0 +1,85 @@ + + +Approximate map between error code designs - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    Approximate map between error code designs

    +

    Much of the design of Boost.System (which went on to become <system_error>) +has been retained in proposed <system_error2>, so an approximate map between +<system_error2> and <system_error> and Boost.System can be given:

    + + ++ + + + + + + + + + + +
    C++ 17 <system_error>Boost.SystemProposed <system_error2> +
    std::errc + boost::system::errc + experimental::errc (almost identical) +
    std::error_category + boost::system::error_category + experimental::status_code_domain +
    std::generic_category + boost::system::generic_category + experimental::generic_code_domain +
    std::system_category + boost::system::system_category + One of:
      +
    • experimental::posix_code_domain (POSIX systems)

      +

    • experimental::win32_code_domain (Microsoft Windows)

      +

    • experimental::nt_code_domain (Microsoft Windows) +
    + Note that there are more precanned code categories though they require additional header inclusions: +com_code, getaddrinfo_code. +
    std::error_condition + boost::system::error_condition + No equivalent (deliberately removed as hindsight proved it to be a design mistake leading to much confusing and hard to audit for correctness code) +
    std::error_code + boost::system::error_code + One of:
      +
    • experimental::status_code<DomainType>

      +

    • const experimental::status_code<void> &

      +

    • experimental::status_code<erased<intptr_t>> (aliased to experimental::system_code)

      +

    • experimental::errored_status_code<DomainType>

      +

    • const experimental::errored_status_code<void> &

      +

    • experimental::errored_status_code<erased<intptr_t>> (aliased to experimental::error) +
    + The difference between status codes and errored status codes is that the latter are guaranteed + to refer to a failure, whereas the former may refer to a success (including warnings and informationals). +
    std::system_error + boost::system::system_error + One of:
      +
    • const experimental::status_error<void> &

      +

    • experimental::status_error<DomainType> +
    +
    + +

    As is obvious from the above, in <system_error2> one must be much more specific and accurate +with respect to intent and specification and desired semantics than with <system_error>. Much +ambiguity and incorrectness which flies silently in <system_error> will +refuse to compile in <system_error2>.

    + + +

    Last revised: December 16, 2020 at 14:14:42 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/experimental/outcome.html b/doc/html/experimental/outcome.html new file mode 100644 index 000000000..dedd5ec99 --- /dev/null +++ b/doc/html/experimental/outcome.html @@ -0,0 +1,101 @@ + + +Tying it all together - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    Tying it all together

    + + +

    Firstly let’s alias a more convenient form of status_result:

    + +
    template <class T, class E = outcome_e::error>
    +using result =  //
    +outcome_e::status_result<T, E, outcome_e::policy::default_status_result_policy<T, E>>;
    +
    View this code on Github
    + + +

    (The defaulting of default_result_policy is superfluous, it’s already the default)

    + +

    What follows now is very standard Outcome code. Indeed, it would compile +just fine under standard Outcome with only a few typedefs.

    + +
    result<file_handle, file_io_error> open_file(const char *path)  // models throws(file_io_error)
    +{
    +  file_handle ret(::fopen(path, "r"));
    +  if(ret)
    +    return ret;
    +  return file_io_error({errno, __LINE__, __FILE__});
    +}
    +
    +result<void> open_resource()  // models throws(std::error)
    +{
    +  for(;;)
    +  {
    +    result<file_handle, file_io_error> r = open_file("some file");
    +    if(r)
    +      break;
    +    file_io_error e = r.error();
    +    if(e != outcome_e::errc::resource_unavailable_try_again)
    +    {
    +      // NOTE this implicitly converts from `file_io_error` to `error` via the
    +      // `make_status_code()` free function customisation point defined above.
    +      return e;
    +    }
    +  }
    +  // success continues here ...
    +  return outcome_e::success();
    +}
    +
    +int main(void)
    +{
    +  result<void> r = open_resource();
    +  if(r)
    +    printf("Success!\n");
    +  else
    +  {
    +    auto e = std::move(r).error();
    +    // A quick demonstration that the indirection works as indicated
    +    printf("Returned error has a code domain of '%s', a message of '%s'\n", e.domain().name().c_str(), e.message().c_str());
    +    printf("\nAnd semantically comparing it to 'errc::no_such_file_or_directory' = %d\n", e == outcome_e::errc::no_such_file_or_directory);
    +  }
    +}
    +
    View this code on Github
    + + +

    And running this program yields:

    + +
    Returned error has a code domain of 'file i/o error domain', a message of 'No such file or directory (c:\users\ned\documents\boostish\outcome\doc\src\snippets\experimental_status_code.cpp:195)'
    +
    +And semantically comparing it to 'errc::no_such_file_or_directory' = 1
    +
    + +

    Conclusion

    + +

    Once you get used to <system_error2> and the fact that any result with +E = error is always move-only, using experimental Outcome is just like +using normal Outcome. Except that codegen will be better, custom domains +are safe to use in headers, semantic comparisons have guaranteed complexity +bounds, and build times are much reduced.

    + +

    What’s not to like? :)

    + +

    Finally, if you have feedback on using experimental Outcome which you think +would be of use to the standards committee when evaluating possible +implementations of P0709 Zero overhead exceptions: Throwing values, +please do get in touch! This especially includes successful experiences!!!

    + + +

    Last revised: July 16, 2024 at 21:33:35 +0100

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/experimental/status_result.html b/doc/html/experimental/status_result.html new file mode 100644 index 000000000..a57b5587a --- /dev/null +++ b/doc/html/experimental/status_result.html @@ -0,0 +1,81 @@ + + +status_result and status_outcome - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    status_result and status_outcome

    +

    status_result and status_outcome are type aliases to basic_result<T, E, NoValuePolicy> + +and basic_outcome<T, EC, EP, NoValuePolicy> + in the usual way, but +with a defaulted NoValuePolicy which selects on the basis of status_code<DomainType> +instead.

    + +
    +
    note
    +

    If the E type is not some status_code<>, the default policy selector +will complain.

    +
    +
    + + +

    The specifications are:

    +
    experimental::status_result<T, E = experimental::error>
    +experimental::status_outcome<T, E = experimental::error, EP = std::exception_ptr>
    +
    +

    So, the default E is the erased errored status code system_code, which can represent +any generic_code, posix_code, win32_code, nt_code, com_code and many +other integer error and status +codings. Because it is an errored status code, it will always represent a failure.

    + +

    You can absolutely choose an E type which is non-erased e.g. posix_code directly. +You can also choose an E type which is not contract guaranteed to be a failure, +though your users may find that surprising.

    + +

    Whether to choose typed status codes versus the erased status codes depends on your +use cases. Outcome replicates faithfully the implicit and explicit conversion +semantics of its underlying types, so you can mix results and outcomes of +<system_error2> types exactly as you can the <system_error2> types themselves +e.g. typed forms will implicitly convert into erased forms if the source type +is trivially copyable or move relocating. This means that you can return a +generic_code from a function returning a system_code or error, and it’ll +work exactly as you’d expect (implicit conversion).

    + +
    +
    note
    +

    As status_code<erased<T>> is move-only, so is any status_result or status_outcome. +For some reason this surprises a lot of people, and they tend to react by not using the erased +form because it seems “difficult”.

    +
    +
    + + +

    It is actually, in fact, a wise discipline to follow to make all functions return +move-only types if you care about determinism and performance. Whilst C++ 17 onwards +does much to have the compiler avoid copying of identical function return values thanks to +guaranteed copy elision, when a chain of functions return different types, if the +programmer forgets to scatter std::move() appropriately, copies rather than moves +tend to occur in non-obvious ways. No doubt future C++ standards will improve on the +automatic use of moves instead of copies where possible, but until then making all +your result and outcome types move-only is an excellent discipline.

    + +

    Note that move-only result and outcome capable code (i.e. your project is in Experimental +Outcome configuration) usually compiles fine when result and outcome are copyable +(i.e. your project is in Standard Outcome configuration), albeit sometimes with a few +compiler warnings about unnecessary use of std::move().

    + + +

    Last revised: December 16, 2020 at 14:14:42 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/experimental/worked-example-long.html b/doc/html/experimental/worked-example-long.html new file mode 100644 index 000000000..b43d096de --- /dev/null +++ b/doc/html/experimental/worked-example-long.html @@ -0,0 +1,57 @@ + + +Worked example: Custom domain (the long way) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    + +

    Worked example: Custom domain (the long way)

    + + +

    Here follows a longer worked example of use of Experimental Outcome. It presents +the same sample program I sent to the San Diego 2018 WG21 standards meeting +after I was asked by the committee to demonstrate how P1095 implements P0709 +in a working code example they could study and discuss.

    + +

    We will walk through this worked example, step by step, explaining how each +part works in detail. This will help you implement your own code based on +Experimental Outcome.

    + +

    Most users will not need this level of customisation, and for them the preceding +quick and easy approach will be much easier.

    + +

    You may find it useful to open now in a separate browser tab the reference API +documentation for proposed <system_error2> at https://ned14.github.io/status-code/ +(scroll half way down). The references in the comments to P1028 are to +P1028 SG14 status_code and standard error object for P0709 Zero-overhead +deterministic exceptions, which is the WG21 proposal +paper for potential <system_error2>.

    + +

    Goal of this section

    + +

    We are going to define a simple custom code domain which defines that +the status code’s payload will consist of a POSIX error code, and the +__FILE__ and __LINE__ where the failure occurred. This custom status +code will have an implicit conversion to type erased error defined, which dynamically +allocates memory for the original status code, and outputs an error +which manages that dynamic allocation, indirecting all queries etc +to the erased custom status code type such that the error instance +quacks as if just like the original. This demonstrates that error could +just as equally convey a std::exception_ptr, for example, or indeed +manage the lifetime of any pointer.

    + + + +

    Last revised: July 16, 2024 at 21:33:35 +0100

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/experimental/worked-example-long/constructor.html b/doc/html/experimental/worked-example-long/constructor.html new file mode 100644 index 000000000..0c250116e --- /dev/null +++ b/doc/html/experimental/worked-example-long/constructor.html @@ -0,0 +1,54 @@ + + +The constructor - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    The constructor

    +

    Code domains are 100% constexpr to construct and destruct, as are status codes. +This enables the compiler to 100% instantiate both only in its mind, and to emit +zero code and thus zero overhead.

    + +

    Unfortunately it also means that it must be possible for each domain to be instantiated an infinite +number of times, and being 100% in constexpr, any instances never have a unique +address in memory either. Thus we cannot compare domains for equivalence using +their address in memory, as + std::error_category + does.

    + +

    We solve this by using a very random 64 bit number taken from a hard random +number source. The website https://www.random.org/cgi-bin/randbyte?nbytes=8&format=h +is strongly suggested as the source for this number.

    + +

    (In case you are wondering about the chance of collision for a 64 bit integer, SG14 estimated that +approximately 190,000 separate domains would need to exist in a single process +for there to be a 0.00000001% probability of collision if the random number +source is very random)

    + +
      // unique id must be from a hard random number source
    +  // Use https://www.random.org/cgi-bin/randbyte?nbytes=8&format=h to get a hard random 64 bit id.
    +  // Do NOT make up your own value. Do NOT use zero.
    +  constexpr explicit _file_io_error_domain(typename _base::unique_id_type id = 0x230f170194fcc6c7) noexcept : _base(id) {}
    +  static inline constexpr const _file_io_error_domain &get();
    +
    View this code on Github
    + + +

    A nice side effect of this approach is that custom error domains in header-only +libraries are safe, unlike custom <system_error> error categories. Boost.System’s +error categories can now opt into this same safe mechanism in order to also be +safe in header only library use cases.

    + + +

    Last revised: July 16, 2024 at 21:33:35 +0100

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/experimental/worked-example-long/implicit_conversion.html b/doc/html/experimental/worked-example-long/implicit_conversion.html new file mode 100644 index 000000000..376dd6046 --- /dev/null +++ b/doc/html/experimental/worked-example-long/implicit_conversion.html @@ -0,0 +1,60 @@ + + +Implicit conversion - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    Implicit conversion

    +

    Back in The payload, we +mentioned that there was no default implicit conversion of file_io_error +(status_code<_file_io_error_domain>) to error, as error is too small +to hold _file_io_error_domain::value_type.

    + +

    We can tell the framework about available implicit conversions by defining +an ADL discovered free function make_status_code() which takes our +custom status code as input, and returns an error:

    + +
    // Now tell `error` how it can implicitly construct from `file_io_error`.
    +// This is done by us defining a free function called `make_status_code()`
    +// which is discovered using ADL. `error` is an alias to the refinement
    +// `status_code<erased<intptr_t>>` which is a status code whose value type
    +// has been erased into an `intptr_t`. `status_code<erased<intptr_t>>`
    +// (i.e. `error`) are move bitcopying (P1029) i.e. they are move-only
    +// types whose move operation is defined to leave the source in the same
    +// representation as a default constructed instance, and for whose
    +// non-trivial destructor when called upon a default constructed instance
    +// is guaranteed to do nothing.
    +inline outcome_e::system_code make_status_code(file_io_error v)
    +{
    +  // `make_nested_status_code()` dynamically allocates memory to store an
    +  // instance of `file_io_error`, then returns a status code whose domain
    +  // specifies that its value type is a pointer to `file_io_error`. The
    +  // domain is a templated instance which indirects all observers of the
    +  // status code to the pointed-to status code.
    +  //
    +  // Note that the status code returned's value type is a pointer, which
    +  // by definition fits into `intptr_t` and is trivially copyable.
    +  // Therefore `system_code` (which is also a type alias to
    +  // `status_code<erased<intptr_t>>`) is happy to implicitly construct
    +  // from the status code returned by `make_nested_status_code()`.
    +  return make_nested_status_code(std::move(v));
    +}
    +
    View this code on Github
    + + +

    We are now ready to use Experimental Outcome!

    + + +

    Last revised: July 16, 2024 at 21:33:35 +0100

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/experimental/worked-example-long/message.html b/doc/html/experimental/worked-example-long/message.html new file mode 100644 index 000000000..b2c6a5254 --- /dev/null +++ b/doc/html/experimental/worked-example-long/message.html @@ -0,0 +1,63 @@ + + +Redefining message() - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    Redefining message()

    +

    You may remember that our custom _file_io_error_domain inherits from +outcome_e::posix_code::domain_type, and thus does not have to +implement the many pure virtual functions required by outcome_e::status_code_domain.

    + +

    What we do need to do is reimplement _do_message() to append the +file and line information to the POSIX error description string +returned by outcome_e::posix_code::domain_type. This causes +the status code’s .message() observer to return a string +with the extra payload information represented in text.

    + +
      // Return a string describing a specific code. We will return the
    +  // string returned by our POSIX code base domain, with the source
    +  // file and line number appended
    +  virtual _base::string_ref _do_message(const outcome_e::status_code<void> &code) const noexcept override final  // NOLINT
    +  {
    +    assert(code.domain() == *this);
    +
    +    // Fetch message from base domain (POSIX)
    +    auto msg = _base::_do_message(code);
    +    const auto &c1 = static_cast<const file_io_error &>(code);  // NOLINT
    +    const value_type &v = c1.value();
    +
    +    // Append my source file and line number
    +    if(v.file == nullptr)
    +    {
    +      return msg;
    +    }
    +    size_t length = strlen(v.file) + 16 + msg.size();
    +    auto *p = static_cast<char *>(malloc(length));  // NOLINT
    +    if(p == nullptr)
    +    {
    +      return _base::string_ref("failed to get message from system");
    +    }
    +    sprintf(p, "%s (%s:%d)", msg.data(), v.file, v.lineno);
    +
    +    // Return as atomically reference counted string
    +    return _base::atomic_refcounted_string_ref(p, length);
    +  }
    +};
    +
    View this code on Github
    + + + +

    Last revised: July 16, 2024 at 21:33:35 +0100

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/experimental/worked-example-long/preamble.html b/doc/html/experimental/worked-example-long/preamble.html new file mode 100644 index 000000000..1bc2b5006 --- /dev/null +++ b/doc/html/experimental/worked-example-long/preamble.html @@ -0,0 +1,54 @@ + + +Define a custom code domain - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    Define a custom code domain

    +

    Firstly let’s alias the experimental Outcome namespace into something +less tedious to type, declare our custom status code type, and get +started on defining the custom status code domain implementation.

    + +
    namespace outcome_e = BOOST_OUTCOME_V2_NAMESPACE::experimental;
    +
    +// To define a `file_io_error` which participates in the P1028 world
    +// of `std::error`, we must first declare, then define, a custom code
    +// domain which extends `posix_code` (the std error coding for POSIX
    +// failures). The following is fairly standard boilerplate for defining
    +// a custom code domain. It is analogous to defining a custom `std::error_category`.
    +
    +class _file_io_error_domain;
    +// We define `file_io_error` to be the status code whose domain is `_file_io_error_domain`.
    +using file_io_error = outcome_e::status_code<_file_io_error_domain>;
    +
    +// Now we define `_file_io_error_domain`.
    +class _file_io_error_domain : public outcome_e::posix_code::domain_type
    +{
    +  using _base = typename outcome_e::posix_code::domain_type;
    +
    View this code on Github
    + + +

    Note that we inherit from outcome_e::posix_code::domain_type, not +from outcome_e::status_code_domain. We thus reuse most of the +implementation of outcome_e::posix_code::domain_type rather than +implementing required functionality. If you would like to see a +fuller treatment of defining a custom status code domain from +scratch, see this worked example here.

    + +

    You may find looking at the API reference documentation for status_code_domain +useful in the next few pages .

    + + +

    Last revised: July 16, 2024 at 21:33:35 +0100

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/experimental/worked-example-long/source.html b/doc/html/experimental/worked-example-long/source.html new file mode 100644 index 000000000..b56dae017 --- /dev/null +++ b/doc/html/experimental/worked-example-long/source.html @@ -0,0 +1,37 @@ + + +Constexpr domain source - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    Constexpr domain source

    +

    Back in The constructor, we +declared but did not implement a .get() function which returns a constexpr static +instance of the domain. We implement this now:

    + +
    // 100% constexpr instantiation
    +constexpr _file_io_error_domain file_io_error_domain;
    +inline constexpr const _file_io_error_domain &_file_io_error_domain::get()
    +{
    +  return file_io_error_domain;
    +}
    +
    View this code on Github
    + + +

    As this is 100% constexpr, it can be (and is under optimisation) implemented entirely +in the mind of the compiler with no run time representation.

    + + +

    Last revised: July 16, 2024 at 21:33:35 +0100

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/experimental/worked-example-long/string_ref.html b/doc/html/experimental/worked-example-long/string_ref.html new file mode 100644 index 000000000..e38bcca4d --- /dev/null +++ b/doc/html/experimental/worked-example-long/string_ref.html @@ -0,0 +1,51 @@ + + +String refs - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    String refs

    +

    <system_error2> does not use std::string to return possibly statically +or dynamically allocated strings, and thus avoids dragging in a lot of the +standard library which impacts build times.

    + +

    Instead status code domains have a string_ref, +which has a polymorphic implementation which may or may not manage a dynamic +memory allocation using an atomic reference counter. Due to this polymorphism, you don’t +need to worry which implementation is actually in use under the bonnet +when you pass around string_ref instances.

    + +

    string_ref provides the same member functions as a span<const char>, +and so participates ordinarily in STL algorithms and containers. In +particular, if you need to string search or slice it, you can construct a +string_view on top easily.

    + +
      // Return the name of our custom code domain
    +  virtual _base::string_ref name() const noexcept override final  // NOLINT
    +  {
    +    static string_ref v("file i/o error domain");
    +    return v;  // NOLINT
    +  }
    +
    View this code on Github
    + + +

    Now you understand what string_ref does, returning the name of the +status code domain is self describing. Note we use the non-managing +constructor of string_ref, as the string "file i/o error domain" +is statically stored. We cache the returned value locally in static +storage.

    + + +

    Last revised: July 16, 2024 at 21:33:35 +0100

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/experimental/worked-example-long/value_type.html b/doc/html/experimental/worked-example-long/value_type.html new file mode 100644 index 000000000..7f9857447 --- /dev/null +++ b/doc/html/experimental/worked-example-long/value_type.html @@ -0,0 +1,47 @@ + + +The payload - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    The payload

    +

    We define the code domain’s value_type – the payload to be transported by +status codes using this code domain – to be a POSIX errno value, an integer +line number and a const char pointer.

    + +
    public:
    +  // This is the value type for `file_io_error`. We add line number and source file path.
    +  struct value_type
    +  {
    +    typename outcome_e::posix_code::value_type errcode;  // from POSIX, as we inherit from _posix_code_domain
    +
    +    // Our additional payload
    +    int lineno;        // from __LINE__
    +    const char *file;  // from __FILE__
    +    // Could also place a backtrace of void *[16] here ...
    +  };
    +
    View this code on Github
    + + +

    You will note that this is a TriviallyCopyable type, and so gains an implicit +conversion to any status_code<erased<T>> where sizeof(T) >= sizeof(value_type).

    + +

    error is however status_code<erased<intptr_t>>, and sizeof(intptr_t) < sizeof(value_type), +so it is not possible to implicitly convert status codes from this domain into +error. Instead, you must tell the compiler how to do the conversion, as we +shall see later.

    + + +

    Last revised: July 16, 2024 at 21:33:35 +0100

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/experimental/worked-example.html b/doc/html/experimental/worked-example.html new file mode 100644 index 000000000..2baf149f4 --- /dev/null +++ b/doc/html/experimental/worked-example.html @@ -0,0 +1,85 @@ + + +Worked example: Custom domain (the short way) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    + +

    Worked example: Custom domain (the short way)

    +

    The section after this one will take the long way through defining a custom domain +which sometimes is necessary if you have particularly bespoke requirements. +If however you just want to wrap a custom enum type of yours into its +own custom code domain, the boilerplate can be automated away +by filling in a few simple fields like this:

    + +
    // My custom enum type
    +enum class custom_failure
    +{
    +  not_found,
    +  bad_argument
    +};
    +
    +// Tell `status_code` to stamp out a custom code domain for this enum type
    +BOOST_OUTCOME_SYSTEM_ERROR2_NAMESPACE_BEGIN
    +template <> struct quick_status_code_from_enum<custom_failure> : quick_status_code_from_enum_defaults<custom_failure>
    +{
    +  // Text name of the enum
    +  static constexpr const auto domain_name = "My custom failure";
    +  // Unique UUID for the enum. PLEASE use https://www.random.org/cgi-bin/randbyte?nbytes=16&format=h
    +  static constexpr const auto domain_uuid = "{be201f65-3962-dd0e-1266-a72e63776a42}";
    +  // Map of each enum value to its text string, and list of semantically equivalent errc's
    +  static const std::initializer_list<mapping> &value_mappings()
    +  {
    +    static const std::initializer_list<mapping> v = {
    +    // Format is: { enum value, "string representation", { list of errc mappings ... } }
    +    {custom_failure::not_found, "item not found", {errc::no_such_file_or_directory}},  //
    +    {custom_failure::bad_argument, "invoked wrong", {errc::invalid_argument}},         //
    +    };
    +    return v;
    +  }
    +  // Completely optional definition of mixin for the status code synthesised from `Enum`. It can be omitted.
    +  template <class Base> struct mixin : Base
    +  {
    +    using Base::Base;
    +    constexpr int custom_method() const { return 42; }
    +  };
    +};
    +BOOST_OUTCOME_SYSTEM_ERROR2_NAMESPACE_END
    +
    View this code on Github
    + + +

    Here we supply the bare minimum requirements for a status code domain:

    + +
      +
    1. The name in text, so it can be printed.
    2. +
    3. The unique UUID to identify when multiple copies of the domain are the same. +PLEASE use https://www.random.org/cgi-bin/randbyte?nbytes=16&format=h to generate +this, do not twiddle a few bits.
    4. +
    5. For each enum value, its printable text and a sequence of errc:: enumerations +which you think it is semantically equivalent to i.e. its mapping onto generic_code +which is how status code defines the common mapping between status codes. If you later compare the +status code to one of those values (or to another status code which also provides +a mapping), if the generic codes are equivalent then the comparison will return true. +This means code like if(sc == errc::no_such_file_or_directory) ... would match +all custom error codes which mean ‘something was not found’.
    6. +
    7. OPTIONAL: if you would like the custom status code type generated by this +to have additional member functions or additional payload, you can define a mixin +here to inject either data or functions or both. If you omit this, nothing gets +injected.
    8. +
    + + + +

    Last revised: July 16, 2024 at 21:33:35 +0100

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/experimental/worked-example/implicit-construction.html b/doc/html/experimental/worked-example/implicit-construction.html new file mode 100644 index 000000000..efa3bfb72 --- /dev/null +++ b/doc/html/experimental/worked-example/implicit-construction.html @@ -0,0 +1,62 @@ + + +Implicit construction - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    Implicit construction

    +

    The preceding code had the compiler stamp out a custom status code domain +for a user supplied enum. You now get the following types:

    + +
    // This is the status code generated for your custom enum type. It will implicitly construct from
    +// values of enum custom_failure.
    +using custom_failure_code = BOOST_OUTCOME_SYSTEM_ERROR2_NAMESPACE::quick_status_code_from_enum_code<custom_failure>;
    +
    +namespace outcome_e = BOOST_OUTCOME_V2_NAMESPACE::experimental;
    +
    +// You don't usually need to use the status code type explicitly, because this "just works":
    +outcome_e::status_result<int> positive_only(int x)
    +{
    +  if(x < 0)
    +  {
    +    // Outcome's result sees that status_code will implicitly construct from this enum,
    +    // and it returns an errored result
    +    return custom_failure::bad_argument;
    +  }
    +  return x;
    +}
    +
    +// Semantic comparisons work
    +bool test(int x)
    +{
    +  if(auto r = positive_only(x); !r)
    +  {
    +    if(r.error() == outcome_e::errc::invalid_argument)
    +    {
    +      std::cerr << "Positive numbers only!" << std::endl;
    +      return false;
    +    }
    +  }
    +  return true;
    +}
    +
    View this code on Github
    + + +

    As you can see, this is less work than plugging your custom enum +into std::error_code. +It also has C compatibility, and generates better codegen.

    + + +

    Last revised: July 16, 2024 at 21:33:35 +0100

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/faq.html b/doc/html/faq.html new file mode 100644 index 000000000..8ae4b26ca --- /dev/null +++ b/doc/html/faq.html @@ -0,0 +1,674 @@ + + +Frequently asked questions - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    + +

    Frequently asked questions

    + + + + + +

    Is Outcome safe to use in extern APIs?

    + +

    Outcome is specifically designed for use in the public interfaces of multi-million +line codebases. result’s layout is hard coded to:

    +
    struct trivially_copyable_result_layout {
    +  union {
    +    value_type value;
    +    error_type error;
    +  };
    +  unsigned int flags;
    +};
    +
    +

    … if both value_type and error_type are TriviallyCopyable, otherwise:

    +
    struct non_trivially_copyable_result_layout {
    +  value_type value;
    +  unsigned int flags;
    +  error_type error;
    +};
    +
    +

    This is C-compatible if value_type and error_type are C-compatible. + std::error_code + +is probably C-compatible, but its layout is not standardised (though there is a +normative note in the standard about its layout). Hence Outcome cannot provide a +C macro API for standard Outcome, but we can for Experimental Outcome.

    + +

    Does Outcome implement over-alignment?

    + +

    Outcome propagates any over-alignment of the types you supply to it as according +to the layout specified above. Therefore the ordinary alignment and padding rules +for your compiler are used.

    + +

    Does Outcome implement the no-fail, strong or basic exception guarantee?

    + +

    (You can read about the meaning of these guarantees at cppreference.com)

    + +

    If for the following operations:

    + +
      +
    • Construction
    • +
    • Assignment
    • +
    • Swap
    • +
    + +

    … the corresponding operation in all of value_type, error_type (and +exception_type for outcome) is noexcept(true), then result and +outcome’s operation is noexcept(true). This propagates the no-fail exception +guarantee of the underlying types. Otherwise the basic guarantee applies for all +but Swap, under the same rules as for the struct layout type given above e.g. +value would be constructed first, then the flags, then the error. If the error +throws, value and status bits would be as if the failure had not occurred, same +as for aborting the construction of any struct type.

    + +

    It is recognised that these weak guarantees may be unsuitable for some people, +so Outcome implements swap() with much stronger guarantees, as one can locally refine, +without too much work, one’s own custom classes from result and outcome implementing +stronger guarantees for construction and assignment using swap() as the primitive +building block.

    + +

    The core ADL discovered implementation of strong guarantee swap is strong_swap(bool &all_good, T &a, T &b) +. +This can be overloaded by third party code with custom strong guarantee swap +implementations, same as for std::swap(). Because strong guarantee swap may fail +when trying to restore input state during handling of failure to swap, the +all_good boolean becomes false if restoration fails, at which point both +results/outcomes get marked as tainted via has_lost_consistency() +.

    + +

    It is up to you to check this flag to see if known good state has been lost, +as Outcome never does so on your behalf. The simple solution to avoiding having +to deal with this situation is to always choose your value, error and exception +types to have non-throwing move constructors and move assignments. This causes +the strong swap implementation to no longer be used, as it is no longer required, +and standard swap is used instead.

    + +

    Does Outcome have a stable ABI and API?

    + +

    The layout changed for all trivially copyable types between Outcome v2.1 and v2.2, +as union based storage was introduced. From v2.2 onwards, the layout is not +expected to change again.

    + +

    If v2.2 proves to be unchanging for 24 months, Outcome’s ABI and API will be +formally fixed as the v2 interface and written into stone forever. Thereafter +the ABI compliance checker +will be run per-commit to ensure Outcome’s ABI and API remains stable. This is +currently expected to occur in 2022.

    + +

    Note that the stable ABI and API guarantee will only apply to standalone +Outcome, not to Boost.Outcome. Boost.Outcome has dependencies on other +parts of Boost which are not stable across releases.

    + +

    Note also that the types you configure a result or outcome with also need +to be ABI stable if result or outcome is to be ABI stable.

    + +

    Can I use result<T, EC> across DLL/shared object boundaries?

    + +

    A known problem with using Windows DLLs (and to smaller extent POSIX shared libraries) is that global +objects may get duplicated: one instance in the executable and one in the DLL. This +behaviour is not incorrect according to the C++ Standard, as the Standard does not +recognize the existence of DLLs or shared libraries. Therefore, program designs that +depend on globals having unique addresses may become compromised when used in a program +using DLLs.

    + +

    Nothing in Outcome depends on the addresses of globals, plus the guaranteed fixed data +layout (see answer above) means that different versions of Outcome can be used in +different DLLs, and it probably will work okay (it is still not advised that you do that +as that is an ODR violation). +However, one of the most likely candidate for ECstd::error_codedoes depend +on the addresses of globals for correct functioning.

    + +

    The standard library is required to implement globally unique addresses for the standard library +provided + std::error_category + implementations e.g. std::system_category(). +User defined error code categories may not have unique global addresses, and thus +introduce misoperation.

    + +

    boost::system::error_code, since version 1.69 does offer an opt-in guarantee +that it does not depend on the addresses of globals if the user defined error code +category opts-in to the 64-bit comparison mechanism. This can be seen in the specification of +error_category::operator== in +Boost.System synopsis.

    + +

    Alternatively, the status_code in Experimental Outcome, +due to its more modern design, does not suffer from any problems from being used in shared +libraries in any configuration.

    + +

    Why two types result<> and outcome<>, rather than just one?

    + +

    result is the simple, success OR failure type.

    + +

    outcome extends result with a third state to transport, conventionally (but not necessarily) some sort of “abort” or “exceptional” state which a function can return to indicate that not only did the operation fail, but it did so catastrophically i.e. please abort any attempt to retry the operation.

    + +

    A perfect alternative to using outcome is to throw a C++ exception for the abort code path, and indeed most programs ought to do exactly that instead of using outcome. However there are a number of use cases where choosing outcome shines:

    + +
      +
    1. Where C++ exceptions or RTTI is not available, but the ability to fail catastrophically without terminating the program is important.
    2. +
    3. Where deterministic behaviour is required even in the catastrophic failure situation.
    4. +
    5. In unit test suites of code using Outcome it is extremely convenient to accumulate test failures into an outcome for later reporting. A similar convenience applies to RPC situations, where C++ exception throws need to be accumulated for reporting back to the initiating endpoint.
    6. +
    7. Where a function is “dual use deterministic” i.e. it can be used deterministically, in which case one switches control flow based on .error(), or it can be used non-deterministically by throwing an exception perhaps carrying a custom payload.
    8. +
    + +

    How badly will including Outcome in my public interface affect compile times?

    + +

    The quick answer is that it depends on how much convenience you want.

    + +

    The convenience header <result.hpp> is dependent on <system_error> or Boost.System, which unfortunately includes <string> and thus +drags in quite a lot of other slow-to-parse stuff. If your public interface already includes <string>, +then the impact of additionally including Outcome will be low. If you do not include <string>, +unfortunately impact may be relatively quite high, depending on the total impact of your +public interface files.

    + +

    If you’ve been extremely careful to avoid ever including the most of the STL headers +into your interfaces in order to maximise build performance, then <basic_result.hpp> +can have as few dependencies as:

    + +
      +
    1. <cstdint>
    2. +
    3. <initializer_list>
    4. +
    5. <iosfwd>
    6. +
    7. <new>
    8. +
    9. <type_traits>
    10. +
    11. <cstdio>
    12. +
    13. <cstdlib>
    14. +
    15. <cassert>
    16. +
    + +

    These, apart from <iosfwd>, tend to be very low build time impact in most standard +library implementations. If you include only <basic_result.hpp>, and manually configure +basic_result<> by hand, compile time impact will be minimised.

    + +

    (See reference documentation for basic_result<T, E, NoValuePolicy> + for more detail.

    + +

    Is Outcome suitable for fixed latency/predictable execution coding such as for high frequency trading or audio?

    + +

    Great care has been taken to ensure that Outcome never unexpectedly executes anything +with unbounded execution times such as malloc(), dynamic_cast<>() or throw. +Outcome works perfectly with C++ exceptions and RTTI globally disabled.

    + +

    Outcome’s entire design premise is that its users are happy to exchange a small, predictable constant overhead +during successful code paths, in exchange for predictable failure code paths.

    + +

    In contrast, table-based exception handling gives zero run time overhead for the +successful code path, and completely unpredictable (and very expensive) overhead +for failure code paths.

    + +

    For code where predictability of execution, no matter the code path, is paramount, +writing all your code to use Outcome is not a bad place to start. Obviously enough, +do choose a non-throwing policy when configuring outcome or result such as +all_narrow + to guarantee that exceptions can never be thrown by Outcome +(or use the convenience typedef for result, unchecked<T, E = varies> + which uses policy::all_narrow).

    + +

    What kind of runtime performance impact will using Outcome in my code introduce?

    + +

    It is very hard to say anything definitive about performance impacts in codebases one +has never seen. Each codebase is unique. However to come up with some form of measure, +we timed traversing ten stack frames via each of the main mechanisms, including the +“do nothing” (null) case.

    + +

    A stack frame is defined to be something called by the compiler whilst +unwinding the stack between the point of return in the ultimate callee and the base +caller, so for example ten stack allocated objects might be destructed, or ten levels +of stack depth might be unwound. This is not a particularly realistic test, but it +should at least give one an idea of the performance impact of returning Outcome’s +result or outcome over say returning a plain integer, or throwing an exception.

    + +

    The following figures are for Outcome v2.1.0 with GCC 7.4, clang 8.0 and Visual +Studio 2017.9. Figures for newer Outcomes with newer compilers can be found at +https://github.com/ned14/outcome/tree/develop/benchmark.

    + +

    High end CPU: Intel Skylake x64

    + +

    This is a high end CPU with very significant ability to cache, predict, parallelise +and execute out-of-order such that tight, repeated loops perform very well. It has +a large μop cache able to wholly contain the test loop, meaning that these results +are a best case performance.

    + +
    +
    +

    Log graph comparing GCC 7.4, clang 8.0 and Visual Studio 2017.9 on x64, for exceptions-globally-disabled, ordinary and link-time-optimised build configurations.

    +
    +
    + +

    As you can see, throwing and catching an exception is +expensive on table-based exception handling implementations such as these, anywhere +between 26,000 and 43,000 CPU cycles. And this is the hot path situation, this +benchmark is a loop around hot cached code. If the tables are paged out onto storage, +you are talking about millions of CPU cycles.

    + +

    Simple integer returns (i.e. do nothing null case) +are always going to be the fastest as they do the least work, and that costs 80 to 90 +CPU cycles on this Intel Skylake CPU.

    + +

    Note that returning a result<int, std::error_code> with a “success (error code)” +is no more than 5% added runtime overhead over returning a naked int on GCC and clang. On MSVC +it costs an extra 20% or so, mainly due to poor code optimisation in the VS2017.9 compiler. Note that “success +(experimental status code)” optimises much better, and has almost no overhead over a +naked int.

    + +

    Returning a result<int, std::error_code> with a “failure (error code)” +is less than 5% runtime overhead over returning a success on GCC, clang and MSVC.

    + +

    You might wonder what happens if type E has a non-trivial destructor, thus making the +result<T, E> have a non-trivial destructor? We tested E = std::exception_ptr and +found less than a 5% overhead to E = std::error_code for returning success. Returning a failure +was obviously much slower at anywhere between 300 and 1,100 CPU cycles, due to the +dynamic memory allocation and free of the exception ptr, plus at least two atomic operations per stack frame, but that is +still two orders of magnitude better than throwing and catching an exception.

    + +

    We conclude that if failure is anything but extremely rare in your C++ codebase, +using Outcome instead of throwing and catching exceptions ought to be quicker overall:

    + +
      +
    • Experimental Outcome is statistically indistinguishable from the null case on this +high end CPU, for both returning success and failure, on all compilers.
    • +
    • Standard Outcome is less than 5% +worse than the null case for returning successes on GCC and clang, and less than 10% worse than +the null case for returning failures on GCC and clang.
    • +
    • Standard Outcome optimises +poorly on VS2017.9, indeed markedly worse than on previous point releases, so let’s +hope that Microsoft fix that soon. It currently has a less than 20% overhead on the null case.
    • +
    + +

    Mid tier CPU: ARM Cortex A72

    + +

    This is a four year old mid tier CPU used in many high end mobile phones and tablets +of its day, with good ability to cache, predict, parallelise +and execute out-of-order such that tight, repeated loops perform very well. It has +a μop cache able to wholly contain the test loop, meaning that these results +are a best case performance.

    + +
    +
    +

    Log graph comparing GCC 7.3 and clang 7.3 on ARM64, for exceptions-globally-disabled, ordinary and link-time-optimised build configurations.

    +
    +
    + +

    This ARM chip is a very consistent performer – null case, success, or failure, all take +almost exactly the same CPU cycles. Choosing Outcome, in any configuration, makes no +difference to not using Outcome at all. Throwing and catching a C++ exception costs +about 90,000 CPU cycles, whereas the null case/Outcome costs about 130 - 140 CPU cycles.

    + +

    There is very little to say about this CPU, other than Outcome is zero overhead on it. The same +applied to the ARM Cortex A15 incidentally, which I test cased extensively when +deciding on the Outcome v2 design back after the first peer review. The v2 design +was chosen partially because of such consistent performance on ARM.

    + +

    Low end CPUs: Intel Silvermont x64 and ARM Cortex A53

    + +

    These are low end CPUs with a mostly or wholly in-order execution core. They have a small +or no μop cache, meaning that the CPU must always decode the instruction stream. +These results represent an execution environment more typical of CPUs two decades +ago, back when table-based EH created a big performance win if you never threw +an exception.

    + +

    +
    +

    Log graph comparing GCC 7.3 and clang 7.3 on x64, for exceptions-globally-disabled, ordinary and link-time-optimised build configurations.

    +
    +
    +
    +
    +

    Log graph comparing GCC 7.3 and clang 7.3 on ARM64, for exceptions-globally-disabled, ordinary and link-time-optimised build configurations.

    +
    +

    + +

    The first thing to mention is that clang generates very high performance code for +in-order cores, far better than GCC. It is said that this is due to a very large investment by +Apple in clang/LLVM for their devices sustained over many years. In any case, if you’re +targeting in-order CPUs, don’t use GCC if you can use clang instead!

    + +

    For the null case, Silvermont and Cortex A53 are quite similar in terms of CPU clock cycles. Ditto +for throwing and catching a C++ exception (approx 150,000 CPU cycles). However the Cortex +A53 does far better with Outcome than Silvermont, a 15% versus 100% overhead for Standard +Outcome, and a 4% versus 20% overhead for Experimental Outcome.

    + +

    Much of this large difference is in fact due to calling convention differences. x64 permits up to 8 bytes +to be returned from functions by CPU register. result<int> consumes 24 bytes, so on x64 +the compiler writes the return value to the stack. However ARM64 permits up to 64 bytes +to be returned in registers, so result<int> is returned via CPU registers on ARM64.

    + +

    On higher end CPUs, memory is read and written in cache lines (32 or 64 bytes), and +reads and writes are coalesced and batched together by the out-of-order execution core. On these +low end CPUs, memory is read and written sequentially per assembler instruction, +so only one load or one store to L1 +cache can occur at a time. This makes writing the stack particularly slow on in-order +CPUs. Memory operations which “disappear” on higher end CPUs take considerable time +on low end CPUs. This particularly punishes Silvermont in a way which does not punish +the Cortex A53, because of having to write multiple values to the stack to create the +24 byte object to be returned.

    + +

    The conclusion to take away from this is that if you are targeting a low end CPU, +table-based EH still delivers significant performance improvements for the success +code path. Unless determinism in failure is critically important, you should not +use Outcome on in-order execution CPUs.

    + +

    Why is implicit default construction disabled?

    + +

    This was one of the more interesting points of discussion during the peer review of +Outcome v1. v1 had a formal empty state. This came with many advantages, but it +was not felt to be STL idiomatic as std::optional<result<T>> is what was meant, so +v2 has eliminated any legal possibility of being empty.

    + +

    The expected<T, E> proposal of that time (May 2017) did permit default construction +if its T type allowed default construction. This was specifically done to make +expected<T, E> more useful in STL containers as one can say resize a vector without +having to supply an expected<T, E> instance to fill the new items with. However +there was some unease with that design choice, because it may cause programmers to +use some type T whose default constructed state is overloaded with additional meaning, +typically “to be filled” i.e. a de facto empty state via choosing a magic value.

    + +

    For the v2 redesign, the various arguments during the v1 review were considered. +Unlike expected<T, E> which is intended to be a general purpose Either monad +vocabulary type, Outcome’s types are meant primarily for returning success or failure +from functions. The API should therefore encourage the programmer to not overload +the successful type with additional meaning of “to be filled” e.g. result<std::optional<T>>. +The decision was therefore taken to disable implicit default construction, but +still permit explicit default construction by making the programmer spell out their +intention with extra typing.

    + +

    To therefore explicitly default construct a result<T> or outcome<T>, use one +of these forms as is the most appropriate for the use case:

    + +
      +
    1. Construct with just in_place_type<T> e.g. result<T>(in_place_type<T>).
    2. +
    3. Construct via success() e.g. outcome<T>(success()).
    4. +
    5. Construct from a void form e.g. result<T>(result<void>(in_place_type<void>)).
    6. +
    + +

    How far away from the proposed std::expected<T, E> is Outcome’s checked<T, E>?

    + +

    Not far, in fact after the first Boost.Outcome peer review in May 2017, Expected moved +much closer to Outcome, and Outcome deliberately provides checked<T, E = varies> + +as a semantic equivalent.

    + +

    Here are the remaining differences which represent the +divergence of consensus opinion between the Boost peer review and WG21 on the proper +design for this object:

    + +
      +
    1. checked<T, E> has no default constructor. Expected has a default constructor if +T has a default constructor.
    2. +
    3. checked<T, E> uses the same constructor design as std::variant<...>. Expected +uses the constructor design of std::optional<T>.
    4. +
    5. checked<T, E> cannot be modified after construction except by assignment. +Expected provides an .emplace() modifier.
    6. +
    7. checked<T, E> permits implicit construction from both T and E when +unambiguous. Expected permits implicit construction from T alone.
    8. +
    9. checked<T, E> does not permit T and E to be the same, and becomes annoying +to use if they are constructible into one another (implicit construction self-disables). +Expected permits T and E to be the same.
    10. +
    11. checked<T, E> throws bad_result_access_with<E> instead of Expected’s +bad_expected_access<E>.
    12. +
    13. checked<T, E> models std::variant<...>. Expected models std::optional<T>. Thus: + +
        +
      • checked<T, E> does not provide operator*() nor operator->
      • +
      • checked<T, E> .error() is wide (i.e. throws on no-value) like .value(). +Expected’s .error() is narrow (UB on no-error). [checked<T, E> provides +.assume_value() and .assume_error() for narrow (UB causing) observers].
      • +
    14. +
    15. checked<T, E> uses success<T> and failure<E> type sugars for disambiguation. +Expected uses unexpected<E> only.
    16. +
    17. checked<T, E> does not implement (prone to unintended misoperation) comparison +operators which permit implicit conversion e.g. checked<T> == T will fail to compile. +Instead write unambiguous code e.g. checked<T> == success(T) or checked<T> == failure(T).
    18. +
    19. checked<T, E> defaults E to std::error_code or boost::system::error_code. +Expected does not default E.
    20. +
    + +

    In fact, the two are sufficiently close in design that a highly conforming expected<T, E> +can be implemented by wrapping up checked<T, E> with the differing functionality:

    + +
    /* Here is a fairly conforming implementation of P0323R3 `expected<T, E>` using `checked<T, E>`.
    +It passes the reference test suite for P0323R3 at
    +https://github.com/viboes/std-make/blob/master/test/expected/expected_pass.cpp with modifications
    +only to move the test much closer to the P0323R3 Expected, as the reference test suite is for a
    +much older proposed Expected.
    +
    +Known differences from P0323R3 in this implementation:
    +- `T` and `E` cannot be the same type.
    +- `E` must be default constructible.
    +- No variant storage is implemented (note the Expected proposal does not actually require this).
    +*/
    +
    +namespace detail
    +{
    +  template <class T, class E> using expected_result = BOOST_OUTCOME_V2_NAMESPACE::checked<T, E>;
    +  template <class T, class E> struct enable_default_constructor : public expected_result<T, E>
    +  {
    +    using base = expected_result<T, E>;
    +    using base::base;
    +    constexpr enable_default_constructor()
    +        : base{BOOST_OUTCOME_V2_NAMESPACE::in_place_type<T>}
    +    {
    +    }
    +  };
    +  template <class T, class E> using select_expected_base = std::conditional_t<std::is_default_constructible<T>::value, enable_default_constructor<T, E>, expected_result<T, E>>;
    +}
    +template <class T, class E> class expected : public detail::select_expected_base<T, E>
    +{
    +  static_assert(!std::is_same<T, E>::value, "T and E cannot be the same in this expected implementation");
    +  using base = detail::select_expected_base<T, E>;
    +
    +public:
    +  // Inherit base's constructors
    +  using base::base;
    +  expected() = default;
    +
    +  // Expected takes in_place not in_place_type
    +  template <class... Args>
    +  constexpr explicit expected(std::in_place_t /*unused*/, Args &&... args)
    +      : base{BOOST_OUTCOME_V2_NAMESPACE::in_place_type<T>, std::forward<Args>(args)...}
    +  {
    +  }
    +
    +  // Expected always accepts a T even if ambiguous
    +  BOOST_OUTCOME_TEMPLATE(class U)
    +  BOOST_OUTCOME_TREQUIRES(BOOST_OUTCOME_TPRED(std::is_constructible<T, U>::value))
    +  constexpr expected(U &&v)
    +      : base{BOOST_OUTCOME_V2_NAMESPACE::in_place_type<T>, std::forward<U>(v)}
    +  {
    +  }
    +
    +  // Expected has an emplace() modifier
    +  template <class... Args> void emplace(Args &&... args) { *static_cast<base *>(this) = base{BOOST_OUTCOME_V2_NAMESPACE::in_place_type<T>, std::forward<Args>(args)...}; }
    +
    +  // Expected has a narrow operator* and operator->
    +  constexpr const T &operator*() const & { return base::assume_value(); }
    +  constexpr T &operator*() & { return base::assume_value(); }
    +  constexpr const T &&operator*() const && { return base::assume_value(); }
    +  constexpr T &&operator*() && { return base::assume_value(); }
    +  constexpr const T *operator->() const { return &base::assume_value(); }
    +  constexpr T *operator->() { return &base::assume_value(); }
    +
    +  // Expected has a narrow error() observer
    +  constexpr const E &error() const & { return base::assume_error(); }
    +  constexpr E &error() & { return base::assume_error(); }
    +  constexpr const E &&error() const && { return base::assume_error(); }
    +  constexpr E &error() && { return base::assume_error(); }
    +};
    +template <class E> class expected<void, E> : public BOOST_OUTCOME_V2_NAMESPACE::result<void, E, BOOST_OUTCOME_V2_NAMESPACE::policy::throw_bad_result_access<E, void>>
    +{
    +  using base = BOOST_OUTCOME_V2_NAMESPACE::result<void, E, BOOST_OUTCOME_V2_NAMESPACE::policy::throw_bad_result_access<E, void>>;
    +
    +public:
    +  // Inherit base constructors
    +  using base::base;
    +
    +  // Expected has a narrow operator* and operator->
    +  constexpr void operator*() const { base::assume_value(); }
    +  constexpr void operator->() const { base::assume_value(); }
    +};
    +template <class E> using unexpected = BOOST_OUTCOME_V2_NAMESPACE::failure_type<E>;
    +template <class E> unexpected<E> make_unexpected(E &&arg)
    +{
    +  return BOOST_OUTCOME_V2_NAMESPACE::failure<E>(std::forward<E>(arg));
    +}
    +template <class E, class... Args> unexpected<E> make_unexpected(Args &&... args)
    +{
    +  return BOOST_OUTCOME_V2_NAMESPACE::failure<E>(std::forward<Args>(args)...);
    +}
    +template <class E> using bad_expected_access = BOOST_OUTCOME_V2_NAMESPACE::bad_result_access_with<E>;
    +
    View this code on Github
    + + +

    Why doesn’t Outcome duplicate std::expected<T, E>’s design?

    + +

    There are a number of reasons:

    + +
      +
    1. Outcome is not aimed at the same audience as Expected. We target developers +and users who would be happy to use Boost. Expected targets the standard library user.

    2. + +
    3. Outcome believes that the monadic use case isn’t as important as Expected does. +Specifically, we think that 99% of use of Expected in the real world will be to +return failure from functions, and not as some sort of enhanced or “rich” Optional. +Outcome therefore models a subset of Variant, whereas Expected models an extended Optional.

    4. + +
    5. Outcome believes that if you are thinking about using something like Outcome, +then for you writing failure code will be in the same proportion as writing success code, +and thus in Outcome writing for failure is exactly the same as writing for success. +Expected assumes that success will be more common than failure, and makes you type +more when writing for failure.

    6. + +
    7. Outcome goes to considerable effort to help the end user type fewer characters +during use. This results in tighter, less verbose, more succinct code. The cost of this is a steeper +learning curve and more complex mental model than when programming with Expected.

    8. + +
    9. Outcome has facilities to make easier interoperation between multiple third +party libraries each using incommensurate Outcome (or Expected) configurations. Expected does +not do any of this, but subsequent WG21 papers do propose various interoperation +mechanisms, one of which Outcome implements so code using Expected will seamlessly +interoperate with code using Outcome.

    10. + +
    11. Outcome was designed with the benefit of hindsight after Optional and Expected, +where how those do implicit conversions have been found to be prone to writing +unintentionally buggy code. Outcome simultaneously permits more implicit conversions +for ease of use and convenience, where those are unambigiously safe, and prevents +other implicit conversions which the Boost peer review reported as dangerous.

    12. +
    + +

    Is Outcome riddled with undefined behaviour for const, const-containing and reference-containing types?

    + +

    The short answer is not any more in C++ 20 and after, thanks to changes made to +C++ 20 at the Belfast WG21 meeting in November 2019.

    + +

    The longer answer is that before C++ 20, use of placement +new on types containing const member types where the resulting pointer was +thrown away is undefined behaviour. As of the resolution of a national body +comment, this is no longer the case, and now Outcome is free of this particular +UB for C++ 20 onwards.

    + +

    This still affects C++ before 20, though no major compiler is affected. Still, +if you wish to avoid UB, don’t use const types within Outcome types (or any +optional<T>, or vector<T> or any STL container type for that matter).

    + +

    More detail

    + +

    Before the C++ 14 standard, placement new into storage which used to contain +a const type was straight out always undefined behaviour, period. Thus all use of +placement new within a result<const_containing_type>, or indeed an optional<const_containing_type>, is always +undefined behaviour before C++ 14. From [basic.life] for the C++ 11 standard:

    + +
    +

    Creating a new object at the storage location that a const object with static, +thread, or automatic storage duration occupies or, at the storage location +that such a const object used to occupy before its lifetime ended results +in undefined behavior.

    +
    + +

    This being excessively restrictive, from C++ 14 onwards, [basic_life] now states:

    + +
    +

    If, after the lifetime of an object has ended and before the storage which +the object occupied is reused or released, a new object is created at the +storage location which the original object occupied, a pointer that +pointed to the original object, a reference that referred to the original +object, or the name of the original object will automatically refer to the +new object and, once the lifetime of the new object has started, can be +used to manipulate the new object, if:

    + +

    — the storage for the new object exactly overlays the storage location which + the original object occupied, and

    + +

    — the new object is of the same type as the original object (ignoring the + top-level cv-qualifiers), and

    + +

    — the type of the original object is not const-qualified, and, if a class type, + does not contain any non-static data member whose type is const-qualified + or a reference type, and

    + +

    — neither the original object nor the new object is a potentially-overlapping + subobject

    +
    + +

    Leaving aside my personal objections to giving placement new of non-const +non-reference types magical pointer renaming powers, the upshot is that if +you want defined behaviour for placement new of types containing const types +or references, you must store the pointer returned by placement new, and use +that pointer for all further reference to the newly created object. This +obviously adds eight bytes of storage to a result<const_containing_type>, which is highly +undesirable given all the care and attention paid to keeping it small. The alternative +is to use + std::launder +, which was added in C++ 17, to ‘launder’ +the storage into which we placement new before each and every use of that +storage. This forces the compiler to reload the object stored by placement +new on every occasion, and not assume it can be constant propagated, which +impacts codegen quality.

    + +

    As mentioned above, this issue (in so far as it applies to types containing +user supplied T which might be const) has been resolved as of C++ 20 onwards, +and it is extremely unlikely that any C++ compiler will act on any UB here in +C++ 17 or 14 given how much of STL containers would break.

    + + + +

    Last revised: April 20, 2021 at 11:39:35 +0100

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/faq/results_arm_a53_log.png b/doc/html/faq/results_arm_a53_log.png new file mode 100644 index 0000000000000000000000000000000000000000..ead38d6e6124a805aeb04e4596882313736d6848 GIT binary patch literal 22184 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 literal 0 HcmV?d00001 diff --git a/doc/html/faq/results_arm_a72_log.png b/doc/html/faq/results_arm_a72_log.png new file mode 100644 index 0000000000000000000000000000000000000000..1b74f7b62ad0c8ee71136849e636f51f599a63ea GIT binary patch literal 21664 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 TFCFpoS3_H + +History - Boost.Outcome documentation + + + + + +

    +Prev + Up + HomeNext
    + +

    History

    + + + +

    Outcome has had an interesting history, and it is worth summarising it here to show how a +Boost library comes to life. The following recollections are by Niall Douglas, and may be +faulty due to his aging memory.

    + + +
    + +

    The genesis of Outcome v1 (2014 - 2017)

    + +

    The git repo began life as a “Boost.Spinlock” in June 2014 hived out of Boost.AFIO v1 where it had existed +for some time as an internal library. In October 2014 I added in the original prototype +Boost.Expected reference library as a git submodule, and began developing a non-allocating +future<T>/promise<T> as an extension of expected<T, std::exception_ptr> as a faster, +monadic future-promise was something which AFIO v1 sorely needed.

    + +

    The original prototype Boost.Expected library was a large and very complex beastie. +I was fortunate to be employed on a contract in late 2014 early 2015 where I saw it deployed at +scale into an existing large C++ codebase. Expected was really great and powerful, but it absolutely +murdered compile times in a large C++ codebase, and made LTO effectively infeasible. +I also found its implementation non-conducive to implementing +future-promise with it, and so I resolved to implement a much more powerful policy driven +monad factory which could stamp out everything from an option<T> right through to a +future-promise pair, all using the exact same basic_monad<> and therefore all with a full +monadic programming API, C++ 17 continuations/monadic bind and intelligently convertible into one another. +Moreover, all this needed to have an absolute minimum impact on compile times and runtime +overheads, neither of which were strengths of the original prototype Boost.Expected library.

    + +

    By August 2015 “Boost.Monad” was delivering on all those requirements and then some, but it lacked +maturity through use in other code. Summer 2015 saw the Boost peer review of AFIO v1 which +was roundly rejected. After considering the ample review feedback, it was realised that +AFIO v2 would be a very different design, one no longer using futures, memory allocation +nor C++ exceptions. As AFIO v2 was started from scratch and using Outcome heavily from the +very beginning (every AFIO v2 API returns a result<T>), Outcome began to gain bug fixes and +shed features, with the non-allocating future-promise implementation being dropped in May +2016 and a large chunk of type based metaprogramming being replaced with cleaner variable template metaprogramming +in June. After CppCon 2016 in September, then began the long process of getting Outcome +ready for Boost peer review in Q1 2017 which involved a repeated sequence of complete rewrites +of the tutorial in response to multiple rounds of feedback from the C++ community, with +at least four complete rewrites currently at the time of writing.

    + +

    In parallel to all this development on Outcome, Expected went before the LEWG and entered +the C++ standards track. As the WG21 meetings went by, Expected experienced a period +of being stripped back and much of the complexity which had so murdered compile and +link times in 2014-2015 fell away, thus the Expected proposed in P0323R1 ended up landing +so close to Outcome that in January 2017 it was just a few hours work to implement +Expected using the core basic_monad infrastructure in Outcome. That highly flexible +policy based design which made monadic future-promise possible made it similarly easy +to implement a highly conforming Expected, indeed in early 2017 Outcome’s Expected was much +closer to P0323R1 than any other implementation including the LEWG reference implementation. +And unlike the LEWG reference implementation, Outcome has had eighteen months of that +finely tuned patina you only get when a library is in use by other code bases.

    + +

    In February 2017 it became realised that the userbase really wanted a high quality expected<T, E> +implementation rather than anything similar but not the same which Outcome had invented. +The only just implemented Expected implementation based on basic_monad therefore took +primacy. The final rewrite of the documentation before peer review submission was one +which made it look like Outcome was primarily an expected<T, E> implementation with a +few useful extensions like outcome<T> and result<T>. I was sad to so pivot, but it +was obvious that Outcome would see far wider popularity and usage as primarily an Expected +implementation.

    + +

    Almost three years after its beginning, Outcome v1 finally went before Boost peer review +in May 2017 which turned into one of the longest and most detailed peer reviews Boost has +done in recent years, with over 800 pieces of review feedback submitted. It was by consensus +rejected, with substantial feedback on what to do instead.

    + +

    Outcome v2 (2018)

    + +

    During the very lengthy peer review, roughly three groups of opinion emerged as to what +a value|error transporting class ought to look like:

    + +
    +
    1. Lightweight
    +
    A simple-as-possible T and/or E transport without any +implementation complexity.
    +
    2. Medium
    +
    A variant stored T or E1 ... En +where T is the expected value and E1 ... +are the potential unexpected values. This implemention really ought to be implemented +using C++ 17's std::variant<...> except with stronger never-empty guarantees. +
    +
    3. Heavy
    +
    A full fat Either monad participating fully in a wider monadic programming framework for C++.
    +
    + +

    Peter Dimov was very quickly able to implement an expected<T, E1, ...> using his +variant2 library, and thus there seemed little +point in replicating his work in an Outcome v2. The lightweight choice seemed to be the +best path forwards, so in June 2017 the bare minimum result<T, E> and outcome<T, EC, P> +as presented in this library was built, using the same constructor design as std::variant<...>. +Significant backwards compatibility with v1 Outcome code was retained, as the review +had felt the basic proposed design fine.

    + +

    A period of maturation then followed by porting a large existing codebase using Outcome v1 +to v2, and writing a significant amount of new code using v2 to test it for unanticipated +surprises and bugs. Quite a few corner cases were found and fixed. At the end of September +2017, Outcome v2 was deemed to be “mature”, and a script generated “Boost edition” made +available.

    + +

    All that remained before it was ready for a second Boost peer review was the +documentation. This took four months to write (same time as to write the library itself!), +and in January 2018 Outcome had its second Boost peer review, which it passed!

    + +

    Outcome v2.1 (2019 - 2020)

    + +

    The changes requsted during the review of v2.0 were fairly modest: result and outcome would +be renamed to basic_result and basic_outcome, and a clean separation of concerns between the +basic_* layer and the “convenience” layer would be created. That suited Outcome nicely, +as the basic_* layer could have minimum possible header dependencies and thus minimum possible build times +impact, which was great for big iron users with multi-million line C++ codebases. This also +had the nice side effect of permitting both Boost and std implementations to be supported +concurrently in both Outcome and Boost.Outcome.

    + +

    By April 2018, v2.1 was feature complete and entered a six month period of maturation and +battle hardening under its already extensive userbase. However Outcome passing its review in January 2018 had much more consequence than I could have ever +expected. Unbeknownst to me, some of the WG21 leadership had interpreted the success of +Outcome, and especially its divergences from WG21 Expected into a more complete substitute +for C++ exception handling, as a sign that the C++ +exception handling mechanism was no longer fit for purpose. It was thus proposed +to remedy the standard exception handling mechanism into something much more +efficient, thus rendering Outcome obsolete in future C++ standards (P0709 Zero overhead exceptions).

    + +

    Concurrently to that, just before the review of Outcome 2.0, I had mooted a number of semantic and compile time performance +improvements to <system_error> with the proposal that we mildly break Boost.System with +improvements and see how badly real world code broke in response. This was not widely +accepted at that time (though they have been since incorporated into Boost.System, and proposed +defect remedies for <system_error> for C++ 23). I therefore wrote an improved <system_error2> which fixed all the problems +listed at P0824 (Summary of SG14 discussion on <system_error>) +and fixed up Outcome so one could use it without any system error implementation, +or with the STL one or with the proposed improved one. This improved <system_error2> +was then proposed as the standard library support for Zero overhead exceptions as proposed +std::error.

    + +

    A flurry of papers and discussion then resulted, running up to the Prague 2020 WG21 +meeting where WG21 liked the library part of deterministic exceptions i.e. std::error, +and wanted to see a working implementation of a compiler implementing the language +part before moving further. The covid pandemic then ceased face to face meetings which +deeply impacted WG21 productivity, so everything large which was not yet approved for +entry into C++ 23 went on pause.

    + +

    Outcome v2.2 (2021)

    + +

    Outcome was sufficiently popular, and widely known as the closest simulacrum of deterministic +exceptions currently available in C++, that it was regularly benchmarked as such on an ‘as if’ +basis by a number of people in the wider C++ ecosystem, including comparing their ‘better Outcome +alternatives’ to Outcome, where invariably Outcome appeared to lose badly in various +synthetic tests. Whilst any empirical measurements in the real world code never showed +a statistically significant difference, it was certainly true that v2.1’s codegen in +assembler was not ideal.

    + +

    On the behalf of WG21, Ben Craig did some benchmarking work on Outcome v2.1 in P1886 Error speed benchmarking, +where it did not perform as well as expected compared to alternatives such as returning +a simple integer from a function. This led to a +better_optimisation branch. +The changes were felt worth merging into Outcome as v2.2.0, the first major version release +since Outcome entered Boost in early 2019. To give enough time to sign post to users that these +source incompatible changes were coming, all of 2020 was given over to announcement of the +upcoming merge of the breaking v2.2 branch into master branch in early 2021.

    + +

    In terms of codegen benefits for proposed std::error based code (i.e. code using +Outcome experimental), v2.2 implements a library-based +emulation of P1029 move = bitcopies, a proposed compiler +enhancement which can treat some move-only types as bags of bits. This very significantly +improves the appearance in assembler of experimental Outcome based code.

    + +

    Outcome v2.2.3 (2022)

    + +

    Outcome v2.2 saw much popularity and very few issues reported after a year in the wild, +so the decision was taken to write the v2.2.3 Outcome ABI into stone going forward. +This is the guarantee that binaries compiled with the v2.2.3 release will link and work +without issue with binaries compiled with any later version of Outcome.

    + +

    This pretty much draws a line under further significant development of Outcome – it +has now effectively entered ‘sustaining’, as big multinationals would term it i.e. +only small bug fixes and maintenance for future toolchains and languages etc would +be expected going forth from now.

    + + + +

    Last revised: December 16, 2021 at 11:42:04 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/history/graph.png b/doc/html/history/graph.png new file mode 100644 index 0000000000000000000000000000000000000000..9351158e89a9ce3866f0526a73bf1b8680558ffc GIT binary patch literal 76696 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 literal 0 HcmV?d00001 diff --git a/doc/html/images/header-bg.png b/doc/html/images/header-bg.png new file mode 100644 index 0000000000000000000000000000000000000000..5be7cba7d5e84e819c4e7df057e7461c9cf4c181 GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^Aa)7|6Oc4mXLbNcaTa()7Bet#3xhBt!>l~)opzA(fB_Hl(n~vky^*+E-{Tj+snz4#vHxMy z<2k*R@%;N9H}p(iV#T&1Q)P=EugR8kG0UI5xOCdtN^8~cfNv*7UR_Y1TzeyCrq}P? z0czgrzFTbPYXrx0zgzfo@rudj{iW^C9-Lk5ujan~)lY6qU8eW4pLjKZ)-!mz`njxg HN@xNA6)#SU literal 0 HcmV?d00001 diff --git a/doc/html/images/header-fg.png b/doc/html/images/header-fg.png new file mode 100644 index 0000000000000000000000000000000000000000..549c812e166e3e23fc154147813ed4376f2cfaa6 GIT binary patch literal 106318 zcmV)GK)%0;P)BB69h!$P)1i^vK+L<59`gpg>15bZSS z(4YlM0~Cq)QP>U$JGkNmNL+RAzt@^$&={|8&b802GL}-g_uT*Nf9#xwO|MUMEpPBz$zrFsj{<{AO z{Hyw(hzw@V&tqm*o%I*yvQ{JvI~TDKy=OLCnHZFSwe{dCqzHHp?uMe|_rZA2?*hYZL#U5XW;fGc`5Ush6-2i}=Uq1*@u= zvPixt#w^!7=e&$en8$cLj<@@>z_-=+Ls)z4SFScCZYkqN1UId=P|h8D*^1%q=sln= zqc#VNLnk+RGu)hU-(FvVeh_uT*L@zI8{uzXUjjeN;Q7{i?vss%kdz7YPq$t_{jm)s&gZNNt+Y@VA4BVwp4d&gvU}?$xUPtu@aD zUwCS2rb7nhuejzpWQZL3O^t{|V*MBy_2Y(n+PjVafxi*{9{J+-zsST)dH3SK#(Nsy zBL51pFj+m{Tz+v0+Gicd>SZ{rw_W;na5EnLW?Gw-zh!=id(BYabn2Y*x~_MBLq!I& zjB)rzWM-;Ubzav~#>nesCLZJP(`Sss4>*5|qoSZLJ>nLy2#bh_99)~WpI4^-)avc( z^>6)(!As}gLdH0JO;qI&XKt=ZBPClFv+(G%k4U&m6rotRe$o-Fjr`TzPqywYECxSO zrokDI8|Ho6ftR1yOf||O&9kFwnD||))3A(T_WRkJgReK=#LQTvc4L3^^){_rM7{g5 z()>aAiky0>nZ=)w9||I)ik8~Ldy|5#g4Ti68qJD2^W#jeE3;~-aA$`VVCzZatF!7oZ`FLAO!-dMZpg67cvHk? z6YekLG2|QH-UCqAuUm(f*C5!^;FVWPlbxhO5lpoe8Z;_>SFv|mYsA_vRWJWQk-^o0 z#IL9pWxambdE>lfhC{M@Fj&f6yNGY-_sd(JS~QBaiu`ZE-RNow+o7ccr0O%b4&A!o zGs~8s_ETHmPkUM9#X6~FhaK#)gZr7@wg4G6N9^VzTo0E5jPL?0ekl_Z%NR@&^(8TROO_R<@R)jC*I6~t zF&;}Du%1G-R2uN22DNHg<|f(o;_bt_rK}?yOMhAV_N8g@QY^oeH`tPAe7+;Xw7e`( zAJ@B6^)x)PTZ1of4FvFq5-k-FL9vJ%2-jOvb;!2Glkuxxy&ejN^-6SxS%MRjs;W+` zY(z#BRL~kNhXS#TgY!NR8H*QNd6%&EGWEvW|J7?CUkOuZ{0obk&UrD*F^+oF`ITWhKUZ4i8Wn+1w)r*;Mm38S82SG1LzifONYe(8T?WJq2C3oxU zar>neI;>8fh}66hI-^lxmgtm*W4Lpks?&?(YL5$DQdPBSYHHI|9T^mVKTTY2+J9+rW)IFd^hW?vHS|qEJ1}#obMN}XLQhe=DO=Ik#y2HF zH-e_GUlV3gn>uHn9GY0e$nuZN{`Hzfl+%MaFS%U~-a$QRkfOs z-Y9KZ@>%)$Gq$K(47acXs|u)tKUpq5Uk38|Ko*p;b|z7wzC7W0fm^VhH5@TPVPVyI z=ivZXu^imtwL#tQ zC0(8n3AW*dtxeQ&=dsV|@rZR3THSTLf$CRRgUzK_$+tAeOT2F%^^B?|hPhlo{(y*Y zU|ZEyiIy3@APwh`1Rj$&QI{^rZiBtP^Z54T59bvU6s!wuU$6~)uB`w`4NhJj|3*ut zZ@qMDQdGCN_o-!~!mx4UhcWYwuY|5j`0g%`{-3oxp) zcJC|T9jeDjI9cTyS?APURqut9!;K6DC{`+18sck*g9><{ym17!8K}ikT?KTt{Z&0f z7q@O8FjW55L!_M5NJHbkNyaXuJtW!i9iypNZA$go!VUqLZ@g1y!SGWrZ<~dsx_lN{ zcJBfcePTpDl~rGp+q|phoKr8ImyF?KtGGYW%dNWy)(iOpA{f`;4xC?k6S2tSwX|3e zpY;H?o_@ekJdnz~)tt|?uAdWvc~uxK`+v1S#hMZELCv~r#z-Wt*7vA6FCQOy`RfCv zA;Tx(+ueqNyfM)=uQ^Xu9V3TDxwZv*PVatmFk;!|W>@ANZ$2`=7=O*prWf3lm@L;a zz}E&AXYF+{qOUFW#<;2a6<@1u#-1}m;bqfXpCD9 ztOpA)ik{HB>y_!yBSckfEw+iP_cq<*)xm5tzBsYk9CG+bxj|A|@N3m+(8HT*fbY!y zX+A;C`T_TOgF$^C$3YTVK|MT_o2InRtC9Ft{G;vWe5(fO$A4}|+3f~?ZGYl*D%Ryj zNKwchG**o7!ckA>{J|QWP%PH~iE8Y;c5vyZ%XhG6ZCw@;2-RK;)1Vb-yl)POpy*Ou z1jH)@ZQlkdRKHOmJ+>dWYEoc!Pr&Z@=xAbV`R*J%>_!?bqdJ`$6u;(4Mj|mc>+KKP zvu!N%;@4F%eLHO$TBZegLLwz02P|GZ#q+g*v85}^qpRq4{nz(?U}2ll-c0hk>p(kU z)C&)WbuaFB0|?DDvjq~VA5d5ZTjLtg7sGJUd*+o{$M-igK~sK-UPI+)$wf3g;1hYR zIciT`YMjkEMOnK?b=_5ds{Jg3cc>J$;-p*jo4$yX*2$_)(OO55#DzUl+xNXy$2K#!Tu>$C(NM=}bKP#1Rt zI*q!8+Vio%1%hIeAa`AG&Jc)*&g<#ll$jroPmb|`nm!tXZ9j)1oS;3hZG3dc9bjA5 z?AZvHz{ba0p)0N%RoAnC^!eg2^=KtoI`M1bz-Io)L162lD=-K);CC(fYd!HAJ_L@o z)Zb)?xh$jlz8kb-Qi$snkyV?Q=yeF0501JVWZ^99gDC`biD+v@1Zud3vG06D=W1pd z$GOe+T+h@e65e;2=`r3|1h|mh9Kkf(dhQBCV=STX+(lI_z_?qcI}0wLamJ#PVBPc! zk>{27FfgRr*r8Q)%X+*nrvSDD0Dv;iFxS~hA54@pz2et7Y92eA41aUI3#wAbDOi5< zuj_eU&$^@!Z=d?l8^Bn;A&ao^0J@#2%{+X_H_{jLUg~Z8`)355_$s;lCHnHR;^43NJ!)ne5&FN%sM&d4Tyh(LB37qm~`p?J37>zL+ zV_rC}v`JB_LtdE>xsL;Do_xcAFh1I5Az#!W{p44Ft{R@?`&zTacXXJ)ne1Ide%x8+!OSTc!N(N?oA*)pqsZK|R zc#)n!VFXiDLMRm<2|NP=o?Z;ZR=BmsL1u+^keUfE0<)JbqTQxj$<8w5=2^b&IAP!T z%^NG1TTN%MO0iS5S}Uko+No(Pkz-x7_Np)9mkrxO=}V9XRTeKs?Y&4EW!-0bugIUV z)SI}>FNJ&?PLUH%bHdMcJsmwFVqtc@Q2cy8aj4RQPZCVIF@_xeYy1^ZoxW!b87xvT z_FYc`gIO+~QZ`-DFz2zfm(*)Lq*ZIalJZfF)M{MJYXe|pb6!3o2o^gF`yrSAH<}R0 zMVu?C2P2R>)dm2(XE4f1&bLr|OKc_Qm$t z)le(-BA7@8dE{+0BoQp=GWEQI`t{6NW>*`_Zd@Idqr3!X3OwkbdO9IZa;`#viLazq z14x_p`E8zPwF{wQ(`Wt%M9)9EH4KEOW0XwHC(Qwz5^x*CUjMGm@<>xGQF-Ut(8V z@mp5C>^4hIw2qUw9&K$Y6nNP>s03+C_0_Zxh5ISRV9(A_pXYnPmpU!RDZT6Zn9;?D zj%D<)l$Y8h>Z@wlaui(3Pk(&EV|}q)L>(MC#8Z5p>D&-*)@$rk(TO!|?E*G(Y2_HB zG>RyKH7I3~d0V(G6$=}R(+mhY%h3RNQ*4h z+HKLlQp(<|GyrK9#pDYyPq7*dzVVF?Uaxvd2KQkR;{*eg)=o&5`;ZFpR7XlyCfmZh z*kIS&zpf((Eco&e2z34qf3cazHjP=@;Kk0N zA<$Rv=?nSzYGOf1tJ~DWFQD;K7c|L@SMWZFyeQMUiy{^;7Ur8&wB{|0Z6q48P~b~C z^_p|~-YpU)3ULlGG0U76_a~T{`FO-P_c4y_e4LaWv@{|*jyEQ*eHov{#&h%QO#ISp zqYH+3w8@gRGB>J8M&j;9v+Rin8rU#9tKLhfqR*9AgsB2^l#xn@;F&ibK?Mmdx+EE$ z>s0eor+Wsb>pJH=)l689!<`rg&Y~L`O-b9vUVeEf5K(F@7wjK@#!OMNpKd+8DzerN zyzVE{&J8xy=QD20-0uZLRlROLFlf>wnIzw}K_$!PJdtui+@`AD#Q-1&s#bL0c(hX9+g__#shF8F-!^;Rws5=>ADsl`Nwt`tT%dXGK>N)6|<=>DSKB;L* z)O?YssxWg_dqAiz)TO_0?c4q5T;m9F(q3R0pW0Nkg?s zPE?*chYYXRUAhUr5roqfZ~hI$oY5%e`X4e}3&bgZiZ&Y>v!!WAZlMcvaB(i=+l6+> zNVbHB>q|mbjvSI^SLn*tvC>v00>OUe52OB|0h$y#qO!L(c7$p2b&G9GdSl~quc@V& z8qqFz{F(a0%`+z`c4}5b4+q7H2vb}b9Nnv4YU&O~waD`gcZKWav%9*UV;p`!2jH0R zV__fbn3vnuf^5WTYp5%6DAR|B{!7O==Db9NdQ6g?QX4Z6sDNx?*_8|_siB2Z-A^3Y za<{qk3#Q!a#Uk+2y!J@neuMPmKesF7U~wTS3uqFhR9gl_3EIhqrj$&7bCTJVJiBgk zts1e9_j9XQ7KNJg&6c3Y7b~j`_UJBK0it*ToEICo+Q&`#bKf_y5M5ONw`UTK!A2y5 zO%OEze*cTo^OC8x;=!~IwX7N^++G*`DB++}>TD*c7#7|q^fT+61`I}^wIJF%!;i@Z z*2Q_>i$nA&B3pO8IS!R5f4!=g(@J{Xr2r3SZ4PZy7Ojhcfn56qRp}Rqjuy3BmYZm&YF1l?28)T%T`LTF_p~RXHl~ZV1Oef!GtfX{888sKWpt6W zO=!XVZF{K=JP%^sZi^orka!kGh5 zEKH@Cy!Z3k0yTjKc0T@l%Kk3-tLiA27fGc|D@9*OLM#r!G=$hoCEA=A7D7SGqwBoj z)f1J>s5qtDC>xaWWcET$y2_c*y9lR4_W=vCJj#a3z_=xy47^&Haof|0YhC<|D>w}> zl8BLZf<4>O>G}<<-u-!8^PKb4Iek($#xcYzIq-#)RI6wMEzWy5^Pa2~wT)Lgfp4 z_augMbJVeAQKWoLt~bLV2J1#50Hvjb+h>h7}=IZqDyjY(`(_~WPHoILBgsY zSa#nQ#qMAH>R;?@ay*om-f{OM+HFG?LQYLxkh|h$EJ($^d2aSJpt!IbcL^P(OPC8= z*alegO|Sv>uXzVo8WlKWlvFgx-@x~12)W(Kk{uT^{mtvFS6Pq3`j2l!FIz{)P}B5V zk){8QV~fJ*O*(m>ywzr>TFjy_1v1i2Kb+mYMd=3r2a{G>?e)NDVVl`eP5*e4ih=W? zA*HzJKraDrx(#q{Je+oQM{S=|hWu=c8Wewk`6CLq_72<}pTA&cco!7j4$E^AQI7zRmgPRb@cHKfUlF3XtX_;$Tq3wqEj6 zzrEKyb+$a!}x?>We^$3pO+|m#1d7VbCX&H~>L#c}V+$VWe+bnUDAW9wCd0ElJo61rbF-=swdRG%-vC$nGV8ndSBtUo4f5iTz0R~x znU?p+mGR8%K)$v4QZvw~**op%y*fQEZ4w^9eKS`JMD$k0)#l2CuyxL})jw*C2gB>B zu$ik~L_FjupDQP_0vRb9`x516IWnmk-BQ#Sgt}OUmC}HP%pBjX=3!;GgS93gS~&mN z-jr>m1_tPAU_M4|MF7iS10~xiqb38!phMbZSHx_g8kd~NvZ-<%d0;-ZS%9?lTRSir zws6?ZB9vLKGfCmIjnwUBqPzcRFC=3;%9ue-&+~oGYwGD+kVE)xh39*$d#}GgziDKL zJRENDsYQ<{^Q*ZMsUDC9uS^kGERYN5uI;hbBv&C6^+D6?Bis-gEEU3?SRr4);8@+M zc%!Fo95%YCvTI%n+N8zVtJOz~m$$LcJi((Jzi*nb+u~W8BQ<~5s@+OUAxA3=?U6?) zas>>j1!of#Us3A^=GfF7lo`SbEF(ESj6;oUo=tDhdO(={b*f`4%~S{Pq}tes%9_iX zRwwv4P$ZeRf>EjyH^aQ7Aa-lg;CqW5N#fYpfN-6Ra09W<^kE3 zS07sheY6s(9oWIYscyt{%{l$f4>|l4-}d~d8CA+U!v#rx!0_o9CeHXQ#kUtTA5?Fktq(4_ujtu zIb)K7B*1s;1?&XHXxs1s;KDurti&uOr>k~Gri%n<(%0cbP;8}M;bxelBw5_G2OO4DEDyZ9Xiwtvbqwe zO&3HLjKr^q{h79)Ia&$WoV?kRq%K8xcxEgDj^@R{g!3aU(?=Slf8odet*+kal_NAJ zzg56x$j%f;eY;oEB23!nU)lCF-@BYH2vEIyoW*jLIcmTo-+xg|MRL&;PjvUYNN0s5 z`soFGs;{}JVo7!?3FGDkOMG`2lT9&iD~oTJY%Ts;hRxpMn73*o@kZr^-Rq%-yI?rO zkb}gy_>jo4`)1JogE(!syBO<*hOL`GoIoy4!7Di(?iHgg#OfVc(o6uzgL!4R9%$u2 z7D2!Bi_^2jKQK=h=9MphPaa%0sXVaVJIH-_Hg`(QUhCIeN?zT}|FzDt;X)8Ns=Shn5CB_RK&T2aX3YG zUZ|m*cbAPK^w`|fzxU^7z9dA(alEx?(6r2y?%VI?xRs^$pgpswJq%pXhy{?pS=!&u zZd_ti9^NH-N^4KP1&(Ya)t6!4ok!;j-Uon? zr$MjaXR4&27tuy}C%s#EH5N8hp)4BaC*ul@`8gg!cMT^~U5AkCg(e2(@v3Hi32XKHu zj~NVrDlKlf*zo3n+@k;-t*6Vbrov>gwB=Q$0F+2ArFfBikX7XjJ@47Vj-_>6j80;6 zUR3Ti`S_+@t~l~Bki5#(piRtj9FHMKX=$>hk#=#2JKO{05^z%H z*vuS&tidwSie???CABAk;w08zz|HiS(#nmOeiO*6wlGqgF_cC{3!exO3dE^b!{`d= zWr%+93GAQ+V{Pj!yQ!PE;-$8)9IzOz1nyRzwmo+&Lcg(dUYDNPR1jFRaKr&;Pg_BG zWQ&PnZMop$yGAgj%&GRSnl1_tR4!lFGd4^#0XD~QBbi;~sEG41((D@|bZbuK;`Y*$ zmjh?j&js`K(71a9?3i&}zw*5ovk>kMs_Nu0WCzq9C^X;h1nJNHbN?o-F{@=~myS|x z3Hou1Ib?GQh^i|IPKv07`uN-+Lc)bbGt}{d1JL^N)I5Q9EI@H;RXphKvhLJeFfHol z*A|0;c)Aqm$jLUCVihj}N|q&EXW^l(!>meZ<;7^btY#_)x=k0>5Hv#h>@}0>ADu*1N8M15$ zDGzQMVF;NpRFKO`G55o6y%N`puExLhHP7>U#ymviG2S>jH!_$bwed-WoKDcI2vXS# z$*Lm~p{_eWnO@~FHZ7$fztthO(37I%ZGO-%Tz2ZM&u@{_J>7!BFrBaSOp58Ss(jIW zuV4uOaEV$l7~S5ORsLp5@@5XxMi!)x9d6Q)H5tP z!qn6U%Ra0dTZkLPQIc2rYd#;mQ$6G$>y-Zz56&P|_bQ{$N#=8Ivc3()40`V12% z#VGFWja)nsJMDXM7JB9P-PW}Cu%HbW-|lU3)z|(&^P0q{u}uG3(hC z$~tZFXX|>(alhW?unUgkB+`N4ef7qP=ofk+3IM+7=y|iV6jZ$*S4zP z7cl#Cw9@Au&hSYrkb7p;Ln7Y?ouV^qE|+rNO}=kwr{n#@*o-R?x!AO1Rh~w%2v1sg ztcpZNto;Ra_bLnum1*l!Sit-8I*aQhQum(9_NKZN3;A;3I~AXYH{49!$ya0)Z@vVX)BJ9 z(yHUyW(aN03zcOP?ZD^-&CR+$0WW|>q`UrBS^_i-QdVSh$AYaGso-2C{?b(~CF6_0 z**g=@8o1N~GHNtYm;$c#%yP*rDf_! zaIOCHe1D#w`#9?u57#@<$}ERW$pA-G)n#Ry?zv9tC1h;vC$W?vl!R4`47{7S&=?0; z30=Q7*Cljsm$Zf4j25?otfbC0Z2)RT%IES$nrQ=#9L^4+se~km1@{K2h{tQjWow4i za+IgjW${kI9o@3V&a9@YS6;23l9O44$8kKI3Pna9CA`J;REe4IS54h@aZSj5%xC6V zH<$6|>Z?&wdLCi?&|QH++Ggi-vj`PFochof`sqmjA!-%&8i1>zTGrkm8uYw&5p|Hf$MFW`Ys=NNzx_jOnJ3yi6 ze|G^9RdY*-lQlkSC0NI()Y}`1;Y?MBc;Hp_WtO_n#^Lv9qiR=-n!?`Rlcb>6Qg{VG zGSLq?kR7F(9{2(>q1G;Azn7jxJu*WpB)?Y>oGQ)ktu&X4SL#E;w^=FDQ3ux$8BNu2 z!eIDMdHqsr%t%dPG#8khvr!dQJ&W4jwPZPt$1Tr~^Xoc`JwIf4%`N%Ei*0cx36k?| zj4q;xYCqoAwuHjb&SMMZfo2bYCNN~X`k!Li?L(Fx6vwWME$%|;i3d@t(6Z9z#glB2 zqM2z__VIxukwVStGS4OS!R_tqDI*ZAs(+kJ(2>(g;Os7-^ z1{_^!7{)B;_4HgwW**1e<9KsVRZ2^78B+envAYtosx+*+JFml9!p77QsA*Th!WxWr zElyE7UTtP>mCkHQD~_JFRMAu=NLJVkTO}GHgm{KnSfk}&2wNIxWtQmegD zjKPk=a7avMp5`2HaTS*{=zn=i#cvUz02hEO;X%e^0W^eZeiW&fp3HvihH8k6%IrJU zGR72Z-+9c;ZN9-nfybMpxca4llXm;Si^LlqKz?`Qt4>=6V@!Tlf_?waL zp4~mrc1qPOLSzR&h#nAIr)rv&llqQksx;%-__mn|r&1X~F*_v%^;wHmR#O(K5}?mb z^0zzdzBM^e&APA&43~%$5H#zLxw1#b(^uu)M@B>6HMq zc-&uIcC_O1)?9HjGdt&LHg!%fEhLOVGvRxgJld$uUcJ`A;d=Av$7{osKd8@GE(9rJ<^)f)OAse$kcM1c$BCN zrYK9`qkv=VHWk^_DKIOrat6e)2@Ha>=yD=iPiC_OpdznF51)uEuS|W~1aR%sV3@Rx zTlS`+H((R>u(cqTo4@&Pa|$_Yn;6N=NQBp^OLz_67%B0{)HKEG=xP;_+b&N+!2UM( zsDeRWGRtWXl%Q=eh03v&DJQ_6BpBV*{B1`81qkb?0jTl!-OQsJyn@fcBXJqVlxly= znL!nJ;$hs(4*-+UY^Mk+Wj4A6@5*8h$+ijb0HVIl(-x?E>g7>6l!u~-#K?a2dg`4~ zRZXW(O1LY}Hpwwg#J!a`as+3Z4V;uWJ?;is<#-|-y~-zzUj5x|T?LX7CaRkg4kp~U zO=4z+)nKvr74%ug5RDv{O=R|GpR9$Uvk%&+;NX_xC0|8T&+9t< z8itI=<3qZscKzLBkTtFmNxZZL$)j1w8a}i6Soqq5q{z(L0{Uln(J2(>HS)DyqHUGp z&fHW=L#MP((E*BMIg*zI^p;Kwl>PhMepL>%=%Tz#Y=x?^OuQS>0!U1ig_;2-40Z^v zODV3Yf8l72{5wn#$9fy%qnphSeNlUwM<<03b$mk&X;uK}2DOv?&a90#s{Bs<*l#^97 zZ)~rU?(W{9T?H2QmKuQs+QXX|60Q{jg<}FEJRGUXVY^@i4G40|&tPie0=|1V#Jq}g z`jAppwHa{&W-^Az&^c4U)}##Q!d=(X0bfs(Gt#=FV?4^bcA2OL1p~tX7)7wuQQ843 zCsjoFHXbZZX3^>x@~o=8l)l5s;vr0}>?-jd;?n)(niGgcku?U&An{*nI9zWK8RSt# zv;Cr~dJC8N!~*g|@J(sfG}tGABV!O~V_0Ylc3jL@aKJPmh*E_XOuZtqDYUHN58-++ zjL9alIj`dMLX`2I`CFxqr87;7V^$K`7!TFUGs@$p<%`%F%kqNCh3yf4^&Vx=ZSlfZ zF4&qG!0R{&3+zs*0t1_DqUD7pLnp?5A;s>`{^_4aGk`i#C1q9H?y?*+@%GxyWjkrI zxhY_#cx76x3FW|Vz@&CS>_X=tvN1Rt30ow>t4BCBO>PydB@mW>y$yd;hq+2482!pN zA^7V0TD!Io?LNybhJGDiyV;{}j%|yTLVSafA%<@cDYg2M20-9R%IW~cw%^2L|waS@t3JU16^ZD)Q$&t_aunsG;m(?x3% zfr_5v~cbzxtDuo}Y z(<5+7M0@33?Uu~JjGNGy&$J1cVQb`RwmxiMFajbDAU1`6UK6NZ^9;YK5FQK}qx~c^ zqm!D_!K(AT-W`$mK_(<-~^gIA!+_Z9{i^@Sx$JNvuG@y_#B%(rf=uDr0bD*-nJ z+Zu$iz?Z7iyEzjM!;YSggp7r!u-+$!!}3YCF1O6;oT&5tV|4;v7q#W0#`Om zAT(uGRa$qLs56~dtI8tBI7E(uqQWmhj>6+S9lM;3!e)ad{;m>e{W~X$G@ho z4EJYV8>s~pyD|TfMg)GU^pPw+0(~Q|_iYiEI@7EYjcbt`KvX^Ph6tlZYG`ZmVtQF; zRy{$KW(0X*j65jKM~et-EuGkQF-1krhRj!;&e<{w@bp8^ZcdvYG)4~p$sid~XQS6? z#fwueE$-R;l352T4N?Tf!u$t&XdHFbp4CX;;5W&>@QA$$?3^%#>MeQ508nXFk0^XcRZJx3a zNW$wB5m*CpzGE3$@Tv0qld|BT4Y-=VEK>S7h>PR%1&LVe^i%3a>4%oM&N9+w)Qw zS2pt)bSXGZFoy+UcpUI{mgh9v{Yd2(S`Rin-)sR~rCv-k`DGlSu*Z5ZvvzNojp*h)fbVhxl6B zNy98$qS4gV0PQwALfJ|LSRpI;9#^?57_3&F;lwAfzu@lV?4ah24jPz6vJpsT-dm8U{Mt){%w#lZNEIhUPfb9x|_IP4=1f~W9tMsG8 zNaann+JJ`s zoQ}0=;aPDd0OsBul`tc#3R3VC&+J;WE8R^|9_-&GDW)+#D&J0Bey^=+G+W$RZS$j8 zm>`Qfchyj#NiP^78t=4@o;xiR+m)v%0m?@Ts;S=THYmj{7AxY;?Ia0r6OJ@j`JYD! zT#muD`=X%TS|XEaQWA}5A(ahPw;w?qe`ds_Iv>Y}=lSlBr)+f-G*{{js0AnSo@HwL z^qOgQ>|A~%H6&P-iW?xeF-MYJ%zY+iF~j`-V}kUPU;X(l#HI?Am-&oa#>ggMwN+p5 z8Euf6caK3>47=pjx@oM}&~YKC9hNJ=$Re~cy+jHW&shh1o^g^1&2bbWK8{DF2Hiu- zLI11p#^!B;wL6A9sNUEe^l?RAKR9 zcVB;hf>DYg^J9UZ%QwmOdX_?h^6gnde$y0nO^dP{4R#6QSUlfz={f~Dk}@+69IGwTQWmck;ffmB4bKbqzZns^afQD}$9Rkgabl;}Qxk`>n{9!YPMvd} z%#vxOo+A`J04nv1mE=~u&-3#+r!R@Ow@;4a?UgHIbCxvcKe4L-)}W9-%$ecUcVg2n+GVc|vGP=mRvRjJwP8$N?#n)}1!@kxz;{X?RW$n9g!Q*|EW z;glx{o4CKO__p7Tt-V&J@tUe766fxzVe zJ$ch?`vZ;9$uz^z!EHMdAK;^}AV}6@BwH@2$n=S$wp1iYJ_70;^zi5iiY|X0#RK`{ z3@dsuti##{azJbmNF$tMP%yNO8CO49q>oA;LTeT)4?{4HW?p|cHdN_XA+79^SAmkt z7CLpN@4Tt%kl_xieaA9PDb5{Lc>eilV0b)r;w){DV6INQ_-7i7&1QCs~w7x;~tA}Vpz5<$~sO^$VN z3{pK@xS^$P0Y2PPhiw^0Wv0`B(&Ksz>=VkUu~`s2V)`jEWQ=jF#v{CGHgqw%4F@XJ zRCK;m=eN*DY>{~PxnHS48;@nvc%UYSXj_H0ac;5>E4}8H31hFL`oNYK-7R@_`cA*5 zz3%A|aJoYxn}YU&yJl!+klkd1mz_?uRt`B=oZJklfgK-lv#R8$;vA=2<)K>{eJNwy#nfehXBXY zy!nS$Yvgg9LyiJ9Vt`g&STVy756?3G_Hk43#cNwzmRO}0ijdj!e4q35jUXyLeT`sBAGqEPo-$^Ab`o(uKidoL9L=TV#An%vDQJ z=dZ(%AtI_)FIv6Yj!zxq&4&XbLT2vZQWGZ!O+crefghcSWp2dcH|_25NzyWBqy{hX z64T}Q3?sNu9L+0&=A5pUgt|I43K%-Cceimr#zV#k){_}AyTCHf%7u^PT&!LC5_D^O zdwiN~K-%A`HE1rlH?h=-Z{t4AO3a-pHZS;EhF&(HYqqsjX7?HkrqdE-?POutm+HWx zg`>6Q!}6-8?x{3NI+tW>45;r^8*m6q4y;$wiVi49KlYY2-5sik+HmKM9$bQFjJ2%5 zWzEki7uHH)sy?>nep^Jlz@Wm(;oJcpv`9~x=bT03N)S1`05s-loZa#Sg-%!L?goAw zZ{^@urOV=m0RP(EhE)LK`orI5gY?h;=)b-(4sh1FahI(#6IXIkCqP9wT9?;cwj_f= zCR9E@pfK*g5VPYkIxB1qM*`-??vnY!cX`MDo4Qd-0LPGg!&069(SP#Gf8k&HbNBo8 zD}VEAf9dCc(O=RbMTmtRzw=iK)6?36j=(XwErzR7FJ^7V z0)nhFG4*{Gzwz|o)PzP&2?W_e|423t1fsj(QGn)7MQbe5a7HnxEr|-F81R-62Zel> zdo>6*x%@3@r#bac)v{T1nXlBwD>4TQ1F5axOqv^#EP**i+08YEm*@IpbmyzYr0%f>h!j}Mu55y?flapgKMmsnGGmohJNfn!;2OO@b>ggR3_=W|}C7xBk< zJdO`e?7@3pi?C`;(v2mO+NX;4D);9KXzxygK{2wnN+5LE zgS`Qig;{JqM_E#{QSN*v)J1bxWqMp5kPnF<#lbf9(W;3e{ObttE_M_vyNPbZ|FVPc zcQArAV{SHvCxeOVH6yW+6Q{ezIDFo_N%r79S~~x_w`io^9@#es8vIo0GKd)!dfP)u6PP$`~aXf|` z!jM4%WPg;GoY&K5p`U#C!ycw*ji#3quMj%en$cn%Q^m~Kl-^lvfXu?$GhlH5a2W<(MucOg90{l$@~SWN{p6_tavx1v?Q)TE2%=w%2a0#Lj+@OY2hNZ z+5&e%ETlUKgfh`cHGRMp*+bBl>s{DvHi>wbwE9e<@)gr|2uF6U&{!b3k@45kM60GL2$zt2$|k?|OBEL*3vghVsO4QEw@G9Cu{ai=Cjli8p8p&xj8zkc;szD7(& zdY$v6_lgAwRGzcM^nH&8gnYAFYuq*QwLq14qZfjgTBV5Q%}h;*&tcjkg;~K2gGGc* z_FxL$&BVN>FCsfuW)(i||1idYFe2vN0fl=2uw+uSKd*b{=I4uXX<#OW!ogkmLI9G; zz2SVE(L^EjWe^p{CH*I|@A(sd?B#R(^6f9GG~UnP6~KFgqvPY!+Wq-IL0F=21aChUQaGbYtDT93SDcI#G9ilBtFmv zBhlhAcNQkP=6Rm)(Hb3(x8p++FTv@ATX}3ml5M1SO6t3uPD*yuXqBUZ*hk@Q$^k4d zRvA5aZPwFOlK*cSq;%5cKiVAHa__-}noH(5Z! zP|l+^igcRn+)~i>Sfg@pQ^ZhR5csQ@)b7)9TOcnK#^)YKhLMpT_5iAvq5Yf3A=srN z#~8zDczLoTmAt#8erx_<4U!x+4xQ)r3*Y z@FY~uc5NcyRR}1ZZNkIb&}7po5sl&VR?XUuN<^`mf}ydv3H5jP0nhjRiSK@SzkcuQ zfB!rF@ONesu(NB_hI@ipB$1a1eRN7=MC4!Od6kmNQlwahw&`1ytWA&3wdOaV_;KA6Ai-SnD_aU75K6v7cn2>%}azrzI`ZELg6U2;z3iFPzebusqn~@Dk@Pd z)I;LL{qubHxA>6baeNrZqa;k$X2tOj?y{g65vYqrWJZspFf^XjV(eY59piSIv+lH; z_fVNo>t(r{&X#0>=yS{BvA$dhw(&@t{#r$zRZdO^fNoUY)qj7kUt=*EUu=HjJ=$$H z%K!$14V8Dtm}4erR{&|kXpYwdUf}K)FQ|lCJ{NKT+oF*UPqR5MGd+$shm+y9#e7C> zoit`c4hw$iKHvGoGUjQ94^F%0zOpO?xj8y&Y5ID+8g?LHs3f^xk1;8DfF%GNLmCSsM zBd7>{QT<<2Y*OnXc64rrwV4 z`=z>j_?(xl95K&dD#ttq0jilPO`%Z%eu*b4N}jxaPEu}v{mu{~$W{&dtTK!5N#dbU z-f?z|Z~TI1_VEVES6GCpa=FO`^q50xD*sB#I;^x}py1ay7#8P~V${ga{SB5&_bT3= zBAC?4SDB{rZis{qM)| z*7&Zq?U=hkIO`^}FBD4H&%CBN(^_QVC*D_00*>S-dTO^rKGn4bBnLu(w znH*IHhLH;kUWL70yB7`rB}aNPTDxP~OHD-J6u*X=w*`>H(s0_z7>A!{R1=%5417;H z#-oUx{!*CPF%AafzN89t^XVJCL(zH6O=`2ju{aRg0zhn&{dQ|0+pTBN5k9{-bfNd& zb2Evej-zpVuJk1J0UWk!s`Gh%?p?v-?Zacd$vDupL-pc3Z?M|V&;qqi0&p_MC<7&& zpj7iMGOp`9uXq1a$9Npa+c6%rG#lJjh%n;T7*`5p!1|0;d#am+#a`;r-O9$7n zIH~FF@oD#vY*1`P)H0Hhz|@f;U4YSBHKRh)zgxs{BFSlg4VyEGvdHSLmJZjo;EKQU zj>Cn`eGvHZp+TwgXn9~ysVOWJk6|_j--z0*ijRc;>5PMB>f4U(srC_UQ>}omczuj$ zON?f)k&nlB)vVPKI!i5z0*4|XhW1y8NbKI9%@I9xOO^7vOx1)C&{!&-5gcm>z1J)1 zH-{l{FgEOVaM^_(ilIAXd|{zHQgJ|5%kn&~yV;p0MFrU}^`}3Q}@g^dsMq)&hh(}K9@>`2A84N8P0CIa0)#;E^ z)PZI70pypmMP-hCa>$X=DO2~i2$E5_iC)*UEu=d=S(tg$w0%ufEBsDmkSZu1JA}Y} zBN*YEO-XD*l8ybs_f};5x6mqA8Cg@(mw#^Hve28m^yIoBo^L9v|N4=_gNtm2A=U^5V(~Zr3p! z(+b}speGc%kOQT{q=I!-Ir8AoPKyJ>(gG5A!}k#OTThVOK*^I*u^dS;u+>%Q8aKg- z6O1;!9muLI;L88xkNmNJ^gsQt{1qj`%wGopwDOdisy@vWV!nfBWmnB9*NW9P%Kt<9O3@&Iy|6 zyyoSAkov@l?7YrQk{;}u_^5<@Gdg^w=F_24(3q zZB?W4xUCtTqt2>R%bBrz(Rh{fO!au*QF8$gI}hQ$m4R>Z(28dtdNyxwdJcuTMQ4GzWn8nKF8nrov+u#$(b_}V;8Xo1%U$EX(Z%!*i6ha z9OfTG&?gP~)^7EyI{h&A53h8;;*ufv+IzE9{iVB&&g!XHWQ<2L*B9CnOzwjciJppn zQSQIwEjoeIl!1vtK9~3p8Z|3#{ya4(UVU0+mC3C{LJ)!E)=%(Jvd%xt!>#K6@I^@l zT0%6$=!785Lmq`wI{ENCKljFRjK|yKLkY&bQjf?^-`a>-j-s7uB&GOVj_!QIVwQ(# zPu`I^=XJe1>Ne!@czk#qZ>gGpA%^G`kW5EdKVltz0FJ)g9x5`l&Pr3^aXjA2W>9r%I6l*y zrx_jN?Qk@@W3Rb_lQiw)gH+z(4N@7=1sSe>uyHhJu#7f^DJl;pKt`;<+Qbe73U~DG zD@-Dj$6Jobx%NaJK$c-+^*dFip|;Bzt^yXS!A5oyVuZ<1gJFbCR8PbZUuMx<5h4>RABWM zr(l{R)|_dX{g098PXN1%Y}H+$!?}^DsJARd*eRf}bBzh|W73t^IA6>;b<#wai?%-n zY7bznj6C^{3ZR0N)GeZ~d1X>as@fxv3aZPjM%td#V(dxMspajkTGp4A)4Qd1ZT4Il zx&bDO3OG*U5!Hh-+tO=ZHAr>jcL*cP+771=T!t2BH&3WG!8sa4OmxK6FZ`8Xd>lxK z+{auSGwjd)g|Gg%|K)%4fB)X!g=A$Mz`_~J9Ci)?`_YK4=TW~U=FwRqOg(jyE=~i) zk#kSq_1)k3@@D;mfAEd3|Lxxcq^-*ZBdsD;0vVz)L{;S&Wd`cy);Z6#T+}%yF`egy zl<_eh&b1p+uto$}C|3O&%K%DJd)k{B`*xP9J2rAiX3nb+lyZqkI=DdN+x*nTerSyk zV)P=ndO4SgXO9%h3Nz{?;+*hW>AfQ$D2e<$4v(V|9@+IyUt`MFX2I>(R4vj>-ZuZh zpZq6ZKgYlS`@j1;e`n1yJU53beIS`!*%~Ebt$EFJ>UE6ANK~(wcnNIy zn-Z(eZIO6!g$BbMOonMjO-lUp=;my1YLUB=7@Dz^6p)h76Z$|v?5*pHprDcvnc7S! znqu%*Dke5leV*^vd=k-dygiOL_ex1c)=Z~V6?S0JYP8~cuS9f=0|GZklt_^(=Dt8d zwG8vCIp3e3&v`NPA;)pNJsxklf6k;6#QDaHk&I<5GW+!tgm;%k4TCT#EpX6aF1xP; zyrZ?)53+hCM2q}*QzD8n9DuCGX30MDfY~4vtu-^ z&d!j><4r`i>+$HN_x!U658E_Icf}SL? zR-c5_qP!wga335v9_1;lrc6U*ltsJRG$j$1$6Fu4c}qk_BHqW6$%`qR)RV6CeNi*% zxX8r&60@U}lIBQMhIv^D%+fHqagG=d7fhPCKI%Nrd5j|z5J`V_SE3J(Pv)5C`F>vS zV;mpeKDp*;rqk3;)p@xac(W497|lsBk531W_vdHI^YQrLAvtp@5j`Fs4tcnsznqud z-Fq<~Nez!w>~-6#_%5fb^$YP$tmtJ}rUuC&U8vNOFjb?O;((aG4mp^u|OY)8oG5WXgpS+LBmu?suPPyOt$=MVo-{S2U)6V@7z{ zS@F8lyQKxCd5UG@P{MN~1ZUB)a1D&_QT_k-X6l^^;F5&e(<+wc92-}v27#rs`%$|?u6;b6;8|Je6`$J_Y# z|Knf&<-hz_%08b~N^W{?nA!{oO?BGUZ&#ClU50dQiC~f%Wq%*0&TF1#_LcAd-q*_h zU;Rxlv&y2n_3M_znwwYZ6yJB8)ewTn)KFQGPr@Kca`#mqH`PnTGGrVg5{d=T zKlHfST^zu$YqK z(li&C5i<`SxzQZCcZWE^$az*v?nJuPrB2<*7{aESn8cM!o=&^woS8Y#^Lm=<2uFnC z5|Eir=cKvXay(pdgkcdQs3`={<7#azlGmyfR9^f1{hK+eI$~OtN2YDbTK)u!_k^S- zugpZ;V-pH2E)j4dpt41uS(S~v!0@S@*7`<-@!9PNmx@71K`Gw+&SL;!Vdp_}z0MVu z633^HFFK$pxvY7^2cf5`pU`8JFe3+6MGfW6+MyUM2Axye{J_McevcMj+lxEoXTBfS zxj2(J?X}M_9%B@c?;I@>5eKu(?D2RLU-KxtZSF8c%ez9l&8!I$QG(z=s%3LuQ_bAn z2Q;NQpLcjk!bCd;^&NY%+(QIPD#-)9%xN3^f@u|}A005_z!5MApWbXFNjqKIq(YAhFoF0_EORCCKN{Y_5uJTLFm`NzJZ%7ip|s%Ez(MtFS3?>%TgC-GOUDigUH0TMo?3`Ok`a1 zJm*tQWgLa_Xqc^g4%?^K^_+Ss=@^F}NmHkiO}*6A?e#2;kwUA+G{zxg$QYkLKRd7Y z$K#W6ypdVz@w@~Usz^g-i{U^B@T`4G46V#y_A8jcfkQ)#VbCPaf~T&unrO`$(Xdw` z)n`4d8~|n%Y&~36NfY_hOV2bdQD#;$)5$X04SXRtjgGR!fkX`xGLoTFgMtxFwR;st zGeiu~gu)Iz0CF3L1|_q^s?L5PA+kBA>!YM+N(0RTqqx$U{=O1Z?Dnu3MmoaXk?IUh zTLCQykHR=t!NkRw#bHr)BS*c^_$wUA$rdxc?96K;mBqrlmc~k-Lqc8uFVnX$Y2Z97(K& z|Mj>3-k<*7@A}^F`^SIyM}Fvk`Jeu0T21z-bA_3h2Z=56abrF(P{nP*3InL4)PdwE zf5#B!alDz?pZvjp>gCP)mB0DxpMC!Oo*^UXPIk*?#Sq3K+!x2Ml2(O z8Yv2Hd&NvFj9Guv{7aY%BL+&H*1NwwVg8PlF9_-dwGe34K25t^+4sp1J_i zgtyZ&$jKhAQ&Yv5NGhy4^E5J$j!UlvG`t=Jbf=sC1nrCMySa7MRdBK!nDzu+xcDUg zt6lj+M#nhbK75k?=G-SrPQ3kwmwTsc2${%Vb4{fglZP@fg3|?nxYYLf{A}vwqgR(3 z`A}M6)Cn}`S`0-?i{VmA4D~L!RMGCQaNuO zk^`aV;J?Sz*(Sydx}ToQ*&)w)mZ=7_9CG+rxV-rN3|GD8oQJOI5<19?aWVuAma=z<)n=?C}uULkTkm=QQiSgjqcuMiHgXg0R$(GCJJ@MnBH}Aw=PBcnzA{mB`rDk$ zsXP%WRQ6^2y1R4#Vp9AQ|LRYC*LVLBBKqrJ`#W`J4l*-VBH?~~tX_ohul=8Y@B6;{ANiwy=<)CV z)nEFhpZTTmBZ|qaMTWGm`=SU#P74V4-AJ?Bn97{-HBpfNc|AR|_e=lqm%igm|Io{u z_4~j7&Bx;tSCmYRr6`r z(_tZxAQU+yC&+51*L!GG(t;-9L4t}}Z(6uk2zR1XboN<+xq31qkJdgrE7=kHP>f9O+P=4&zzE+J5Q7~E4q$l_J#FJ9avZR4z+O^Tlqhs7nW}XI?wCr`Sjy>ygfcW(o{1O1tMS} zq}0GDuKAu1jv%@o+!~_&>H@oBjd^K8VDV6^d zRCu;xefZ{ej01CZEF4aofQX=i~8j7?eU?JPH19VqRnJVTs-HNR2#$OHi$rp)QEJt zi#hi~m~#+BpsZ@0ON}K&z-6v%3f-Pj?fyxGW>YBrIgN78RZ`S6a7)Pch|7;RQNOd$>H2g~87BSdz38Hes_kW=wSSuPladOFF`Lm;jd)oJPIz)Ij>x}VK>-4fT(w!8Ukxhb8um_YFq8RO zg3-@jLtZiY>HU^PMuZWA5W@vgGfpV6hBymUC8zdO9vTD9s`H3ko;s_(D*9JcfH7oi z8gpgGR$v7lk<>_k09*)7C+;z(#PK>iqHjGxVoLYJvMwhXAlyuXM=-Qg)etq9nsTye z92cp)vq+36^!;L}k#iJ2c%c4hb$SVymFNuBc)DALKNX7zADIDV8T)u$=U2Y} zpZM6#`t@J=P0zj<$ASB}GkMC2B>i5p-$;Yb$MJ@}keNHiT!BI*S0`WBAPS8$x!!(sN!|Cvljz^>_XR4&or6kH@?{I$wh$tz^yQxyegwv5~ zA{3e%hqGtXww)re>rG)?qdEf;<{A{GV|(yUm2AmXPS%=~UPYkC;LpJqDbczgTg2qTKnda0`aKS+Ec zuA$Pa z2+|bdj2J6tTUd$}$pKJE))Ug1jR6u5RCSgY`6}GXOwp3>*Dtf$qbL))fxShD#%S4O zr@eTz-)N?6rXw>OD0Gn*MJi>$ZS5yX-4YZ@(m_KvbqGuiR5%TtaFG&;+U<%hccDB13{?h z&{{Xm9Z(%V9~DAcGByxiOlc+w!oD1gB)~OjffHrkoB)<@#L<0aHJbC7WJd|N(_RNf z<}jyhKa(ZNi%u4PQOWV6D$1$U3)zwy+RqwFyb5{BsMa)WVsc+fB8ys_l=Lz9kjHtw zpU-#CuOG)F^!hrDWjqcurQ^eSy;F~F32f)D^6lB2tx2#bXs z89-892KF%PNQ)`}RHyBEMgpdMFe;=Mqec%}@7dJGS?VYnxd)tqAXJp}fCy|fQALiE z?_V(%ltP2_(UJ#v5RqH3QfL@OZ`rN(+~?ay%fT*?_6DM6ul0~jFePdL5&eNQ(1@8@ zbRLm{%WP{;B96vW@8o)CNLMA6$x+p9ie?ocu#{4Tc__t?9IdnBT-QqOv(TryU;)*e zh^Si1kIrSS%m*@H2M0 zSfBay#TFftDj)9+mpV|S*=UrCUJPx<6!gZGaHLJwx>(Rg&=_?Mou;*Li{)D#gtZJ( ztkRo!wEQLYBk?$~z1s%;q*9?+9W_nXC#M2Hj17e}70gox1)+$O?Zo=a)=>s;D))r- z9-?Y$1{RG*B{g-pJsKhDAMBV5U0|%8GcfOgG_li3lwlF{rh|J;ABJ#qrE!LID1o~R z5g&E-LwCB57himtBj!zn$y#|vuhgOQ9^%;pq`L(LF*2j(q1~)^-|7~kQY(UL=Sok! z(dNi@+_v%dI|NFV=7XM9aG9U*wkoRi*PN& zVzGy?sGB9k8!;~Knd_a(=qYg8AO}h0Tz~Q{f7q!5gb27Ew=|GZ-AY4UmRiGUkivmH zMAZ&tJ&+oDy*j%KlHMF{lm1sC8+b-C#_c5n0+GLI&28#_QT9PjieE6T1E<_!4&sj2 z37M!P2~+EwJnIl=8sT=@yQ*}U8;fc%G@ICqda=oshJE)wB}g&{<1D)@q2~HCjKN!@ zh{?jly>icC(RU=N4>cTdiu)D8i(&CsPaq%)vTFCk@S`w>T8AhRZJNO>sIeqHbx{|( z&K(I5ONyI}U>2J?@@H`7V|=w!VNo=yo`X>M)9 zOzOvlo=g=6kKj)v{bvaE`_Y8FM=6p5ZNm{4L(YT`iPxvp1$7~LfB5w99YBMeKVY{& zZ52rKtX{WP3Q|dZzDQ3I&^j4#UQ_i1cEH|$BY^000AR6rR@WEkvwkL5PTz zg_(J4byWL7r4&^mCf^s+CtF;)93^*|6jd3qaLP0HP2US3h|If&Kj+5ur8qc2qFg zTj%flozo#6fmEiF zbmo-UsQL##(3_s5ipZY5dmjHoj|YGozq$FXBP+sWEU@7MVy8z(5C=Z>>{IT&dm#XA z;-L=bKkxi^{P8F{fa$*-r(&i1+X^5gaHG8QLJyLYalfX&u<;{U@Ke)5ZGa zMHk#*u+*X34j;JUnu|aCk01Harw<;y#SqV}abunDE4<5L12Rpcr0Y?r)*7*uvVZ@* z&N}DJ{U_i1^fOM~cfy`C9x^jWU3B3;9=h%D7r%Jb6<@geq6;roMj15oRH$>bP!ZjNMCe~%d*`}}9W0s*O%?p%+qK{AATvZra>nI)MuRku|g3lp*)@OS|N zmm?N)$}u1k)}TKpC50I`ye*!+Cvn4q1Jj%0+HMKCl;{w^ju#Z3A2h{|l|#`Qu`&P{ zdaYOyENIeWL#(sPEd4y=CnW4_F|u{s4-E`93rfQ%Dut3KKVaRnfFPBlq^X@CLSvq$ z^?KYA;aV2Mu#7w?W;^ajE}2Rh6VS#!$4f7dlIauu&W>mA3h7QiP2)JO?A%PlVptY+ z$~j*IvjE(;IZOeOb|x?tZYV1lx|2Ju2l^-s5=c-oc`!NZiDu;EZv4L87b~};(?|Tm zlVPxr0cu%*F<^U`SW3Mvd5&p?dJhSpM0DzvQBc%+ zq;+@2#4xERe6lHEdkV5E+NP^C?yAA>YjSV|d68FEx>+>XEvtAcu) zl_qdYI#BXldPFFa39M&4+>%3R{!)D-4F2|C5LlKylhMG^C>uW4{LUScu7-mNDg(G zfpQK07A?*mI@xCz2;EN&2pyv>njg@6*h$VR!W1z+b7Ws{y?HZ;lPhdi-Hm=PzRBhfa5jcT_b-CO#j$7+#Rm^>jg{r2+ zGV@~CFs-;{pA=u+%3`sbsIJzVJgyeQMrbk{H$-xa{x*)WA7+#8)QOXZJF+>CLo}IL z5K9?sTJd##rh+&6R|+}cbkY-U)T6>TmZQV8iP=$$2YU9sTX4|YGLiG$smMZIGIc_tpn;eN6d z0Du?2>ZOZCJ+zwM^FOY!xg-OU2Je{UBDGspmoE=K`R@1Ly<~y6|M5HD|5xuPqG_C% z8=}l+2tFTALq$?jDuk`cZ5qrB0);BL&KB!XVG%KZfg!r@efNJmNA`Uu>^zuC{JdYop$O=RQ+fBQ(L2_wCzz{ttiu6Tbg@w^c;j{+#pJ zM*zSRf8cRin0@FUKKYhEeb-lRyhU5WBaiwiwJZpW&N`-PL~P_r1V4MTb`$sP+x4_( zJn7sge)s7QIrTW7`{;8X4glvq@w)-w&}~OP`r*&K{Vf;VeABJ^-uvsF!==STA#wl7 z_kQK8U-Ib3JRH6gfAm9{g%EcV)ZNKHS6_MEP?xcVckQyYerDHUm%?5pkj7NYpfe&# zPIo7+_9Ld1?6syxUR449sAB0ZbB9C3``p#Z=H};M$Lo8p{m>lPY8V;jQU>axM{8fLet`g3ZC z>Nu{ZY2CP$QkRQe0SvSwmmhpBIukAN%-?sdQHz*oP{_hPa!Jo2i#M+@f~UT!T5>TA zi&__H{js1D*G(k0TMtvCFuB-6WrS{nrQpMfaG7DLQQhS1k7&>ZRQITAqi`Pz>krAD>kjj} z#;05U8=2`MoejkwKlY^BIAxabz~JpdA!AGts}{N_pz)*xYz>{OWr$OjgPxTx#p*~d zWuT;~15bgoD$FvDO6pjm$C)TzHBK;!`6kOFM(9EET0Q}g>-QY3NkIXD02I4dilP7j z*%lw7w;Qtj#RZ_cnVTcg9|@zufuvqo$d+uqu}aG$V|&sxGeApr8qMUuLX?B8StQXq z`|#B?>XZ-1IlV2@&mA6=gQGkM*qJekSSBgt=NTi#$b3?2Nr|RE&wbbq|4h~go7WP~ zP<7$C7bE96t``v_q)TQAmsU6XD=H$S>M5tz?V`LQb$&hG9>JeJ! ziWIEcxl!O0L8G#EHnVPyrB-MC7e6PnE=>rdwlH+Ec*15l%hl| z7J|}2S6DiL9{V6#zbknjlUundvk5Fn9gG$dTaq@8P@o@RL=do29j7${)-tp4;YxZkPwf9Rtg1^@?c_~#%v z>3)a+4Cen}1|mDn=R{q6<;U%BCy#{Bv>zrHnAQ5(SRvSq!~BrNZE(_dWj$xB=z zEq!=~mS)Y|1Xw*tU;*R^Q2cf%qLCi`nD2t`(4UvR{Q3J&zSkRm<4u8Csl(vOq&!Y* z(EKthmI@)>?QVB@+B2T?+~=RaZ{ME()xzwVKl@R**_56#z~+Vc*lvf6|Y?;Qzzt?s@t%pY-%+KIv_5x!`SYx!~}j zBT5TU1g#YXfC5aVoN>kjU;jI=`Ct8ro&H>M(Pd#1+P!DbxA|=k9Jprk>}mjFFzkhe zQ1#OQsFp^%XtP<43-&CA(eu<2=(fk2VEBL&?5o4ylWY}Ij7ISK;;<8gg%mN=-+yKn zlv;<>#pDD&>ZY1L&vDJ$OlRW-Skn8kphRW`p!8rju_arZ>v0%OW|uF0wY8jTxT~unJ;xb@6b6bj(u<9rr+$`4OBJ>=ppruEYk!3rC zY*Kf-sg2s;K%`RZP#3i<5D8|P*Lb_=_eAjSm?FNqZ=WYO?(OrZ=NE0PZi_11%z*J$XkH};m zy%3-G#}K4LUSf&%A43>gXsgtlgoJY)1wq=FWB%t#2S`i@khBe>qY0g7<-!sXqEhQn zs2Gf)O(FH1+Ng)WT87|>CtQ9XJ*r_6=K)6mMI0s3Q{}O`&W!+BgH5AWuw}#poPAhL zsorA@6pD>|pr6b8`#YCpYGIFdHf1p-YHQGwbhEFhtJTPJ4s58N0;#pSu((y|q4$xO z+NVrxW=K0o#^5n6hRS&4p53J|QU5Z{w8$uk7$o}hZ%?f?a?wr&HrVB^5s1Z(v&o*^ zR>~N;eEn6ovzTPFU-m|J6g%X}wcCE3KoT#Q|E3UM)77@!EE-)f9R^~TQwAchL&~H7 zC4x{LOb>|2P2XiIr7(}vYHDM6vxy=O2nD2+TI*u9J{pGysso5jZDMKbiHEun62cOc zQ6~h@VzFzSR^zlHB0X}f#;sZhl!>?`nuSEHNLD!e@!kG8d$iO_T?#arkSWwRjVE2V z4FKcH|DG~yY0A1G61#+6$9#l+*w}LwoZae5HiHUO=KOi3OBv3puhE>V{vu$$r&JlO^b?~L!`OY9<_IEUhySzMKJ(BYNfb4l-BP%@LD3rRKH5MJ`?pDhGm zziqtmi#I1E4gf3RznhWlm_#Tb-}8`@@3JvWjoHfTu7;bfbf!E ze9_N+>QZmM^kCp1jztLbsDt|{rz~!(j zQteu6BGU_g@<*TlFMnhwhTfh0^MarJvB!S*S-<(~fB41AuhdSC^h-()0F;Q^!!UX4>s z-l0Bm#t^*w_`*A~nWCFDCk{8)cDpvzZK4i=Vy7G*;3+hKh=qoP3+uW7mc)RG&RVub zO1D3<=z*A{fnxGmKf9w3<(MZA<@0h;tXtj*5LmoQG<^#KF|={LwVt*>pq9Y}brjPF z!#cGo3RnN3UG3rM7F8bJf=N7_}76^4|56hC1G zpV&k}Op9P`_ym^pu96e$EUl)OSsWlKCtk3alN1H}bQI^g+lg~dJ@v&#m(+25>6jgn zeaVl6ofFVKo+>U%JOGU1+^0j<(O=X>k9B6&&MOfq;-7$OT|k5!=%gqkL#%y17~(SV z5A3)}0h^W?i&j!frgYK+`QXKX7UX%;<`IW@u&u}8&OOIS;Ve!q(wt@-Fpf0dsMwPX z0C0YVlc~dS%t#fp{>^13*6L<)@@?^^EA{;1naC=SiR@!AOR`i*7HY)nW;-v$gO>lot%_zqAkL9q_%@_Hxq(~!Pt)4L zsy1vyB4GxCLPhBd>v83y16m9l%&oO?n$|?M45jqd+h8O>Qp;j0tF6`1iO0pTR6K7f zLqK1|4W%KUMTF*LXLgv4crtj{-5X3cdSz}h>1NH$ZCWeBRNoZU(O_3T_tY$hMYS9o zX!Vu2E6ngYB?bgqNs6-zeeP5=UKS9zDJ=||^hRgZ`f@nL zY|?5~XlB%J!wtJJp0yw2_DBi4X|6-UeX179W}z2Wk2h`zz}V8rmSX!@3`-PHfMME7 zT=xN3N-b0r_iC8ILe}d8yPi`U(dp1Z0O}!xj_I<{D*NBbF}e`w!bn32CSIoqLexrk z3~8{atmcMP%_s6Y8-qTD?$-5ECCXMu!KB{x_nr5I6HmT3098&)}b>Cfo z^*_GiJ2kvI{UHzho&W3Kzvh*{e)(lrXug|e(fBK%Y!;%jckk}kz5X?i{q9G7r#|;L zfA?2@F;251OPYQcyK*#s;KFV<7xu$%%2->{L0wY{(c!# z!8|n3`*X}}^*4o2smGWk1$|foXx^`#rFmL&$XbwQosO; zwDiOD(Y(i=2vR|DgK|2cIPSSiHu70bI&D%2kyTM3_DCg9N9R^)Iv3730ReFq$D^T* zZV02{>Tok~v6-yL&GmXq(I!J(=q@Pf+gks-HC-i&1Nu6a*U7CBcBv;7mWk)0Vmluo zGPl)wv$au&2}50~N<@kEE@-q>P@8G$ee&Bz*}W4iZKF}UF*IZ;wJQ=Fc?!P$GvF6Fgou+Ti1m0`K_@qcv>fwLR4z0A{NOV z(YNEY)*-VdGFc)JBsX@*{vC7~O8N-ljfmdxF{*Gd3RDIIi+gfq(Vw~r6Ob6FE=>Q; zXLf-yH)x9fkl_O8cyx~tuu)StOJa}c?Ri<@p^{GQ^^*z+^in5AxLwF9o>@aZG!^n} zybD-##>G+4;(R2FDZ$eM7<*!)8zI0TOg^0HLw^f2OXr~!qGbPQ$48IU1j$NFKp`bU z`PmC*B67|U1&$CN1S%zxiTfLBCA2A&JKGb%iKBkhDaC)^^cG_BeSxV4Z9di`RzqDT z9>B=c%#Wn*K{aA(m>JhP5aD{@mi(RD*5Zot=tfd8QV4?MTYdvitk~A(V%rlj#Y@Zj1l(<H8{u|U0!E93 zg~yIXNsY4r!TZpg5ChW4pqpKrV*1yWUH||_ISxEvv^7&$5v{UHAi>G-g!zAi$WEKEOmzJQcf^Oau-`9*#-6xRK-~l zh7}M)en84;L_zim5qeu$k=+ui@jgo0xj<^Ig-jMOBUT9l{v7?bNJ{alE;?8yt@hBp zQ%*aT5Du-TFWvCXZ7X6%5hb$%BEaL%yiX-Oa%AhGk6rZg*Z!;k9JuLQm)~%!)qUQB z_V%ZEcq8sP^ZqC8Ui{$sPki^EyleBwmM5P;!mqK2aBEt{b|TqK_=_iiMsu6*0K=as+olAn9oe_(FYv>vCm4ldDx zGm3zme#WW4_g`Ok!U_Anv!DC(uX@qX|Et$I{M1~V=RN)0Z_^`m3{l(_Up7|*;C;S5 z=NJHd`RcFiTJ8BzqO^S zCyy)%Sm#xYJl(>?jF1C%0T615Y+rF;6b0NfP^!Yx7uf)-xZ4U$u^`j59>*06+tjF3 zAESA}1}dO6kVBk}W@+N?fbuDO{BjZ*?IKcX006x}Lcfil=eAmHHl7f%)`i-Q$N;il zFc=5IJ@Pu0iZC>XRd`fxgs5^9wCb;jiGBPPBV+^x7*Lo?se;7~E!|UseqT)Kgu&%g z1B^uGCTh^C*GujPBJ8+&)M|r_(`ER1!z%?!3v~P_9a$L)AGW4!w557JSnOhU6mB?= z+n%{GdP#{^Jo`PPSw4)Jl6zCwJN1^PD&W3kktn}=4 zY-lg_ViFY0Y+Xvxz~N%_M~Nbb1VhWqPWA(T^36VA@*ekGB_L14)PP7MEc)77W?ctP zdEpaSW`If-(=tP2?8tMS?Jck*h6-SIy*jgvp_4W($yV+nk8fL^axn6Knk=| z%N8L~p{Y&6EQ*P9Ot!$3e3%(`F{j{UKyAEwX{@blLsv5STBo&itlorV@SF7Hu!r+H z63O!!L&8u+ADwergR9f50-s zY%P%*fZOLdC^DEzAPZj4-VTQaWpJ7&klJOVum@#e$mw zQpU6{DEbk$9G2b4R+UWR^}v_UdEKC-&s4&)ngdE{9=i|S)`FDu_xMK0x*tN z8Vz-^F)V`)b8lenlSg1cDK?>l<+X{|o$h>EB=A$~6+M5^pkLwEI*fHdg%(cAW(cL5!k zqbnXENum)Ln;|)R&CUdr@o&m@L-F0ta1N|NIx%Am8TS0-XUQ9yfDtzZ0Mw)JPz_3R z9W=e36_zR)6-2arTaU)_>FDgJiiu5GdU2t)U*eZ z`FRd|kSu_;>f9R{%>}(aO0ss4S3gGRgfQ%4rmQo1Slqo%^=Lfhp-r9%+5^!i9y8&v z)n?t15*;^jBZfel$)IUgIULi`F#*pV!H!JmPA33jVPOS9StCPnm(CEDzFtw8Rfpan zNUj+5-bf3LKL6HL+7qY4658E`a-y3cwx8I|5x_i#lQ55_Sb18K_4goR3Pv=Mbt zs!G$zxSFoI@`novhPt7qeCAq9P2)d3i~(X<47-@8^|&IUS_Z|m4#QGOHmyyI#V!GL zkdp;p2mr`XmxwfutEr8v)lnIC6|dr44<;U2i6M*C$3%k%2vB+UkjOXCon-w5P~nyi zRLLzyh($AxEf>g+@=olufJcn34Twk3qQQ*9-guhYXHHgo0uc zsn()B5%Y#oE!1Biu`y8))ddN4kmc<*yS$ygXfJ}Uic_XdxHQ~$a>X;o5rF`?N4B_{ zktYxUhRLT!Aa0dJ6o8H89z*;nDNidqk$z#rVhv+yej(-uTts z`*z>$Zg&BIi@tPg2ye_J#4c#Ej*1YVFbK)jU;F1roOHK`KK!(YpMB;RFa4q^#XGFl ztk;O9G!<^*J2*KT_ra$>;Fy=`^Ot<#U2lJ%xNTrPZXMaYZQq`|sr~)kZ~wbTp8b$l zyy`{!Prmm~7y40;e%N2V`+bNs)P?K+=`MHK``iEJSC20|d(Yo|@X!D3uWz{iMnqf; z8$<;F|DXT%u9NoP`=?*_obP+$V~_K9fBc2dc*on`qr8M+SW+p|v~ErI?%REb)zN$Y z=7aD2^Y`9#@Ta#Mp(BL4#`!4t}*sjn7PP8_y$5rGS?Hcx|ueakmt-@%{y}VW}sQbs@5E#-R z7Y}M}Py$9ICNn5lie{Lu*IVPX0)SFVEyH411~Xb`dY#SeMr{#R%Qyj*5+Lv17wo80 z;W+YGP%jqGj!TIq%-VjY7_DhcmXAt8tw((VL#dlML;iv@g}p2(-SOisf@mir7D~B_ z5PPe1W-TP$GNe3HA|$Li5-0wFAWqbn%n}ebSuF^$=Kz8;zM{-Ruo5-In%(lwMo0Y+O<;Aro)P)Pz7N{R#GWLU0~uBbyAu0&6EPHr+SY_>d2Eq z#SdF{R*6S3{&!7rvGboAiXiY3T`>h2?BUk5F7v^H0O;KO@C~YSLvNjTn!(fF%G~!K z`Ad*kDgNRk&PAPFO#~Ux72w-g)VL9mXHVI3prc4aY_>LHG|}C?GzCNiJFmdkSj%5F z<*?!$6foGq^%e^w$=DE#HJMM-bdpREsy}livVcs}Bp`zh7>#a^-Y+J%cJw|{Fha;9 z;K3Y4c1*Ti)lvjag=N%fuo*&c%)7={INo2GHSK3YmOz;_D1&=itV z$~djK@i?uJ^qCD-$)BXq{0g)ydM1(v7YXh!FUKn48O2J5XOsSaq?kmEs zxLmWkTTgmws{Tc8%HxyXV(UN`PYoR)hdcKM4JLB{_H)s^c(4qp6s`biHqET^zc$px zG_4vNj15p&xJ?st(}H~W#$GjLAs|8lU`@kOZzUj(!Hp2-SdQ9wVe5w@A|-Beh|A>-WWmCGgJ*W=Ir+)o_yGJWjB zpS}FDtKwLpe#GTsx2eMsZ@%f)Pk!RFKlqf#FPDpBeuq;Zc>h29lfM?>aa=dGNdUa= zH-7PyQ}4U8gzTEv{^D=E=YkJy9$D2g0FsL3bX_}q= zaX$C@YY$$3-9c^B{=k#}#W8=#cfI3%pZxe|^){ALjkBlTXre;3)`fj8v*$LNc0e0o ztu+>AX^or3%oEj8fAl#|IcBl?iH~0N#mla7d@N;Q>--=vTNI@CUrC$6vG;M{TiYk~VtxBU1&l*&rbF*aqFWdG2_zdTVNNbi{Z!kwDPj;(y(b*mJ}Mm! z|0{F_zuEdzbz~Y0(ByT!Up+=WAYw=^4TnB+v%_3TXLAFg=0%yA*W=b|wb{50b+KIT z9)^w7T(l!FGpla|kt<`30lV%eyhmBen zhSunaZJ(#P!_$Waq_QILgTA8txZ{%06(gBJ=o;yC@e_5L{4i0KMWI0-rD!~WdE~Ua z79~9)O0v1fw9Q5VW(mL~Y68fi9F7>0Z1U}$HjE)W_Aob4BV{cblZw5+;3o;hl7I^# zX!Q6$XIBu?Jn3uhG)3y6n=udS&p*as)5!-euI_3|F-W~EJ;iePgN@FXX2(_Ouhi+=amYa`G3U_N4ZAKX+;gHEiZ)zzozr7+9&nnxsS|DhCvmue=S;$)J{)!RA{5w+w%_9)D36p$xBhBc1| z$*Y>k+@exvNyG z5-H+$5ep=7J^Sym<_#Fq!|HhNYx{E>C-U5}_EQ z*0QK|C^XcvC}pU1C}mI}r|D^}R@F=G+YJ?+kQb^%r4-Ewu7zr$s!QlFECFB`mVh`6 z%jI(S#$wlE*jNl3%f-fG*cgUoEkmsfzpz7po%Ps5q;Ozoi5X0yag)~APk$+?HOK`0 zJeKg^#mZxqj`vgF>_20Rx&8lFZI}ABNQ~X^g{PpT2(nCltnS@%AYDjR`S0HO-XD9> zkDh$jjg#)V_vWu1mfm=Uo=y!|D?aGN69C|IpStu3Pk+L$U5i!Y4}Si7ox-b60vZ7M zAeAj$#u+2Fz+7_Otxr5{|2^)0muJ4<{0rXt9`8l5K9q>4bmmBTi=K)qBOmqXhwgOZ z|I$_0by+#U)W%vD7uejz_uXx?zLr2J4M}^Q_nvn8DaV=ToOZ^kAOFZ_wf(6# z_q?Z{s{u+oeeN&+!f)Jm+o9Gbk8k5B ztvPB7)9TC{!!hZmrjwfH>6UVzCTsPzGQ)WsZCJowV-A=r$BKy^tHj zSXle4Iyw$(tT3;}P0edY#9HcNu|ZU+XQG3N|J;3V?dPuWsU{2bUM73=Q?%%;(P*-< z0)A)i(EOwwj@xA(!U1^D>t(9Z5ey)Bl?iVYJk8} zu{58LsnjZ*NXE2{BEbM2ZE8IE6=7W#R3l&$p@`kF!Jvr%H5w>RnD+i!H#(`-O<$Tz zJBA2(jD(_ux9Nip$2ZRya_CgyZGv8#7?+5<2tEW@)h_O|#O@(P=r8~u)aU<~ zb%6~&pQ!5WhB^yEMKyA8AK3Oj2|^02*H^w!iCqnB)KFA((=TQ+>~Xfd^bnH(7l4q3f)Cx=U#XL_(B;h|;*$1u{+3TIV08RYM>lpC;ij zEEQ0ugd5ZD77{Acv>wMTsf%G)(mWS|uwX$#8mE=0Rmh{gV3rJl*{N@4uqg2Q7Zhd& z5seF1$%gZ0K(!e9j$?OXaYS%sOHYdAj-)2s=HLrYqgL83k_Vd^W}fv7Vp;n4>fG9- zFR<}QwfC;X@Ui8Z-=-Es2s6rss|*Nad&@V!p}9NkHaR5f1C0FFlU6(i^-X(EIae@V zsG?cP8HW?()KUOJg;bHa1yM*KfWUIGk&@GAFqANE#DOFcFD$9G(_Anlsa7&Y;pd$S z#N$I6RLN(`lo|9>W=1p*rH+YSxZ84XyDOxH5%DAM{qU2X@dJ0i#|e)+^Q6E0$d>?s zjm8m)5Xc}uboMD518#1OfBzSM|I2T9wE$dw^P$zqLA&$#T6dfP0^Kx8vML7EUh?+B?(P!PW%;lEzKVMSwt1k_lcdlAJWkk^9abmD=U+ zehP_n8p-H|oCl)T^7!Y7pL5HTAR?9$YhT0&P?tV&4p#SZ5IMO{GS^YBXZKnt{RW`5 z5xE<*!qGktCFtntB)>{}Eb-Hoix1ta?N)DhAq&XXYI7P_0#NI)7#_z0d!*( z7KcB_Eg~jUG0|_awEJL;cG-{BEt>hg9*<7bsK1E9@q+IX$)}L&5D^w2pQk~tmKA%T zS_97j?HDYZvs3LlIx!E)+*!eH3PNu;MaAC4T2!b$855VYu{})l3G=RH_$GbG$z?>QXBT z`d!EtrcTn1e<3~aXC}Fc5dqJno@z13Dq(*QWNQGdr;7CK5ws3-IPsO^v_57|O< z-Fks4LRg(|)}>nv+k60a_nVPCBzukgk+#W?N+|uO1&^Nwj*v6&yKh5;^?*Js%neD` zF%n^-MJaV0SFKH9oI?yJX8`~$f!5;|GY`YkX)dLdI!)s^t{P7pi#?^(zH9sKuXWMd z7->T}u@^P>tP?>(d*li1fO(iHA|exb=(AoHT|k;l%p4jwwH2{&Vq6M}f?>PZLKnrOVRM5&=Cb0g*70u0&=bRwBnxL~m~03renSOD1Nei9K`c}DD!rU`~9N-Yg4BN7aiod^IDn>>w2)&M?Q#%<2P4Os6 zdqR<;kTa~P46a6whaurcX5yf7EgeR6l`vb>U2E+VAN}l3K!V=QLU`)=PdxcPJJw^r_4+^h z<~P4p>rjV1XW3xyB66dCJose;lLK8-C-z zZ5~~V67#8SEO)Qgo5ZET7=BqrIW=xK-gxl971!*J%l8{sl`U#I41{0k|G6juTPj&q^+?X5Q7eK4}d{a;_Rhs=xTLTRilIU z7qbc8B^lgW5OvJi5287J%?OtZ~tQCs$jS&U7=VJ!S!h2#yd*8Ot=^@Jd4t9eq93wR|p(krX#4dv?Rcx@6 zx;&Bm6Z3~{cM6j+Eb(}<*3=Ved_*49U{~ug5$SG6L_G<_SPML#epp8!)RE%zKK%vQ zWkUL8>A#xizN0}BuPx>t$-QQ2U{D6Mj)O$xu?Ra22~=R_%?lFY#zLjK2fCFy)UpVM ztfcA=KoH8zcjwnnM2J$G7R7x&fl+~Kqzyoe3HHNVa6VAUNxkfFovvggqi2h!e2-ak z+XzY){TJRL40;E{ocxe8<(-%>5iHx0>!OU0K1}_pYtv59qK`-WVS%+blLp+sRIZhO4i<&STm@T|h%!=vx=*>0u&2;;Bu?D3C;2vl`&Mr=7dg zmwom#pTGFRO95~kIUt7K;}jKxD#xSZ0*2){t*`jPRXY_(o}6Pbc29lA6LVgtA9^;ua_0icJp(KvhYuazi3$Fjzw;{xuDIs#p~Gn> z#yN-<5a6mSue<5sS3maQ&m2B{l%-LRZMEMpCt#km|DHSC$7{VMt)QV?lSq&^XFGIn zu1Htv6K1Bi7C&jikm9;+^Xt+U3|WOF|9j{4Syx5{M5OJLnB#*7g!}s5dlUXjYVs+} z!Y)ie5~*XVR1C;+FzXQ2WRH|-LXliFf9t4#Q4s(DAOJ~3K~z-N1ci;1)jh ze9&y%v@}A1VOS~s)VAdVse{!vs5s+J|Gt<_-~&<%H&0KN?A!)rpd(bC!{SNlTM@fZV%IEJUT3!QIM<*u%2y zFdC(A%vN=0?SYj>6)zs@&Y^M(5MQ(~k~$@i4(u8CZ{OvD4n*$92yLB)N?F5Iq zETzOP2ec zfM=T4%jND`7PE~Wv6Rvn6z~x8SDh)S#otyfUuQIY!W)j>l@nBubfKcxtrio?R_%j8 z$KJ3~K!m5p!feH`JE=S{H~AawO>a{hV@P5SpPn3JC|Xwmqs!F0|0H>_jL-(D4TR~; zAvxRH76DTQi(P+|V73@jBvE)=(5}BxYhxIIqnVr6Vb2gAJ$XVp-^f5Bv)M`1^GKz? z@7S@S&~^UkTnaXbB`^zaM+!;26qq_+B`S75T+NOpsS)1?c$m#{+sIsq0Czk?s^kTO zKqz-bGk5!Lr;Ux3dEP{NBHP!!N(#wWSV$62hJZj3RRM@R4`E z=^Zcm#g`(&O}DMCxc(c6%60`oU@^myg|u_c^_Fk!e2X2I z2C!$(uG3E6@pCWu%lCu&;Y`5Pm@K4al2M-lH7x2)FQtCr9dgt5T_x3-#prj72mq{hIubm6s>ouykP}Oz74?O_4Q{g8|o&*WR zw(U?D`&#Cbo^H8_byHs}0+Nz-%+NJaBAk`+kimBxDd4fJ>*|C;2p)ze?uRzAlew04 zdJ*hz+wPR`CZf(=MXBm;f!Vs^f6;@(yAr_S2t+3y=<;nzC$vtJ=tSu_QnzVqbyUOJ z7j>!1^_+Mk4zso#2_;yhU>vlVnil!o)YU<5%@NbFL~S6#<9a<#E6w77T8Fw=3>!TY z7iV&Z?p@KeH9G_KNc#vO(I3Hm^U+}v!qS;m%;2*@LgJqMh(0z#?f zw36N!>!|TiZ|admPt!#p0^oh%7i9A=F55VzshTK?Fq?v9WoF(@AqRtm1u5vR{kG=q zjerD9hR}CDh^VMkb|k{&wwRY~)z|H$Df)XgZ%mNpKRdJT)Nt(P;NHcD z*{g)nE{)+#7j+cUCziTWqMwGd+!VTy(&4!v(mXR>!4IbPoJ&Mcq>GZ+axbDsh zJ-Q?$ItET!tY(3rx{;Z7z~ji$4BWjo^EbK|VBtziAZSRa#=?a!i)(eDqH(hEd-V1N7rNJo_5=3mRg=|$nr*Q#cMh1j9!5b4^ zn1X2uD8l17%^yO}WK@T;k`D?gfx;lCaYwwQ9cLwG%MzJ9I!n<^Ir1ZN`VQG6Br-8=qZlUJ}9apV%yB%frfN0oKp-`eP+I2PMJI38328tSsOahk?LCfGqh zMY*(T+}b)i)T!1*Nn{rQeMM<%>((Zp$)j5&TJ_ZukaDgxq)?+mwGd2gR5OwW4(ac% zlMMlBO+4$*=jw<;*ro|wk7~Fwz5a+Ll>D=(RGZAo5Uq@~lXiX=JUj9>+XCT*bTyyRrrn8DDZp0Hrr9q!UhS zx!r%=u|P5qaLNfmL@LFPVxH1~qDw6h=GmF|6+B|V*Thojyyu?3d+%47AGgS) zq!V^e3*PwU8*cu}&3jMS0{{nZ_-9r!J2DGt-NT@+b7Tb4riO0!EYUt-0b#4wFZ;?j z9(U@!_Md#OCqL`S|L|8I3h9Ufl*BuN>;)Ep?A^P2?+&=_BS$uMI6F?OS{Jnrby)hM zq+VW}+N39sd!Kmsov!tfBb$2kIqT66+v#f#9Xj&aPk&+0p1ZEso8!1@+-hB@<)xGg zgv{osD0PTSfAW1!+UXnKeDkf*l77^qcjVn2y6x~sKk}KWjrxLxh)5IVdxJ+05L8&2 z2=C;!QajVsCOuia_isOR{ttiuX*-Gl@9dww`}Vx}XP$l1N%#7L-+OBqh|`VrDkFQirCBP3o{S2~<7I5*C0o;C7QQ5n5=v4XjlGI_t$t>h(&uQzIhT zg%wIpgMjs+kCvhp%8spP+t{RsG$neZgoVRXp&}_L6m$U^_e)n|B&F0BNgxX5UPJ0( z%lg*c;%^!%Bvgf6Hr#uvy-aOfja#j)0cg40tyHMU6e0>?Lu+mbK`LtZoE?9?#|#lC z+pPz{Y+X ze>QhMlEc(>#ULut;FE0`G9K3CvrTgpMC=J_-n#8@dB`uFOywY1@i=#@jicGb4Ba)c zJ+TzJmG>jk-ee^N?1FF8On%li0*eyll2x5vd?0 z1Dfr`)2Z3QMtO+269=vx%P=I@AEtDw==5t}1G;3z_RzqKd0wh6j0j$^)t>uo%#Y&a z01PuQ5)sVbTu%$Z_|D+D?m5mAlL5*46ge))l_yj{pSm7p29ay*Vp4S}77n@rB)nr6 zREvnF#{!2fCuV3~!=sS>n2{UnqG)5{lmep0eFTK2PC@|X{zHg)M0o|l%Q0C;DR8?2 z$)q%rN_|xkTO~y3efvAkrT6ii{l~PRtWwERA zG*0WWt(S}48da3WYr3JpdfW=5nsz7CGKk5}DM=pMyOX*I7y_FF0h%=LfohM20urqZ zBh9~pltJu!Z2uYDtK35xOBuY8Bm&&p)VN6-#W+$m6h?rvJX!lzHjrSn13APjv}>E$ zmOk}j_ka;@p^;G8Gdt#|6jNHp^p8alnz|+RpikKch!m(hbfw(Aq)R_bt&rnX24 zv>Rbsb`=2mK5gaFcj$i_V^q7O9tG)ikE$;BMXTZ3^oh10(%zjzjjp)jOGXhm=^i_M&DB?4 zM^qL_LtTvHdTV`TJ#Lj!m%|2gOQa_Oi?$>Y-bqvj05>1JHO}rQ?cecpuRQSOLX{R} zoYuOVs#3p?@&Ox9ji*`$Gp>Lf?{jbZ+Au81(f)t%J8ym6Z@u#PiBEU(&r_fAgs*<} z8}EL{2RfqE$Fh25cA6j^xZ=yv=eAVSloaN={9r&cG_XiP=tonRehDO|CWI1I`dZLc z6w-kWM8u+^?U)oBrZq6!aljH0R|hiyP@%v;xn5rZJUwmGq6Wm={LE~gdfVMR8B zBwXF0@3FRZDh{>f>_(9|CW?iCXhSXnbHKA|Oa&^*#-oglo~R4Zrx*g#r0-iT%{^=b zZhh>N>dfuRgwV-EU|)tY>un-q-%+&2;(~)P1EbZDDHF%@d_74Fx)DVnK^L?#FOY(s zw%P5_FHI7vaA)TEp;@03AA&I=6{_mk0R#nSN31&w7pkV0Ha5&Cj*Ao!@?e%|i@FCO zZfqRQ#WGUn<)&WV$hHS>`nskSgOufJDC$VG9Q+kKsN_&8L^m46_Sf-rg5g!OQ`sDQ zsE?L)b1hS-OGF6^+n_JzJRD}@Ipbjlrju<0M(u-}U=>!!8-xCzWaS2H%5zjHESv`8AoF&~u{tR_ zqoyX)IIRj6q@qtqOW$4%2#wo%+@hum6kr)apq8PvakV-+)nTX$^)fZJ5@69eRaSPi z)|eQ?hH?pn65*XF8Fazo-(y*m7hGB$-Ct*{BCOcV5cU3#F8!CmyKdWO3n15DeJ!X%t4$Rbh;Zo@o;MKiDE6uU^)XJm0_`fAZPBs8wlKR!_6Q3n-6=Vl;fcX(S$f)4}S!JogoMCnNMA8f;TE) zHsVguvM3eZ)kJoh4qbB52fpk)BU&ytN~!B{Ydvmlu8u5*jiD}` ze(Mu<5kfjnB+(bXaOG;fsSn?&58g3z>FTSlTP}C$TDBgyY~vJdHndU}YCN6VlyE(8 zoX@@H>Km%gxP%e$s;jPj?JvFIKmXRNz9Ti#v!46p_rLcOM~-aTei`05fk&S8ke&Y4 z<^S}hp)Qy?IPcj;Nl*-?XJ=pRE!S}U^<}NMPZHokY-kX<-h@htMANDPAQXwieE5zy zrWuIn^OMjf5e4znPvlrIL$_2epa;@dH2k zA*+*HHIXlf zqLNR2*g?kbz;TyCN~q=SY-rsAU3%TAkEY0{S}?0SU}h{rZ=Zk@wR0iK78DpC1L?wH? zg}II3`PYbmSmP`eTD~4Zn~VXSU+2UT&-_tjxxI#FrZp~N53$T{Hv8*>EKDBNkSo~k z?U|SB5W)7i4I$T8l3C|p+oq;+0OnT8pxqPwP`#UtN01poI9dH@@98ICXpr#3?iznC(XrW>DNQCVn^eAJyJOUBDG0g2kJay&ljdJz^n!8_eCA z&=(Nud@_4M`!{mHX~N@OsozgZe;bK=Pr9TbjMCIb7DgJJ<_l#EXf7r$0bFS z*(Emw1p=^Bf^=KdZy2IWkrKYx?z*JNfkZVnN6wov=zDdLnsZ^a>!Lnw_VENc;=-+= z-V-)+M|4HNk{)rUMmAe`vPX1L-7F9Hjv)=5%j=|Hm2()&!dp9;tHaQPncY^%q01yH zKlQ4gSq$~I&FQTlxRSg_Z!s@LOT6B|+<(vAKk~R!?t0gK-~0WK`|QUr{+=g1=0W$~ zchLb{PvVMQ!frSNU=T&8YT=^=Xw#rP5P&C~dB42_O%wnA|M3U5vRW^Y@`93bNsNK7F$0FhI;iFD9F{!{} z*jNn9&8;J=^=50+#&XXzt(*2C5JljTXFc>dH~5M#ekppf`}XbK@pBIyH3%ve!m7-i z)|w7N#%V+k8fWHO7p2fykAC=ZKKJS?ZwS+uKFL=dxbDTz`{nb_KliCmKlh}awRv|^ zYxlj6KkNPP{aA{}5miL&gd)88rmqpk@tU3Q6pUAsw7TIw#NsIx1CSx~JpGln?TT}6 z4kKXKV*Yw0XL2T>@t_>l+SyaL-=eZG)x690w)&44(6JuGp+8^u9Oo@0yacvzIc!q` z;;jUG%up%kxrL_1IYQDE?b@54nA>W7w6#|2uxq(DIE0g}fJrG~mk)c?UBXvp^svh9 zI&-2Y&08N@f6n!KJxwb;fDx5i78;vqGdV2o!orSQO-gaST76A-!CN?~OlIaPCSBLG z+DlPzrbMEkv3Jc)*B7PSbjXLKIkk*DVkn9qQ+3)Q+xI6(YA!Z>0`y#C5mlHZpe+F) zL;o3cQ0xg*2(xF2=T$m(e29|QF$NSc~bHAwx$%F+~1;zkbk zAp?h-Nxw;(+BTqYUVk*2(mP5q4@@YLer%7aHH>ZQIEtiI(UXSxGyuJhy?spr$LK?= zh7fSaVa>d1f^F$bzA74v!rL!l?~*j5o7YTuyn<+6K6Oi}B=`#SWEm|xogkVMWx6yG z0T9{4i{*BoCD}6>%()z;B-zk+=j$a@9Uv;SX{ZZGmFKpCa(nH#9SaYv^;Moqr@s4a zh$rAZCXsCsKAHXP2i6Q#Qqiovt^WJ6HI*79}?;za}eiaX?cW6n}al^qAD z_e8hF#Jd;B5jY+Q5v$@*Yy8Z@oY?WI2_#!5w>7^^XMve$Z^%#+B^2+#_Q_vxL9*yH z;0BIgs6f788NkVI6(eKAfZ6u*45qld=qNc($t4dwwW*Y0J+2VgMttIt=&k^-R70@m zxW9-WG!_)N!zW<}K@02V;pv+IOf>el+`=GLL1E|tEbkI`8>=i7et!=D+qT0tsh=w0Pw6ZUwT zMh~~KmWhtnN*Mq|1J|LzIIak>U^(Y8-?h_s`@}~t-aNWxM>qG%6XNF4)nC5j1Aq0- z52OSJ>Y0g|%5e6>{iKJy(Pk> z49i`+s|L=P5DW>ic-ByB6B;$nG*?K8h7KZ@neD|%SBYp<*}(IrwC-JxYfbLbuU#yb z!?4tw81^s;esq%7cb|g|583ju68TEf*pMPkLOj3!RJ-Yo4SB(=L;`{sk0KOU0B#6j*CB&guNhd+`uxm2L)aM zKx<>j+jJB`goO%WAvJu5=u{X1N?k?)=;9p~JJ6%+EUW-F_pOLs1oiZX$0t<5=*!5j_^Fc52V!mR zsd4Fyn|-$1u5;XMhjQDX!!4AymZ~dwTg@5Y@^-EC3?j;cs4TVWUr}=u47_@a$%c~9j-giN#Tvm4Uyf7+^n!nbhy-Dw39lSi?(XYLV^J4q|MKJ zwsbRg&4nOB@n6B4MoJ_Hz=FvR?stsx04Q-_1GNVPnE0sOavd?dW-TU(c2d5e>8APr{)BTe0xu=jlO+JE`v)AuZg zpZ=wny!*}Xe&NfXck*2~?tkJ5*WYqm13UZ@3nDOqLRx@;LA>=xW_c6*zK7ix0FG{M z{o#N9LsWs&tg%m)y}_nI(z(BYJZgtBq|#8;Gmb<~Xew*ykbmw4JN63qSKYRqReY6)49k z%=Ycut9TB=LQ;t8)Yg{TVJHGFSOI`anc9R%=bgVJsr>Voe9;+k48gc`vvu_1I^!!6 z&0YR+@kRf1@kRf5@Zc>ke(AH0`4Q%ECn79>Q2r-vZyvVmRn_;ewf4TB_nec2A;}>F zi6Ia|0w{#R)(ef{SBsEHegfQd`@B7?)uhl=+u-E;ZoC8`4UJyghJ3P<*?7fEX_wxm{DdWQ)arf`z z$3J%MVu`Q#r&zd4L=<^4fYzx98O7m4{DJ_eoNLGkS0iFBvghp?3uAzx?IO?yhg38# z!3PZ!(w+)|1P4#d5%7^bBxxQQrvW7inUG)#9FUEXrqC`N>eQIQc`HJ=3X%lgs>3Ly?RkLXkAG$g0w}#OU6oRK+l?=WV-z zsZMoO%gPQ08*ihGHI58)xnDlkxVk|Lhah+eVm#S4a2h?j!^j8@r&$SP_gl8kZU3=g~MW8v8w$D=!F+&)(8dB$7hmJSeXgRz4gPW z5DaBk!2z1rUjPbCq2d!+sD?(0msYpN@GXc0G#ou5JycWd%~?|Xk(MA`3?ZezfGwqm{97!APDdSu2Iv z@)RAlw*wo4JOF5YX6_q7@mb){!0YukbC2cW#slE0LLMHZ(XUFvJ~55M!I*9A+uvDZKx1IN8FGybK`;`$|FC?HdzqJ8RCkL&_kO_Av4buMD_UD zr$f`C^xt3DVu z3<-W~nri!aLg*~4QDGKo9=t&j)e&H}94msJNgYqM_z44IMT@U$7&3R;_0C2Q@@rB9 z13g8qi{HEmWG)~WvWwU%#ga#_tx_hfv?KkOQ!g$qRUE*VBo6jIc7zt7>D-e)0>%Kx zhbNSxPnO8KjBWS^Ar1OJR<+{`B%(!#gdtp{_RlZT^?7^y_3t#y)D zYbF2mhFVmF2@sK<_mj^!5~1PJxBR8YW`h!4kIb_^mtWhtcjjh?sm=twCEZ%>TF={k zUYFJGTBnPje$kO!J$K!8;C+AfH#^%0rfJJy-ODXa{?{WP{jG0&{o5=s0jQKJ+Z_N3 zk#MhdtM#=LNO_)jp7E^jKhpQzf7gNcU-4m)j)py+~aRkZxCR4EjiZ(8DkZ1XM$6-urv3 z_qPxOCkxZ2YHnDXWK%OBpl0`s8}>|tss)+4-gThG98UKVU1&(=(9JEnoQyGBO8#|i zcTx41Nt4a}BHGXBUW-Ym!glSFh;*LYyl#C4kXlx?R29s`$j5N!B4~4|p^Grxri?Ka zA`p-bP<^WgDRRvjjI97z$Sfq!cCu1YbIN z$-vT`NwcU{7d0OOQPOb72y>CQ7P+o@9?Fvb$K1Fw`R@)RX-Z6%CTz(Dj*=&fANAY? zkY!-&D5O$U7l(Q+7MKAV1_00$$T50#_2Ibt5s&}|dN|y%Zj!{vcmdD4v4IGfh)%q$v(TVFGGovLV&!Ci=oC?O+mC=o)Ord`g#C)ZN4!oJA^4c*wL zF9mb&F~u;tUGG{H#@KDdSPku}@1{odke2%-d5{rTt&B)Y)pz1JPc$M`Ld_oGFqk&O zG2HbL4W${%Mk2zn>M*nBq9kLH8Vr;sIqL`fC$ll3Um1>V5-)JfNNaPdXc!zDh8Mr$d&l)25h(WR6RuAr~6Lia(c zfp%=m-F@bsMiR>11&JsKpS%n;rt2XWTe3(#jIm+}zLx2QgJ%&Rxvs>F;N=QzEfrLUyb&*ICR%+YIW4;`lFQ2(* zKIE7Z!a&{p{WeIYOkOt=pbZr?{n|wT{%P@bWB>|{I2_-gO!fSWEg<#M?z&qgEiOH$ z$_@b?3VSmL4?F#M5V-BOFTMAj@1s&Zz!0AEvgiK zE(0f}^1aH!PrCSVkNNIL9?AXk?!Wk;;%kDRexz^rz_ahS_oRE@ddnU0;X$H;lPfO) zv2RgX&xdyAL#N*Nq#u076OZ(z-twlmA3V6t!Yo|tYLxYN_ph_gKI7z5_uhKT9T9am zO>cA_zPRKdP5k508I0>5x5}489dLb-2 z#5E8(B$KsUL26xvW*}-i7U{g!IV%yBI!$%u81bm0^knX4td}MZWGn6y?Ow>T*r;h} zSp13YPFuFE5mgqR=bhGP^@%D?byasQaP5xDuvj4f$a4~>1%E6UJ7_fL#6c1nc6Krh zL}JyrFi>E`PY)itJ*B>NNh+o>MT~Svaz_mY1R`eRXq`rnxFG|IE=&ugdw%gEE~=4~ zPHS(0)9ooq;Kb#c5{>#u1Qt+PT4<|0G>5FLcM+e&Y3;$OC=?B61SpUFgPUu62v7my zhcthnzo9Gw(B`&oZH}m1ZQ3LCO94Dl(NLjUrd&K(gQQ|e1Qw( zxM|Y`G0KyvAtH&z3gD9h*z(Nc49nm9>#;!$Q z<6B56ViQ5iap;Mw>qA6%liM>3aTJWHbkc8^nhg|CD8mQfB7RlSo4MoyVI zzm=d8&jgwI0R4g#k*ELIv$j_Cu62L=l{ffW+hD?2hK@*7XRdN}@i_;|hpxWu!bjit z#FLIc^V|nq_0g-p^^xbEb?R{+zUCH;-&q5Y1hkx?FgybQ;J4j>@4a@_&iv|M{{4Bq zo%iyKnUE;DSBb8c%XZ2Uoc#c>?=v?~WrZoRWU;gc zV`+U>U%?I6-E@=)re{C*DZl#C*KluG$*wnXM}sg?X}y8SamVd>>C1omDBt%lE_8ZX@fID6hBj`-7l;-gn9X9i;kjpYFkJmMzslvDP8>JvAx zXQ;u*m+%zf_b*5=+D z5v`_OwbY>%u_Pj2VT1JEQRgGmlNcg4J4C}To7oLxv^ z_aCJbgty+Buo&;fItoE8l_vVq!J$=1g0hH?iReu0k0m{#W7pxr`taPFpcGIktCqc} zA&HJ=ba65+wNggO7qC4r*&z)cQ7{x@+&NqM!<$Ex`zSVd8K}!hfw^6!N^Un&7(*GM ze8L*Q0zP+`>dLUNEFq=ofq6_Jup0PbivkY=RcW;Dshrddy*1zFQIL~FB)D!-tb|>b zfNU~tI(?JnEx}5V&|w`n0o2l4vokZ*&_;sNBl0##$b7B)|aSaB>iPgrzB9Ssxg?<071tPy@jX6sEDOhz>gjiyI{~1i*7!qVgWrVvNZhhQgV~P#?3aGnNvgOSEGxzX=c{Z5-91IA$Hj zZ#1ZVGLCIuU=9jpv}Z0A(n}3x#J?t+p@B2pUOcuS9`*oB`_$ko!0;eJiaEvwvSlGJ z9RHbLE_AzU9(!$c%LvH1@vz}eAFYvr?-z_laKEl+;$fj0l%*^m^_5D-LTso*WsLqU z!6hl~?q11)S_F!;C99e;*&@Fe`I{mZ!Xl_HCWvst0tHI$aL3{19}sfLXYai;cW+5Y)Au#iBS{)i3SZj6KD0`+we*bgRPD^?`67!hEh8YCMVwTvMS z#C!$mpYZMXd)J5d>BqF_yqRrOE&wD5WE#A)_TEDPuKM`ZpS|`o zKGYGb8*t=^5lp_cWo6C_$XO3M;|M6W8}&JKSEACcEQ^zczw`V@KJLQDJp2*o9>tCG zu6JIkx4V@uBA@^K%}04l&VTH;fAQ8Y{pZ)e4Hn0z#>BKP9T-kI^`xKs#UDTWockZ? zi~P=Syz#)nZ6cbc)!cS^pI570x88EcQNHhYUGS(|Zhq1qz3xvfTm!2ypghl;2v0hB z@6W&Vc}GE_|ITl`@oW3{`_-%E1PzF-O3n&tW@PpSdndpEz|ckHxZ{p_(#79%q@~t>_0g*TU_>yO=gQ?HRR7`AphFgLV?Di+dA`ep+#Gdx5atleoB(TqHbZU{6? zgE@fd`YA58sy|Khl&lXdrIfl_?b7;y#kfMuJ>obK3uJqPWvo(YZK5I}3$W6}TM8pL zda)ML;4o7~R!`X4e#5JNh^_vn|bvIsD!HD{RKs^|S zdx&*(wTPZNWn^Axom-zbsxbkNMkS5!D4JZ~c=oNG>XNxo2_nc?l_+xB1`DNjJzN$}Vi=!G0h!y5W84;LPWFM)moMUdwajR9 zEGqL5-GKptqLJiz^W5RZ9tlGFnEWl9tm=^VfeggRg2!&{#=>o;j0zh!3`e&|X1m%s z91%Vgr$jpmO;aqPc#*Q@?T!*j;#(sHu9HR{YfN~@c{M!xcy~OyMZg|FK1Lv^Hzmo< z@+5u}X zx|-Wg+Vn|cCq|66hZ8LK5Zu<1f}U|9ddgZa7_u=B`in@e+;|@D{&KPCqBtIaJB-hZ z4E>1@!M$8rc(-yjFxm`4HNu;^Z_G@C!?p-Xh%dJI1cf-*$Vy3{55nAf?>aBDlU2tm zRDB3lO5x$^$>&=NhcqWO2=@jGMndz&aW{!_B1xh|VxNVZgjLvF#6y;^8UgXiQEwt0 zfE#y2oOz~FI`_@#fUTJ=eWyzk%ZWnQq#13`p9T(V2Ax9iTk4gp99BoBsFuCovz zBNTYtd1o9m(ayU4!LPo~=D2ym>UNi*eMcfK(1iu$NEQFdr=0k*SNtSMUc1L#1!q0* zTaF~?ign6w{n{Vx>>M0?2tcCxKd=1QbN=;#qeRL+68=R@Y+AS^_JU1q^%_A z6YhP&6P|d%#ZP;}QU3V5-toQ;L?=FWw0tYb?Iu=3|fD{rK;D{821V0C4$bSA6iwk5rl>3=upXPh)LRLdsIaiGpoeLC z{#vk-a7>FW(%VL}6doJbz}o1+RW7EHvjiA-Z%J6XK^s^~(dqi5P;fuB7Vo{aHqU*n z#ayks)eWD0k_C(B-azN>+Y=9?WbO{*ikYb&(}IppmeD_0U#$tb+uH}UHPTOaEwz+M zyP8m=`Q3>H3j>RchcHTZhb$R^4hh+gHIKk%$NC{rDVZP_B0Ud`r?@ILKbPFalmq;1 zML%{aMCqysDxXDH`zWUIgu4^b?aP+vyL9>*@SYSE9IMJ{Xki$M_Jir23leIW% z?B!v$)tfh{W6Ct%?i7&b;wW4DP$0h+Hiw`v1IC&n0mRZTZfm#2>OPUKBXVOy`xI%4Hk#PTVbpfdReC9muylj0=hz(NvI8l2#;$SKUGm*5r* zPgM2*NmM@Jo-I^m%+WS`z#PFB6uy+8oASXIDm8n&R&~qO>6k`-NTsNoJ+>bPg%8{u z^W1hcl8Xj2mg4hb;i|pqc^h?tl7U*AJ2wF=MS+xMaFK(JvBByL|5bVo1q3-+0c~x> zNrNr}6%gkeCR}1(w!ng`F*-eMXFPI%29<8XN>^vELZ>pek+4v8Lt|O2F4GpPETHxX z8zeAIhJ}(x1KqM>MW|AGzSNeK&6g5z&1;k0;=HtLWKlJmBK=`Xa@X< z){X@qkta9A^oxg>Gv+?ni(b2)0}-3rzyl`#k{6$`#t&?@`J!WS^z}DL_~Z*;5EBL+ z+(LXXBoKCoM{{5nZ2qGQzT*e~)l&iSvJc*L{f%Ep+{0T&Q ziA(I_7z_{-si6q4Gb7?<|NS-a|KMLQe!(j~{?TjPPE&Hg?vpQm+z&tZ2fprCxc=H3 zKlYJNAK1SQAba*~o%g7R9EB$li0xnb#aF9hzLbgpt<49w?>c7BJwfE+XI%8d&-n(w z@6})Z>Q_bh*yE0Q#3LVi_Bm%B{g3?h6@UARm%R>BnkNFi@MoWW?6G^`Zl+ao81i*A z{r5lX^rLj1x88Ec&phwf4<67aM>Fh9SMad&&Ux7@pZ|@&LC^f>FW!IG0RSka=u&0m z5QFQlh=N}dx3&$cO|HoSgdOuO6Lvyif`*L7m*be!|4G-90d!`0az!tXSn`?G0NOWv3wJM6vusiKazjf<# z@6AKKEEG%BQsr(^{a#f;!1}NWb8nul4w57&VdsnZj+|2OtFFxC#? zUXVo|*P=*>A9Cqj;(Ue&9eB}@4Z8c%>JvEXkaMLc-#fmAep7OH4$E!OVap#StpVI^ zrbdd}9t{k`u)6>*v0C~xE~1=L{OblRM|vb7PUJp^hG3W;CP>cB1)}0$sUDd5pDh6FFnmm`CXZB-AphboU zHEwE1v9qp28zBd}nm*jvKC}o*L`fwB*f4Q2eOw@aGtEQ7J?<-x1?uj#Nq| zZ;J5lM1V_2+TB3?e5sW_xL^*b47Z52k6tXE&t~_G^0$(t5dmb^YR`J!R>ZsrhbCG3 zIvNKuxz2*4M$Fse2&*KM($OMk$Ub*86rD>Pxr)hgVX^xLf?`Xe63g(!OOh5?1l|~S zG9#MtL*K0@KJ!U{_=P*RZ@BR*o;+_+Zoqp;+ z{`8w({iYv%@xMO#o?BTsoQ|l)g8yq@+kfdFUaESVERBFMGGc!@v`uCrB*KTC_n`k5 z-O;Ol^N&CI@#|`>Iq(>55d`mg#}(gu(RUuj`xNYiuiFtVb~tap;*GC=n^@K*i*%1~ z2NAAydiUiYc>G1@pL~Q=+<)-*eb;4Iyx|WnMW6jRRhb`i{v*EWFYIf6=Pmp1+RxI> zPOZHPA_DFE%oo1#ue1NIg9i>A)ar$S$(#Y~1TeNwxC+^6=;GYIqIFx3r%Rv>5|n-7 zEl;*2JxtUkF>wgvb-1wdEXr$c0$~9*(Uk))!EIBb3p77324&F-8ga@<6lyv~&5H#| z!Q|+chq-Yhq^+&pQ<)ZP6MKQuz2y^no$$L=ltcGk5UGwDG>~*GP1uOWi0A__-kEp8 zfJ8*Ktg1#fC)cJ`#ghB3(313gPZZBGL0rs@%xQ{PBQePj*(Gp7GC0aAawoS&G&?1_ zsFe+1ai7JfBqEIBK(**>L1fd&F4ms|f@L5|$kh;sq2C>2R;Kv;leJ95G_y9LRC*Ir zO~6?x@68X>keZ_aF!zbc`9yZvng*@6!DjBJ3$^zDa_E9p5aPRB&x}hsD#Q=A-TJ4H*v-NfFZ3t09 z!)9^2IQSI$BMEddG#NV8#}X1nTAxiE#!lDtcgs|fgbSCEDkDIa0|i;=00Va|(mI<$ z)+hQ2a9|TuUBTJqC@=_w5S5Bp|B|Bt1}5Hz*kjBgNzOD%t~d=c##7unQVON*J>@?+ zn(&CZRAPrsl^9Y69SawtQdT+vFNI2(a7p*VMa$@FiS5Ht&9W6aEfj}La9J?ct+CHv*2JUCrNB-WJ1A)EmVz9?GVe@Z8p|&%mJ9lY^j%h-%r= znOf)8xGN(8p|bE)Cl>C#&3$`ruv+b!>J~))vk;CW{eILZSi^05=u*eP^w$Bg+r1x2qD&unSuy{jRY|8%q zgFcm2DfKY;9ubjBFnnQ~=n+133?CF{ycDQcnWkxFKJ$prR;vzohaZZrK(|79vloqJ;O*ufJA^yhORNOi);$l?UGL{4s6fI zA2XeBpW{FAHy?lhdp>x|8K;CXE3MGSB1wPY%ieU^YTBKLg-V!k*u3ui6g5Hm@nB{^ zIqBpRzqu9sU3VRL!ymluFW+%xJUaTsgjl6e-GA4iSG?>Ge)*L@c@)9h-}hgyf6XOt z{jZl<&ZDN(0TLGVwsP-KR$u$-{#X9;>tFh-&-*5R-#>iqC2xD{dweWy4;%}B+r!WK zrgulL{_Qt^{3F-6Q=F`Suy97$f7ijkeCPYW_oDCoM!wYb*WNhKYnwnYb?gO8myQCZ zM8vWIUP3d>!kA#(nbI=?~3UX|30J?LJqfKLok~-av8({-RV6{{eDg&17 z>4$^p;Fr9$UKE5V_wH#p9S{B+Z2y zo*UR;DFjHt@&#{fg?zZrU<&w{xx`D!sVpKX>LQZGrk zZPe*t>8d);bBf2y-0ka=-y?pn3%546zV^K(sm@k8xeHeK<_tb@Ed25#--FqG!mNY| zhkr`zZN1*Fv@?4w*)sj2Qg=&j2WX~25a`mkRU;iH9}zbVdOLw7Cc)$_ascjpPof1x zVeYN15erKzG^t0^ZwJW>_IMGrdDgB=vHMN|JuIFl?K3?>nhX^+k~!TtV{_vk+4cy) zEJ+|ok;E9oY(RmL;bs|SIhxBkma^na4+BYvzJl_=ptV#$NzF;+&bO>ha@D8~k9^e1 zuFMpXLZ#MeHSJL{XRJLBo1MGyow<}^GH=Yjc+_}nL=>}F==Tyb`DLw`M3oW6TI zmr}&rSl?SG0142!g)=F`ohmLiLKHJM8=j_dKKeAuG-EhY+ohPzviKG^k5D(@epVPr zgwE+9e(Tw(U3VZ z)e?cHE2I@LVhMBv55NJ`I(2TXt-FWh4xW*o*y_>1$kKE;>d;ES-EEC%z_K9od~x}I zN2AzrPGlF0rqRJ_i(AT^QRMz_t#T}9MXvh0|NZcP{IG|danHZ`_$_m53a$$YDg%&m zzQJvlPTNBiL;$^H5dh)%d+t8{gx!Gh{`Y*KwVgNq?jPE8&6yRY76nFWW|?Os>-&UC z93DQwF@x_g0&~Rm7$PDkopQoAv4X$unti|h>uCd_`{_^K==4GfC$|dQA(k+A9TNOZg=$izw_q*{;m(0SID*j;H@?5$n9;Hy!$cd zpZAUYYS&%6kEQECOSM((5$J07Cn~<;aO)$Brd)d#kZ(!R%o`~lCvtee_U~h#K2Tsz z9O6L1P>y~U_B<9GnMGhH7Zr+8p?P5Jk84or;O2;dfFPn&oP#8YrPzk5Ft@qQZs(9f z(`woZk2{W}OD@h@V5j}WV%-NG0$@i8EqB=t9J3cWMl-6}>)cgPXX7Zvd>MqJTUbW& zk*kGF1Ca*X$6dBreKedx7VZS*^+)5ps}Xj>DVv^+H0`!vd)^QMYmg*-c%}^xy9x_J z;~_4*4A@%K!BIkvT2c+EAkj6)8X%+a3|6T)F`AD zXeZlb1~?Hp!lSZJT_ScVB6l^~!VLq1H(+DM5%N1g{{YNwq{HL#eN<S(pa=wI;`3?60jj~2hv6;K6#fUaw9^zLNK^dZb4?~yuj;4|TMC!e%++z?6 zt-3ARk#h3!a!8axiWIj{4ykTPIyafR=!V!4DXo41#R&C{4lO>d8+cy*Z0h@%4a|gC z>SWXw0HRV$5z*pg%G=Q1n_k2#+~U=49|so@nVrT|iCS-S+fimMA(~lTd^4H`5@BYv zaT!L2ZQ>cG&EVJBASqIb#}$H6tmp{A4(Nelp~Z?^5CH!4b#FfV+aA1U&-BFe&%E@1 zT!%}!w8=8M0HI+P2}G>vQl*07!~`FE-e~~vwXf{|<5&HWF6^ij!a|zx3jjhEk0`Tm;qdW z?M=^p*3UodNB;jOeBXEfLtB*F|Mbn5|JfyPXYR-Dxt9pGzBX*4X={t>?b#vHB5>Wc z`=0a6pZ%fd{J;~w@BDvoYjnwgw@9n+Sx?*7a$k$12e9W@v*xlc(*68COx%!X) z=1+K|cSvTVC=rzy9z4!@oJ@)V)Xlnm2#pi^9xEHfTf;@~}=u zW?u7->#4N-Rmp5Mt&Y`hHWl{EZx||k{I)5hkB~~&CRv09h!~D@d~~ZaI)`CKyeRRS zZ0sKl)nI%+5EMv)ZxIIQz3G;wkh0y_YkFvHr}bIc&9zLmPTut;roAJO-QURpp4vG2 z^@l1HS`qT1!Sd!@cL!nr=)KQvyY)s`5DOwrb)^x*5#Z>M1JrqHED&;vIvMevHiOQO0Cf(Rtve`+z7e%lAHI^Mtg6F-%5a)l_0I_eZ`Cj}`zB3)RPESF zq@!TQkg#9aImtBoUX4DqwnPJtz`V#Nw}Fz2vr?u)B_6PtaH*wdz1|KdwE7kngeo!7 z2@DAG=#Ym_-QctK&}y2NuK0XBZ}@M$<5e8kTQgOpwo>6dWaxc{ymA=NGc5yueLo4p zy|HVbBH}hq2EVi@FFFznKtyuL(ZGwjLQm-*OQbI?EQ0>35E52%?u|$v-5OaWbEF0d zYg$9FE!g%(djC=}5arOY#M4Ve`NI{tVIEinB3#Qv5g!SI0>aF?`$03LsTz^B_tx`Y zKWK%fLL=>fxohXEe4v<1IU=ZpZj+gdq9Yx66N)OfOk_wtZ}l`rATs6uj4@22iluxPZAb$R3nAC&Q4Joyb5rhJ|P(%9wR5fG=!G#?2QPFT=0k}Qr#{cSn?e%hfCp;eV)o_i4?szimjGxyf#?d^lLOr@GS zfSCzPEh|9e-gf5g)>|Q}Wo645?zK#aSPL+>&Yjy@ua8<*AW~=&;nwG!_4fAq&}!OR zO}k2&f;x>wgNzI%s>FJB&2uTLJSZ~Kf!LkMWymf(a!r!hb%DSkjB9sz$2@~5nAZRV zKn`PyoV^0WHf&p5Jtx`Pnyxcq5iS;mH^K=6d`i}jm67g%%8VU&iCR`0!5)LTBqQx0 zDY0XcE8-R#X5QI31PSM37Ug-zhdZ!m_dOBe;Gz8pP|6fx-1vN{k6hzg}xb8kQp zS2T5M*>~wseiS{6H5Cd~zwPZz;>k*Q^_wg}~tdfEJa+-&ldVQYJ|NQdT9e0m^_%7wzt3Pw?wfk;?CuMn_}KFv_25T5>Y+#a;xBr^D?av-PeIBo z^66a&yNj+S2&tA86>?(Ch)J0@f)H_D z*}%9^B1Lk6LwnGmVZ8KNW_>&>n@&fSQ{9@%1Tkt#E>8W-o*p>`5%q3po$a#~tq!#Q0r5pG7b>*%&^ z`KFB4jgV-Q#)-!thi=z?rDP`%xj1DYTwWcQ-ShyT5 z0qX(0iOoDLSsMQ4j6$b^2F$P$0AMa%A8$F8Q`hqmuhXIf^b z>oZoUPScj(Ai^xGX^WYC^NB>IwKYrE>3@jEG0`}D$3*~(pk9aFS+rVI;mHkg8A?doI|p}m4%RZQ zwstf3LREp$!dy#bfZo=Kv}@Nf08q=M4M1mB+7I`B-_uUM{{v4y>EsiSJ#J4x&-EU< z`qS4RIIw-&tzY`|r?0>H^S3l^t7(`1`n@+qtaYUyY@PaVG}5-W@-PsaDTYYEZhdo? z>dRnCT^Uh>;XIB!A5*(}prjwC44TBkBV~osnH!9tK`*dg7JaBZsbq_&6f9JVDbYf3 zWl=ehp`QYaj{~NXC24_V1LsX{YmR*J!|_(bQ10ixPmd%~)E0?%Y9N$|x&tseK-i)J8%Ii{*~D|}(mU3t zI`M_H@(ZqAaITZ}0+!^!_{pt9D5WaFTn@`C%xvHQT_pH~44K?AA2u`bCE4GT!8$?Z zY|$rd89`vaXJ&}#JYlst1x2csiKrT7!HY}%jLh>ouo)4T6wi$I($)e&QdoI=oVOyH z?CisfNruT;97~{eheTt5!PIijSe(Tgy~WboyzbI*@pwzTQ?QUh-VJ#wdE7YpV-5g1^|P_XFz`?kBEs@?GAN%7eU?n~3|ENdPh#R>0N;J>z(dRi8lSCrKSFRnrS&{3Zy_pbq0{bh1Us@>Ks#F@r0jO=9M$ zZq+*BveSzjaGuxtLrirVp{^DRN4>Y+8*?u~dqWI>z7}$|PSdni%Zf&nTn;sMyHszH zhE$5VaU!h?(z7ubOI~)5ZQ-Kq9%qwEbIo$LfmTdCB&RM>zoXOG*=cMESDuG7>5oMF z8h{h~vfM{4;z;z|S>;pCuXWVoCq#VwJYW*Ep`k7}x;NSk@3kuPDKYHs&K6Q&HTts@U3jt{`_Q32!hzQ?*!P)oQ zyJy|ni+=d0zWU{_5LNf}iqoekep@f!#$Y_Gwt&dJ3wol#FtV%c6t$hRm{C@Ljs>}P z?##`Gd|KgAvCMU<2++B$rd^{N_KlVbJC$M{ z&a|b+#T3C4MG#xtIk>&Q*41j->b;Q)b43twHEoH=q3!+Cw6!(uR=!3MQ$Rq^CT-Fb zNU#5HeQs^0Qrf)UTJ1)pu3Zp7Eh|qk>ncCBA(Iw`4l{|=Iemzk1%L@lpk1;+CPRvn zE>;vilh!Qad@vrr#R%0=6MttG80&{o?Ir7r3RkJvUbhx1n!pW!g{m#$$fb1Z#*|@N zh@cq1@CGU@u20`-nAts0xgK{YgRr?E zjeQ?Sw#{YshBwhpE|l+jz)3(eaf_4 zEek?H6xdTv?4u}&1|824Kx0xf(5sS(#;%^_k?b+BX6SRlA||89oG*LQUEmXnW*uD4Jw0t&s6#yuu+L8^uddO9y0_d2bKdNw z-XJ&a5}A8m>qls^N7G;_b!)YIJ#U*{RJ~O`u+ZBnrr`1QV>l|Ngl85Z2$cWWDF@6T zLu@1Nb}=hmrqzxqWZadBlCQ5!4s1)QN*TjA09i|ln%!$lX0&mkVwWCmK={gB-Xpy? zyMi4zf+ld zhLbTvr-)*L2(dDRk$UeS+_|+j4^aoA-ehTR1ciHRb6P|&v-p%kv&|I>X|gDE)47U~ zOoKGM%(z}Rg^X){)&e&yY;!d|)FLO`;AuTJ4ZU@*eo#PI`T(9{2sS!%b#;w&o)K$B z31fQiv&u;c3Jdo>qh~+1)>&8@`yiP`dhe}J?L6xuj*#3>kAOu39?2~b;y<8V~~EJSqOH`k`H z8jfc#XhPT2+T7Y2086P;os3tLhTlFYA#^s{7zIfjIh4m#;HhN#t|Jjb2^glMimHC` zo%Nw^L;))YYnfDLqyMhc95w^ z4y$()4yQGd#(4YfuIAB5TTl8SX8$4)MW@e_7$8xpb<*mPxd~YKpi2Db zwnJ1S!J_q@xV%F|7tZxUb)I+hU{w2@rZH-lLWrPaFDex$W291@>Lhl>l9nI>ux>lz zMk9SyOZf7cwZkwuqVzsz9(OF+Mo;2SHnO=U@aUg`Q(C-6vEvxGm{_#wQRA9MAtNJz zYbL0a!osTA2atK*Vdg>w{G*)~HU4&Jj1PBIT(WDTh^SxzEY%%8kZ>=~Hoy>h4o0)L zmT5Kp+rLhNt#L()l z>gh^faEK)uxQuGB1T$Vjd>3bZLV_>5M+nC)V=0+jO4TdFf?xH4Bt65$VADuIS zNYjlR6&YZ(crT(<^|V}BhB~m}VQOLB8@o}kz=pvg2USTJ+{uo$5n`SuM&VPnA%#1? z$GAPOvWr(BghaLW-axW}vUp;fhzONpKe;FVE#wT!|BM9%#Jr>9Ve)1#RcZK&^^ru3 z{Q!8NJmIR8syEBrc0!WvSWc>2lj2ErSObWKN-4G0Nk3x>Xl-o=vD8whY0LeJPVb~b zR77gjd#$gb36bZ$M!Kf3fD|-e8FTOM=ggsV!lsQ}1X2TvG{8kBM`$VS<7^o?=+#b7 zn&CWPjmKLFv0SkZmaTreEa5FfYbKS7P+H@p(I+Y^B7d*ME?>rQjUaM#Ymj|@ih2vt zXnsUk%H*?~#n6y+ib{tylVkoOG?h4ZLiZRHU$H!E&{3X(jvcH*1BPyEuk>F>*&to~ zeJ|93O$b}nUyF`I1^4qMZxX6#O~<{=P04+o`|*2EeCexSIZgGmUp#Q>yFYDE!!fD? z4~B)vi`BB~ssHqxQ;*-hfB&I>d-0FJBF8P(d}DVP9j*JJ11tzggl;!<)I{}9uF03d z9K$?j${2b=jMIv_ukBIAxwy?X%}-pv_7lma`OVv}Gd+2V%D$efX zA`K_eBe+m0RlEPD{a!I{G8C$%RJUqSBu%9WUmjC=F)bL3+5x4FsnSxLk;V*=W?*BU z5rQ$cHqf5fNVO+_3N6@XaI#7Wd39%v4&6pKPT1$lR3t{gG~%Rhbu!~6maUj-_d%XA zlo@Rhy2rvjqR=u{$h8}x=#2)f`yU+J%ke?g$wRzE7PqP;>}uL_ z>jIc?k{EnkdXT=d9>d<*1o#e{zIu%U-4?pOxIW|PXUB7ghi4<;D5mGJ^dD84pQbU1 zx2wy^Jhjy9tTpdMnvrKEH!Onc#FxpG>K07VL6}uE@$<6H-~j^@6qT#j5IneNL*TcJ zoQgrfNCb-O$`gkK1bUwZqWH3}#;QQ63nj!HL}F|asY2j~)fBZrWuC%9Cv z(S{u~hX_k*)#ANaL`WmX^Y8i8CW+T!W#slm(W&Qy9)Qsj4-jL3?|h*ebeZTI?H37! zp~t(Kw6%9H&eY#lV1v9YIf~Vckt#X}4N{y2E_K7PGmQ5xz=R_CT!UeE9M7;UmkIi4 z1(|{TQCz$=>G;Zapd@cW7(Q)?%P5w>8;iJPtCL{pXCY;%H`&&tl(Ti?kqSMY@4$z@ z)Pru~2NrF3+-Ovij|)RGpm_IO`G~=LZ8oG*7b1#7k_RpyYn`@MyY)SaAHX&n#33#K z03ZNKL_t(Ijy%=JQfH$`i}saL>ZTaUvkb`(EINS@lBkm^<4hy)DjL!BsX>uWCcyyr zhQXI3C)r5R30Sa^s+UlnJ$wY6TP;)XP4~tj zmdOFxO0?5+4~;OSNM7~Abt^bigA_|huPq^MHIc?lTqkkaeMH}g2gz2D1#7Ag7_~?D z=R((u{%P!NB5&s2M4(I4M~4u<@})2TufO`hcYW`7pLxSrH>=C#+iZnHuOXTM${>>1A@lWAnGY5(&H_PR}c<(sA^cDcjK3%-?-otM{UCZ zfV;gmy*H)Lc&XvTN(TmIsipY}?9>qES%h_o#L^Tt#l2Bob?&XLMLG+E=LYJBjWzQk z-1DC81K4|au~zSesu#^IMyghUP^?A;u!}$`dVW#ow$VR;jR2`YR=-bt++fICf^3Aa zGlB(xz|sTIP?gBQhGz4d!{T53Gz&S3w{3%~V@d|l6gKs&_oN%vEJYL)0@JV(k#0?O zS%hIRL(e-IC|;kX*>;G1OB1_fc(YTT>ddk5%4 z`sk;yL4gI9iF-~ia!EQ4*BLEhRS-gv2&U=6!^X_YH-cKG1cPp7r~^=-V)0joZT}Wm z2zTa~6N@z6`i={RTfVJL7Y9gFDO9WNc0_%^qCX{f_au-}vYBK^1b}JUQprdB9WODNEEh|K+&XUt1q=8 z;#5{K#iSAXZec8or)6QON+u#8EU3%FWEn>mE{dc}PKjX2MRHW~0wIE_F~fN66Xl%S zLs{8XtXOfMtpm6rMTn9oN5=wPK#E{6R5A>}j&OIOc$_W~DIfWw*MVb-8#ZK{DHq~8@Oh;nOo%d-v6QW9vB>M#DFFt=pQsiv z^>rV~X{Dk8Cxp4p^Y%P%qYKX6;(`EFDX4u~j#&?{K+eEEFa1Q8&80uH8k_a#CC}k8 z=B<91K|RT+ngz$Rpbf{zaaVoGNg|?!841}GU|4X$2Bfj`G=eBef)IA@!xjMJ!qlhH z!ZRiL61`Q{8V^TyE@cMHLcrOLaA@7H8EdQ_Lj>w}AT;3$cS z53*sI%Z}`%AN0Y!Um}!)6OWvOl<$26Ml%@pCD1L<8YX!fvB>REaK zk_ZqLPp!ll>@oMbt>?BQ0F`Q~t5PPH8x2s~Ab^cr8Y;nJb{%yj!e)^|&{f{4^w+el-KTsUn8$4q$y0S)pP*i{sdI;K3zWa$U&y+`q5nLxro zWO)WMOv5SxViEO>>6tJZAs?M+DOSs>mWfKyejx4?C=9=6Zyg$#i$!e;1+>zk*LU>}HEOS9}FS?|9u1);vAHz4OP7p?6)+o;guDb;`%d`t|MJ#<@#D|_miz2^)I(1t9F-M@Cnz=Bd$y(% zk6X3Izx4~h+WVSiBZ}RYxd_@Qs~XCdI$CE40JOD*E?c@}(S2(gd$_v5W{Z|0uRp}D zUDIi&pRBrq8$bJng9i_Gkn!X>y}*x}9*p)-VWJ0YkKhRAQp!j;V8KGnoqGc(Ob7(4 zSHFVBKG>!XfxhL8(}?h<8*kR&2?9Tkk@U>d6SL3j`r zdNu7n``j}LbZ^TC_8;8$+0WS~B$Qx=KayR0R;QhIx@OBxbr&Ih>Z)s*ThOT0plJmv zGXw9v&xw0aJbvGepW8mTW05I9iA8NQr*j^BRu-0gZr>LU9z3+^?F8t|Ao8Gd&pLSE z;J$q~@!(3^fVomp$@qOvI`PE4C+Ii2%P+0PE4DBq(;00x%Y8Yxgj)Prf>?kL2pBh$-9tYAFe?#EW+=kGdnFa&Y#v>;n?+U6}d6g4u;gw6gQG&)Q4qve)RhM6I{@ z8T7RxB$gHri!lR8KWk%Bq=!)#Ns}0?G?H+OuPjQfAiOhggY9oeGC_#DEL#)M@;*|- zMu@0_3!NNq07X1_Xr6bvw1R~yZLM}sbv5vbwlBgE1MC0f!=}*I+A;1vG#KGpzNd^C z1_riUqJ$COqFBB%0@^m+)HHoV0F3T#A7!_tQ4L=L_(ix;Rv=&x;b=-w)cdi}-ig~TIDy3qjVU68HQNydi=U=a2!QZJBOe(z&S z$sSuMN3gUMBy7^qu``r$X69gD;l@exM*~j78c-T0UiS;R!jzj^$uW4I=5@8AXy|1% z=TsdBFmjWWt)juN?87NT{1U!UZ*ieGi#}2vk~ZH^qqTQC~*PW|`B@I6@J@5~u(Ok!^g4g-Yi}SQBlW22BnC z0v`_`jw(?ehLJx9??fPMZ{)5&8`$ecmp#8t?3i*jmciC->J1&)enIU3?e?!W|HUzd zK))2Uj1ALDs7V9muZJQE2hFQ?1F zE_}iN_n6ynzw??;-+~_>EV-F4-HDvaY}etHT@5PyZKB`nHEX|+Ncfpe{e!}A~ydWN}*ZkfefANdAWh`<$Z_j-8Q!aSycjR1< z|N3A4+Xt@vThC>SF{M96rhc~n6R&|pe>V^mvQcQ-v*`I=Xfgv1a7en9`!{$LvDDU^ z07PH;L9R24R5})ur6=_3EYi4zT+fLkOjNd3do*R$r70zkb+w+*ziEjyL>iYVR{L0O z0VBhXB#DT4gq(Ut8xa!q-sXA7ygH>Q_j#IjsUgs&R##7V zaCmf5fawQbDZCAV0a8x1!6%nk>*ez!q2dZfrR$e$?=tLUg|dgr#uQYXaU?8VLsyqf zEh?qDa7ZkvR=)y6Upm3S|E??Fl=k4>QXUfm$jU>WD_=;v@ablmqAd3 zP@ZIosoqn}eS3XSzgn%+YPH*)e#7WIasi9o)#433N~*7ni<&LRv`>hFO}kn1IbcOkC`)o@ z=PWxcQ?y&dgxT@GgwBHvX`O0PA)=gsJmrRU0}I}L z>AYCCHnst9^RwZ9y_4`8M;0qV3mo?kySHAxrf2lk2Xlw0I|Ha|s{k3go?$0;wp#?3 zjYwI}IP?f#)=v+|P5}u7YAq3^0f(&x^dHNCLO8&rXxZOLI4KIN&o%`kB|0D#)FO(d z_tu@bQ_6&ZTg7Yzy|?wev$NhNGVd-?(KsgCw-h2Onz=+orA$^axUew%M!}}FZJx=E zC=|B-`lNKUK&R5U|11N{iGe}!SEgf!LDi#|M!+Gyy36RL6| zVz!N;&1ZolIafb`3eo@&n`sPrs!*w|tyTUVXR2=|ZNnoj^HDxiq&yq2EV@Da%!x*+ zrVAf&k&J}-cZ3Aw07N*t#I6$c-sj#1`_-AGG4xVJb?c3_q|g(yOo-T_Gq)zQJK8MB z;&re1&7b(CmrS*$hG(-wiZl4GuYUFSUjFOg4q&xcqHD_8TaVxgR$Z};!2-p2QAB!| zQVI%+*}gr)$}A`lSZx3}`V3 zM({`3K9D*-FX4`O^rIj4;D?_5&bPm(``(PZ079X{gBfaU4Fwcy=WqR|edhVxhdl7l z-uey$20{jna+GLFTzKfWo_p0NuhH~+{cKFr7IW`?U1&Pz+_M1Sho12h0CLQ+$GrNr zFE``7bEy2?6J|c+jMJ|A+2UITHY$^Q;%@hvDa6`hxqNdD^L`?fumMzIFsxyFdP+ z-+B%pUVYW|x-3Fp*c0l#E04eMg2!KY!Jl37&Ud}zuR;_mPTaN;4Im)g@66LKcThJ}7iVt}V_PbD^DK0u(j%*!cc9*iSd!m3yXKB#-dfr)!N4XU$rPir#MFx?FpCWkf6DE~;+8gu)v?vY% z?ScGO(j*9=3V?Aqp2O{9Qn#qc0l_ep1l+;q8KELzLYm4XrRoY!%lcC6b|nL)l(^u- zo<6pPBRrk;*ySEGBgyPIFK)bICIo?6rdp?hr3>q_PHm~Zchdm^fgvWPP%-;~I@*W9 zU2=-uh#3{ggQvJ4{T88ALZJ}ll%8b*k;TYZe7n-*(F8Vb7b!MXEwx%(iz3|%4tD|o za&N3d=)8$lku6{$QnrTqYqg&V+=?X!bV8z1yf5O^!x(;-xhqbnb937sh;)5K0mI^N z{_=tM@FAmdr4mVYK~76fU*P&% zhu=Vk`CEZn#(mM;1!j!FgAN~Dk&3BA2+MU84+Ge3P606OqU4}zQ*JGWoiL2=`jZ4t zQXPOIP^fH8yNgSjbAoSmqNcXB8fUj)Fj)4bfOmkVe4FF(GJ zdyl;hcQ6%@u8DYaB9L-9Bas0E+~#lTz{wg++2jx0yYKYSaI7c+G1JQ&0hn8gnAP`D zZwh-lA{s%*&a6T%Hj3At|;a`L#LEMU+bxS7LPIs)~vyRgBJ2!k{j z+~%Au4vXMXcQ!ifMU5q8DDLdmGlzBxQTKV`f>2^ND2`}!36hGVuuO)4fK#1HDXRNu zZAVM-O0^WbUpx$&yUg0Q5mnU*mr_g%I`7QuZA6^vR-IOqVr_L@&%$lq@hhKP#sW#f z1cZf3^g{YL&4|R@4Dyjlw&Ln*&0-9T8haCFW)t>lE~qet&}PtAjHz0MKdzu*xiXuB8R@W>m&l`vN{cG)A zZA(xGkZ8KAXvaX~gREc>NHNeTxo|)^f-MmV%TW{sCsHiMmQ3U*vJ}Zy5;=){5h+Ka zTo_|3O56=eEDlK&kYisYq6=uCsp_VqsJj}7)m3}%^?!4Yk&AbXF~`3OXo8H@bXDzI z>;J!R&T)9(=Pi6(yjtwECQgzuj^97Si0GA9zLJRE zefL?D8n>}f%anZi)vsXY&wu_MjF}5CiVIAczUr%ACZfOim;M|Pz4U>nZ@>MypZ=-; zJ<)~i&0Of@U-i|me(3cN{@Z`~&oj%buf6O5Q zKz2A!rJcHYoJEqDeh;ZhRB?Li2WT?<(qU}+Q)Z!pq?8Om^Vt)D_Gp#^@r|ny3k{f* zbR5{q8d(c2GZ2xXrYHax!U}OBg+LCJwhGu~QBl!>+$tj1lxko=E-WSmS{&dnV_yUS zMs~($x*W$=)As%xLu?Kg@{oUPDO#$Bi`+JDC`(|NP{Y|bi z_O23jd?{>8N02_ECJ&QJBWd4$+=>Za7vFjEQWV7Ol;Xrr9U#Y2G-4%VCvby`6yYuK zOM!5cd!TcNh*U%`dcgp`_yg1om+6>qVy&2_q`pgJ`ErX;)NFnrLkfIc#{R67eg=M$ zTQHqxDX$MJ(jH55xhE@q|^^IDc@&GiT*kZQ~dle`HSEQ;gIm^ELs#Yx3D zy4k`P>^z!*++>>=r8&6GFZ?;ZrNWi`Hd%b1-5m9lWR15E647r=5K5ImUF_ zday(8@d=#s!Pki%8^D8((^%__@eLC*AD4S3MnJ`NJv^MxA=^XjZ2hv%w0y0(RM7xS z1u#l2Q#czpoVFJ8&=8m6r%gt3?wPdy2EPG(+wO3h;@2xAaOcZ0F{vD=Loy&HU%omV z;xe!f1FP+*1rr=0hvF^nHlR2~gREVP2)RU)oWpY^EiuCDQNGAR+d&0-8b#5e^)2auQr|>s&LY;B%IL7n4zJ zDw%|A667B{c5sVb)7%+{wPgFd=BzV9!sNO+fRWN&%a+zi$W8oQJbfX8?@<5&rsEc9 z9m0%PUwiqTcYc$ch1gL3B_ja^qUY4)tzY}hSAF$sO!N=`{{Qvt*^Bo@4u?zly?39z z`N?1Y&X2wFnYTXoi=X_JcfRl&g(Natcv6v>Re>IRh;w@)zVgaflG8h1_@Z~aT!{-K zdX?wAzVXH%B%&{T{)=RW6XzI*+nQ?vYW&)3uf6@&um8d)f0>BB<740U(o0XCz59$w zh`QniIY#UCH@@~WZ~gi&y!k8N@~waD)z@DB8~@RN{&PS34@HKC!#EuLc!j>>yT0w! z*Is_<>62Gqefg!Ao_^@VAAI|*&lb73=jFZf%2#~h^Iv@P=RfuO*M03b{o$|wiI4yE z-}zggIP_?t>6?1+>Z>mk(OYkQ?k1#ob7cM1*Is_-^Iv@P=RcLswnD&dLANL;iZN4cxRoFD?KArX@mGOM8Q(sa=UDs4GhW=)_Hy;JoP5j$o8QfuxH zm6(;rp%-(T^8{c3+KCVnyF(2NxehMQefCB+6bp;!F~-H+%_g3!3g$|JIm%yAVWJpA zlKWh<=1M(?eN#F?uxI3&G~m^vIZH_9`iS2*0;qE2+%vx@tj|pBQu8jE001BWNklvv2`5G< zsNLQCbP7gXZGOy_bHEs54;kbPsrs)Cbv%AR+PkNgNl-4+N0l45Fwmq$Q*9Z2E8N5z zZ=F(iT7IPM(cN&Vi14DqfL3q?-Y;pc)SO)Ner&e8)gPU)v;hl`aeR0Skk)Fo(93~N zmeQr3Z4ZC0R~s_B@5qZ_PGzzPv_m~n?!t16d(`D?o!5EdH&s1wrdlYeV<5{G50$W7 z#(lCA&gbX5_$|h`2#d%dPF1rqA%>X zBHB=7yn2dniT4Fxg>|s4G7^M{V^*WZ{w@@$Fp-hD*?aFk`^Inj1K<2Df8^aSy-P%I zz4h7m-hEa)cqd;rMRcwCiT~m6ea}DhPrdocU;f0$f0Ayr9I+q96#UIMKlSFDpZfkk z{k{M7fAOPeNJ3q@R$?R+90hc}dmlJci#EUC|TWB z3T&3m*S_jiBKp-|`Se_q2;yB%SEY!^8z1@5+i(5)Tfg>MC;N_%eOt{ld-}V(o$Dm` zH@@yef9>D<8^81mpMLwTU;m3g{O7*$qyN~?{p>#o)O+xABW~{HSHAN5zW;mPe(Tpi z{Kf}yC49q2zwXn&^6Bm3PR}e8z5aC{{@;G)|M(w&{AXVJz|(K~Ltp>LzvYkqoxk-7 zjHhx|7icvm|M2S{B&WAN{dQ{~O9ksh{LUACaRB6{bY-*oRwg^FUO zr%&!a^x?1ZRBRK`v-h5V?lb?7;VMDeRc2?!*vSmy+HhN9YedEoRBW9~gZXq`U13g; z$9AKdLBP#lFh;MCwKS7R9*Ej7xpBR%bzaXG$W%FwJA{0rqRpu}m9j-d(g$S?$cyt- zD&c{0F5bf3Gh8ikBZ+eeP5)YJ&gauk{M&~d!2VPSdJb#%F_n4@V6}aoXVpL&n_eod zzpzqP(HI6NrM(8>mDU-3c+ANht1!EbhuV_G+|p>47byQ@{=zMYsc_XqI_K$rRXxlW zQd4UXi@|%OSfa-$nniH8Ju$VMCmwE*NR9{Kc$4BfCXT5Vo0Z60cvEH$g&pn0*bL;6 z8YAA!m(%4~p+iFkr6V?XD*PDi9)Ld2>ywN3Ky64ID@xcJ%`oR;CgA`xkVKVP4k#>4 zaQGZ!L`r7pv{zz6_O=|xm6BVaHI<4U%5~^mr|MX1hFVe-L*iOGVYf*{$h(ANp38wv zBq|kAaJ3hW;*cSmtau+^JiLeZkwxy0r^uab2z7410V!m)c-YP^kczp6L zwWiY%%beCi(zqaRaS^~<6?>tb<4}1w z;S;0^5yAMAZ|n})mZx+QLz$rm&eCGU?S5=$vc=#S%&}#Yc2p&Zws@RDz@q@M2Juo7 zszxPh&2;Q$N#z^!dhR@HMDEI(mrUn+?X{A`}hs~DLfy zT^5^3WXg#om2R2Yi-%|UvW8wjpAVEM%TDRZfBgoScglcXW4=@e^FMk|| z;1X$vo)O}0@n+@?c|tAKN|U?B87x~VSkZ~x(&YJ86ukA@MMNxFK^yATnlXXwCE*Kz zI6xk98}Nl{QLsn=#zJ_ky{g*je<^(vPQj`>&P$X!vSrdZzr2*N|3Cg`WHfc+7h_(Y zB-4OfPq+yK1q+|nc`o<0CZ?+7G;LBIDAC>e)(drIyowya8AV;lWkXMAFpOXQ>|5k~ zlekib(UK8x0^{hsomP0_Tm0MgFIs_+LN##s~k^ANm2DFMs7P|MmCYdlo#m zc%?CRA{PGQJHPeQKlQVWAsz3TYD`ZF<0yXV_r3IEfAiy?dHZwwShSVm9Nuw51;MPL zpl|U85&wg~|9}3WKl}~f^|5dNu8(~?5&hWT{P-vS?%&%^Nm!R`tvNsPkvE9w)4%#_ zkaB{nvCNL+4mpgkzy7t~^i6;8J3sdAKqLIvkA6Igbr0?>ks(>~^*269#Gn1l|4rm? ze)5+-`SZW{-T&mD`0-EtEtel>@ViCyStl6baZ);DKX-NkrZJQ2@fSi9cta*V++PD?%<#b~*0c zFXk)w79g05#HuQ2vRW;!`lwV&Gc&t-V=5<~w@{lg;oHO1+cKf2L}v&lJ7tndm`~7R zt=QUeb?c7WS0p0gIfEMdC0B-)f}K?0Pp)Lq>#o`y5F@J;cK3MS;XVSON|8@Jw6kSF zAAd^}Q&KZl%V_cZIN|yLQl0Xw`Jyl8v8A$OV zAMhZ9AIGKA0TA1Ytq~NJs>kKH1ERX5DI)c6;WAQJwTD2VZtlW`C5f+XL86;%QGAG~ zH4!i(f=_en_n33qSiaSE_~dS+K$M#+oeRhjo&f?a(>zPV4ByNM&SfiNIzto6GRBd; zC^crZC*zU3O{G_~0ZK0H?+yxT>IpAH|4x%@na(#^3V60FRo1teWhd%Jk3mMxs@qjk ze_qVOn7EHb_i{^iVnxzW6C;PS?nbnd$wCvw0K7vDn(QqV)JjO*e_BhQ!tVLf#ZKjf zB<=?W%xiHZq9irD?JB87^BK~FHp8RHG?lTo-PhC?N2wQ!>{1*sy&z(Qn8WyP2N zj+Ec8B@63HTX?&G+0t9pG{z(?Fc%++Tm7`WQG`*S7z+!DlDhll@&pl)Yn_>tAji0L zc+AGfiwYlgtHQs!Y#~2j=mGNxt}P^y#5dm4qMTZ${Kj{=tx36}NFfP9)nyp*1hND< zjU7dwQc|OUsqV+aY{r2=DE}zKf-OFioZ37Jxk~GSyDy>aK=LVUa%-j*RSL&Vfqc>C zQ7CsDYQ6R*mfA((0!Rx$niBJ@V3wi7Z}|JZT}dqwEde&XBNV!s^fnvj{r|&1@X!7* zB>5$DK|~a$K{buWsS4JU$8#`=dCrqEV;BdJ`NE%;*@a8$l13(gXE=9`A`o;{viQ;$ z?$El*+~jmOW@Hz2-6Qa?7_s7LLKQl%KdwL$hSbF}#$8JtL60aO90TQ17f) zN0FM13|%D%jZ3)HgF@KDsCS!0@7K%f@Vtno{MD^T(6?M|Z9TjyIAB5duGy!wdH z!^fB`-K+hfYSHGE&z%96vg^F^G_O&p_A-IeZn-MY(&g}=DNfABtVq~_A zg@+!v_UY;ir+?8)``r z7~*pf5X4^2GBlqBtJdO%Ue&7VbRJ+>E^Vq$!IDm>bd1|@cSKH^s^$neT#=TOOUtL| za%=mc>Js;+uFamScCQUm{WyTOm*=795${AJY6{rReyyY`Bt&D*N);}dDcCmW`EY%K z?p<_T#+{Bs+A&xf`n;HGJ7}@B2$6=&1+T1F>Dg%4;1oNZx)7 z-^cA1d+#lx)he5A9=0;=1oa_54Ll^dJ(`phS(JlS>{j921et!@GEo=WtpEmt!_8kPb$27c;Q}i=|w~0?|(#~nH zjc=*shMNnExA`jBOO;pv1#kVyTSe@}*)H%HWrzaTjk{U0-YbDZq1sJ^ZVKLlGgKa8 z-gZylt$WZHBCE8^KkTzhphnwQfq6%Ld-)C3{v~tq>`p9^W9s_ zch7Ht0}#Sscy(Ib*-fRRFdSNcW0GO5dmkqY4Kj}DF0rpCUp&{G?(v;S9aGu(ftpjh$* zt+@HD0>c8jZ__3?iAXSTTj4s$94_3*#_o2mq{GFyML-E(9vM3rL9&yPIg3W5PpH@f zA?Eph#sIidqXhI!g+ivahH>Lm9t9@)BEy6BM$GIgReK4Evl+$Fk^nubE2`qC%}i8P zR1$|>-X{uwwpG}OleO_5xi8UCQlj)ka^)bYYS=B%w!2Vl`^hROfNl(z-`ke&w6_6 zDN>VD7+~aPUi445LYd(~_fkK%c597C!!M3YDV5Z`=b11o(3V!4w@)7 zBkbA8#d)ppx7azC$`B7+q6({MiG7Q?loL@)cBbcnQU+qlcqD1vRQXlBlHrLQ(FElo z23da1dA&Zzi*^T0HrEWHg03uf9ql5i#y2ZLrt0^38NXJnjH^GUK1~n#NxtWcBM)} zDf3TL`r{$eJdWMhT+4mUIeQbkZxIRg^D!=fSb&{?!GV(x9e~D(2(rb9U^(--)|?OC z!j4<)6}psL8)yW}a4M15mJyTr(pV~T85*PN%MKHxVz2Z9=CDVzI7tZT6U-RFkpSK_ zO-}0NRuimKg#QEsy1c(hw_~6cgCS1B8U&6|v8Q>=5>qifW`4tIt+f+Nuwtt_={W9E zV2K%R8Ij;}bXP84>j!WcvMdS|UY)D!L7j>UTd}Ze0BJjl=)_JKsux&}FGQh;5ue5OP zO)-{$sT;CDC{HmN?90`Nkw{)kc&uz@&%3D|L^<&^gB&zkBU@`t7Eu|;QQ<{ZuzK|m z4Z9p8$F2I?pbPHJ*dDH_xJ!%rpbCt_kti;`Fs0U5)=%z^kmVXBSPjmcTzzEhmDR_I z^v|#^=dQrpxyqSQvurN26^g7Rp_EZ4FY62_Th(oD{c5%W#inoOa_<`;NwP@Ws0cMY zLp@`3i+rfoYh&nhA=O)MZX2_`5+d(h`>1zo(zhGPN9ccg^oQ5_tA4x$;TD#y(ModW zRRY4SSSTHj6(;}y#)=_qBnO5~F?Vazh}Ly(Ms^K`b`MDrkAX~Tf#Hgz71kw8U2c*y zy8xSwyO_mioL{g~+BkUGx}MK5a8x}qRVnm)D+nS~3p#v+qEhXXlaCso<&$4O{}x@h z%}*_DGs~+t=d1GKE0!UmU?F|v3KokMqGxzxIRiJbj%=?Cnk=HaP+%06Pp~Cf7#0Rw zi=39#C$^x52v;sQ&Z-FcV)D#z#z~7aoap9Jz}W8pPc8SrA93Z zFvd=4*|aVR2&O)Q%xZO$WAgM-kdsviU`mqkffJFhWtoo3X|@ip?IOc>Bml55Gt1?; z2e}m4!_fDK#nudIWzujLaG}ie0Tu$dt+vRRMOcYFh96vdIW~8>U0P%<5SAL=E9sRb zY{`o^d8Uy``6l6tDiS1Ar2Beklf*tvf0U621F+{_G`x+><|dB9XkjcassbDdNWaX) zqO6?HOgr|;Z|Yz#0NTEgB(kWvT_Le#^r%i$MtGcTCD#Eo0ynek`TRVuM5L++>fN)q z)*7ufOEyqzdi?ugb<37495pfD4GaUV3?U8I2igx-tjdUZt@&_$j>{=3Z{jg7k-xl4 zv5@0}&fHduDuRDY4Oyv@db40r+Bz!80wKhF25xwHWW9lCP_p9Qudk$=UU&V4@VgW@45uX|4 zDj7Ugl{r3SN*h)EY7n;J!@*1;nBbti5GP3HuCiH6NYnL6@#%@U8xrVosbk-WHG-`* z*A;Xr#B~n6z;V>~b+s5wISNBXy^XJpU7hv}$`^CL3(R~RPcFyZF)jsc@S?l~L~idi zp_PD{r;Tzkg9pAm!OBiWu?K02ni`>J+It&?lrn8bfRBU_I)Y%iuY)?^D~_E+_LUDF z0uWAVeS0Qjq^&xR<6iZk9QqanCG!k+q-1W+d5d+(yYR2c*t~0>2!zPY(k799 zK!Olo*Xv)|K9~h>2X8?dZnd3z*MU5hE#kUaCq|r3DOPCf&Njz5XPva68ihoX>N65$ zo)Ze+*a>P|pD`|%!yYMOsFjo+Nl=-i>3*IM2p+u72W736v@f@zBE|=T%eQ`4)dACN z)e;fuE<*d)Y?K#?{kgV0K#vXx-;`Fbm3c(r$;ZGwHC*g&q8bVjl@6{bvL2eIvIMWL z5ZQ3On?5|8W|c#@i$TvVrdHwYQFjfq#VMGoeMj+412B^YBBQD*Jtrmxu-2B^g@~5B zd#XjkvbVoVzlW&U&z@}wJ40dfhV#Pmf($8o@tN2TB{ zJzHLhq4`enE$a1Mx=|Fk^)JFpCoHO}dT1#?L?!OC^mgxY)J}#C=5jQ3HE2eEsCl-R zLt4xo!BrK^9iwh6Je|ze#C5)|bwjHT>>cSgp)Y;DwWoP zpZ|Kkc(^`yH_>sqyGO29Vh<>;sg@=a)A%4>gzB=oO>gX$-6~UA@VET5govnk_aHwh z=bM1SH!wE@pjR6e3k1B3=~t;c)zb(2sG6T^qSL@u1d+aX@KiJ#SgZN8mQUuEXeTNP zQ4YdwtyL?O0z5pTxgwBom3cB-eRMl!%gum^lI;YN8kH@Z=>3Kw4p>kaRC&h2gOBL^ z^V`SnBB=Diwbwdt!{W7heKlt^bMv*B&LVIps<*PyqL--q5KbicA*qlGoIX0(VNoV! z?}WoOTjYfkn_JxKmUI%*grqbp&B5}hBjO$!8?Vd`!z30>J!F$OHXuT!kTwWyBTjVy zXET}P!7epVxj}8*j5{G8)%u7$MH6|b?SPD!#-@oksQ`96YPiwCZY3wzAH`XqQdj-O zLMcD<2(OdFiaZYQqDNL8GqE!o?3lG_~!7+yUJ}oQP<+J@66cW zeS?J72+McWf)XLq3Qg^#>bfINYmqD zYy-h4hB2VQpK=vyO48^E$nZh#F+>q>;D=!ez8X_3GtAb)5bkQ%1W0(xoE7GD6-F;{GxRh!;ek^y zSYedZ)*uze!%>^haQMV(tC@Y{91{`IamWS|KpN2$EU{;>2&M>Rs8?*CC$}oS@071r z*)mCJD3EapkS*)B6FF2yMEHEjOVS-dz0}+_=$+1a#oFN*7ad1|e?pj@`=Xehjv=fb zqCVR3tg0zhFRNq(Z=0>PXm4qV%^-9ajo4&Y@slhl)UM@_gvgTzn3y1 z^j#fZ^1lBGWP)g0^(402EkAn_RWA-rI`t9OSD{9sO^~!u5_|-*-K4ye7J8#w*e$Bi zBuc<3Z8mfmU?hP*+>Ew&t+Ta!3`V-j0&?bhpDlWlx-b6&G?+<3#vQk(M>mLW%t8X6KxMo{%txF~la8348GsTbFX`!r#^EAki zr6`gMsLhdLCvFzYOq9@8o7?zd3={z0LyFDMB*Xr}&1!@cHqQJrEA*fs;61}&hka8Q z+41}S%ip;{LP;H@T0OEBL4-M}j=SSY?HmKZ;0x)o!o}Fr} z=yFx06z5+Wp;ALNDH?&Q*e!};P>xX$C@7Ss;mE61&CGL>C_&JjlgeQ`-WzK!Ob#Rl z>j4qpsm$1l!tjIaLeFfC=*lXN+R1{vG@9NoGAbx@V@i9#(HG%xl!bV2{KyzWq|i2E z79!>ur@1guc|zQgW2?t;hpR~Sh)lhCLhcxU6oh0b(XtQT;l~g8}Gkb&JNop#ZaaekgthZNFoGS(Rd(86%@S9+SQeUT$I$TR_3Q;x= zaAPe?q8_@Gg8y`JYg|0e&b-zlTB1V`pF)HYb-8aVm=KAJQK1LuYZH7sF3UIcsb>8R>%s_IL`Sn=he(q zb;y7~6v3JROF*>0IC&vws)wNMC%2vm5X1RLuWYu+}`Mk46a+*pOF?Q^@T3 zTC2iyi?A1hNn+Ij`nJ1|V4opPh+{I&O5p!-m>LCBva7VH+?E%2RfnQS8cW`I_x-;GwvuC3ygugK66Yk30CB51`zN4Ap@=E;Cy;A*GT^pD zM$*R?CDg>9qr{{j8!S8f^*`sel8aVBGQl$TZM@;qZCXMfQ>joZ zQzF)*TQ+`M`K^Kpm8*) zvy+N4yXN07K>hTgrl0?ZdHw&l?6aXZ@9@`pgTF~4wxG}_I%8ZLraEN0^2%rGbV?ij_^eg z;WkYnsdq@?mb6;ryF;fpNS(`|b4;~GLhX~Y998Usu(@Jk(gP#gMWj5aLgv|p z#C&1PgWct_6GbXEa(9<|W}0j6KpR^udL+Oq3pC^}F}C(|T_Fj9+$B$M0M8EDT&( zB*cKVloUmg&5Xw^jPGj^oHjv9QT4`sBBl+6i(XDdYM)4vBuJT$RpM1QVqWu{^J=~@ zK0n4?dDRm1=@na)gac}ar ztr)rsD9mv|lG4bKpEW1Ub@h&yV&S3*T9sx`rOF}_#|R+p-0t}`Q{ti{Gg!zSav$gnef_JBVO=x27!5k)+7P`ne` zRX|<3jPlnq_XFF8>-jL(iNO#w9!|@hK?LQdq$lFbyI5Lm!@Qe<}fzwRT7C{j+Qka zA~9_j=Em8+m$=O6M4R>*ljwuj|yl_12Bl&}IiKhUH1{Mu65h z%Gjo5wHj2|VMvtS{r>V~%QkY^Sika)>&->bMhxZxZp{-ji$aq2^`pguv)2#iMj54( zyJ;$sDzCIdXEKz;l(uZVq$)%2m<6wGp*!Zfy01A~0FfI)vD2AMPPL{EP*5liauznm zfh-wsG9j*qutwUP)&Z6-5{~{W+}2i^p%kqDRL@qbc&)K^dRJrtVc%4Qi{AsJVO~}A z828*rDfsR!kqX!o!M&3TJ~J_P7sefq3N!N=D$6+qn%zKRGHgvs)|s&0B_32{C=WAN z8Dk&>lSEXyZ^w3s>lHH&(SZBa*Zt>=!0dJlDLQ50;_k zOmrOg5Z9>;)gyxFWi%UxISWqF+N95Q;*mPWCAIp=(9Acr)GwAdT%}u3>L9+~j7e1GQgWYYGy z7}Z!IpL$#cH*QX1W=3o=W}+BKqiN|NwFn}FK_yZ$Rdui^NA~f7fAA0$+1LQ|NI+J= zN>~26Gz@`u!yWor8&BWFh;7LY?@g?2ZF}SrrB!(VwZp;cX03TSo)}NyXV7rQikrE< zmy8OuOwbF4LAfMD^X#ik#zds!GW1w$;bc<1!0DUUz}EAmCT((?N#Ga9e7dwKl1Wxg zf0ExI?cwFJm5zLw>x2Vj&THg>!kiW$GBTe#&O$)2MFK1n*4?pFr54+bhDWk)UZBO4 zz7(jST3wMYpon9B7)c{Lyati#KbH( zWGF}^#LN@%2`T+ez1eRwx_VTV1+gQaRrJhVuwT=rpnkiNRXR7>S|XcMpR(l&OW2-; z5(?$pE2{OBV&jV2YwVEi8g|5?K|?PQ2O?4zB_967W^z46`zeb+PKUnEq6y#8N-HL$ zG5W7WoBcsSt+&5%30aPiNVNUJI5AT2- zYr4`3W<~`NSfmxH*xC7{841VoDxOv3!??TFpdymHigIY} zI74za5wfHG>q#2pAV0=s=rQ!5 zm|#&3GB>s#C5Xy^H@8fd=vaENUH8c z?v~0$WeUkMR0=AwUsZ{NHIzA#tYjhLDmZlspmTsYMg z->!O$VAD%~8l}PsQj1mN1KC5y01#UUM5W(!y!m^%9J+-Fbxt~Mr8KHlmFfW!(Y_T^ zS;$I8qW8?%%0=D(Ad$Nd9fhw%UDR>a8G98&?MP2)d3WeM`}xc};%29}Rd?5s=e*=4Ek0w-iw<{grkl`J6;w_CQK7`op?G#7aG0lnZlL$oN_L_Uf zj#1UdIieCQA$xRS4I%h2WBQS$nM}?oT=`9Y!VP=KJrR-X2>Nn4NUBE~{^GJRav|A~yfu_cHoUO7jJ2i{Nh}K4f}oA) z)kMo?L?GQHXD8hzPz2ty{K#F$fZG9CD`>(?))k3?BDci-%;3vVVbuWeaq|1R^h>BT6RWkq6o_%ceF+- zW9TI-gC)!sqFWY6gxMwIMEzV3n5G=#e%ZXcdjjADlv>AeDTH@M4nqjbv8ai(-;-e8 zfQ=*$L56t4)Ine%RVd5%>2Mqp5|6J~IJOID*G` zl&M!obNv^}+#`>+(K*g~%~b-!hJ>_}10CU>pXB9Wy|!%EBq;K;hn47YwDvlXd$q_iaS*p5g+~RwQly;7AmfhQH|~|-?Hekp1MZzn!j*bY zlOU(z(@A(525s=u<3~Z>gX~7`(eNccz}heeVP>bP=Da^oZ>+!YQ>h-8;{cio9}Zfz z3MET-hs!?bm`H@FyIjl-K2=ebZR@A*kS@e|&X$X69i|{)%yUY8tx*U*VK@h}#$E1y zJs;-0R`Phkz9ll9C}&;+N?ma!J$(30)^JTf*SwxMb5@5qSC_uKwT$k;WU0?Y0L*|P zHWZbuA_NyC(dre87b`E7qtj;1-JlF4U&bv(dPm}HZvHl!OWU-EoW9(2H3HzstS9L{ zqa+7FkHCECfc|VS@TTi6T%Wfgu<-$a?Ztm{&a+L!-QDJl>fG5YGqr-+d>=|X!*_$f zD{>o+X~J0) zUmPM{HVW?%K9|VW4CZ081!t=%-XeDq2F)VweR$+Wn7DD|@=Xj@q-EriuoV5~zRm}D zk5d%K%rR<7;4l}-BmaCsVqxVO)WnUHZd-*01~iOI5)wl+*9n11g9qkv1j%Cn^Ry_h zWsA=Ty!!}j$apIeaqyEo$17U|VH1@ql)!6Eo#W|~-+#S6N2(Bu9C|s=2ie!<*7!v+ z$t_cOhdF#1cwNJMQv50stg zoLA12Jz+6(fx*E1GVUse2fuBkuLz53p<^u5_pCARL;BC^CLY{XTTx6P-ho-!*zgVr zi(Z}}zR)s5zWQgCA|J(xvp|Y2jnxf#3@5;%2Rh(_d9_2h4Sy>qL1`gSyzf zJ0G$9Ww(V{Bhp=b*~9fY6W?E6A{Ok6mMx<7}fqVT?_L`)@*Q*kOCJo}Xs^en}>3+_K zIZv~hWBAZd!rhngB!NpRdQmD3LgA3~n@gpS;~+!bhDm=}txA2KyKxphV1ZQ`_`?sq zkW%Jd1l4WXvSc@Vf#4EK&Oz;#Doo=C>jVVPd|tM;K;QUBZ|;AsH*^#352*rN~ve#>#nX4=9uGfz>kohlyM$RWwgIUg`e*^dYdrn&JP zHv1emcLc_xNO-HMd<6tW)Q|h3lSN{U8vQN2zFzx(Wmy}E6eI)Q#uZ{2-oZY%>Y7>( z*NU&@H5I2PUMm3fAc%=SZUe@)-nC{Bh(+N<-PRJjH|?}bWZVBbE}ERAauj*lb0g{a zrasPPfOkF*t~oqHP0r*^l5Lqb#=V)OF5YnOH{;fo{?>NPiAoVby^+$DJ_ zrQXd$wZUeHVXfIs-@h?)R^EHfn5jXMbFSShPCB;{E0f_dRHNG6+On?o(?BVWABFAddJMx4q4vUR=JpN zXz5IDHfs+l_euHj99%SS;M+$vrj z{J=POgrd>_u{b~89`8L$MM^D`^d{M@38qWxU2kj#t?)i-OR-5L3g=0%8%TrRf-w1?d+TKA#Gt{O#6r;pzE%?wPb;LE{-Cl10pde6X zGP3!^6m6$5h?L|h*>n$)2pLOPQXP>o+6|JMHRvRvZGd-&NHYK!`SH`;&hsH=CF|?} zLmW~HJ&8L|3Luyl-65G>WWJWKb$wx5=+bB%@g0fWh~RgVSsFNI_-4b)Ozx47xrVrATPr;tiqn_&~S?TXPW~Q}K@<5<0pX7)!F+&7AC(i<>QT%l;!17N1sp+J zBOd#WExCFAtM4t1Vr+)VXc-2k8U!`Cld(-5VBiVfJ&?=^BCrA|*%*OcG z(53EWX(ei~pn1Tvp{g4hPfjWN*s9>B&updhVY#T0?QwmQVwe|?gNQr9yvF<(ZrCVHv%>=K(Y>~Eul4m|qq zdqwHw08&J~of3(RzsmV$Y+NNaZ`iExajO{O+Z^W-B8raV?(Rwb_q8y0Tuj1;0Ny6% zYprvP<9v9A-vV+^T#75;4Eru8YY_VbDb(fW#nif&TB?IsGG_NENPjqcwO%9OU=1k7T*+9 zPnkYd%5uAYJR3jWAa5cfX>YFwJ|ghR&64CqvO#vKI-`c^ty|nSg41v0cU2!Z?R&5_ zGxsfLk{b{ij_-&|4(P`im+kH+?l>j{86me;F^LKHx3 ztyNI+oSTZ7ltc%A*qo;aV*aQBJm&E60Yr{6 zuAJYgE+8R+^&gj+h~g0<=0iqXiEy0bZgak{%xT%doy00friZ1RI_-1y0N`J09)N+w zzJ;dnCX@sJ_@0ZevR3a%X_!YvHXz+41^@sc07*naREX&&h%0dO6>ml9v|j6K_(_nk zoR*Rpx03{(-jTm_6oj*aBQq3Xb#s)+5E)QBmKxg~*_v`0cX2F3LAqUq$&U)ji$n#P zEHx&!mHCM{lST1`rdt=)q2{u#9_$4%$vLm&1gcwUzJsTSF``KAiX&3pw&ez;iJLJI zzU7jot+m30nP$9W;Im4|0mUDM{+#lX%E(N!hIj^&A=jIDJFd~QjY~=|6rTX?@k(5U z!H%Xz)S%!vhb6#b0gg}1-JDiQ#(}X;OIWxCKz_5tbGMOsI3h2{9mhQ#ZtP+SKxC4w zX|uq!=*gs^1n)t0)G>u`>NxIHMg-$z0b$iG6id=8-6&G6(J!K@gE2h@&$*TA)zuzv z6SD}SL4>7_s+iFCpm8tiS|IFqsapI-^V(FmEy1QIm#8~2A!Kf}Rsob(x+1VFb!K=M zx2QPl+N}X@V6mL{-{dS+PFFNDq6lSTy-<>SGD*BL)ul@rn#nd4ZYA=>7f}NsXoJ(V zc4MT3Qm$Wik5X1^lg#N3ij{USiadXPl0X&|t&X?5kGzGIi$Wz4RGx+5B9-;47Er$G z$wa_Z&CVcptpRsRc~>bL8{frLhq!xiu$Z}n`@EKHeJY!Z7zt!lGoY4eX1Z|U9?yKQm#4^fq z^Y5EX=7bE1teGQQOl92Py;Qa$&;01rw~MIW-@R1Nw(>y!Cmz=!!{&oKJ1vnIg5s@Y zuk1Vt2sSzl68^pAAn~91{=dSz(UgSkFnGJnH*ghi2~Vr!wiY>Jag4@Ym>3GcYGPfE z=qY$Dyp{%8k*Z39?(&+5XyFtxDU}m=FxgMBA zM2>O6e6%QAU9DJaqWm+Zp{Nqxkkxuv#%qeNBYib-PGRj+yACiUf(IV^D=UjF3wxpn z&DZl6?>>9}B_euy|NC%~BL4LlcVk>||FyRfvZ3u`VU~yMi?wE;P9cqRH#b!U(4w@< z)gPMK(7~!qH!6`@Cj|K-l=+_vWtLAOrgZLPEOnx_F!=|RWe;#UrYY$ zJ8wQW?B$ouyCG9~tJhLgLc&nbqnV9r3_lGHkTkeU?9H3FoSa~`DT@&Ym|nX)y?{kE zER5?gWT>HdRon zSFql`Hq)0@*IH*<3t5*s1}h2{#v5yC0hl1#Z7MmA-JwU~6Zo80icz;9m!s>J({%JG zRwZ+XcBu;N;kq36<+-W`H3GZS23flPLg%A!sOodBYt6*B^o}d^gEz#2+}2#SV!uH= z#&H~XC73QVObqPJkib^ka7fp@eV+K?Ex@e4*2;JZ3Xn}gK5IjmNgck~>lKvfOLL}6 z?IYcaGB;>n#a14=65`%5C)uC7v?#T&Jz++stg-=ssWy;ID zVM}G~JkP9Z>WdRrv&r>>Q@gf!Klzja162amZCD(=nppKZyZ{L}`7Fpc%55r923is6 z6pc7VZQ^4F*C7f;FKwXUovI~I@1v?#?2`zW2E)xxKQ*#(#hEpD|NiXRKYF;n7<$~@Jr!0k z^oZt@yO#i6MXxWJr)K6xtJ0i^=sX`(MCAe{Ufr4_dGli&X{_4*Y&}N3gdVw~Y!>o* zX<05#$`Kn%HJ;!8Z}VEw=E*zaO&EK~gvTgMr3mJYBLupa(Q_Wi-M6-UbWltJ1Ikid z2yCwbztc|U-V6GK#;&>WBCDvdI90*q$Ye0LHBV^R&@BWdEEPLInHY9xAw&iB^tN=PnD0&M{Y$j<42p#O$XBzNLgr~{THYZjUYX0|z5*nM$ID@w?bQC-5q@GqIo z*h{#%$N33-bA4P}J3)dtZ1~EM*geK&j04Z4tyNBR42kEw4m~bH`?^%4mAfF{ z1^_$;Gx?%xE%)_seNk=@7zHIh$sx?efsACEe0`k!dVP^yoY&~8IuOyQ15}g;I4)8e z-HapK7;9<{-5h^ok)EMfZwQh7cS=N;-lZgP_Cvvo!$|8`PZbCp6{XtIJsmCm6 z)i%8?4;-nW=S*&JGA9oCC9~0D3ZBFbVF*zwk%|-Do%u?XA`>=^Mty*rfI|EXTwpG9 zd&CZ{V`@hyB@DJGYDKKc-)nREVG2q+^bQyAakP?4up7vAqqcAgygB7Usob`7Qf;Si z21ZGrq?Ro6eRX_|y7(4?M|;p&At+p|*WrnW?F{i)y>6$p=kicDYBiHNnMX~j_9Q4q z6O&UeE-db=>duaLb9WZ2&?7rn0P^~n3JqR&uN|#(L`lfPRas#3+eMrsL@6t6Ge|~9eGdNiId&Jjc!#T z(9T~D)-XKRL78_;ol8qj!eEyoXRh#a99@$zjtg(8#*wbP z5UXTrs<=CHlroxq4;MAvmfU7_dm0D-gP~L9rfH#8B3F2k!Jb6PImNpGNk};k_TVAY zwPOF~d*F$f#Y~{P5pXxSzC?VUNNROb6%RsmTK^Y>Mqa5HzU;&-O=TR%9h#6(7-!(R zyGfQ5J;*qR#~IG1qB1g7G#CHu!jeV;F6N5wf1Fy$Xv-E{Qn$Y8T>5D|M1a~j0j337n3|%U?0cwr&`V3ciZZI%?)xo1c>OyMM*}^&@1}dZxl;65fe zdm-=1R|w{wx!HUujW{L6ftZyQ4)`J$R8fL*VcK-Fb6vrdS3MGbt=KNEeNG0p^m05w zB329q(hYA3Jb)hwTR$8;i!@WY@W2JS%OK%Y z1Y{WmD3%DydZS_=XWDJ)oSl}NuNh@Z92Zt-0VXD{kkbG{l%coTeF9}hZMT45C+V_+ zZnMfSB>#k1oz}+w7V5nP<>8XwKA(8~NmF2)LlldI);9AFlxT5&&AnWp8$Z;OHuiB{ ziL{T>1^U>iQ3pu$p!D#N;|P{SWk|$Va4=%L@`7UEqUI}82QpMGhd8J-rJRt#1h>*i zSChXhy$^W$0iK@6_Dkb8xQ_k%xgvxHrvg|x(NHm!%T%JlwCaR(I zZtJq5wxDPsw{4FWAr!-Pd~LC%wKQ)#qaJxLS2-pm%<5Epnbv>H7MKnO^?yM%Ki`Jp2eUwf6$4JC=ug;=D;^KwU( zzt$2G@(rYwW)H)Uq6rZ~U&KTzgM`}Uy(6G3G`{SS^r{@rRwkk9aq?l_5T2D#DZE|x zm%HfLZ~3-ql93c^v3vN4Fz%9V^Wd1DhQFVcHT0_H)6cv=K=(Q;`83E4?r#2YK94Xf zMKerLdFeQ+ADbs!;C9Z3oY7n5qowb1R$ePtS~V2jb3C-maA>(8Y*1=EaT z9l=|*MR}N7jzV`pB-Ax4g`kz%QKPb&N=nQ@%$tNPA~lI6*Hf{eSgR&#RK+O;JSK2n zUey(sfjix_BIBZZ$=@Z)5m7}MopbuN60avL9F)R}1Z8G9=YuUIZL8*YmkAD%ia5(C z51a!jEm+IeLS>u^EZgIMr%HHq_ciBA{R2_qy&&nC(T5aO}wT0Ov{7aY; z!E{uN0c<3S+RQ9tjC}VUsSF&&!S?KK`#!UBO{TekY_-3ljTa(!_RLFlqJiD=GACP5 zO{YQ(cgm1U0j%acJH9;ELD4) zALFtS3wj*K-PWWfg4{FM4OXMlN3A*g_Nn5(Vs^u$BmUd?Bc|6BTrMMWEP{4j4)DN6 zTquPV8#Vw<1pF!i8|u6uKxS82KimJ;*tsrQlH5ibm&iP)dRC_A)Bk-IJ+6kk?CGw` zi~#nB0|;bsO(QcIWh9$DRp(?z;Nt$dvfAE|KuXUDHL9gYc`pmL+hS+F>9KiN)q6ut>Jh%jq%IRe;o2T&b4!`~Q~+zLJejihBSL^0OK=PG_I6h)j<258 zqQ5Si?WRuABkn#|MeqG|^Z~NGaxNx_XNr`U8y5l0Mo({4r zw^>!vw6}s$0zquHDwL_kK<@^uTFr_E4P%(C`~ao&4o}^$QF4j9{h=B;EHj1c7=gPB(_hoTPL+H%_wsr9e>|Gc+H@;4Ma9f!BHtkj6_*>$3j z*eyC%Sfwi#2E*pC?!{#`JX0*&N|#h~Mdof~Fv;K3F!ZiDiZG)RN(DCj-@>uF^jNQB z&J3<-aKxw<10Q_o z-Ygz4)v*xf6XDa0l@Ygq#Xix@5sTK|dAo*M?03ufo1v-OO1W7LLuu!-9^HhJweEXf zIBY^yj9N2>Mr&OY$l%Zf_MkAFI!9PJhYtMm$MKFIKB^yx&3w+!V#`=cZ82dQeB_R$ zQ`NnzpX0xB?{9&-P4mu~t>TOu1tg|x?mKi#7|Z=`6Jk*}vo*c)>7uPd#uSo#@K>4d z=!`g;$cZJ=doy57YYrAwIC?6-X~rF+GQw-bTU42EhZOGY7&g~Uw3bcvW38ni1(Eax z*Pg%H7FFW@H8;&0%QqWsRROVDW@tmCII>(HxD+R5x~|XH>&NT-LFM|$#kjexIdh1h zLkDbi?mib#2T}lc^ELEDU!5`@wD&6ubi)31=YFcTC^@OIUx2ll@v)R|e&ed6_=sl) zK}?jM84)EBcfZ%Qu9*$InfrZz=2`Jb3ML}F$N(^;cqw2%*Zmn2fx@xwk#%OtD@IN+ zQaQ#8rqec_#M5Zq-%=oZG>~;Vl>+{U@!k+6Xh!SUCpX^z2vI_WpO zp*~EJVla>=9Iw7o79Kl*o4P4Y(k~Fgyb|G`$H1-UDy8&GIttiCsddF>#=@|D zQtHJ-6&J@^^Y`anw(EHQ9p5a*xE|xwMQaR$&j>8VY#G6HFO^`d z9nI~&KZO+_DU1~%Qp^#f$37B~I3gNeDJ+o|t_tj4haN%D}uYe+KI?;3ScfCIgc#( zMlhYa?h98hv*7vJn!`Nn6aU32``K3OjWrYH%x-EW=E5%mjA>PMT|g+Jl2OnQlic@( zW%@CWUadO$ygwr^3*?53tm1%fANdRqtm#LFsbyq}oBNsecCfvK+&?}i6ICL`2sjKFj=1ivmm{W% z5FB_d^pHxRW(^mCd)_O>m7x$Ta!-`p=FTkoEt(A~rH6q&BI5+yXAd<*m>E4!;|_!L zWjN5&0)&dKIMi0It!n=)??q63IMRo+$F});{V_6Yk4`#|w~EHVFY+|pe8Hz%pbM?XCW5H-pnhLaHn(AFv zRV3muocZDy#k5BM&Q}81ONcNJNl6 zT0scpnd}+n(n_-olqKfXyz_jMli6+VBP!&iI*Bs3MUZrj zT+yClgS}G3V7}u7Obb|y_HFj~WGGn72#KY@&W2<{M-|pJgzMKv z#6ktWBkssVc$Un@+rGukjA9)>IKdhii`G$|yc!hrg`BdStF2{otyz&Q^PZvL3f#V! z8z#pR_L$syTjcnrEf^GIardw5_dTzV_aB>S5rm?uYh$BIa1JDYb_et2d^#8UQWB}M z>0kHn|NHa5=DJ_!hw7-2$@}%k>kPa^YfY&dMPF~39Fl}jD(Aq zFnlkXSPxX>+;ZQ&-!YO&2=36PNyf3qeY5o>vU6tfvBLz(L9Gh*PG~>K+SJXd;RMij zmbfMEHo}mDl8wvHqXTb%)cg>STrF_1T+Z%T4-t0|w^vcWK*;S;OSLF?tOrwci$aq! zb}d@QT)lw@p6Mm4*OV=!0=fV=zokr~*NrTr2q|8+Y+c~(m|OQ4Fe}V>pp2*t^ELEP z{fLH^ifCZ>x_}U^#xY`ca9f0!GM&q=B=V;>@lbD)qFwE#!n!t`6XDq-kJl*SSH zq4|^wiID?_G4ycPO0`o_Y6-~k83KAP5q6PK88|egKuHvs8H8Gg@dHZ+5j9@`Qr4jt z(R*ghf`+-S%H_7M$;{{R9^*7$bCQZ8evw%|-v5RzH=Z24JLo;I4O1PO`~SJFqSc{p zoAU~giA`a^fooXS*aH%uIV!>shj=(wWxJkWS(%ksU)@FirqQx4yWJels484)ysdg1 zNs%gbdz=YoGZso_$(>7WLKH^l@vacq<9Oq==K|WMNji?)aQ@AePKlb8*4z{pIE|c5 z>k$QMUMdhAQ8Jw}=-gw8OFN+j;<}iKx!d}Bx`rBDE6K5#fRIwhMoZ0iB4i>j&;|sw1=5-PpNp*D0%Pj#L28kYGh{^+b{s#8wYR5OU40C2VG!UD+a%sQCb4 z5%Bs)G*)ezIop58_4s1du!GvXyHN6y7W26>Si;>ob+u*R545as5vZL=c{s=LOCI_c z;^2f4?agFNds|Cc520_l<(l?L+e5<~e_m@c*f<@fG$zgRz%ZBeMCvoeLsSdHO(sBj zZEj>oCs9{hj}=ZZ-WoLx19712>6 zHaE=!Sw!5=5`iq6Ma{(p%G(wgm3HY`3m>&PB4&809(Ll|8#LmSo8R|^Va;{@`i%VK z0C-@stfDGojAPyNJl`4RB;N>-jeFVlHQn5qOMd#Ft&m0*VY$6QzB+4V&>;E>OktFm z=lOo(>anM@?Yt}ce}Tdwx6KguObg)UW)zsSWu`hf*~DhVY$PGTh&cHQ_7aJ}7M#vD z)95g5El6y~I1M(Bn3!%}lj!jp$4+|2g3{fAk%-xF&X(Nn`xD-b^ZbCGyLP#?aEmzk znrvi#O(dpMNcbqxG?bnkb7u-_)7SOu=U@L=Hs9|*PAKcvB<9!gKF^P0q=;&U?xA%I z(BxY4nqNr!J&w1#vFftLOd?0r{o{pePj;GW&GI*3G@%CU35e|V$F_Qvv%YpI$l1UL zLQX8^%gC8X2grHR8d2u5vpih&EzBgOYk+EG0|w4AXj*~aAcx;qy4=fK7$*Sj zBjMOZ(HzehG7y*~g3ox_(imi{^LY0c1l###>z-GSX-hSN=00R|Z&CM4Cc0KedYNZ- z4kB?<3cSc;9AJQYjN&l7*Hs8Lter!zk|Pyrt-?N$JYLBvnjg+3kpMU44>-_h<)}E5 zF=J+VCrrNs!D>g%WrI!|VTm5myq?DgzVYo}itB$P@9 zO{T4s{)@=)2>moL(Bei{2@x`=p6*a2#_5E>0DRy&;tAikK8jk!QGj0-LK;hiD_+2o z5#IM#7^Xv!A9JOlC)~rEh22xz=e5?IZjIPRmcM+A<8}VP*`Q;*&mVy#mf*%#-~kqQ zv5(zfQ~5efLIrIr?xh-KC z$BASD6e~K82WGdW7`5y;>y*Fp--l#h$1ZJitdo_om2UwzFCNGQG;58VZP|muQqAqR zU^?3QU4&hwj`Q`w6*JV2Bz#n%Mhl59c5B;7+v3%;5>NUcq@g)gQ9iOT&rJ(D-q_gZ zJy-PqSeq-S(Jm_Wxb*wf1{sD%yMf51L`r1SVZ@WBWV%MrTHK-Y8|LI)rY_9^lHNAX z;q9h#wf$#Z(VL!E+|GF9RAIy|$;N|8UfvA`+g0+?fq+n}Z`2&@a#|%dT69i4AZmV# ztU;G92f&<~va62;IBn&BB+TiG&cjRW%Q16w@Dk9)HxO}B4FxDEqe z2z;E#ilb9WgTxWOOq+FXnMUKGXNkR>rVArpCHx$o2LN8=qO(PAWI&8d5}Dpb3cX^b zau=vGByDjmqS(eHVu=b9IUTirM|OqC7?rS6zZeGyQ9TrZA?IEYE2-+CdN>glCuQbj z-iegCAB%rmD=BCF{)AwS(B~SG;DNz*>74lPS`=yi5oV6Ws{h$>+9!V z|5)pOogc5`qr$o0=a2Jv$6*oS9vUdpl*WQ`PonlKB8 z8VZX(&g(P7TV{|oV#s7k)0Q3}?PV>+sF=e#NjXhX)ygobf$P?duq-5^b=kp9;Kn6-YuUQ4&pYFl`hcWLWXy7~8p7-#b8@)h@@UyCTRH5T z9Bhf|f@o(8bSV_xh-TgpV&Cj(DiPO2j#)Z1kce90Dwcb;j1P)qq-3A<7vi7@aENFI z=A;*&+^1oIyf1Zp>VniY8Dn6OY-SoX?X7I_7*s=EILL{|sim}OLc2$;5FLx;w9Js7 zGvvt9JZ3k!fDe6Ae%DM&b6r9a@0%BJBrj*aZQQTRE)hkT6--kWc~)cSQPFC=o!b$> zYG!jyBLBL6yZawM{+;uSwXooiN<_e)OvPGUKSPJGGL`FwGI4?`Ap~G3)ib`G@De~^ za8@oYmXoMXtoPBx3k-NfY`NX@y6?{%hev}OHWmClEhri9?6S4y4aqUSyE*R-;UFG5 zj`1R5I{Y|ZN&1diQdcEa$+FTzn1pl|Mh0=@ef7B`cAoqF1zellXYg!VI1iOU`C7Nx zQXR&tSP`A^u&MXpG3r5jVBV2HOTraUzk*pAZe1jf?w~kIOTiAdVff37X%X>M)D-co-ov&(yYic_aIT1v9u>t%T`_Yl!x3;_KTSlG!HSVLxGy*>Sox z19q~U$FZ<1Um`lNC(lHma#&$L1!OA`k1@Vc8MXtND7QKsmX+H1K=!`NLRFl|F` z@O5fXy#;=}DTq-8&^KA2l)0?EeOmyXdY0hB#*<8>D*ju@oI;CI$u%>xvVEIbggL!LYIt|V!#C74m%=NJxYgK9`3q3jhxmkqC^l*lpfuf`JOkC z>o^ORjT9iWHO8^l5+;$sX=7Mxf>=_wjyqQjGh9r~{-j$iluC&;ud)-rTYD?LL+ zlczW|Gb(x>Z%;R802WgpRli`(sX}j>=Q0L|sOIyPrP8@ZLbg?sOv$^o*7x0DSL69w z2cznWO^eOAo6{Ow&c$V9e#1x>zM#yXDXLXTH!Gj9w?@ER&g;sVsHh%82PdLXQd-ti zN{ay%mT2E?m~FAB6CxC7^D6cVh1@WM$r};v4W`}K{T1@x6yO!b)!Z_fWT}Sz?8uHN zAY-=N?2f--C2+NDqcVnW8^C_!9zljgWQ6L6dSDz8qPgcYrd>239~g@+C&Dk70Xrfr zhrX(k*nBp(4YX@1L~gchx!o9IK_csW;hrO5Ju-uc+StBQHP@Us%fi$^bqpObT~2+M zw8ih1L}s43S2#U{7NCU+xpB=zxBfG<=|lx$ZkGh=E#Y`9EvC$I4&YlusBYyBVY;EB zL*M)Ft)*)Ri$s;ZAXfUieiQlY{BSc;INB#xd0Wa@`@p1kVlGf`%361gexfplKp%_u z=;80`keL+|<$y2Q3~&p~yRl4wY50bo1T^rfq#4&(UWbz3l-aTyI3_R6VI{Yyj`Mh7 z9}dGwtxV||+Yu&OUp)#2tC*0>k}E6ziQhQDC`Q+ss>5kf6Z2r{R~~MosE~F`A4biE zpO#r@-54#YjsfygSuTsW-Vlg!FzUz=Ot@j)tOwgy)?^37RXpnoqGN=!Wx=|7tQdc=bbzYE3f#uiiPiEa zl*C=);>a@0yvdjHX_SQ9Y+Qf5YduFX)t*H{5AZd9j8qKOJE(eOWi`zf6T&2QC-Cke z4Y6Z z$3SB$v2d`u0}4QgMPW;e+WQcBFkvjO($L$WXNb9-Ez3fq`l~u$ARqzDHT}D5tvSX~ z*8&onMbvCE>(}+`pMU*nYn|tN=uzB@_v?@2IJ48Nu~~$mhXR4^m6=E)q$%uVplc#n24|BBjToX* zkwwf!m+4c7rYCPSW{)k-a<3WNm7I&dwag?b7pOnvNd-mS5HzA_ctSx3(--QDwI)8F z& zEyp(!-Qy4MU7}t0=NL!5?-)9U_i5d0O{80*i+f()(gv8zi3VUB?WGI5*ShX`4LzWv zL!VaO7;1^bc=5wo#G;}CA0~^F-}l#+$fv$2e`erS7XEF4i91`_e9d{UH4`e6i$NU( zCVM;zT4AQ1KBxvuv{EZoycM3MW1Q#tf#)0m#@*$&Djd|1bee7OQJHqVnUt!E3M->1 z%zKn|bFGL2){51c*|Ld5`LfjKnoHdcu?o>V1ci1FN{gjdr|1HvbzkidTTXs%l9S_* zA?5WUDSYxew0pe@d3@+LW2|eEGZ(xd5$N1fl_hgUS^-KuOabAQmGLREc0y= z$w-gn?ox&M&Q$d+W-bz&H9x^F@ABBsKSTAIS8KFicJr0#E^)SazDjw%g}F2s*0PDI zHHY1v%*cI0v0?rULhY?fK>TxM(F@teA$Y8MJaP^;EwD{Qrsf@p5kTgz+aL zgtk|NGm$gLI_T^IMpv}7`k5b|sQd-1&F%kbjzPQ3vc0Pkc85w5&ENCfT13tLx<2tj9OD%XK%#rzwP;ouA_E}ZAp%scB&&M6D|3BM+$KQ# zeb(Hk?+Yx9TlpuC@vh<$l5uB;>M}2e_~%Se_S4yVgK!eHR9q*P6YGc+gq;SMkbBli zyCT5nNZim4mxL8HZRj(76gtLhWL8PiY`4s(LO+TFwicJkn;PId6SO!rcp;i9Fn2hT zh~X|UHzdZawQ{_KNp`GvD19~Vc8piKS92<4STvQ_yqL2AlSs_Q4qVzpTr)3~aS!uN z5NvitZKS$eERPU3*d(lHbsyuEU<0n3V43kwXbbEqIjwmo0pG9EhM7%yv*#nzTDjh-Cw`fx^s`s=kejg+65eWd9@4OUj2%g!>}WF z<3#>-|8lq2`6FUg7`cH0P*@<;^P$3;or)0XXon=l(lN*|TW%&Y)>?DkXnOI}-1h}l z2Hvde{_M3EeuiVbOKNB-p$S5{&D$>D?xP$AyAK_h4XKRteD?@TJl=H(hc4eE4TLMK zS(GGsVjGPhB?qcRqmspv(_D8r485me8b%nk`kwR7eyN0%vJ$7xEV22|O<)Gg=FR;t zcR3NW3p39(-E5kvjv+fJlQCT2JWDfpba_A>ve{llG*fn1>Dag+c-!j~Z$#JDa(mOW zzTBBbRkUG&lfw?$!On4mca*=HH=k<0Ak2a_c=O2cwy~C8(O2KD><m|s%A`g!FMn)RNA;xPf_%}mC(v-Yu&n&vOMTZBE6s`)bFl(Nd<&@U2?1^Ax_|B#G2F?1k9|?< zOtzY)m+Tu*nGZ>M)wdQV{>-L5Hs*?dx8G;`)%0fc@UrERSwC}LlT$@<# zUwWCVpWScdf>yd?1=%Ibm^Pl2D`Smi=RuWjIk(4;wd%53I{7xKCg32yM30^)H-BEi zQ$%hq!s#&3d|7yfUzY=-7|fe|(?yvrbHHYGN)ogxCJ!WRZemsCfN14j*L8hj^o#(# zVi<-P9zV7rVQl}jxVGG7(M5rMIw~wNj4d&~RNKi;t*73ZhjG{@tt7%-TWtNFzo!A| zzm?b>$I*tS`AF|we|c0qH}3{U(H@}g2u?&8t^6E8?)Eln4WBN4!u$F%o8-r`N$f*M zG?5txnRn+B(c^r5%h{as%iLJFx;xNCCt?uDGnOtYKjwKN(TSZXf&vmtc3&y)N#&GxR`eb&MLsW58;nvjj-o0Kw!gNIBd2AiysF9e*&z}QM zi5xn~H>N11LAhXF9!jdbP*|Y@0nw5ol`;%|6wti9NWI258B+u8?B)bK!Q64TExU7X zwl-Nl8H0QK=gwgC*;;Ge^RhL;8w9Ppyc{{;yhW6qs^w_FTnm@i#y77*mVZ}Yq+dxi zoRp~J=ekSw!f6&9<4{p>#yMDgbLbf3z#|%q0=Ij9!B5#oaqx-tObp(U^ITC{_|q-c zFz-Jo(|lzZUta#gr9n+*iJRRs76>tT9;(b^6VKBdU2ql&LvG@a?M5*==Uv?VQddH{ zbBqIw4GuS8G_GdLgEFz|6+pRsj5Bsh7JVb!0$CUh_a!nSB4Z~8uPAOQBNVBExeVs9 zkd&uvI`_cUs9?-jr)bM93-Aa`TUTCk6U?+4S)ntE4AyK`!)(f84gm(2NiuSu z0+hAP?DywCiTNBa5yt7a<{Wxp@qNgdn^;ufCc@-A1|p0M$!STktBFcXI`8>uYqIEE z*L{CMr+$}ueBe@hIvlPDXYc3bj zp~o2KdAykUJYFIShj*Myo1L|iP9CE45JEE_=c`GAokhiW8RRZz6Z463pVf{956no8 zPA!_sTvzK3&KT1^-GA;h8l%}up%ep79AI7UVlf%y;s9U{SjdFL_!eIapTDI5#@Z5_ zvp?BC9`NqPu|R=cX3&FF9tH~f{4kQ({H=yt=>&F13R#72aru{U z2IFrSeDrNq4ft}D>04A!4}LT;KV*C?$jl_>-nW#TiND#R@*h%J4jtCVX=SWx)7;DG z9(%lOtI|qmmFrzVi)ZBMUICfGej@$ytE~}!1IaZ&4S#z9fRDHQ>Knc9wcuSwB{t4< z$JWVJB5>@NMCQsEE+-aQb4r_85N$C(wV&L{koMUb!P)aKTKjUeq%;%JoEb`%ud|b= zYECssBRkPm)!mearR2(NjSpTI4#ND7t4V@r@6n_nbb8^thretQq@}3wvrWrSDxK65rvv(w@3UpBD(=o zb$f^9;W*#XT9V$G@SY0`lk|IqGJ_0jIL^=s-*GeoB?AubX_G}m9s^yOJJt>vC&x^z zdct@>`S`-B>*Pbv!bZCrOgQ*S$`BvJ?VXb&rC`Couj&)j{JeW=HR;ROTA{l@?=vhTI~!oDR86VM2$CR$y3I3PL?aP#K<1@Te=9?o&L zz&l=Rl_1-qv#l3+YbUac<_fz(h*QnmayrX}d0A0)c}3L4+>RM?Cdw`syRh0FoyUiy zHSX*BteJO0-k4ax{sx1igkeuE1?Na|Cv#H{d}s$Qm4RS1t!Y%5%gxqTC7laou348n zGa0E3*g~RKAN#VkqNHYz!7#$3K^+(%si-Kfgc=#FHJ!-pibofePZc=puwh`gF6UI zj12L*fecoz6;(C2Id}VtwO*+vs#d_sGfIyd*3dLwy3I9LP#?&A*;*CjdyEsyw4nzW zbcoq~z`k>t?-YSQI3cl-Xy$=@ugqG~Lj=QT8_y+eo$JQD34dmVn3JSwGjtrKMGW;p ziWtpJ^cbnpuR1=O-s!62kB@&pj@KBcigeCcK|5Bd2Qw_o9L!H4b{)f$iUd@w>S1d( zyNF^-EIVltaeY$h+*$MWoVpDTu9`|hQ_3~+PmqA;EwC5JO?ik8M_L%D^n!yMs-d!R zw~lJdur~=hL?zJz(YK80CIQ+yswC~C9E*!`-X4jpahV%VIzz+opUk!JxU4;E_hR2A zk8VS|TjDv1<|K&9Uc^0vxEZQ~R90!^J=s(8^sSW+DRp}IcHuVbO6tkg0+DLX05uccF zg#prLk3Neh&CJu=)+J&8s+SIiM`&V$URw=~Z;gy~*NA1e`OFXH9Fez82#j-Jo71;jyUIWGq8dF-4ii&om*7B-JN{%w} z5qbo5)NPJJtLmTNSmd-zWJr1_JOuEvZL#KBER+u?+=H<(mwr$-K=fo0^iDsNj}a zlvFftV-kSJdIqe;ES8qp}$G@VWpN}~;?`p4EApfR>ho6uOKRjP*G zf+^Y`RfI92D%J~PfpI3)LC2Y4n9KRTr$65BvfsVev-WE>Jvli!=lj0%zWd#K?X{lu ztjjj?)A)b+>c|NI1K7XN|7HMT02Y54jI+fPK8i#*Y zUlhL&??i(EAZZ2=w8h{IAOXC>P1#Jz8S`_&IT@a~;EHs@>JU+R0``{Bnv_W9>N_mB7PeesPq zzO3uk^rBSHimk5xr7M&N9{cete&d#lFWzzU&9B|Od0jc)!Jqd113!A}^?!5x_^CVZ zeEZX%zTUlH0;k|){yhaJo#vXd-fJ4e&~i9 z{{F;?C+GjQx^4T$yYBkkJ$qKJx#oR`4<9Wq*#BZ@&U~~O z82o2G^S~=#`4|1~d-q=b{`db@Ap`Gx=V!n8#fLw4_ug)88qNR`H~|Ltzv-sWUUbp9 zdw=h$YFv|VeBB7_zQ2l ze$SSt_iHoZ@`)$F|x8J`1%<37=MG5F<4^wbT zO!j}}(VaV=wr%?caso_=2{{F){ZC-})Tgew^wMqp)IICMO=Le4Q*t`{$tf`1v17ye z=WqVfmmUVDQzkByKZ~{!hRnCXgkF@{fo;|w&TyxEZz;yP_`Ma0^ ztNky}fBvrh`yT^WfocEfDPPaW9y_vY*T(su)BLT)1YU8)P5@V5y^>2xf3yC-`d==* zaPz|tKfd^rm@KssfYYbXY}|MjvRCS_%P-#sV9yoX%a0A!>-zQGi4&*t&vd|K@tJeZ z>5d;i*;}ka=`4P3-*(OgE1R}&Uq?(F14#6S=hUe)YuBdPX9(I%!_GGIuALjc@b8ag zuP_^~E!6*ut~!sL&JE;J<<34p1Ng`zKi;`>L;p;@eM_?y!vvUIdg<2t??0Ho0!+F5 zvloHMM?UhB;Vb=$uFij71*ZG=AH4YDXUsn{Atq@ishp6Li!R!H?AWRAeCP1|mFaA? zIbD8ivCWGYmw!%=967On|G^i%aQpl-)0ylozRjkud+oFT>aQPIzBt^Nr_Y>z({=x} zY14(;HwUrflJiJV-2{c}G4@dpnbI-0+@(871z@r^tF z?!Qi*n%sB)p+9-|e`MNu`LUx%pSZMa@Za^W`|keSWB+*9%eQPfyS}C! zKlbJlAOHXk9z5~NSKWQyc^hv2;GV6|d@A4~h}qZUkDt8ZhI_yJ@X>#`^Tk^>pIu*V zW^?DFJX_WNmvhg3%02(~vXzzfmp$*!cf8}v-}=^%mY=~=Sib)C!+&_=m!7-(Q(Ly2 z^)LT??Uv1JiGheMzU|o2-}cb;Qp+4T@WjXd{F|Tp)PJ9K)|yK$*}U!CbJlNI+pV!5 z9zJ=`J%>)8p1kJO=fCAGzjE%m=lB?Uj-TwH(3QrXLm6em)Ovb{^T`3y@ygDRU75i%oMu`4*{X4GUjXk zk29-bY^JyT(C51DAIg}@SAEN(rK6^9UGH{ZXk1_KPmrtIJ z#BAxz%{)mGGv8`%+4^UimctwjYUa0P<0WX!1cJ8k?FgH>XY&zpb|WsHN%@ksQ_0Nh zYdW6HJ?aV${On)O{$H%q&+#^DMh4huC}^1jIiD~?Nffx-xLD|!?9Dvt>|az22MiE_3Dv1H-gr zDDu0J#q_Xxben(7Kz6`%xYk3VT|6%`PN=kcwWK(*v-E1%+=t;xG__1u_%Ll7J9<13 zlj!Oz%l8s}b-V7-nY zJ?pdpBDvP1_uNa%WCML{%ei7N5xIRUR8JvdwaFbWFqPSci;c>Op7H2X4R91SKf^{N z^$~vt#NNd$k@KjP&~u#A&}*Z)f>;WIH`5t><=ps~^a_?k>sP#+Tg%*X`b#_iSYcG@ zUp|wP{@rBRV9bMjg@`bd0IQTqagkhBQeb*)eqHmRiaSJVot11j*y6EFz*~#3{$TbN z*Ga{=nB5p&1g#hf=?|qsd`PS&n$?bE_15yzR?D1!@08mL4(H9POB9ArUDsXv4z6mR z@2T3eFs&Wx`N&7v6+&!<@9GUxxi<*Jm`KhdSIfrX`kSY(S((z}&#oS0fb2||3-jcA zFnXIm6RQW}2yIFv8Z%G%Ur&#yF);$JP!ca51aCC2Z0r z)UVLfw!~0JxC^F?UM+-HsV*C^*x`7C43GMg?%XiHQ@u%z&g`3~-)v}c0#(xajH)@4 zK=FJocBm&XLF|9it5xr4SJf8!FkxtO-I+0goRrf=Pv56vXr>heLp)>^jxJG{JLARV zu##YUI)&n9OI_Y%H_Y3r0ro2<))qJ-PF6CZ;Db4U2c(kHAMVqP+@!9RO0hUWrVsf_ z%iU63SV9Zu-A#D%VM%BNk}KAhk&!0$?|_-{X0@2ZL;-P$iYYC2iAk|`fo4)9$xd5hfxgLh_O2H$AELhlFR=O@&JQFw> z9!$3dHnMRnja6Wwp3GVcm;RFtLo*o%=C6v0-5LP*1R+$WrQAZ)uVlEh7CG+fAs2tg zzsxW!>CmSpycE+Lz{N8h;Bo`C=N==N-8dFxpQmAh@LY9Eo@d{ z8#hYPL3^JRR!41ZX~}B)1Oahk+h`gOm7bbaqqZ;-qr8cNpS2pX=rE&yU9}SmK`k!T zna2{lyrEUb+cXAZ<7?(RuMu#r{t$3jcM5o% zz}dEdb~fMibU{SRgtiS>dT75fL36AKLtgc0;+&Zj#KqjO6*S4LxO(OowwVez2059> z{x06?T)H2E4OFSb!TM1}8{*rTw$5ra=IU~nkhjpyrkJ;yGwjs>QAO0rjh*@&m8NDpxSS8;5z5i&SE3c}`2TY~$jDHq>baJf^@G zEKnF)gu);}&65igw6nR0#WciZM$W=x3E*+dsB=E7H3O#eaV*rTDE3nOU;3{~KmS}l8OqAiR$T1&GO za+nxy8Y&a6LwYJnCt0h~BY@K;l!YswiKF>l6}U7VFr>0i)IreRkSj53QpHwhHYq-$ zj%5V^%?`9s{7rwFvkx8^LRq zxdd!+F^g)DW}*bVv~U(oA~gxW;2;#i25m(Veq(82EB{|hDm`jpsauC>L?F%>LayF8lYe+a6~|x#1vt?BT?s^Jn#b{(rz4GPJOMs>>*AlcXg-KELD|i%@hj5DA zG@*Jgb}AVwP-tkytKD>vq^RRD>B<$A#ho@7I($Eremwt!fNaa46&#fH#cm(lP5 z@lyNfil?fLeNu_agT-T{>7iq|xhSRp9<#zjY;kYJ1m=4n1!M+HD`^bJ>LRRwf^DvyQQ(l5Fld*+BJJhR{)B+%@#w?vRt>_e?>f~86 zWXfG1#B@P*u2wqJUie5GfpD7-q};R;qMmvaNji!)PS!Hs@IqL%FYJOA7I6)P{Yor* zi6VIqx>$B8d(9MQioK=QPZiKhk9s_mQ0GuIa^{tH&K5ZrGr_W+kfCtX%S?7}GkB(E zaHkpDWmudipUFa-RCjv_`rgpZ*2?`(h>9xZtWl@)AmYnSTBET!7-D)7!_5KR^`g0@ z%Gz+#okJ9(-ONd(2i7`{ub=UhP0*PLb*&Iu3Q6_lY}N<((YqLV1+Ih%j7>ML(X`eS zj_qLDsjUWeb+d(CIo!IVqT+8LSvJgUf(|k?yAw1E#*-_}#z-^4i^Q_Ew8_;md6Hhx zuO>*uthtEt%>8uH7^*)q5UoEYGNQyouF?c+G9~g zBx8wJbdPzCZK)&j3)k4nE&4O96$8zb3QQA+nh_R+K=TGv*~IQt7~446)l$n$42&=q zz4BLmFc@~I9iZg^;Kc!WY9(UB?*z@s2aSRqB*Tcer`v7K!XP7+;xR|$==vH#3r5qH z6uK>3899b`#imCET?VFH(ykdAQ^drWCLhvMbLqR-Be!u)s2t{lt)7X2h(ZTisA~A3 zizQ>58D(@*IQ2o)6d|Fi3`#;+l%c|3O4pT3%PRI6cuuMhj)m|he^RR}fuZeKe6B{& zI%8l7skpbqflX>h6WCt1$!6!?0r8RG)vV z`Yi{F+(L*!t;1yR{HD7Co&EsL`zE#%qgdfE0vMn@&|NX+cCGHJgAow~_K^ zY7ZCr`PELWhOKS`G1LwAGHcm`&dPBUIjxm;RV+b*z>yrSN#Uhe zIcHiG|LdY4kfOK^N55>XAZI z~z19=@^&G@2b#L zaDpof?=w!F3lxt_XV!jP8q+er$%4ScFeQ$Nf&ZBHkqm_eL9QDru2%(vW5<`sZa zdz_B%J_x0o?DyFu76ZBO#%FTah_OTa$SEj?4t!oWuEnsnFmc!jEU@B=&5Jw9E(+gL z{n-9ly!0hFsHG_KK$GdH35Gp{%}YXQ+A!7{ws_xl)+k7hX4506UJGWWvQU|O$~mm5 z)Xoh!LR01xZhCMC0*WlvCXAwIw3@o#$=`E>Xb=ss5cp+c7kAK39a^Vl1_;ULmV>FV zknM^Cr3LBUjm%nzoBNvZy$1a(n{hw2!ft)8I?mkc7yw(@q1IB2Y7Ucf%@wOiuR&kX zX{7A@5__+40}qJ0y~2x03T7zZ&%!d`z>!Ts$wypW7ger$NMs&Cq2FyF=&BQyb@M7ie9g@PH3si&z2MlkvRi-~8bM|! z;W8qO%BmeHhc2^JorbKU0TqTVyT6+V*Nv=4YgWXhCIx0AY#@XS#2^Mx=eI&1&j(Ra zhn%XMaQMO{LanB!wSwpEt!tlf_F4_)iWSH}?@!`8Fxq?CiDZ84A zHYLquEQSSu!OA5!(FR_5I7H%D9O+oreIjhC9C)7?msG-nTc(C;Xti3h@Yr(8>j{Hi z;U+@8)cI{nCnabXmE%Z56NK3Y(^hk7p+!l{#moG#xs4$yt_$*#ZEPv@m*p{ey84EZo+ie+>*r~&2wc`iEWC{ zv8s)1fSH3O^y@w$VkFIjnSzIAY&EFe8;mQYpxaYWC7YEvf}=tkemBtZ>bZZ<9g}MN zVRa0kb{~SMck_6qTDZDqH#&qT69x__gV{rPB6Co^?Vi6@2wJDSIE33J0RGC*BopX0 z;CF+_A#~A4hZeuov>L%tA1J!5jp;O{!ax>M5>}j+8t|M9tI}NlO6}!@@E|Y+fNX>> zHPA-%`Xn|JI4q2J`dzwBbX$v45Sm-fMGVOe&M7u$q!My}c1sOy(%}uFSnj(nahCEN z5QZj4#b;#aOIE#!5$q_iMws|^logkwln!SJx3OG&`DC>fwx2(m(F$}2q6+8j61l<}8BlH%EoOx>a zQA!;LE&mwCu2I+UBa8%~YNd`5`P$~%r=Te>N2qff(KRWWe6n9xs*Gq($JU?XBTE$<6b%X11cW1vepm3^W(EgnU0EmRmbcAN7_ zLu(5sm89oNzo|kf^Qjf8+B=4YcX3h>bSS0lZ)72cV%U3ES$(HdMUYVt7j6Yz+M~X1 zHX^kUAu$0RD{Gu;Yl1>U$SwLiH*O509749v_pMD-H&RI;Yhe)c9b2(#|j8S!alP`@kSvja&G-=$>@^hQV+T=q?Zoztd1{=czV^nfV zF&JWI+=1Aze5IbFp#s@SJR_8YC9ro>7z#vFJHct5EtX@VE6z3e?1}lM4)<}k|4ieAQuK0 zgzld^2NdTl@Q5sCVBi)4Va7{$>;3=*RZCnWN`mv#O3D+9QW<;`lZ*0mQ&Tb%72Gn5 zQp@v;vWpdbBNU7b3{2X~)|>}w5Cds&E=o--$;{7F2+7P%WiT|*H!#*WFgd=yhZCqG z!qdeuq+(9;4PKV1Hyx6gnJ3)X*T8%1&d~!CcvGht8EkNzY0cztDB;<=un7h&oMQJ5 zOnAh^!sYOgmxqZbU_wKJkwW(@g)2%k8?y8!<$B~f6iH61Ubv5eVdat_!+^S!9H1Qx Mp00i_>zopr0Jz|Gn*aa+ literal 0 HcmV?d00001 diff --git a/doc/html/images/next_disabled.png b/doc/html/images/next_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..10a8c59d7b3741260b7bfe918b62d0670cad8433 GIT binary patch literal 1110 zcmY+@U1(Ba7zgmjDRvTtQ&L$$oM7uF2)$_$L2619oS2=UZrYjBy6mRGh`_UtKA{mr z&7hmQ>n7-KH(k`l3W_tgna$01TCHhYnyqEo%+oU}@c)DNeRv<Aw4@Ln z93k3vZsg(J43U|lVL3RF9xoOO*=)8_spRvsnW@QgsZ^`gs@1Bl&*gH{hGA%$HjdJ0 z0!^YRltHf%-=x_aG>vj-2F;>8dW+_ej^3ep^d5ac3+N+SL}4$&L!O*Z;pbcwggWI6Ht znSIeG^MqH2daRdq_j=NKWUEDx?&yZ{K(t0hNp-olr%gM()V(P|g0v^Rdp~d9J+QaF z!E^J*7D+vMK=CJy#-QLKKFMEfm#>;6HRZnKq86dtH6)t7^tAr+x)|r>qo?RMm@+$*>08dLHng9R* literal 0 HcmV?d00001 diff --git a/doc/html/images/note.png b/doc/html/images/note.png new file mode 100644 index 0000000000000000000000000000000000000000..ad6296a193a88d75cadf1e17fc3770edc797da6a GIT binary patch literal 13625 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 LNkvXXu0mjfZ5Nz` literal 0 HcmV?d00001 diff --git a/doc/html/images/prev.png b/doc/html/images/prev.png new file mode 100644 index 0000000000000000000000000000000000000000..d88a40f923e3c554125f01cd366707c60cfcad04 GIT binary patch literal 334 zcmeAS@N?(olHy`uVBq!ia0vp^!XV7T3?v)swEqJs=3*z$5DpHG+YkL80J$mwJ|V8+ zB7$jYX~xFJ+qQ05v3zNuzpt9I!sW}Cx;s0Z9qba~V*daCKl2PvGf+KGNswPKkP8D0 zLif*|1B!DNctjR6FmMZjFyp1Wb$@_@swJ)wCBgY=CFO}lsSLh}$wm3OsVSL>3T~N2 zspa`a*~JRJ5eh~I1}5!gYt92Th=DXX7o{eaWaj57gkwm>gfq&(JZLf6ZeXy%aV8%R&r1O{j}20XTDX{IIykaj z4Nx#hVBm6cU}k1+>Qw1kB6gA`rFdeFa~bob(-ZFQzAc!;#K4>y+$E64`2%PJgQu&X J%Q~loCIAR&aHIeL literal 0 HcmV?d00001 diff --git a/doc/html/images/prev_disabled.png b/doc/html/images/prev_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..ab3c17e02d156e7494dbab2f9cd66af46af2358c GIT binary patch literal 1109 zcmY+@QAkr^6bJBgcW-U!1{X&)qK7M_5M*o=8THWJ+-L(GYZ=trG_;qf9*iP{hOHkvdvc6%2vA_iD3U9-0yJDcRs#*KhAd};6H4s z+g3+J7N6H0vA^EQ+H!#9vbD6`Ds$w15^-3cW^4D2@1tYP~^k(L0ny@6iX8LwWQOEu&AU zfQo1ZeMa02wZ5RQ=o?x^-x0S~tsm$oT0_531^q^UP!(}k|Km7w>=EA^b6?PZ^nZ>c zHKa9-^N)RQXXnMy?rd*3eEalZV2h}d<7uSYUol!mlhPcO#b+0y%6jsu%~o|iC&Tqk zjZ&+ugrhej$H%%!n2hY4Bw5`RXuNjl<&!a&&LzU`dgFGUS~a!}3S4TRbC4w09~9k9 z);;a{R+T2~>V^|?*&xZWmO@B-pr0ES45n;vpEFE`ily1KnYZ`aRH^GBuiSf29T*)S kmrP2ur(nL^S^Z=hXV#3jn*#4_ x=vj5p^wF)?xpx*Du6ddKc=uuXxWffq{6A*KyDFWJxdXJF!PC{xWt~$(69DY=mmvTE literal 0 HcmV?d00001 diff --git a/doc/html/images/up_disabled.png b/doc/html/images/up_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..e22bc8712192df3a8faa3264b0ec71ff3aaaa96c GIT binary patch literal 1115 zcmY+@Z)^*37zgl2dzmw~oK$GMafp#cWXs;jyt!6uYtl7UeZec8`SV6X{7De9Dw2(4 zm>26}32(gcW*OddFPdfV_NT?wYHgXdTAfl#H+r5D$$dY`-IIHMf0Ezb_xin_j)wY; z^+eR*>U8+HT56YQ=DTxXyvjv5Ve7IHJsG&Xy#F3Q%RQaGE}~1@h=SLMDmvFJ(fJml zT!5&3h-ky9p~u59A~Sj2e&_VmWGa=4$F*XyxL7D;GnsO^oJh>ZqBHq?zEmnDlXI0y zMc4I7gDEtPW>6Hx&`b0Ry+#^}qc><4CD2?%a47s&%&rYXwnm@^2oK6>2RiC(}ybQxc@;;j!lN7xJKGXK5u*58HCq zi)yn~zbYIeQ(ynxTdSHPs@k~jXquO=uiH1eY2@@XO+VY(#*4k%x7x*t?&AUCt?S$* rDO!X~;(e<^-4?Sb9}HJ}I(CrQLYik+oARjr0iT6jPLE^M9tiybIrJyp literal 0 HcmV?d00001 diff --git a/doc/html/images/warning.png b/doc/html/images/warning.png new file mode 100644 index 0000000000000000000000000000000000000000..cdb17c93aa4da7c1878b6f7d7c2945f4c130294d GIT binary patch literal 6955 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 + +Home - Boost.Outcome documentation + + + + + +
    + + +

    Outcome 2.2 library

    + +
    +
    +

    Niall Douglas

    +
    +
    +
    +
    +

    + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +

    +
    + +

    Introduction

    + +
    +
    note
    +

    At the end of December 2021, Standalone Outcome +went guaranteed future ABI stable. +From v2.2.3 onwards, you get ABI compatibilty guarantees across Outcome releases.

    +
    +
    + + +

    Outcome is a set of tools for reporting and handling function failures in contexts where directly using C++ exception handling is unsuitable. Such contexts include:

    + +
      +
    • there are programs, or parts thereof, that are compiled with exceptions disabled;

    • + +
    • there are parts of program that have a lot of branches depending on types of failures, +where if-statements are cleaner than try-catch blocks;

    • + +
    • there is a hard requirement that the failure path of execution should not cost more than the successful path of execution;

    • + +
    • there are situations, like in the filesystem library, where whether the failure should be handled remotely +(using a C++ exception throw), or locally cannot be made inside the function and needs to be decided by the caller, +and in the latter case throwing a C++ exception is not desirable for the aforementioned reasons;

    • + +
    • there are parts of the program/framework that themselves implement exception handling and prefer +to not use exceptions to propagate failure reports across threads, tasks, fibers, etc;

    • + +
    • one needs to propagate exceptions through layers that do not implement exception throw safety;

    • + +
    • there is an external requirement (such as a company-wide policy) that failure handling paths are explicitly indicated in the code.

    • + +
    • where interoperation with C code, without having to resort to C++ exception wrapper shims, is important.

    • + +
    • where your mostly C code base needs exception-like error handling, and the subset of Outcome’s functionality available in C is sufficient for your needs.

    • +
    + +

    Outcome addresses failure handling through returning a special type from functions, which is able to store either a successfully computed value (or void), or the information about failure. Outcome also comes with a set of idioms for dealing with such types.

    + +

    Particular care has been taken to ensure that Outcome has the lowest possible impact on build times, +thus making it suitable for use in the global headers of really large codebases. Storage layout is +guaranteed and is C-compatible for result<T, E>1, thus making Outcome based code long term ABI-stable.

    + +

    Fully deterministic all-noexcept C++ Coroutine support in Outcome is particularly strong, and we +supply Outcome-optimising eager<T, Executor = void>/atomic_eager<T, Executor = void> +, lazy<T, Executor = void>/atomic_lazy<T, Executor = void> + +and generator<T, Executor = void> + awaitables which work for any user type.

    + +

    Sample usage (C++)

    + +

    The main workhorse in the Outcome library is result<T>: it represents either a successfully computed value of type T, or a std::error_code/boost::system::error_code2 representing the reason for failure. You use it in the function’s return type:

    + +
    outcome::result<string> data_from_file(string_view path) noexcept;
    +
    View this code on Github
    + + +

    It is possible to inspect the state manually:

    + +
    if (outcome::result<string> rslt = data_from_file("config.cfg"))
    +  use_string(rslt.value());                   // returns string
    +else
    +  throw LibError{rslt.error(), "config.cfg"}; // returns error_code
    +
    View this code on Github
    + + +

    Or, if this function is called in another function that also returns result<T>, you can use a dedicated control statement:

    + +
    outcome::result<int> process(const string& content) noexcept;
    +
    +outcome::result<int> int_from_file(string_view path) noexcept
    +{
    +  BOOST_OUTCOME_TRY(auto str, data_from_file(path));
    +  // if control gets here data_from_file() has succeeded
    +  return process(str);  // decltype(str) == string
    +}
    +
    View this code on Github
    + + +

    BOOST_OUTCOME_TRY is a control statement. If the returned result<T> object contains an error information, the enclosing function is immediately returned with result<U> containing the same failure information; otherwise an automatic object of type T +is available in scope.

    + +

    Sample usage (C)

    + +

    Equivalent to the C++ API: BOOST_OUTCOME_C_DECLARE_RESULT_SYSTEM(ident, T) declares the C type, thereafter BOOST_OUTCOME_C_RESULT_SYSTEM(ident) refers to it. You use it in the function’s return type:

    + +
    BOOST_OUTCOME_C_DECLARE_RESULT_SYSTEM(result_string, const char *)
    +
    +BOOST_OUTCOME_C_RESULT_SYSTEM(result_string) data_from_file(const char *path);
    +
    View this code on Github
    + + +

    It is possible to inspect the state manually:

    + +
      BOOST_OUTCOME_C_RESULT_SYSTEM(result_string) rslt = data_from_file("config.cfg");
    +  if(BOOST_OUTCOME_C_RESULT_HAS_VALUE(rslt))
    +    use_string(rslt.value);  // returns string
    +  else
    +    fprintf(stderr, "%s\n", outcome_status_code_message(&rslt.error));
    +
    View this code on Github
    + + +

    Or, if this function is called in another function that also returns BOOST_OUTCOME_C_RESULT_SYSTEM(ident), you can use a dedicated control statement:

    + +
    BOOST_OUTCOME_C_DECLARE_RESULT_SYSTEM(result_int, int)
    +
    +BOOST_OUTCOME_C_RESULT_SYSTEM(result_int) process(const char *content);
    +
    +BOOST_OUTCOME_C_RESULT_SYSTEM(result_int) int_from_file(const char *path)
    +{
    +  BOOST_OUTCOME_C_RESULT_SYSTEM_TRY(const char *str, result_int, /* cleanup on fail */, data_from_file(path));
    +  // if control gets here data_from_file() has succeeded
    +  return process(str);  // decltype(str) == string
    +}
    +
    View this code on Github
    + + +

    The C Result is guaranteed to be layout identical to its C++ equivalent. Convenience conversion functions are available, but you can reinterpret cast too.

    + +
    +
    note
    +

    This library joined the Boost C++ libraries in the 1.70 release (Spring 2019). It can be grafted into much older Boost releases if desired.

    +
    +
    + +
    + +
    + +
      +
    1. If you choose a C-compatible T and E type. + [return]
    2. +
    3. result<T> defaults to std::error_code for Standalone Outcome, and to boost::system::error_code for Boost.Outcome. You can mandate a choice using std_result<T> or boost_result<T>. + [return]
    4. +
    +
    + + +

    Last revised: July 16, 2024 at 21:33:35 +0100

    +
    +
    +Prev + + HomeNext
    + diff --git a/doc/html/motivation.html b/doc/html/motivation.html new file mode 100644 index 000000000..e03eca098 --- /dev/null +++ b/doc/html/motivation.html @@ -0,0 +1,57 @@ + + +Motivation - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    + +

    Motivation

    +

    This section describes techniques currently used to report and handle failures +in functions, it also shows why these techniques might be insufficient.

    + +

    If you just want to learn how to use Outcome library go straight to Tutorial +section.

    + +
    +
    note
    +

    Motivation section of this documentation is not complete yet.

    +
    +
    + + +
    1. + Exceptions +

      Exceptions with their good and bad sides.

    2. + errno +

      errno with their good and bad sides.

    3. + Error codes +

      Error codes with their good and bad sides.

    4. + std::error_code +

      Overview of std::error_code

    5. + Plugging a library into std::error_code +

      Illustrates how you can hook into the std::error_code system from the Standard Library in order to work with your own set of error codes.

    6. + Plugging a library into boost::system::error_code +

      Illustrates how you can hook into the boost::system::error_code system from Boost in order to work with your own set of error codes.

    7. + Narrow contracts +

      Describes narrow-contract functions that do not work for all input values, and advantage of using them.

    + + + + + + + + +

    Last revised: June 27, 2019 at 16:00:40 +0100

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/motivation/errno.html b/doc/html/motivation/errno.html new file mode 100644 index 000000000..e7b44eaa2 --- /dev/null +++ b/doc/html/motivation/errno.html @@ -0,0 +1,70 @@ + + +errno - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    errno

    + + +

    The idiom of returning, upon failure, a special value and storing an error code +(an int) inside a global (or thread-local) object errno is inherited from C, +and used in its Standard Library:

    +
    int readValue(const char * filename)
    +{  
    +  FILE* f = fopen(filename, "r");
    +  if (f == NULL)
    +    return 0; // special value indicating failure
    +              // keep errno value set by fopen()
    +
    +  int i;
    +  int r = fscanf(f, "%d", &i);
    +  if (r == 0 || r == EOF) { // special values: i not read
    +    errno = ENODATA;        // choose error value to return
    +    return 0;
    +
    +  fclose(f);
    +  errno = 0;  // clear error info (success)
    +  return i;
    +}
    +
    +

    One advantage (to some, and a disadvantage to others) of this technique is that it +uses familiar control statements (if and return) to indicate all execution +paths that handle failures. When we read this code we know when and under what +conditions it can exit without producing the expected result.

    + +

    Downsides

    + +

    Because on failure, as well as success, we write into a global (or thread-local) +object, our functions are not pure: they have side effects. This means many +useful compiler optimizations (like common subexpression elimination) cannot be +applied. This shows that it is not only C++ that chooses suboptimal solutions +for reporting failures.

    + +

    Whatever type we return, we always need a special value to spare, which is +sometimes troublesome. In the above example, if the successfully read value of +i is 0, and we return it, our callers will think it is a failure even though +it is not.

    + +

    Error propagation using if statements and early returns is manual. We can easily +forget to check for the failure, and incorrectly let the subsequent operations +execute, potentially causing damage to the program state.

    + +

    Upon nearly each function call layer we may have to change error code value +so that it reflects the error condition adequate to the current layer. If we +do so, the original error code is gone.

    + + +

    Last revised: January 16, 2019 at 01:05:39 +0100

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/motivation/error_codes.html b/doc/html/motivation/error_codes.html new file mode 100644 index 000000000..d87e45af0 --- /dev/null +++ b/doc/html/motivation/error_codes.html @@ -0,0 +1,63 @@ + + +Error codes - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    Error codes

    + + +

    Error codes are reasonable error handling technique, also working in C. +In this case the information is also stored as an int, but returned by value, +which makes it possible to make functions pure (side-effect-free and referentially +transparent).

    +
    int readInt(const char * filename, int& val)
    +{
    +  FILE* fd;
    +  int r = openFile(filename, /*out*/ fd);
    +  if (r != 0)
    +    return r; // return whatever error openFile() returned
    +
    +  r = readInt(fd, /*out*/ val);
    +  if (r != 0)
    +    return READERRC_NOINT; // my error code
    +
    +  return 0;   // success
    +}
    +
    +

    Because the type of the error information (int) is known statically, no memory +allocation or type erasure is required. This technique is very efficient.

    + +

    Downsides

    + +

    All failure paths written manually can be considered both an advantage and a +disadvantage. Forgetting to put a failure handling if causes bugs.

    + +

    If I need to substitute an error code returned by lower-level function with mine +more appropriate at this level, the information about the original failure is +gone.

    + +

    Also, all possible error codes invented by different programmers in different +third party libraries must fit into one int and not overlap with any other error +code value. This is quite impossible and does not scale well.

    + +

    Because errors are communicated through returned values, we cannot use function’s +return type to return computed values. Computed values are written to function +output parameters, which requires objects to be created before we have values +to put into them. This requires many objects in unintended state to exist. Writing +to output parameters often requires an indirection and can incur some run-time cost.

    + + +

    Last revised: January 16, 2019 at 01:05:39 +0100

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/motivation/exceptions.html b/doc/html/motivation/exceptions.html new file mode 100644 index 000000000..bfe02764f --- /dev/null +++ b/doc/html/motivation/exceptions.html @@ -0,0 +1,79 @@ + + +Exceptions - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    Exceptions

    + + +

    Exceptions are the default mechanism in C++ for reporting, propagating and +processing the information about function failures. Their main advantage is +the ability to describe the “success dependency” between functions: if you want to +say that calling function g() depends on the successful execution of function f(), +you just put g() below f() and that’s it:

    +
    int a()
    +{
    +  f();
    +  g();        // don't call g() and further if f() fails
    +  return h(); // don't call h() if g() fails
    +}
    +
    +

    In the C++ Standard terms this means that f() is sequenced before g(). +This makes failure handling extremely easy: in a lot of cases you do not have +to do anything.

    + +

    Also, while next operations are being canceled, the exception object containing +the information about the initial failure is kept on the side. When at some point +the cancellation cascade is stopped by an exception handler, the exception object +can be inspected. It can contain arbitrarily big amount of data about the failure +reason, including the entire call stack.

    + +

    Downsides

    + +

    There are two kinds of overheads caused by the exception handling mechanism. The +first is connected with storing the exceptions on the side. Stack unwinding works +independently in each thread of execution; each thread can be potentially handling +a number of exceptions (even though only one exception can be active in one thread). +This requires being prepared for storing an arbitrary number of exceptions of arbitrary +types per thread. Additional things like jump tables also need to be stored in the +program binaries.

    + +

    Second overhead is experienced when throwing an exception and trying to find the +handler. Since nearly any function can throw an exception of any time, this is +a dynamic memory allocation. The type of an exception is erased and a run-time type +identification (RTTI) is required to asses the type of the active exception object. +The worst case time required for matching exceptions against handlers cannot be easily +predicted and therefore exceptions are not suitable for real-time or low-latency +systems.

    + +

    Another problem connected with exceptions is that while they are good for program +flows with linear “success dependency”, they become inconvenient in situations where +this success dependency does not occur. One such notable example is releasing acquired +resources which needs to be performed even if previous operations have failed. +Another example is when some function c() depends on the success of at least one +of two functions a() and b() (which try, for instance, to store user data by +two different means), another example is when implementing a strong exception safety +guarantee we may need to apply some fallback actions when previous operations have +failed. When failures are reported by exceptions, the semantics of canceling all +subsequent operations is a hindrance rather than help; these situations require special +and non-trivial idioms to be employed.

    + +

    For these reasons in some projects using exceptions is forbidden. Compilers offer +switches to disable exceptions altogether (they refuse to compile a throw, and turn +already compiled throws into calls to std::abort()).

    + + +

    Last revised: March 22, 2019 at 13:58:05 -0700

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/motivation/narrow_contract.html b/doc/html/motivation/narrow_contract.html new file mode 100644 index 000000000..48430e457 --- /dev/null +++ b/doc/html/motivation/narrow_contract.html @@ -0,0 +1,131 @@ + + +Narrow contracts - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    Narrow contracts

    +

    A program’s thread of execution can enter a “disappointing” state for two reasons:

    + +
      +
    • due to disappointing situation in the environment (operating system, external input), +or
    • +
    • due to a bug in the program.
    • +
    + +

    The key to handling these disappointments correctly is to identify to which +category they belong, and use the tools adequate for a given category. In this +tutorial when we say “error” or “failure” we only refer to the first category. +A bug is not an error.

    + +

    A bug is when a program is something else than what it is supposed to be. The +correct action in that case is to change the program so that it is exactly what +it is supposed to be. Unfortunately, sometimes the symptoms of a bug are only +detected when the system is running and at this point no code changes are possible.

    + +

    In contrast, a failure is when a correct function in a correct program reflects +some disappointing behavior in the environment. The correct action in that case +is for the program to take a control path different than usual, which will likely +cancel some operations and will likely result in different communication with the +outside world.

    + +

    Symptoms of bugs can sometimes be detected during compilation or static program +analysis or at run-time when observing certain values of objects that are declared +never to be valid at certain points. One classical example is passing a null pointer +to functions that expect a pointer to a valid object:

    +
    int f(int * pi) // expects: pi != nullptr
    +{
    +  return *pi + 1;
    +}
    +
    +

    Passing a null pointer where it is not expected is so common a bug that tools +are very good at finding them. For instance, static analyzers will usually detect +it without even executing your code. Similarly, tools like undefined behavior +sanitizers will compile a code as the one above so that a safety check is performed +to check if the pointer is null, and an error message will be logged and program +optionally terminated.

    + +

    More, compilers can perform optimizations based on undefined behavior caused by +dereferencing a null pointer. In the following code:

    +
    pair<int, int> g(int * pi) // expects: pi != nullptr
    +{
    +  int i = *pi + 1;
    +  int j = (pi == nullptr) ? 1 : 0;
    +  return {i, j};
    +}
    +
    +

    The compiler can see that if pi is null, the program would have undefined +behavior. Since undefined behavior is required by the C++ standard to never +be the programmer’s intention, the compiler +assumes that apparently this function is never called with pi == nullptr. If so, +j is always 0 and the code can be transformed to a faster one:

    +
    pair<int, int> g(int * pi) // expects: pi != nullptr
    +{
    +  int i = *pi + 1;
    +  int j = 0;
    +  return {i, j};
    +}
    +
    +

    Functions like the one above that declare that certain values of input parameters +must not be passed to them are said to have a narrow contract.

    + +

    Compilers give you non-standard tools to tell them about narrow contracts, so +that they can detect it and make use of it the same way as they are detecting +invalid null pointers. For instance, if a function in your library takes an int +and declares that the value of this int must never be negative. You can use +__builtin_trap() available in GCC and clang:

    +
    void h(int i) // expects: i >= 0
    +{
    +  if (i < 0) __builtin_trap();
    +
    +  // normal program logic follows ...
    +}
    +
    +

    This instruction when hit, causes the program to exit abnormally, which means:

    + +
      +
    • a debugger can be launched,
    • +
    • static analyzer can warn you if it can detect a program flow that reaches this +point,
    • +
    • UB-sanitizer can log error message when it hits it.
    • +
    + +

    Another tool you could use is __builtin_unreachable(), also available in GCC +and clang:

    +
    void h(int i) // expects: i >= 0
    +{
    +  if (i < 0) __builtin_unreachable();
    +
    +  // normal program logic follows ...
    +}
    +
    +

    This gives a hint to the tools: the programmer guarantees that the program flow +will never reach to the point of executing it. In other words, it is undefined +behavior if control reaches this point. Compiler and other tools can take this +for granted. This way they can deduce that expression i < 0 will never be true, +and they can further use this assumption to issue warnings or to optimize the code. +UB-sanitizers can use it to inject a log message and terminate if this point is +nonetheless reached.

    + +

    Allowing for some input values to be invalid works similarly to cyclic redundancy +checks. It allows for the possibility to observe the symptoms of the bugs (not +the bugs themselves), and if the symptom is revealed the hunt for the bug can start. +This is not only tools that can now easily detect symptoms of bugs, but also +humans during the code review. A reviewer can now say, “hey, function h() is +expecting a non-negative value, but this i is actually -1; maybe you wanted +to pass j instead?“.

    + + +

    Last revised: April 26, 2019 at 17:43:41 +0200

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/motivation/plug_error_code.html b/doc/html/motivation/plug_error_code.html new file mode 100644 index 000000000..94ddaf21d --- /dev/null +++ b/doc/html/motivation/plug_error_code.html @@ -0,0 +1,187 @@ + + +Plugging a library into std::error_code - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    Plugging a library into std::error_code

    +

    See here for this guide, but for boost::system::error_code.

    + +

    This section illustrates how you can hook into the std::error_code system from +the Standard Library in order to work with your own set of error codes. As is usually +the case in C++, doing this is straightforward but requires typing boilerplate +to tell the C++ STL about your custom error type. This is not part of Outcome library, +but we still provide this short guide here, because how to do this is not well documented [1].

    + +

    Suppose you want to report all reasons for failure in converting a std::string to a non-negative int. +The list is:

    + +
      +
    • EmptyString – the input string is empty,
    • +
    • IllegalChar – input contains characters that are not digits,
    • +
    • TooLong – input represents a number, but this number would not fit into a variable of type int.
    • +
    + +
    #include <iostream>
    +#include <string>        // for string printing
    +#include <system_error>  // bring in std::error_code et al
    +
    +// This is the custom error code enum
    +enum class ConversionErrc
    +{
    +  Success     = 0, // 0 should not represent an error
    +  EmptyString = 1,
    +  IllegalChar = 2,
    +  TooLong     = 3,
    +};
    +
    +namespace std
    +{
    +  // Tell the C++ 11 STL metaprogramming that enum ConversionErrc
    +  // is registered with the standard error code system
    +  template <> struct is_error_code_enum<ConversionErrc> : true_type
    +  {
    +  };
    +}
    +
    +namespace detail
    +{
    +  // Define a custom error code category derived from std::error_category
    +  class ConversionErrc_category : public std::error_category
    +  {
    +  public:
    +    // Return a short descriptive name for the category
    +    virtual const char *name() const noexcept override final { return "ConversionError"; }
    +    // Return what each enum means in text
    +    virtual std::string message(int c) const override final
    +    {
    +      switch (static_cast<ConversionErrc>(c))
    +      {
    +      case ConversionErrc::Success:
    +        return "conversion successful";
    +      case ConversionErrc::EmptyString:
    +        return "converting empty string";
    +      case ConversionErrc::IllegalChar:
    +        return "got non-digit char when converting to a number";
    +      case ConversionErrc::TooLong:
    +        return "the number would not fit into memory";
    +      default:
    +        return "unknown";
    +      }
    +    }
    +    // OPTIONAL: Allow generic error conditions to be compared to me
    +    virtual std::error_condition default_error_condition(int c) const noexcept override final
    +    {
    +      switch (static_cast<ConversionErrc>(c))
    +      {
    +      case ConversionErrc::EmptyString:
    +        return make_error_condition(std::errc::invalid_argument);
    +      case ConversionErrc::IllegalChar:
    +        return make_error_condition(std::errc::invalid_argument);
    +      case ConversionErrc::TooLong:
    +        return make_error_condition(std::errc::result_out_of_range);
    +      default:
    +        // I have no mapping for this code
    +        return std::error_condition(c, *this);
    +      }
    +    }
    +  };
    +}
    +
    +// Define the linkage for this function to be used by external code.
    +// This would be the usual __declspec(dllexport) or __declspec(dllimport)
    +// if we were in a Windows DLL etc. But for this example use a global
    +// instance but with inline linkage so multiple definitions do not collide.
    +#define THIS_MODULE_API_DECL extern inline
    +
    +// Declare a global function returning a static instance of the custom category
    +THIS_MODULE_API_DECL const detail::ConversionErrc_category &ConversionErrc_category()
    +{
    +  static detail::ConversionErrc_category c;
    +  return c;
    +}
    +
    +
    +// Overload the global make_error_code() free function with our
    +// custom enum. It will be found via ADL by the compiler if needed.
    +inline std::error_code make_error_code(ConversionErrc e)
    +{
    +  return {static_cast<int>(e), ConversionErrc_category()};
    +}
    +
    +int main(void)
    +{
    +  // Note that we can now supply ConversionErrc directly to error_code
    +  std::error_code ec = ConversionErrc::IllegalChar;
    +
    +  std::cout << "ConversionErrc::IllegalChar is printed by std::error_code as "
    +    << ec << " with explanatory message " << ec.message() << std::endl;
    +
    +  // We can compare ConversionErrc containing error codes to generic conditions
    +  std::cout << "ec is equivalent to std::errc::invalid_argument = "
    +    << (ec == std::errc::invalid_argument) << std::endl;
    +  std::cout << "ec is equivalent to std::errc::result_out_of_range = "
    +    << (ec == std::errc::result_out_of_range) << std::endl;
    +  return 0;
    +}
    +
    View this code on Github
    + + +

    This might look like a lot of extra boilerplate over simply using your custom +error code enum directly, but look at the advantages:

    + +
      +
    1. Any code which can speak std::error_code can now work with errors from your +code, AND without being recompiled.
    2. +
    3. std::system_error can now wrap your custom error codes seamlessly, allowing +your custom error code to be converted into a C++ exception and back out again +without losing information.
    4. +
    5. std::error_code knows how to print itself, and will print your custom error +code without extra work from you. As usually you’d need to define a print routine +for any custom error code you’d write anyway, there is actually very little extra +boilerplate here.
    6. +
    7. If you implement the default_error_condition() override, you can allow code +exclusively written to understand std::errc alone to examine your custom error +code domain for equivalence to the standard error conditions, AND without being +recompiled.
    8. +
    + +
    +
    note
    +

    This documentation recommends that when you define your custom enum for representing +error_codes, you should always make sure that value 0 never represents an actual error: +it should either represent a success or should not be provided at all. If you only +intend to use your enum inside result<> or outcome<> you can just start your +enumerations from 1. If you intend to also return std::error_code directly from +functions, you should probably define value 0 as success, so that you are able to +inform about function’s success by returning MyEnum::Success. This is because error_code’s +contextual conversion to bool (which some people use to check if there was an error or not) +only checks for the numeric value of the error code (without looking at error domain (category)).

    +
    +
    + + +

    [1]: The only documentation I’m aware of is the quite old guide by Chris Kohlhoff, founder of ASIO and the Networking TS:

    + + + + +

    Last revised: September 10, 2021 at 11:56:40 +0100

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/motivation/plug_error_code2.html b/doc/html/motivation/plug_error_code2.html new file mode 100644 index 000000000..3dcbc6f4c --- /dev/null +++ b/doc/html/motivation/plug_error_code2.html @@ -0,0 +1,190 @@ + + +Plugging a library into boost::system::error_code - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    Plugging a library into boost::system::error_code

    +

    See here for this guide, but for std::error_code.

    + +

    This section illustrates how you can hook into the boost::system::error_code system from +the Boost in order to work with your own set of error codes. As is usually +the case in C++, doing this is straightforward but requires typing boilerplate +to tell Boost.System about your custom error type. This is not part of Outcome library, +but we still provide this short guide here, because how to do this is not well documented [1].

    + +

    Suppose you want to report all reasons for failure in converting a std::string to a non-negative int. +The list is:

    + +
      +
    • EmptyString – the input string is empty,
    • +
    • IllegalChar – input contains characters that are not digits,
    • +
    • TooLong – input represents a number, but this number would not fit into a variable of type int.
    • +
    + +
    #include <boost/system/error_code.hpp>  // bring in boost::system::error_code et al
    +#include <iostream>
    +#include <string>  // for string printing
    +
    +// This is the custom error code enum
    +enum class ConversionErrc
    +{
    +  Success = 0,  // 0 should not represent an error
    +  EmptyString = 1,
    +  IllegalChar = 2,
    +  TooLong = 3,
    +};
    +
    +namespace boost
    +{
    +  namespace system
    +  {
    +    // Tell the C++ 11 STL metaprogramming that enum ConversionErrc
    +    // is registered with the standard error code system
    +    template <> struct is_error_code_enum<ConversionErrc> : std::true_type
    +    {
    +    };
    +  }  // namespace system
    +}  // namespace boost
    +
    +namespace detail
    +{
    +  // Define a custom error code category derived from boost::system::error_category
    +  class ConversionErrc_category : public boost::system::error_category
    +  {
    +  public:
    +    // Return a short descriptive name for the category
    +    virtual const char *name() const noexcept override final { return "ConversionError"; }
    +    // Return what each enum means in text
    +    virtual std::string message(int c) const override final
    +    {
    +      switch(static_cast<ConversionErrc>(c))
    +      {
    +      case ConversionErrc::Success:
    +        return "conversion successful";
    +      case ConversionErrc::EmptyString:
    +        return "converting empty string";
    +      case ConversionErrc::IllegalChar:
    +        return "got non-digit char when converting to a number";
    +      case ConversionErrc::TooLong:
    +        return "the number would not fit into memory";
    +      default:
    +        return "unknown";
    +      }
    +    }
    +    // OPTIONAL: Allow generic error conditions to be compared to me
    +    virtual boost::system::error_condition default_error_condition(int c) const noexcept override final
    +    {
    +      switch(static_cast<ConversionErrc>(c))
    +      {
    +      case ConversionErrc::EmptyString:
    +        return make_error_condition(boost::system::errc::invalid_argument);
    +      case ConversionErrc::IllegalChar:
    +        return make_error_condition(boost::system::errc::invalid_argument);
    +      case ConversionErrc::TooLong:
    +        return make_error_condition(boost::system::errc::result_out_of_range);
    +      default:
    +        // I have no mapping for this code
    +        return boost::system::error_condition(c, *this);
    +      }
    +    }
    +  };
    +}  // namespace detail
    +
    +// Define the linkage for this function to be used by external code.
    +// This would be the usual __declspec(dllexport) or __declspec(dllimport)
    +// if we were in a Windows DLL etc. But for this example use a global
    +// instance but with inline linkage so multiple definitions do not collide.
    +#define THIS_MODULE_API_DECL extern inline
    +
    +// Declare a global function returning a static instance of the custom category
    +THIS_MODULE_API_DECL const detail::ConversionErrc_category &ConversionErrc_category()
    +{
    +  static detail::ConversionErrc_category c;
    +  return c;
    +}
    +
    +
    +// Overload the global make_error_code() free function with our
    +// custom enum. It will be found via ADL by the compiler if needed.
    +inline boost::system::error_code make_error_code(ConversionErrc e)
    +{
    +  return {static_cast<int>(e), ConversionErrc_category()};
    +}
    +
    +int main(void)
    +{
    +  // Note that we can now supply ConversionErrc directly to error_code
    +  boost::system::error_code ec = ConversionErrc::IllegalChar;
    +
    +  std::cout << "ConversionErrc::IllegalChar is printed by boost::system::error_code as "
    +    << ec << " with explanatory message " << ec.message() << std::endl;
    +
    +  // We can compare ConversionErrc containing error codes to generic conditions
    +  std::cout << "ec is equivalent to boost::system::errc::invalid_argument = "
    +    << (ec == std::errc::invalid_argument) << std::endl;
    +  std::cout << "ec is equivalent to boost::system::errc::result_out_of_range = "
    +    << (ec == std::errc::result_out_of_range) << std::endl;
    +  return 0;
    +}
    +
    View this code on Github
    + + +

    This might look like a lot of extra boilerplate over simply using your custom +error code enum directly, but look at the advantages:

    + +
      +
    1. Any code which can speak boost::system::error_code can now work with errors from your +code, AND without being recompiled.
    2. +
    3. boost::system::system_error can now wrap your custom error codes seamlessly, allowing +your custom error code to be converted into a C++ exception and back out again +without losing information.
    4. +
    5. boost::system::error_code knows how to print itself, and will print your custom error +code without extra work from you. As usually you’d need to define a print routine +for any custom error code you’d write anyway, there is actually very little extra +boilerplate here.
    6. +
    7. If you implement the default_error_condition() override, you can allow code +exclusively written to understand boost::system::errc alone to examine your custom error +code domain for equivalence to the standard error conditions, AND without being +recompiled.
    8. +
    + +
    +
    note
    +

    This documentation recommends that when you define your custom enum for representing +error_codes, you should always make sure that value 0 never represents an actual error: +it should either represent a success or should not be provided at all. If you only +intend to use your enum inside result<> or outcome<> you can just start your +enumerations from 1. If you intend to also return boost::system::error_code directly from +functions, you should probably define value 0 as success, so that you are able to +inform about function’s success by returning MyEnum::Success. This is because error_code’s +contextual conversion to bool (which some people use to check if there was an error or not) +only checks for the numeric value of the error code (without looking at error domain (category)).

    +
    +
    + + +

    [1]: The only documentation I’m aware of is the quite old guide by Chris Kohlhoff, founder of ASIO and the Networking TS:

    + + + + +

    Last revised: September 10, 2021 at 11:56:40 +0100

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/motivation/std_error_code.html b/doc/html/motivation/std_error_code.html new file mode 100644 index 000000000..ac6038fa6 --- /dev/null +++ b/doc/html/motivation/std_error_code.html @@ -0,0 +1,70 @@ + + +std::error_code - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    std::error_code

    +

    Type std::error_code has been designed to be sufficiently small and trivial +to be cheaply passed around, and at the same time be able to store sufficient +information to represent any error situation from any library/sub-system in the +world without a clash. Its representation is basically:

    +
    class error_code
    +{
    +  error_category* domain; // domain from which the error originates
    +  int             value;  // numeric value of error within the domain
    +};
    +
    +

    Here, domain indicates the library from which the error originates. It is a +pointer to a global object representing a given library/domain. Different +libraries will be represented by different pointers to different globals. +Each domain is expected to be represented by a global object derived from +std::error_category. The uniqueness of the domain pointer value is guaranteed +by the uniqueness of addresses of different global objects.

    + +

    Now, value represents a numeric value of a particular error situation within +the domain. Thus, different domains can use the same numeric value 1 to +indicate different error situations, but two std::error_code objects will be +different because the pointers representing domains will be different.

    + +

    std::error_code comes with additional tools: a facility for defining custom +domains with their set of error codes, and a facility for building predicates +that allow classifying errors.

    + +

    Once created and passed around (either inside a thrown exception or returned from functions by value) there is never a need to change the value of error_code +object at any level. But at different levels one can use different predicates +for classifying error situations appropriately to the program layer.

    + +

    When a new library needs to represent its own set of error situations in an +error_code it first has to declare the list of numeric value as an enumeration:

    +
    enum class ConvertErrc
    +{
    +  StringTooLong = 1, // 0 should not represent an error
    +  EmptyString   = 2,
    +  IllegalChar   = 3,
    +};
    +
    +

    Then it has to put some boiler-plate code to plug the new enumeration into the +std::error_code system. Then, it can use the enum as an error_code:

    +
    std::error_code ec = ConvertErrc::EmptyString;
    +assert(ec == ConvertErrc::EmptyString);
    +
    +

    Member value is mapped directly from the numeric value in the enumeration, and +member domain is mapped from the type of the enumeration. Thus, this is a form +of type erasure, but one that does allow type std::error_code to be trivial +and standard-layout.

    + + +

    Last revised: January 16, 2019 at 01:05:39 +0100

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/recipes.html b/doc/html/recipes.html new file mode 100644 index 000000000..e76b3f1cf --- /dev/null +++ b/doc/html/recipes.html @@ -0,0 +1,36 @@ + + +Recipes - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    + +

    Recipes

    +
    1. + ASIO/Networking TS : Boost < 1.70 +

      How to teach ASIO/Networking TS about Outcome.

    2. + ASIO/Networking TS: Boost >= 1.70 +

      How to teach ASIO/Networking TS about Outcome.

    3. + Extending BOOST_OUTCOME_TRY +

      How to informing BOOST_OUTCOME_TRY about foreign Result types.

    + + + + + + + + +

    Last revised: February 08, 2019 at 22:18:08 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/recipes/asio-integration-1-70.html b/doc/html/recipes/asio-integration-1-70.html new file mode 100644 index 000000000..7c8120ed3 --- /dev/null +++ b/doc/html/recipes/asio-integration-1-70.html @@ -0,0 +1,294 @@ + + +ASIO/Networking TS: Boost >= 1.70 - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    ASIO/Networking TS: Boost >= 1.70

    + + + +

    Thanks to Christos Stratopoulos for this Outcome recipe.

    + +
    + +

    Compatibility note

    + +

    This recipe targets Boost versions including and after 1.70, where coroutine support is +based around the asio::use_awaitable completion token. For integration with Boost versions +before 1.70, see this recipe.

    + +
    + +

    Use case

    + +

    Boost.ASIO +and standalone ASIO provide the +async_result +customisation point for adapting arbitrary third party libraries, such as Outcome, into ASIO.

    + +

    Historically in ASIO you need to pass completion handler instances +to the ASIO asynchronous i/o initiation functions. These get executed when the i/o +completes.

    + +
      // Dynamically allocate a buffer to read into. This must be move-only
    +  // so it can be attached to the completion handler, hence the unique_ptr.
    +  auto buffer = std::make_unique<std::vector<byte>>(1024);
    +
    +  // Begin an asynchronous socket read, upon completion invoke
    +  // the lambda function specified
    +  skt.async_read_some(asio::buffer(buffer->data(), buffer->size()),
    +
    +                      // Retain lifetime of the i/o buffer until completion
    +                      [buffer = std::move(buffer)](const error_code &ec, size_t bytes) {
    +                        // Handle the buffer read
    +                        if(ec)
    +                        {
    +                          std::cerr << "Buffer read failed with " << ec << std::endl;
    +                          return;
    +                        }
    +                        std::cout << "Read " << bytes << " bytes into buffer" << std::endl;
    +
    +                        // buffer will be dynamically freed now
    +                      });
    +
    View this code on Github
    + + +

    One of the big value adds of the Coroutines TS is the ability to not have to write +so much boilerplate if you have a Coroutines supporting compiler:

    + +
      // As coroutines suspend the calling thread whilst an asynchronous
    +  // operation executes, we can use stack allocation instead of dynamic
    +  // allocation
    +  char buffer[1024];
    +
    +  // Asynchronously read data, suspending this coroutine until completion,
    +  // returning the bytes of the data read into the result.
    +  try
    +  {
    +    // The use_awaitable completion token represents the current coroutine
    +    // (requires Coroutines TS)
    +    size_t bytesread =  //
    +    co_await skt.async_read_some(asio::buffer(buffer), asio::use_awaitable);
    +    std::cout << "Read " << bytesread << " bytes into buffer" << std::endl;
    +  }
    +  catch(const std::system_error &e)
    +  {
    +    std::cerr << "Buffer read failed with " << e.what() << std::endl;
    +  }
    +
    View this code on Github
    + + +

    The default ASIO implementation always throws exceptions on failure through +its coroutine token transformation. The redirect_error +token transformation recovers the option to use the error_code interface, +but it suffers from the same drawbacks +that make pure error codes unappealing in the synchronous case.

    + +

    This recipe fixes that by making it possible for coroutinised +i/o in ASIO to return a result<T>:

    + +
      // Asynchronously read data, suspending this coroutine until completion,
    +  // returning the bytes of the data read into the result, or any failure.
    +  outcome::result<size_t, error_code> bytesread =  //
    +  co_await skt.async_read_some(asio::buffer(buffer), as_result(asio::use_awaitable));
    +
    +  // Usage is exactly like ordinary Outcome. Note the lack of exception throw!
    +  if(bytesread.has_error())
    +  {
    +    std::cerr << "Buffer read failed with " << bytesread.error() << std::endl;
    +    return;
    +  }
    +  std::cout << "Read " << bytesread.value() << " bytes into buffer" << std::endl;
    +
    View this code on Github
    + + +
    + +

    Implementation

    + +
    +
    warning
    +

    The below involves a lot of ASIO voodoo. NO SUPPORT WILL BE GIVEN HERE FOR THE ASIO +CODE BELOW. Please raise any questions or problems that you have with how to implement +this sort of stuff in ASIO +on Stackoverflow #boost-asio.

    +
    +
    + + +

    The real world, production-level recipe can be found at the bottom of this page. +You ought to use that in any real world use case.

    + +

    It is however worth providing a walkthrough of a simplified edition of the real world +recipe, as a lot of barely documented ASIO voodoo is involved. You should not +use the code presented next in your own code, it is too simplified. But it should +help you understand how the real implementation works.

    + +

    Firstly we need to define some helper type sugar and a factory function for wrapping +any arbitrary third party completion token with that type sugar:

    + +
    namespace detail
    +{
    +  // Type sugar for wrapping an external completion token
    +  template <class CompletionToken> struct as_result_t
    +  {
    +    CompletionToken token;
    +  };
    +}  // namespace detail
    +
    +// Factory function for wrapping a third party completion token with
    +// our type sugar
    +template <class CompletionToken>  //
    +inline auto as_result(CompletionToken &&token)
    +{
    +  return detail::as_result_t<std::decay_t<CompletionToken>>{std::forward<CompletionToken>(token)};
    +};
    +
    View this code on Github
    + + +

    Next we tell ASIO about a new completion token it ought to recognise by specialising +async_result:

    + +
    // Tell ASIO about a new kind of completion token, the kind returned
    +// from our as_result() factory function. This implementation is
    +// for functions with handlers void(error_code, T) only.
    +template <class CompletionToken, class T>                        //
    +struct asio::async_result<detail::as_result_t<CompletionToken>,  //
    +                          void(error_code, T)>                   //
    +
    +{
    +  // The result type we shall return
    +  using result_type = outcome::result<T, error_code>;
    +  // The awaitable type to be returned by the initiating function,
    +  // the co_await of which will yield a result_type
    +  using return_type = //
    +  typename asio::async_result<CompletionToken, void(result_type)> //
    +  ::return_type;
    +
    View this code on Github
    + + +

    There are a couple tricky parts to understand. First of all, we want our +async_result specialization to work, in particular, with the async_result for +ASIO’s +use_awaitable_t completion token. +With this token, the async_result specialization takes the form with a static +initiate method which defers initiation of the asynchronous operation until, +for example, +co_await is called on the returned awaitable. Thus, our async_result +specialization will take the same form. With this in mind, we need only +understand how our specialization will implement its initiate method. The trick +is that it will pass the initiation work off to an async_result for the +supplied completion token type with a completion handler which consumes result<T>. +Our async_result is thus just a simple wrapper over this underlying +async_result, but we inject a completion handler with the +void(error_code, size_t) signature which constructs from that a result:

    + +
      // Wrap a completion handler with void(error_code, T) converting
    +  // handler
    +  template <class Handler>
    +  struct completion_handler {
    +    // Our completion handler spec
    +    void operator()(error_code ec, T v)
    +    {
    +      // Call the underlying completion handler, whose
    +      // completion function is void(result_type)
    +      if(ec)
    +      {
    +        // Complete with a failed result
    +        _handler(result_type(outcome::failure(ec)));
    +        return;
    +      }
    +      // Complete with a successful result
    +      _handler(result_type(outcome::success(v)));
    +    }
    +
    +    Handler _handler;
    +  };
    +
    +  // NOTE the initiate member function initiates the async operation,
    +  // and we want to defer to what would be the initiation of the
    +  // async_result whose handler signature is void(result_type).
    +  template <class Initiation, class... Args>
    +  static return_type
    +  initiate(
    +    Initiation&& init,
    +    detail::as_result_t<CompletionToken>&& token,
    +    Args&&... args)
    +  {
    +    // The async_initiate<CompletionToken, void(result_type)> helper
    +    // function will invoke the async initiation method of the
    +    // async_result<CompletionToken, void(result_type)>, as desired.
    +    // Instead of CompletionToken and void(result_type)	we start with
    +    // detail::as_result_t<CompletionToken> and void(ec, T), so
    +    // the inputs need to be massaged then passed along.
    +    return asio::async_initiate<CompletionToken, void(result_type)>(
    +      // create a new initiation which wraps the provided init
    +      [init = std::forward<Initiation>(init)](
    +        auto&& handler, auto&&... initArgs) mutable {
    +        std::move(init)(
    +          // we wrap the handler in the converting completion_handler from
    +          // above, and pass along the args
    +          completion_handler<std::decay_t<decltype(handler)>>{
    +            std::forward<decltype(handler)>(handler)},
    +          std::forward<decltype(initArgs)>(initArgs)...);
    +      },
    +      // the new initiation is called with the handler unwrapped from
    +      // the token, and the original initiation arguments.
    +      token.token,
    +      std::forward<Args>(args)...);
    +  }
    +};
    +
    View this code on Github
    + + +

    To use, simply wrap the third party completion token with as_result to cause +ASIO to return from co_await a result instead of throwing exceptions on +failure:

    +
    char buffer[1024];
    +
    +outcome::result<size_t, error_code> bytesread =
    +  co_await skt.async_read_some(asio::buffer(buffer), as_result(asio::use_awaitable));
    +
    +

    The real world production-level implementation below is a lot more complex than the +above which has been deliberately simplified to aid exposition. The above +should help you get up and running with the below, eventually.

    + +

    One again I would like to remind you that Outcome is not the appropriate place +to seek help with ASIO voodoo. Please ask on +Stackoverflow #boost-asio.

    + +
    + +

    Here follows the real world, production-level adapation of Outcome into +ASIO, written and maintained by Christos Stratopoulos. +If the following does not load due to Javascript being disabled, you can visit the gist at +https://gist.github.com/cstratopoulos/901b5cdd41d07c6ce6d83798b09ecf9b/863c1dbf3b063a5ff9ff2bdd834242ead556e74e.

    + + + + +

    Last revised: August 06, 2019 at 10:42:06 +0100

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/recipes/asio-integration.html b/doc/html/recipes/asio-integration.html new file mode 100644 index 000000000..836cc9cd3 --- /dev/null +++ b/doc/html/recipes/asio-integration.html @@ -0,0 +1,279 @@ + + +ASIO/Networking TS : Boost < 1.70 - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    ASIO/Networking TS : Boost < 1.70

    + + + +

    Thanks to Christos Stratopoulos for this Outcome recipe.

    + +
    + +

    Compatibility note

    + +

    This recipe targets Boost versions before 1.70, where coroutine support is based around +the asio::experimental::this_coro::token completion token. For integration with Boost +versions 1.70 and onward, see this recipe.

    + +
    + +

    Use case

    + +

    Boost.ASIO +and standalone ASIO provide the +async_result +customisation point for adapting arbitrary third party libraries, such as Outcome, into ASIO.

    + +

    Historically in ASIO you need to pass completion handler instances +to the ASIO asynchronous i/o initiation functions. These get executed when the i/o +completes.

    + +
      // Dynamically allocate a buffer to read into. This must be move-only
    +  // so it can be attached to the completion handler, hence the unique_ptr.
    +  auto buffer = std::make_unique<std::vector<byte>>(1024);
    +
    +  // Begin an asynchronous socket read, upon completion invoke
    +  // the lambda function specified
    +  skt.async_read_some(asio::buffer(buffer->data(), buffer->size()),
    +
    +                      // Retain lifetime of the i/o buffer until completion
    +                      [buffer = std::move(buffer)](const error_code &ec, size_t bytes) {
    +                        // Handle the buffer read
    +                        if(ec)
    +                        {
    +                          std::cerr << "Buffer read failed with " << ec << std::endl;
    +                          return;
    +                        }
    +                        std::cout << "Read " << bytes << " bytes into buffer" << std::endl;
    +
    +                        // buffer will be dynamically freed now
    +                      });
    +
    View this code on Github
    + + +

    One of the big value adds of the Coroutines TS is the ability to not have to write +so much boilerplate if you have a Coroutines supporting compiler:

    + +
      // As coroutines suspend the calling thread whilst an asynchronous
    +  // operation executes, we can use stack allocation instead of dynamic
    +  // allocation
    +  char buffer[1024];
    +
    +  // Get an ASIO completion token for the current coroutine (requires
    +  // Coroutines TS)
    +  asio::experimental::await_token token =  //
    +  co_await asio::experimental::this_coro::token();
    +
    +  // Asynchronously read data, suspending this coroutine until completion,
    +  // returning the bytes of the data read into the result.
    +  try
    +  {
    +    size_t bytesread =  //
    +    co_await skt.async_read_some(asio::buffer(buffer), token);
    +    std::cout << "Read " << bytesread << " bytes into buffer" << std::endl;
    +  }
    +  catch(const std::system_error &e)
    +  {
    +    std::cerr << "Buffer read failed with " << e.what() << std::endl;
    +  }
    +
    View this code on Github
    + + +

    The default ASIO implementation always throws exceptions on failure through +its coroutine token transformation. The redirect_error +token transformation recovers the option to use the error_code interface, +but it suffers from the same drawbacks +that make pure error codes unappealing in the synchronous case.

    + +

    This recipe fixes that by making it possible for coroutinised +i/o in ASIO to return a result<T>:

    + +
      // Asynchronously read data, suspending this coroutine until completion,
    +  // returning the bytes of the data read into the result, or any failure.
    +  outcome::result<size_t, error_code> bytesread =  //
    +  co_await skt.async_read_some(asio::buffer(buffer), as_result(token));
    +
    +  // Usage is exactly like ordinary Outcome. Note the lack of exception throw!
    +  if(bytesread.has_error())
    +  {
    +    std::cerr << "Buffer read failed with " << bytesread.error() << std::endl;
    +    return;
    +  }
    +  std::cout << "Read " << bytesread.value() << " bytes into buffer" << std::endl;
    +
    View this code on Github
    + + +
    + +

    Implementation

    + +
    +
    warning
    +

    The below involves a lot of ASIO voodoo. NO SUPPORT WILL BE GIVEN HERE FOR THE ASIO +CODE BELOW. Please raise any questions or problems that you have with how to implement +this sort of stuff in ASIO +on Stackoverflow #boost-asio.

    +
    +
    + + +

    The real world, production-level recipe can be found at the bottom of this page. +You ought to use that in any real world use case.

    + +

    It is however worth providing a walkthrough of a simplified edition of the real world +recipe, as a lot of barely documented ASIO voodoo is involved. You should not +use the code presented next in your own code, it is too simplified. But it should +help you understand how the real implementation works.

    + +

    Firstly we need to define some helper type sugar and a factory function for wrapping +any arbitrary third party completion token with that type sugar:

    + +
    namespace detail
    +{
    +  // Type sugar for wrapping an external completion token
    +  template <class CompletionToken> struct as_result_t
    +  {
    +    CompletionToken token;
    +  };
    +}  // namespace detail
    +
    +// Factory function for wrapping a third party completion token with
    +// our type sugar
    +template <class CompletionToken>  //
    +inline auto as_result(CompletionToken &&token)
    +{
    +  return detail::as_result_t<std::decay_t<CompletionToken>>{std::forward<CompletionToken>(token)};
    +};
    +
    View this code on Github
    + + +

    Next we tell ASIO about a new completion token it ought to recognise by specialising +async_result:

    + +
    // Tell ASIO about a new kind of completion token, the kind returned
    +// from our as_result() factory function. This implementation is
    +// for functions with handlers void(error_code, T) only.
    +template <class CompletionToken, class T>                        //
    +struct asio::async_result<detail::as_result_t<CompletionToken>,  //
    +                          void(error_code, T)>                   //
    +
    +    // NOTE we subclass for an async result taking an outcome::result
    +    // as its completion handler. We will mangle the void(error_code, T)
    +    // completion handler into this completion handler below.
    +    : public asio::async_result<CompletionToken, void(outcome::result<T, error_code>)>
    +{
    +  // The result type we shall return
    +  using result_type = outcome::result<T, error_code>;
    +  using _base = asio::async_result<CompletionToken, void(result_type)>;
    +  // The awaitable type to be returned by the initiating function,
    +  // the co_await of which will yield a result_type
    +  using return_type = typename _base::return_type;
    +
    +  // Get what would be the completion handler for the async_result
    +  // whose completion handler is void(result_type)
    +  using result_type_completion_handler_type =  //
    +  typename _base::completion_handler_type;
    +
    View this code on Github
    + + +

    The tricky part to understand is that our async_result specialisation inherits +from an async_result for the supplied completion token type with a completion +handler which consumes a result<T>. Our async_result is actually therefore +the base async_result, but we layer on top a completion_handler_type with +the void(error_code, size_t) signature which constructs from that a result:

    + +
      // Wrap that completion handler with void(error_code, T) converting
    +  // handler
    +  struct completion_handler_type
    +  {
    +    // Pass through unwrapped completion token
    +    template <class U>
    +    completion_handler_type(::detail::as_result_t<U> &&ch)
    +        : _handler(std::forward<U>(ch.token))
    +    {
    +    }
    +
    +    // Our completion handler spec
    +    void operator()(error_code ec, T v)
    +    {
    +      // Call the underlying completion handler, whose
    +      // completion function is void(result_type)
    +      if(ec)
    +      {
    +        // Complete with a failed result
    +        _handler(result_type(outcome::failure(ec)));
    +        return;
    +      }
    +      // Complete with a successful result
    +      _handler(result_type(outcome::success(v)));
    +    }
    +
    +    result_type_completion_handler_type _handler;
    +  };
    +
    +  // Initialise base with the underlying completion handler
    +  async_result(completion_handler_type &h)
    +      : _base(h._handler)
    +  {
    +  }
    +
    +  using _base::get;
    +};
    +
    View this code on Github
    + + +

    To use, simply wrap the third party completion token with as_result to cause +ASIO to return from co_await a result instead of throwing exceptions on +failure:

    +
    char buffer[1024];
    +asio::experimental::await_token token =
    +  co_await asio::experimental::this_coro::token();
    +
    +outcome::result<size_t, error_code> bytesread =
    +  co_await skt.async_read_some(asio::buffer(buffer), as_result(token));
    +
    +

    The real world production-level implementation below is a lot more complex than the +above which has been deliberately simplified to aid exposition. The above +should help you get up and running with the below, eventually.

    + +

    One again I would like to remind you that Outcome is not the appropriate place +to seek help with ASIO voodoo. Please ask on +Stackoverflow #boost-asio.

    + +
    + +

    Here follows the real world, production-level adapation of Outcome into +ASIO, written and maintained by Christos Stratopoulos. +If the following does not load due to Javascript being disabled, you can visit the gist at +https://gist.github.com/cstratopoulos/901b5cdd41d07c6ce6d83798b09ecf9b/da584844f58353915dc2600fba959813f793b456.

    + + + + +

    Last revised: August 06, 2019 at 10:42:06 +0100

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/recipes/foreign-try.html b/doc/html/recipes/foreign-try.html new file mode 100644 index 000000000..a3fd99a97 --- /dev/null +++ b/doc/html/recipes/foreign-try.html @@ -0,0 +1,178 @@ + + +Extending BOOST_OUTCOME_TRY - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    Extending BOOST_OUTCOME_TRY

    + + +

    Outcome’s BOOST_OUTCOME_TRY(var, expr) + operation is fully extensible +to accept as input any foreign types. +It already recognises types matching the +concepts::value_or_error<T, E> + concept, which is to say all types which have:

    + +
      +
    • A public .has_value() member function which returns a bool.
    • +
    • In order of preference, a public .assume_value()/.value() member +function.
    • +
    • In order of preference, a public .as_failure()/.assume_error()/.error() +member function.
    • +
    + +

    This should automatically handle inputs of std::expected<T, E>, and many others, +including intermixing Boost.Outcome and standalone Outcome within the same +translation unit.

    + +

    BOOST_OUTCOME_TRY has the following free function customisation points:

    + +
    +
    BOOST_OUTCOME_V2_NAMESPACE::try_operation_has_value(X) + +
    Returns a `bool` which is true if the input to TRY has a value. +
    BOOST_OUTCOME_V2_NAMESPACE::try_operation_return_as(X) + +
    Returns a suitable failure_type<EC, EP = void> + which +is returned immediately to cause stack unwind. Ought to preserve rvalue +semantics (i.e. if passed an rvalue, move the error state into the failure +type). +
    BOOST_OUTCOME_V2_NAMESPACE::try_operation_extract_value(X) + +
    Extracts a value type from the input for the `TRY` to set its variable. +Ought to preserve rvalue semantics (i.e. if passed an rvalue, move the value). +
    + +

    New overloads of these to support additional input types must be injected into +the BOOST_OUTCOME_V2_NAMESPACE namespace before the compiler parses the relevant +BOOST_OUTCOME_TRY in order to be found. This is called ‘early binding’ in the two +phase name lookup model in C++. This was chosen over ‘late binding’, where an +BOOST_OUTCOME_TRY in a templated piece of code could look up overloads introduced after +parsing the template containing the BOOST_OUTCOME_TRY, because it has much lower +impact on build times, as binding is done once at the point of parse, instead +of on every occasion at the point of instantiation. If you are careful to ensure +that you inject the overloads which you need early in the parse of the +translation unit, all will be well.

    + +

    Let us work through an applied example.

    + +
    + +

    A very foreign pseudo-Expected type

    + +

    This is a paraphrase of a poorly written pseudo-Expected type which I once +encountered in the production codebase of a large multinational. Lots +of the code was already using it, and it was weird enough that it couldn’t +be swapped out for something better easily.

    + +
    enum Errc
    +{
    +  kBadValue
    +};
    +template <class T, class E = Errc> struct ForeignExpected
    +{
    +  T Value;
    +  E Error;
    +  int IsErrored;
    +
    +  ForeignExpected(T v)
    +      : Value(v)
    +      , Error()
    +      , IsErrored(0)
    +  {
    +  }
    +  ForeignExpected(E e)
    +      : Value()
    +      , Error(e)
    +      , IsErrored(1)
    +  {
    +  }
    +};
    +
    View this code on Github
    + + +

    What we would like is for new code to be written using Outcome, but be able +to transparently call old code, like this:

    + +
    ForeignExpected<int> old_code(int a)  // old code
    +{
    +  if(0 == a)
    +    return kBadValue;
    +  return a;
    +}
    +
    +outcome::result<int> new_code(int a)  // new code
    +{
    +  BOOST_OUTCOME_TRY(auto x, old_code(a));
    +  return x;
    +}
    +
    View this code on Github
    + + +

    Telling Outcome about this weird foreign Expected is straightforward:

    + +
    BOOST_OUTCOME_V2_NAMESPACE_BEGIN
    +template <class T, class E>  //
    +inline bool try_operation_has_value(const ForeignExpected<T, E> &v)
    +{
    +  return 0 == v.IsErrored;
    +}
    +template <class T, class E>  //
    +inline auto try_operation_return_as(const ForeignExpected<T, E> &v)
    +{
    +  switch(v.Error)
    +  {
    +  case kBadValue:
    +    return failure(make_error_code(std::errc::argument_out_of_domain));
    +  }
    +  abort();
    +}
    +template <class T, class E>  //
    +inline auto try_operation_extract_value(const ForeignExpected<T, E> &v)
    +{
    +  return v.Value;
    +}
    +BOOST_OUTCOME_V2_NAMESPACE_END
    +
    View this code on Github
    + + +

    And now BOOST_OUTCOME_TRY works exactly as expected:

    + +
      auto printresult = [](const char *desc, auto x) {
    +    if(x)
    +    {
    +      std::cout << desc << " returns successful " << x.value() << std::endl;
    +    }
    +    else
    +    {
    +      std::cout << desc << " returns failure " << x.error().message() << std::endl;
    +    }
    +  };
    +  printresult("\nnew_code(5)", new_code(5));
    +  printresult("\nnew_code(0)", new_code(0));
    +
    View this code on Github
    + + +

    … which outputs:

    + +
    new_code(5) returns successful 5
    +
    +new_code(0) returns failure argument out of domain
    +
    + + +

    Last revised: December 15, 2020 at 12:22:39 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference.html b/doc/html/reference.html new file mode 100644 index 000000000..fbde8745e --- /dev/null +++ b/doc/html/reference.html @@ -0,0 +1,208 @@ + + +API reference - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    + +

    API reference

    +
    1. + Macros
      1. + Constrained template macros
      2. + Version macros
      3. + BOOST_OUTCOME_CO_TRY(var, expr) +

        Evaluate within a coroutine an expression which results in an understood type, assigning T to a decl called var if successful, immediately returning try_operation_return_as(X) from the calling function if unsuccessful.

      4. + BOOST_OUTCOME_CO_TRYV(expr)/BOOST_OUTCOME_CO_TRY(expr) +

        Evaluate from within a coroutine an expression which results in an understood type, continuing execution if successful, immediately returning try_operation_return_as(X) from the calling function if unsuccessful.

      5. + BOOST_OUTCOME_CO_TRYV2(spec, expr) +

        Evaluate an expression which results in an understood type, continuing execution if successful, immediately returning try_operation_return_as(X) from the calling function if unsuccessful.

      6. + BOOST_OUTCOME_CO_TRYV2_FAILURE_LIKELY(spec, expr) +

        Evaluate an expression which results in an understood type, continuing execution if successful, immediately returning try_operation_return_as(X) from the calling function if unsuccessful.

      7. + BOOST_OUTCOME_CO_TRYV_FAILURE_LIKELY(expr)/BOOST_OUTCOME_CO_TRY_FAILURE_LIKELY(expr) +

        Evaluate from within a coroutine an expression which results in an understood type, continuing execution if successful, immediately returning try_operation_return_as(X) from the calling function if unsuccessful.

      8. + BOOST_OUTCOME_CO_TRYX(expr) +

        Evaluate from within a coroutine an expression which results in an understood type, emitting the T if successful, immediately returning try_operation_return_as(X) from the calling function if unsuccessful.

      9. + BOOST_OUTCOME_CO_TRYX_FAILURE_LIKELY(expr) +

        Evaluate from within a coroutine an expression which results in an understood type, emitting the T if successful, immediately returning try_operation_return_as(X) from the calling function if unsuccessful.

      10. + BOOST_OUTCOME_CO_TRY_FAILURE_LIKELY(var, expr) +

        Evaluate within a coroutine an expression which results in an understood type, assigning T to a decl called var if successful, immediately returning try_operation_return_as(X) from the calling function if unsuccessful.

      11. + BOOST_OUTCOME_DISABLE_EXECINFO +

        If defined, disables the use of the <execinfo.h> header (or the win32 emulation).

      12. + BOOST_OUTCOME_ENABLE_LEGACY_SUPPORT_FOR +

        Enables backwards features and naming compatibility for earlier versions of Outcome.

      13. + BOOST_OUTCOME_NODISCARD +

        How to tell the compiler than the return value of a function should not be discarded without examining it.

      14. + BOOST_OUTCOME_REQUIRES(...) +

        A C++ 20 requires(...), if available.

      15. + BOOST_OUTCOME_SYMBOL_VISIBLE +

        How to mark throwable types as always having default ELF symbol visibility.

      16. + BOOST_OUTCOME_THREAD_LOCAL +

        How to mark variables as having thread local storage duration.

      17. + BOOST_OUTCOME_THROW_EXCEPTION(expr) +

        How to throw a C++ exception, or equivalent thereof.

      18. + BOOST_OUTCOME_TRY(var, expr) +

        Evaluate an expression which results in an understood type, assigning T to a decl called var if successful, immediately returning try_operation_return_as(X) from the calling function if unsuccessful.

      19. + BOOST_OUTCOME_TRYV(expr)/BOOST_OUTCOME_TRY(expr) +

        Evaluate an expression which results in an understood type, continuing execution if successful, immediately returning try_operation_return_as(X) from the calling function if unsuccessful.

      20. + BOOST_OUTCOME_TRYV2(spec, expr) +

        Evaluate an expression which results in an understood type, continuing execution if successful, immediately returning try_operation_return_as(X) from the calling function if unsuccessful.

      21. + BOOST_OUTCOME_TRYV2_FAILURE_LIKELY(spec, expr) +

        Evaluate an expression which results in an understood type, continuing execution if successful, immediately returning try_operation_return_as(X) from the calling function if unsuccessful.

      22. + BOOST_OUTCOME_TRYV_FAILURE_LIKELY(expr)/BOOST_OUTCOME_TRY_FAILURE_LIKELY(expr) +

        Evaluate an expression which results in an understood type, continuing execution if successful, immediately returning try_operation_return_as(X) from the calling function if unsuccessful.

      23. + BOOST_OUTCOME_TRYX(expr) +

        Evaluate an expression which results in an understood type, emitting the T if successful, immediately returning try_operation_return_as(X) from the calling function if unsuccessful.

      24. + BOOST_OUTCOME_TRYX_FAILURE_LIKELY(expr) +

        Evaluate an expression which results in an understood type, emitting the T if successful, immediately returning try_operation_return_as(X) from the calling function if unsuccessful.

      25. + BOOST_OUTCOME_TRY_FAILURE_LIKELY(var, expr) +

        Evaluate an expression which results in an understood type, assigning T to a decl called var if successful, immediately returning try_operation_return_as(X) from the calling function if unsuccessful.

      26. + BOOST_OUTCOME_USE_STD_IN_PLACE_TYPE +

        How to implement in_place_type_t<T> and in_place_type<T>.

      27. + BOOST_OUTCOME_USE_STD_IS_NOTHROW_SWAPPABLE +

        How to implement is_nothrow_swappable<T>.

    2. + Concepts
      1. + basic_outcome<T> +

        A boolean concept matching types which are convertible to a basic_outcome<T, EC, EP, NoValuePolicy>.

      2. + basic_result<T> +

        A boolean concept matching types which are convertible to a basic_result<T, E, NoValuePolicy>.

      3. + value_or_error<T> +

        A boolean concept matching types with either a value or an error.

      4. + value_or_none<T> +

        A boolean concept matching types with an optional value.

    3. + Converters
      1. + value_or_error<T, U> +

        A customisable converter of value_or_error<T, E> concept matching types.

    4. + Traits
      1. + is_basic_outcome<T> +

        An integral constant type true for basic_outcome<T, EC, EP, NoValuePolicy> types.

      2. + is_basic_result<T> +

        An integral constant type true for basic_result<T, E, NoValuePolicy> types.

      3. + is_error_code_available<T> +

        True if an error code can be constructed from a T.

      4. + is_error_type<E> +

        A customisable integral constant type true for E types which are to receive error throwing no-value policies.

      5. + is_error_type_enum<E, Enum> +

        A customisable integral constant type true for E types constructible from Enum types which are to receive error throwing no-value policies.

      6. + is_exception_ptr_available<T> +

        True if an exception ptr can be constructed from a T.

      7. + is_failure_type<T> +

        An integral constant boolean variable true for failure_type<EC, E = void> types.

      8. + is_move_bitcopying<T> +

        (>= Outcome v2.2.0) A customisable integral constant type true for T types which are move bitcopying safe.

      9. + is_success_type<T> +

        An integral constant boolean variable true for success_type<T> types.

      10. + type_can_be_used_in_basic_result<R> +

        A constexpr boolean true for types permissible in basic_result<T, E, NoValuePolicy>.

    5. + Policies
      1. + base +

        Base class of most policy classes defining the narrow observer policies.

      2. + all_narrow +

        Policy class defining that hard undefined behaviour should occur on incorrect narrow and wide value, error or exception observation. Inherits publicly from base.

      3. + error_code_throw_as_system_error<T, EC, EP> +

        Policy class defining that EP ought to be rethrown if possible, then the ADL discovered free function outcome_throw_as_system_error_with_payload() should be called on incorrect wide value observation. Inherits publicly from base. Can only be used with basic_outcome.

      4. + error_code_throw_as_system_error<T, EC, void> +

        Policy class defining that the ADL discovered free function outcome_throw_as_system_error_with_payload() should be called on incorrect wide value observation. Inherits publicly from base. Can only be used with basic_result.

      5. + exception_ptr_rethrow<T, EC, EP> +

        Policy class defining that the ADL discovered free function rethrow_exception() should be called on incorrect wide value observation. Inherits publicly from base. Can only be used with basic_outcome.

      6. + exception_ptr_rethrow<T, EC, void> +

        Policy class defining that the ADL discovered free function rethrow_exception() should be called on incorrect wide value observation. Inherits publicly from base. Can only be used with basic_result.

      7. + fail_to_compile_observers +

        Policy class defining that a static assertion should occur upon compilation of the wide value, error or exception observation. Inherits publicly from base.

      8. + terminate +

        Policy class defining that std::terminate() should be called on incorrect wide value, error or exception observation. Inherits publicly from base.

      9. + throw_bad_result_access<EC> +

        Policy class defining that bad_result_access_with<EC> should be thrown on incorrect wide value observation. Inherits publicly from base.

    6. + Types
      1. + basic_outcome<T, EC, EP, NoValuePolicy> +

        A type carrying one of (i) a successful T (ii) a disappointment EC (iii) a failure EP (iv) both a disappointment EC and a failure EP, with NoValuePolicy specifying what to do if one tries to read state which isn’t there.

      2. + basic_result<T, E, NoValuePolicy> +

        A sum type carrying either a successful T, or a disappointment E, with NoValuePolicy specifying what to do if one tries to read state which isn’t there.

      3. + bad_outcome_access +

        Exception type publicly inheriting from std::logic_error indicating an incorrect observation of value or error or exception occurred.

      4. + bad_result_access_with<EC> +

        Exception type publicly inheriting from bad_result_access indicating an incorrect observation of value occurred, supplying the error value.

      5. + bad_result_access +

        Exception type publicly inheriting from std::logic_error indicating an incorrect observation of value or error occurred.

      6. + eager<T, Executor = void>/atomic_eager<T, Executor = void> +

        An eagerly evaluated coroutine awaitable with Outcome customisation.

      7. + failure_type<EC, EP = void> +

        Type sugar for constructing an unsuccessful result or outcome.

      8. + generator<T, Executor = void> +

        A lazily evaluated coroutine generator with Outcome customisation.

      9. + in_place_type_t<T> +

        Either std::in_place_type_t<T> or a local emulation, depending on the BOOST_OUTCOME_USE_STD_IN_PLACE_TYPE macro.

      10. + lazy<T, Executor = void>/atomic_lazy<T, Executor = void> +

        A lazily evaluated coroutine awaitable with Outcome customisation.

      11. + success_type<T> +

        Type sugar for constructing a successful result or outcome.

    7. + Aliases
      1. + boost_checked<T, E = boost::system::error_code> +

        A type alias to a basic_result configured with boost::system::error_code and policy::throw_bad_result_access<EC>.

      2. + boost_outcome<T, EC = boost::system::error_code, EP = boost::exception_ptr, NoValuePolicy = policy::default_policy<T, EC, EP>> +

        A type alias to a basic_outcome configured with boost::system::error_code, boost::exception_ptr and policy::default_policy.

      3. + boost_result<T, E = boost::system::error_code, NoValuePolicy = policy::default_policy<T, E, void>> +

        A type alias to a basic_result configured with boost::system::error_code and policy::default_policy.

      4. + boost_unchecked<T, E = boost::system::error_code> +

        A type alias to a basic_result configured with boost::system::error_code and policy::all_narrow.

      5. + checked<T, E = varies> +

        A type alias to a std_checked<T, E> (standalone edition) or boost_checked<T, E> (Boost edition).

      6. + default_policy<T, EC, EP> +

        A type alias to a no-value policy selected based on traits matching of T, EC and EP.

      7. + outcome<T, EC = varies, EP = varies, NoValuePolicy = policy::default_policy<T, EC, EP>> +

        A type alias to a std_outcome<T, EC, EP, NoValuePolicy> (standalone edition) or boost_outcome<T, EC, EP, NoValuePolicy> (Boost edition).

      8. + result<T, E = varies, NoValuePolicy = policy::default_policy<T, E, void>> +

        A type alias to a std_result<T, E, NoValuePolicy> (standalone edition) or boost_result<T, E, NoValuePolicy> (Boost edition).

      9. + std_checked<T, E = std::error_code> +

        A type alias to a basic_result configured with std::error_code and policy::throw_bad_result_access<EC>.

      10. + std_outcome<T, EC = std::error_code, EP = std::exception_ptr, NoValuePolicy = policy::default_policy<T, EC, EP>> +

        A type alias to a basic_outcome configured with std::error_code, std::exception_ptr and policy::default_policy.

      11. + std_result<T, E = std::error_code, NoValuePolicy = policy::default_policy<T, E, void>> +

        A type alias to a basic_result configured with std::error_code and policy::default_policy.

      12. + std_unchecked<T, E = std::error_code> +

        A type alias to a basic_result configured with std::error_code and policy::all_narrow.

      13. + unchecked<T, E = varies> +

        A type alias to a std_unchecked<T, E> (standalone edition) or boost_unchecked<T, E> (Boost edition).

    8. + Functions
      1. + Hooks +

        Functions used to hook into the functionality of basic_result and basic_outcome.

      2. + Iostream +

        Functions used to print, serialise and deserialise basic_result and basic_outcome.

      3. + Policy +

        Functions used to customise how the policy classes operate.

      4. + auto failure(T &&, ...) +

        Returns appropriate type sugar for constructing an unsuccessful result or outcome.

      5. + auto success(T &&, ...) +

        Returns appropriate type sugar for constructing a successful result or outcome.

      6. + bool try_operation_has_value(X) +

        Default implementation of try_operation_has_value(X) ADL customisation point for BOOST_OUTCOME_TRY.

      7. + decltype(auto) try_operation_extract_value(X) +

        Default implementation of try_operation_extract_value(X) ADL customisation point for BOOST_OUTCOME_TRY.

      8. + decltype(auto) try_operation_return_as(X) +

        Default implementation of try_operation_return_as(X) ADL customisation point for BOOST_OUTCOME_TRY.

      9. + std::error_code error_from_exception(std::exception_ptr &&ep = std::current_exception(), std::error_code not_matched = std::make_error_code(std::errc::resource_unavailable_try_again)) noexcept +

        Returns an error code matching a thrown standard library exception.

      10. + void strong_swap(bool &all_good, T &a, T &b) +

        Tries to perform a strong guarantee swap.

      11. + void try_throw_std_exception_from_error(std::error_code ec, const std::string &msg = std::string{}) +

        Try to throw a standard library exception type matching an error code.

    + + + + + + + + +

    Last revised: December 10, 2018 at 20:32:00 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/aliases.html b/doc/html/reference/aliases.html new file mode 100644 index 000000000..b537d1253 --- /dev/null +++ b/doc/html/reference/aliases.html @@ -0,0 +1,56 @@ + + +Aliases - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    + +

    Aliases

    +
    1. + boost_checked<T, E = boost::system::error_code> +

      A type alias to a basic_result configured with boost::system::error_code and policy::throw_bad_result_access<EC>.

    2. + boost_outcome<T, EC = boost::system::error_code, EP = boost::exception_ptr, NoValuePolicy = policy::default_policy<T, EC, EP>> +

      A type alias to a basic_outcome configured with boost::system::error_code, boost::exception_ptr and policy::default_policy.

    3. + boost_result<T, E = boost::system::error_code, NoValuePolicy = policy::default_policy<T, E, void>> +

      A type alias to a basic_result configured with boost::system::error_code and policy::default_policy.

    4. + boost_unchecked<T, E = boost::system::error_code> +

      A type alias to a basic_result configured with boost::system::error_code and policy::all_narrow.

    5. + checked<T, E = varies> +

      A type alias to a std_checked<T, E> (standalone edition) or boost_checked<T, E> (Boost edition).

    6. + default_policy<T, EC, EP> +

      A type alias to a no-value policy selected based on traits matching of T, EC and EP.

    7. + outcome<T, EC = varies, EP = varies, NoValuePolicy = policy::default_policy<T, EC, EP>> +

      A type alias to a std_outcome<T, EC, EP, NoValuePolicy> (standalone edition) or boost_outcome<T, EC, EP, NoValuePolicy> (Boost edition).

    8. + result<T, E = varies, NoValuePolicy = policy::default_policy<T, E, void>> +

      A type alias to a std_result<T, E, NoValuePolicy> (standalone edition) or boost_result<T, E, NoValuePolicy> (Boost edition).

    9. + std_checked<T, E = std::error_code> +

      A type alias to a basic_result configured with std::error_code and policy::throw_bad_result_access<EC>.

    10. + std_outcome<T, EC = std::error_code, EP = std::exception_ptr, NoValuePolicy = policy::default_policy<T, EC, EP>> +

      A type alias to a basic_outcome configured with std::error_code, std::exception_ptr and policy::default_policy.

    11. + std_result<T, E = std::error_code, NoValuePolicy = policy::default_policy<T, E, void>> +

      A type alias to a basic_result configured with std::error_code and policy::default_policy.

    12. + std_unchecked<T, E = std::error_code> +

      A type alias to a basic_result configured with std::error_code and policy::all_narrow.

    13. + unchecked<T, E = varies> +

      A type alias to a std_unchecked<T, E> (standalone edition) or boost_unchecked<T, E> (Boost edition).

    + + + + + + + + +

    Last revised: December 13, 2018 at 21:10:19 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/aliases/boost_checked.html b/doc/html/reference/aliases/boost_checked.html new file mode 100644 index 000000000..939c92e30 --- /dev/null +++ b/doc/html/reference/aliases/boost_checked.html @@ -0,0 +1,33 @@ + + +boost_checked<T, E = boost::system::error_code> - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    boost_checked<T, E = boost::system::error_code>

    +

    A type alias to a basic_result<T, E, NoValuePolicy> + configured with boost::system::error_code and policy::throw_bad_result_access<EC> +.

    + +

    This type alias always references the boost edition of things, unlike checked<T, E = varies> + which references either this alias or std_checked<T, E = std::error_code> +.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE

    + +

    Header: <boost/outcome/boost_result.hpp>

    + + +

    Last revised: January 24, 2019 at 01:15:16 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/aliases/boost_outcome.html b/doc/html/reference/aliases/boost_outcome.html new file mode 100644 index 000000000..8af624fb5 --- /dev/null +++ b/doc/html/reference/aliases/boost_outcome.html @@ -0,0 +1,35 @@ + + +boost_outcome<T, EC = boost::system::error_code, EP = boost::exception_ptr, NoValuePolicy = policy::default_policy<T, EC, EP>> - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    boost_outcome<T, EC = boost::system::error_code, EP = boost::exception_ptr, NoValuePolicy = policy::default_policy<T, EC, EP>>

    +

    A type alias to a basic_outcome<T, EC, EP, NoValuePolicy> + configured with boost::system::error_code +, boost::exception_ptr + and policy::default_policy +.

    + +

    This type alias always references the std edition of things, unlike outcome<T, EC = varies, EP = varies, NoValuePolicy = policy::default_policy<T, EC, EP>> + which references either this alias or std_outcome<T, EC = std::error_code, EP = std::exception_ptr, NoValuePolicy = policy::default_policy<T, EC, EP>> +.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE

    + +

    Header: <boost/outcome/boost_outcome.hpp>

    + + +

    Last revised: February 01, 2019 at 23:42:52 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/aliases/boost_result.html b/doc/html/reference/aliases/boost_result.html new file mode 100644 index 000000000..0de33cb25 --- /dev/null +++ b/doc/html/reference/aliases/boost_result.html @@ -0,0 +1,33 @@ + + +boost_result<T, E = boost::system::error_code, NoValuePolicy = policy::default_policy<T, E, void>> - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    boost_result<T, E = boost::system::error_code, NoValuePolicy = policy::default_policy<T, E, void>>

    +

    A type alias to a basic_result<T, E, NoValuePolicy> + configured with boost::system::error_code and policy::default_policy +.

    + +

    This type alias always references the boost edition of things, unlike result<T, E = varies, NoValuePolicy = policy::default_policy<T, E, void>> + which references either this alias or std_result<T, E = std::error_code, NoValuePolicy = policy::default_policy<T, E, void>> +.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE

    + +

    Header: <boost/outcome/boost_result.hpp>

    + + +

    Last revised: January 24, 2019 at 01:15:16 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/aliases/boost_unchecked.html b/doc/html/reference/aliases/boost_unchecked.html new file mode 100644 index 000000000..301bc3176 --- /dev/null +++ b/doc/html/reference/aliases/boost_unchecked.html @@ -0,0 +1,33 @@ + + +boost_unchecked<T, E = boost::system::error_code> - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    boost_unchecked<T, E = boost::system::error_code>

    +

    A type alias to a basic_result<T, E, NoValuePolicy> + configured with boost::system::error_code and policy::all_narrow +.

    + +

    This type alias always references the boost edition of things, unlike unchecked<T, E = varies> + which references either this alias or std_unchecked<T, E = std::error_code> +.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE

    + +

    Header: <boost/outcome/boost_result.hpp>

    + + +

    Last revised: January 24, 2019 at 01:15:16 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/aliases/checked.html b/doc/html/reference/aliases/checked.html new file mode 100644 index 000000000..53e3d1c26 --- /dev/null +++ b/doc/html/reference/aliases/checked.html @@ -0,0 +1,29 @@ + + +checked<T, E = varies> - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    checked<T, E = varies>

    +

    A type alias to either std_checked<T, E = std::error_code> + (standalone edition) or boost_checked<T, E = boost::system::error_code> + (Boost edition). This means that checked<T> uses the appropriate default alias depending on which edition of Outcome is in use.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE

    + +

    Header: <boost/outcome/result.hpp>

    + + +

    Last revised: January 24, 2019 at 01:15:16 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/aliases/default_policy.html b/doc/html/reference/aliases/default_policy.html new file mode 100644 index 000000000..beadc3070 --- /dev/null +++ b/doc/html/reference/aliases/default_policy.html @@ -0,0 +1,45 @@ + + +default_policy<T, EC, EP> - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    default_policy<T, EC, EP>

    +

    A type alias to a no-value policy selected based on traits matching of T, EC and EP. It is defined as follows:

    + +
      +
    1. If EC and EP is void, choose terminate +.

    2. + +
    3. If is_error_code_available<T> + true for EC, choose error_code_throw_as_system_error<T, EC, EP> + for basic_outcome or error_code_throw_as_system_error<T, EC, void> + for basic_result.

    4. + +
    5. If is_exception_ptr_available<T> + true for EC or EP, choose exception_ptr_rethrow<T, EC, EP> + for basic_outcome or exception_ptr_rethrow<T, EC, void> + for basic_result.

    6. + +
    7. Else choose fail_to_compile_observers +, which fails the build with a useful message.

    8. +
    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE::policy

    + +

    Header: <boost/outcome/std_result.hpp>

    + + +

    Last revised: February 05, 2019 at 21:41:47 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/aliases/outcome.html b/doc/html/reference/aliases/outcome.html new file mode 100644 index 000000000..e3416422a --- /dev/null +++ b/doc/html/reference/aliases/outcome.html @@ -0,0 +1,30 @@ + + +outcome<T, EC = varies, EP = varies, NoValuePolicy = policy::default_policy<T, EC, EP>> - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    outcome<T, EC = varies, EP = varies, NoValuePolicy = policy::default_policy<T, EC, EP>>

    +

    A type alias to either std_outcome<T, EC = std::error_code, EP = std::exception_ptr, NoValuePolicy = policy::default_policy<T, EC, EP>> + (standalone edition) or boost_outcome<T, EC = boost::system::error_code, EP = boost::exception_ptr, NoValuePolicy = policy::default_policy<T, EC, EP>> + (Boost edition), and policy::default_policy +. This means that outcome<T> uses the appropriate default alias depending on which edition of Outcome is in use.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE

    + +

    Header: <boost/outcome/outcome.hpp>

    + + +

    Last revised: February 01, 2019 at 23:42:52 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/aliases/result.html b/doc/html/reference/aliases/result.html new file mode 100644 index 000000000..8d8852998 --- /dev/null +++ b/doc/html/reference/aliases/result.html @@ -0,0 +1,30 @@ + + +result<T, E = varies, NoValuePolicy = policy::default_policy<T, E, void>> - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    result<T, E = varies, NoValuePolicy = policy::default_policy<T, E, void>>

    +

    A type alias to either std_result<T, E = std::error_code, NoValuePolicy = policy::default_policy<T, E, void>> + (standalone edition) or boost_result<T, E = boost::system::error_code, NoValuePolicy = policy::default_policy<T, E, void>> + (Boost edition), and policy::default_policy +. This means that result<T> uses the appropriate default alias depending on which edition of Outcome is in use.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE

    + +

    Header: <boost/outcome/result.hpp>

    + + +

    Last revised: January 24, 2019 at 01:15:16 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/aliases/std_checked.html b/doc/html/reference/aliases/std_checked.html new file mode 100644 index 000000000..bced7e934 --- /dev/null +++ b/doc/html/reference/aliases/std_checked.html @@ -0,0 +1,35 @@ + + +std_checked<T, E = std::error_code> - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    std_checked<T, E = std::error_code>

    +

    A type alias to a basic_result<T, E, NoValuePolicy> + configured with + std::error_code + and policy::throw_bad_result_access<EC> +.

    + +

    This type alias always references the std edition of things, unlike checked<T, E = varies> + which references either this alias or boost_checked<T, E = boost::system::error_code> +.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE

    + +

    Header: <boost/outcome/std_result.hpp>

    + + +

    Last revised: January 23, 2019 at 01:27:31 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/aliases/std_outcome.html b/doc/html/reference/aliases/std_outcome.html new file mode 100644 index 000000000..8320e90fc --- /dev/null +++ b/doc/html/reference/aliases/std_outcome.html @@ -0,0 +1,37 @@ + + +std_outcome<T, EC = std::error_code, EP = std::exception_ptr, NoValuePolicy = policy::default_policy<T, EC, EP>> - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    std_outcome<T, EC = std::error_code, EP = std::exception_ptr, NoValuePolicy = policy::default_policy<T, EC, EP>>

    +

    A type alias to a basic_outcome<T, EC, EP, NoValuePolicy> + configured with + std::error_code +, + std::exception_ptr + and policy::default_policy +.

    + +

    This type alias always references the std edition of things, unlike outcome<T, EC = varies, EP = varies, NoValuePolicy = policy::default_policy<T, EC, EP>> + which references either this alias or boost_outcome<T, EC = boost::system::error_code, EP = boost::exception_ptr, NoValuePolicy = policy::default_policy<T, EC, EP>> +.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE

    + +

    Header: <boost/outcome/std_outcome.hpp>

    + + +

    Last revised: February 01, 2019 at 23:42:52 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/aliases/std_result.html b/doc/html/reference/aliases/std_result.html new file mode 100644 index 000000000..aab17bab1 --- /dev/null +++ b/doc/html/reference/aliases/std_result.html @@ -0,0 +1,35 @@ + + +std_result<T, E = std::error_code, NoValuePolicy = policy::default_policy<T, E, void>> - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    std_result<T, E = std::error_code, NoValuePolicy = policy::default_policy<T, E, void>>

    +

    A type alias to a basic_result<T, E, NoValuePolicy> + configured with + std::error_code + and policy::default_policy +.

    + +

    This type alias always references the std edition of things, unlike result<T, E = varies, NoValuePolicy = policy::default_policy<T, E, void>> + which references either this alias or boost_result<T, E = boost::system::error_code, NoValuePolicy = policy::default_policy<T, E, void>> +.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE

    + +

    Header: <boost/outcome/std_result.hpp>

    + + +

    Last revised: January 24, 2019 at 01:15:16 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/aliases/std_unchecked.html b/doc/html/reference/aliases/std_unchecked.html new file mode 100644 index 000000000..8d10050e4 --- /dev/null +++ b/doc/html/reference/aliases/std_unchecked.html @@ -0,0 +1,35 @@ + + +std_unchecked<T, E = std::error_code> - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    std_unchecked<T, E = std::error_code>

    +

    A type alias to a basic_result<T, E, NoValuePolicy> + configured with + std::error_code + and policy::all_narrow +.

    + +

    This type alias always references the std edition of things, unlike unchecked<T, E = varies> + which references either this alias or boost_unchecked<T, E = boost::system::error_code> +.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE

    + +

    Header: <boost/outcome/std_result.hpp>

    + + +

    Last revised: January 23, 2019 at 01:27:31 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/aliases/unchecked.html b/doc/html/reference/aliases/unchecked.html new file mode 100644 index 000000000..ad76a2f79 --- /dev/null +++ b/doc/html/reference/aliases/unchecked.html @@ -0,0 +1,29 @@ + + +unchecked<T, E = varies> - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    unchecked<T, E = varies>

    +

    A type alias to either std_unchecked<T, E = std::error_code> + (standalone edition) or boost_unchecked<T, E = boost::system::error_code> + (Boost edition). This means that unchecked<T> uses the appropriate default alias depending on which edition of Outcome is in use.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE

    + +

    Header: <boost/outcome/result.hpp>

    + + +

    Last revised: January 24, 2019 at 01:15:16 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/concepts.html b/doc/html/reference/concepts.html new file mode 100644 index 000000000..74115064e --- /dev/null +++ b/doc/html/reference/concepts.html @@ -0,0 +1,38 @@ + + +Concepts - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    + +

    Concepts

    +
    1. + basic_outcome<T> +

      A boolean concept matching types which are convertible to a basic_outcome<T, EC, EP, NoValuePolicy>.

    2. + basic_result<T> +

      A boolean concept matching types which are convertible to a basic_result<T, E, NoValuePolicy>.

    3. + value_or_error<T> +

      A boolean concept matching types with either a value or an error.

    4. + value_or_none<T> +

      A boolean concept matching types with an optional value.

    + + + + + + + + +

    Last revised: December 11, 2018 at 14:56:04 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/concepts/basic_outcome.html b/doc/html/reference/concepts/basic_outcome.html new file mode 100644 index 000000000..1515294e9 --- /dev/null +++ b/doc/html/reference/concepts/basic_outcome.html @@ -0,0 +1,34 @@ + + +basic_outcome<T> - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    basic_outcome<T>

    +

    If on C++ 20 or the Concepts TS is enabled, a boolean concept matching types which have value_type, error_type and no_value_policy_type member typedefs; that the type is convertible to basic_result<value_type, error_type, no_value_policy_type>; that basic_result<value_type, error_type, no_value_policy_type> is a base of the type.

    + +

    If without Concepts, a static constexpr bool which is true for types matching the same requirements, using a SFINAE based emulation.

    + +

    This concept matches any type which provides the same typedefs as a basic_result<T, E, NoValuePolicy> +, has that basic_result as a base class, and is implicitly convertible to basic_result. Whilst not guaranteed, it is very likely that the type is a basic_result, or inherits publicly from a basic_result. If you want something which matches any value-or-error type, consider value_or_error<T> +. If you want something which exactly matches basic_outcome, use is_basic_outcome<T> +.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE::concepts

    + +

    Header: <boost/outcome/basic_result.hpp>

    + + +

    Last revised: May 24, 2020 at 12:48:39 +0100

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/concepts/basic_result.html b/doc/html/reference/concepts/basic_result.html new file mode 100644 index 000000000..084b86c7f --- /dev/null +++ b/doc/html/reference/concepts/basic_result.html @@ -0,0 +1,34 @@ + + +basic_result<T> - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    basic_result<T>

    +

    If on C++ 20 or the Concepts TS is enabled, a boolean concept matching types which have value_type, error_type and no_value_policy_type member typedefs; that the type is convertible to basic_result<value_type, error_type, no_value_policy_type>; that basic_result<value_type, error_type, no_value_policy_type> is a base of the type.

    + +

    If without Concepts, a static constexpr bool which is true for types matching the same requirements, using a SFINAE based emulation.

    + +

    This concept matches any type which provides the same typedefs as a basic_result<T, E, NoValuePolicy> +, has that basic_result as a base class, and is implicitly convertible to basic_result. Whilst not guaranteed, it is very likely that the type is a basic_result, or inherits publicly from a basic_result. If you want something which matches any value-or-error type, consider value_or_error<T> +. If you want something which exactly matches basic_result, use is_basic_result<T> +.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE::concepts

    + +

    Header: <boost/outcome/basic_result.hpp>

    + + +

    Last revised: May 24, 2020 at 12:48:39 +0100

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/concepts/value_or_error.html b/doc/html/reference/concepts/value_or_error.html new file mode 100644 index 000000000..b41158091 --- /dev/null +++ b/doc/html/reference/concepts/value_or_error.html @@ -0,0 +1,41 @@ + + +value_or_error<T> - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    value_or_error<T>

    +

    If on C++ 20 or the Concepts TS is enabled, a boolean concept matching types with a public .has_value() observer which returns bool, a public .value() observer function, and a public .error() observer function.

    + +

    If without Concepts, a static constexpr bool which is true for types matching the same requirements, using a SFINAE based emulation.

    + +

    This concept matches expected-like types such as + P0323 std::expected<T, E> +, one of which is basic_result<T, E, NoValuePolicy> +. Be aware it does not differentiate between value-or-error types and value-and-error types if they present the interface matched above.

    + +

    If you want a concept matching specifically basic_result<T, E, NoValuePolicy> +, see basic_result<T> +.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE::concepts

    + +

    Header: <boost/outcome/convert.hpp>

    + +

    Legacy: This was named convert::ValueOrError<T> in Outcome v2.1 and earlier. Define BOOST_OUTCOME_ENABLE_LEGACY_SUPPORT_FOR + to less than 220 to enable.

    + + +

    Last revised: August 19, 2020 at 12:15:40 +0100

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/concepts/value_or_none.html b/doc/html/reference/concepts/value_or_none.html new file mode 100644 index 000000000..94709dd5a --- /dev/null +++ b/doc/html/reference/concepts/value_or_none.html @@ -0,0 +1,39 @@ + + +value_or_none<T> - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    value_or_none<T>

    +

    If on C++ 20 or the Concepts TS is enabled, a boolean concept matching types with a public .has_value() observer which returns bool, and a public .value() observer function.

    + +

    If without Concepts, a static constexpr bool which is true for types matching the same requirements, using a SFINAE based emulation.

    + +

    This concept matches optional-like types such as + std::optional<T> +. Note it also matches + P0323 std::expected<T, E> +, which also has an optional-like interface. You may thus wish to preferentially match concepts::value_or_error<T, E> + for any given T.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE::concepts

    + +

    Header: <boost/outcome/convert.hpp>

    + +

    Legacy: This was named convert::ValueOrNone<T> in Outcome v2.1 and earlier. Define BOOST_OUTCOME_ENABLE_LEGACY_SUPPORT_FOR + to less than 220 to enable.

    + + +

    Last revised: December 15, 2020 at 12:22:39 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/converters.html b/doc/html/reference/converters.html new file mode 100644 index 000000000..f9d487835 --- /dev/null +++ b/doc/html/reference/converters.html @@ -0,0 +1,32 @@ + + +Converters - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    + +

    Converters

    +
    1. + value_or_error<T, U> +

      A customisable converter of value_or_error<T, E> concept matching types.

    + + + + + + + + +

    Last revised: December 15, 2018 at 17:49:37 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/converters/value_or_error.html b/doc/html/reference/converters/value_or_error.html new file mode 100644 index 000000000..983a941ea --- /dev/null +++ b/doc/html/reference/converters/value_or_error.html @@ -0,0 +1,46 @@ + + +value_or_error<T, U> - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    value_or_error<T, U>

    +

    A customisable converter of concepts::value_or_error<T, E> + concept matching types. It must have the following form:

    +
    // `T` will be the destination basic_result or basic_outcome.
    +// `U` will be the decayed form of the `value_or_error<T, E>` concept matching input type.
    +template <class T> struct value_or_error<T, U>
    +{
    +  // False to indicate that this converter wants `basic_result`/`basic_outcome` to reject all other `basic_result`
    +  static constexpr bool enable_result_inputs = false;
    +  // False to indicate that this converter wants `basic_outcome` to reject all other `basic_outcome`
    +  static constexpr bool enable_outcome_inputs = false;
    +  
    +  // `X` will be the raw input form of `U`. It must return a `T`.
    +  template<class X> constexpr T operator()(X &&v);
    +};
    +
    +

    Overridable: By template specialisation into the convert namespace.

    + +

    Default: If decayed X is same as U, concept value_or_error<U> matches, X::value_type is void or is explicitly constructible to T::value_type, and X::error_type is void or is explicitly constructible to T::error_type, then operator()(X &&) is made available.

    + +

    operator()(X &&v) tests if v.has_value() is true, if so then a T with successful value is returned, else a T with unsuccessful value. If the input type was void, a default constructed value is used for either, else a move/copy construction from the source is performed.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE::convert

    + +

    Header: <boost/outcome/convert.hpp>

    + + +

    Last revised: December 15, 2020 at 12:22:39 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/functions.html b/doc/html/reference/functions.html new file mode 100644 index 000000000..6e41bf000 --- /dev/null +++ b/doc/html/reference/functions.html @@ -0,0 +1,106 @@ + + +Functions - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    + +

    Functions

    +
    1. + Hooks +

      Functions used to hook into the functionality of basic_result and basic_outcome.

      1. + uint16_t spare_storage(const basic_result|basic_outcome *) noexcept +

        Returns the sixteen bits of spare storage in the specified result or outcome.

      2. + void hook_outcome_construction(T *, U &&) noexcept +

        (Until v2.2.0) ADL discovered free function hook invoked by the implicit constructors of basic_outcome.

      3. + void hook_outcome_construction(T *, U &&, V &&) noexcept +

        (Until v2.2.0) ADL discovered free function hook invoked by the implicit constructors of basic_outcome.

      4. + void hook_outcome_copy_construction(T *, U &&) noexcept +

        (Until v2.2.0) ADL discovered free function hook invoked by the converting copy constructors of basic_outcome.

      5. + void hook_outcome_copy_construction(T *, U &&, V &&) noexcept +

        (Until v2.2.0) ADL discovered free function hook invoked by the converting copy constructors of basic_outcome.

      6. + void hook_outcome_in_place_construction(T *, in_place_type_t<U>, Args &&...) noexcept +

        (Until v2.2.0) ADL discovered free function hook invoked by the in-place constructors of basic_outcome.

      7. + void hook_outcome_move_construction(T *, U &&) noexcept +

        (Until v2.2.0) ADL discovered free function hook invoked by the converting move constructors of basic_outcome.

      8. + void hook_outcome_move_construction(T *, U &&, V &&) noexcept +

        (Until v2.2.0) ADL discovered free function hook invoked by the converting move constructors of basic_outcome.

      9. + void hook_result_construction(T *, U &&) noexcept +

        (Until v2.2.0) ADL discovered free function hook invoked by the implicit constructors of basic_result.

      10. + void hook_result_copy_construction(T *, U &&) noexcept +

        (Until v2.2.0) ADL discovered free function hook invoked by the converting copy constructors of basic_result.

      11. + void hook_result_in_place_construction(T *, in_place_type_t<U>, Args &&...) noexcept +

        (Until v2.2.0) ADL discovered free function hook invoked by the in-place constructors of basic_result.

      12. + void hook_result_move_construction(T *, U &&) noexcept +

        (Until v2.2.0) ADL discovered free function hook invoked by the converting move constructors of basic_result.

      13. + void override_outcome_exception(basic_outcome<T, EC, EP, NoValuePolicy> *, U &&) noexcept +

        Overrides the exception to something other than what was constructed.

      14. + void set_spare_storage(basic_result|basic_outcome *, uint16_t) noexcept +

        Sets the sixteen bits of spare storage in the specified result or outcome.

    2. + Iostream +

      Functions used to print, serialise and deserialise basic_result and basic_outcome.

      1. + std::istream &operator>>(std::istream &, basic_outcome<T, EC, EP, NoValuePolicy> &) +

        Deserialises a basic_outcome from a std::istream.

      2. + std::istream &operator>>(std::istream &, basic_result<T, E, NoValuePolicy> &) +

        Deserialises a basic_result from a std::istream.

      3. + std::ostream &operator<<(std::ostream &, const basic_outcome<T, EC, EP, NoValuePolicy> &) +

        Serialises a basic_outcome to a std::ostream.

      4. + std::ostream &operator<<(std::ostream &, const basic_result<T, E, NoValuePolicy> &) +

        Serialises a basic_result to a std::ostream.

      5. + std::string print(const basic_outcome<T, EC, EP, NoValuePolicy> &) +

        Returns a string containing a human readable rendition of the basic_outcome.

      6. + std::string print(const basic_result<T, E, NoValuePolicy> &) +

        Returns a string containing a human readable rendition of the basic_result.

    3. + Policy +

      Functions used to customise how the policy classes operate.

      1. + auto basic_outcome_failure_exception_from_error(const EC &) +

        ADL discovered free function synthesising an exception type from an error type, used by the .failure() observers.

      2. + decltype(auto) error_code(T &&) +

        Extracts a boost::system::error_code or std::error_code from the input via ADL discovery of a suitable make_error_code(T) function.

      3. + decltype(auto) exception_ptr(T &&) +

        Extracts a boost::exception_ptr or std::exception_ptr from the input via ADL discovery of a suitable make_exception_ptr(T) function.

      4. + void outcome_throw_as_system_error_with_payload(BoostErrorCodeEnum &&) +

        Specialisation of outcome_throw_as_system_error_with_payload() for input types where boost::system::is_error_code_enum<BoostErrorCodeEnum> or boost::system::is_error_condition_enum<BoostErrorCodeEnum> is true.

      5. + void outcome_throw_as_system_error_with_payload(ErrorCodeEnum &&) +

        Specialisation of outcome_throw_as_system_error_with_payload() for input types where std::is_error_code_enum<ErrorCodeEnum> or std::is_error_condition_enum<ErrorCodeEnum> is true.

      6. + void outcome_throw_as_system_error_with_payload(const boost::system::error_code &) +

        Specialisation of outcome_throw_as_system_error_with_payload() for boost::system::error_code.

      7. + void outcome_throw_as_system_error_with_payload(const std::error_code &) +

        Specialisation of outcome_throw_as_system_error_with_payload() for std::error_code.

    4. + auto failure(T &&, ...) +

      Returns appropriate type sugar for constructing an unsuccessful result or outcome.

    5. + auto success(T &&, ...) +

      Returns appropriate type sugar for constructing a successful result or outcome.

    6. + bool try_operation_has_value(X) +

      Default implementation of try_operation_has_value(X) ADL customisation point for BOOST_OUTCOME_TRY.

    7. + decltype(auto) try_operation_extract_value(X) +

      Default implementation of try_operation_extract_value(X) ADL customisation point for BOOST_OUTCOME_TRY.

    8. + decltype(auto) try_operation_return_as(X) +

      Default implementation of try_operation_return_as(X) ADL customisation point for BOOST_OUTCOME_TRY.

    9. + std::error_code error_from_exception(std::exception_ptr &&ep = std::current_exception(), std::error_code not_matched = std::make_error_code(std::errc::resource_unavailable_try_again)) noexcept +

      Returns an error code matching a thrown standard library exception.

    10. + void strong_swap(bool &all_good, T &a, T &b) +

      Tries to perform a strong guarantee swap.

    11. + void try_throw_std_exception_from_error(std::error_code ec, const std::string &msg = std::string{}) +

      Try to throw a standard library exception type matching an error code.

    + + + + + + + + +

    Last revised: December 13, 2018 at 21:10:19 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/functions/error_from_exception.html b/doc/html/reference/functions/error_from_exception.html new file mode 100644 index 000000000..9977b400e --- /dev/null +++ b/doc/html/reference/functions/error_from_exception.html @@ -0,0 +1,47 @@ + + +std::error_code error_from_exception(std::exception_ptr &&ep = std::current_exception(), std::error_code not_matched = std::make_error_code(std::errc::resource_unavailable_try_again)) noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    std::error_code error_from_exception(std::exception_ptr &&ep = std::current_exception(), std::error_code not_matched = std::make_error_code(std::errc::resource_unavailable_try_again)) noexcept

    +

    This function saves writing boilerplate by rethrowing ep within a try +block, with a long sequence of catch() handlers, one for every standard +C++ exception type which has a near or exact equivalent code in + std::errc +.

    + +

    If matched, ep is set to a default constructed + std::exception_ptr +, +and a + std::error_code + is constructed using the ADL discovered free +function make_error_code() upon the std::errc enumeration value matching the +thrown exception.

    + +

    If not matched, ep is left intact, and the not_matched error code supplied +is returned instead.

    + +

    Overridable: Not overridable.

    + +

    Requires: C++ exceptions to be globally enabled.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE

    + +

    Header: <boost/outcome/utils.hpp>

    + + +

    Last revised: February 01, 2019 at 23:42:52 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/functions/failure.html b/doc/html/reference/functions/failure.html new file mode 100644 index 000000000..183244e6e --- /dev/null +++ b/doc/html/reference/functions/failure.html @@ -0,0 +1,38 @@ + + +auto failure(T &&, …) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    auto failure(T &&, ...)

    +

    Returns appropriate type sugar for constructing an unsuccessful result or outcome, usually failure_type<EC, EP = void> + with a decayed T.

    + +

    Two default overloads are provided, one taking a single required parameter with optional spare storage value parameter returning failure_type<std::decay_t<T>>, the other taking two required parameters with optional spare storage value parameter returning failure_type<std::decay_t<T>, std::decay_t<U>>. Both overloads perfectly forward their inputs.

    + +

    Note that failure() overloads are permitted by Outcome to return something other than failure_type. For example, basic_result’s auto as_failure() const & + returns whatever type failure() returns, and BOOST_OUTCOME_TRY(var, expr) + by default returns for failure whatever .as_failure() returns. This can be useful to have BOOST_OUTCOME_TRY(...} propagate on failure something custom for some specific input basic_result or basic_outcome.

    + +

    Overridable: By Argument Dependent Lookup (ADL).

    + +

    Requires: Always available.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE

    + +

    Header: <boost/outcome/success_failure.hpp>

    + + +

    Last revised: February 23, 2021 at 17:37:27 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/functions/hooks.html b/doc/html/reference/functions/hooks.html new file mode 100644 index 000000000..585b2731f --- /dev/null +++ b/doc/html/reference/functions/hooks.html @@ -0,0 +1,58 @@ + + +Hooks - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    + +

    Hooks

    +
    1. + uint16_t spare_storage(const basic_result|basic_outcome *) noexcept +

      Returns the sixteen bits of spare storage in the specified result or outcome.

    2. + void hook_outcome_construction(T *, U &&) noexcept +

      (Until v2.2.0) ADL discovered free function hook invoked by the implicit constructors of basic_outcome.

    3. + void hook_outcome_construction(T *, U &&, V &&) noexcept +

      (Until v2.2.0) ADL discovered free function hook invoked by the implicit constructors of basic_outcome.

    4. + void hook_outcome_copy_construction(T *, U &&) noexcept +

      (Until v2.2.0) ADL discovered free function hook invoked by the converting copy constructors of basic_outcome.

    5. + void hook_outcome_copy_construction(T *, U &&, V &&) noexcept +

      (Until v2.2.0) ADL discovered free function hook invoked by the converting copy constructors of basic_outcome.

    6. + void hook_outcome_in_place_construction(T *, in_place_type_t<U>, Args &&...) noexcept +

      (Until v2.2.0) ADL discovered free function hook invoked by the in-place constructors of basic_outcome.

    7. + void hook_outcome_move_construction(T *, U &&) noexcept +

      (Until v2.2.0) ADL discovered free function hook invoked by the converting move constructors of basic_outcome.

    8. + void hook_outcome_move_construction(T *, U &&, V &&) noexcept +

      (Until v2.2.0) ADL discovered free function hook invoked by the converting move constructors of basic_outcome.

    9. + void hook_result_construction(T *, U &&) noexcept +

      (Until v2.2.0) ADL discovered free function hook invoked by the implicit constructors of basic_result.

    10. + void hook_result_copy_construction(T *, U &&) noexcept +

      (Until v2.2.0) ADL discovered free function hook invoked by the converting copy constructors of basic_result.

    11. + void hook_result_in_place_construction(T *, in_place_type_t<U>, Args &&...) noexcept +

      (Until v2.2.0) ADL discovered free function hook invoked by the in-place constructors of basic_result.

    12. + void hook_result_move_construction(T *, U &&) noexcept +

      (Until v2.2.0) ADL discovered free function hook invoked by the converting move constructors of basic_result.

    13. + void override_outcome_exception(basic_outcome<T, EC, EP, NoValuePolicy> *, U &&) noexcept +

      Overrides the exception to something other than what was constructed.

    14. + void set_spare_storage(basic_result|basic_outcome *, uint16_t) noexcept +

      Sets the sixteen bits of spare storage in the specified result or outcome.

    + + + + + + + + +

    Last revised: January 22, 2019 at 01:11:40 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/functions/hooks/hook_outcome_construction.html b/doc/html/reference/functions/hooks/hook_outcome_construction.html new file mode 100644 index 000000000..ae806c747 --- /dev/null +++ b/doc/html/reference/functions/hooks/hook_outcome_construction.html @@ -0,0 +1,37 @@ + + +void hook_outcome_construction(T *, U &&) noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    void hook_outcome_construction(T *, U &&) noexcept

    +

    Removed in Outcome v2.2.0, unless BOOST_OUTCOME_ENABLE_LEGACY_SUPPORT_FOR + is set to less than 220 to +enable emulation. Use on_outcome_construction(T *, U &&) noexcept + instead in new code.

    + +

    One of the constructor hooks for basic_outcome<T, EC, EP, NoValuePolicy> +, generally invoked by the implicit constructors of basic_outcome. See each constructor’s documentation to see which specific hook it invokes.

    + +

    Overridable: By Argument Dependent Lookup.

    + +

    Requires: Nothing.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE::hooks

    + +

    Header: <boost/outcome/basic_outcome.hpp>

    + + +

    Last revised: August 19, 2020 at 12:15:40 +0100

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/functions/hooks/hook_outcome_construction2.html b/doc/html/reference/functions/hooks/hook_outcome_construction2.html new file mode 100644 index 000000000..9e3303fb6 --- /dev/null +++ b/doc/html/reference/functions/hooks/hook_outcome_construction2.html @@ -0,0 +1,37 @@ + + +void hook_outcome_construction(T *, U &&, V &&) noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    void hook_outcome_construction(T *, U &&, V &&) noexcept

    +

    Removed in Outcome v2.2.0, unless BOOST_OUTCOME_ENABLE_LEGACY_SUPPORT_FOR + is set to less than 220 to +enable emulation. Use on_outcome_construction(T *, U &&, V &&) noexcept + instead in new code.

    + +

    One of the constructor hooks for basic_outcome<T, EC, EP, NoValuePolicy> +, generally invoked by the implicit constructors of basic_outcome which consume two arguments. See each constructor’s documentation to see which specific hook it invokes.

    + +

    Overridable: By Argument Dependent Lookup.

    + +

    Requires: Nothing.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE::hooks

    + +

    Header: <boost/outcome/basic_outcome.hpp>

    + + +

    Last revised: August 19, 2020 at 12:15:40 +0100

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/functions/hooks/hook_outcome_copy_construction.html b/doc/html/reference/functions/hooks/hook_outcome_copy_construction.html new file mode 100644 index 000000000..0409c884e --- /dev/null +++ b/doc/html/reference/functions/hooks/hook_outcome_copy_construction.html @@ -0,0 +1,37 @@ + + +void hook_outcome_copy_construction(T *, U &&) noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    void hook_outcome_copy_construction(T *, U &&) noexcept

    +

    Removed in Outcome v2.2.0, unless BOOST_OUTCOME_ENABLE_LEGACY_SUPPORT_FOR + is set to less than 220 to +enable emulation. Use on_outcome_copy_construction(T *, U &&) noexcept + instead in new code.

    + +

    One of the constructor hooks for basic_outcome<T, EC, EP, NoValuePolicy> +, generally invoked by the converting copy constructors of basic_outcome (NOT the standard copy constructor). See each constructor’s documentation to see which specific hook it invokes.

    + +

    Overridable: By Argument Dependent Lookup.

    + +

    Requires: Nothing.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE::hooks

    + +

    Header: <boost/outcome/basic_outcome.hpp>

    + + +

    Last revised: August 19, 2020 at 12:15:40 +0100

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/functions/hooks/hook_outcome_copy_construction2.html b/doc/html/reference/functions/hooks/hook_outcome_copy_construction2.html new file mode 100644 index 000000000..75cebdf2e --- /dev/null +++ b/doc/html/reference/functions/hooks/hook_outcome_copy_construction2.html @@ -0,0 +1,37 @@ + + +void hook_outcome_copy_construction(T *, U &&, V &&) noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    void hook_outcome_copy_construction(T *, U &&, V &&) noexcept

    +

    Removed in Outcome v2.2.0, unless BOOST_OUTCOME_ENABLE_LEGACY_SUPPORT_FOR + is set to less than 220 to +enable emulation. Use on_outcome_copy_construction(T *, U &&, V &&) noexcept + instead in new code.

    + +

    One of the constructor hooks for basic_outcome<T, EC, EP, NoValuePolicy> +, generally invoked by the converting copy constructors of basic_outcome (NOT the standard copy constructor) which consume two arguments. See each constructor’s documentation to see which specific hook it invokes.

    + +

    Overridable: By Argument Dependent Lookup.

    + +

    Requires: Nothing.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE::hooks

    + +

    Header: <boost/outcome/basic_outcome.hpp>

    + + +

    Last revised: August 19, 2020 at 12:15:40 +0100

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/functions/hooks/hook_outcome_in_place_construction.html b/doc/html/reference/functions/hooks/hook_outcome_in_place_construction.html new file mode 100644 index 000000000..203746a83 --- /dev/null +++ b/doc/html/reference/functions/hooks/hook_outcome_in_place_construction.html @@ -0,0 +1,37 @@ + + +void hook_outcome_in_place_construction(T *, in_place_type_t<U>, Args &&…) noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    void hook_outcome_in_place_construction(T *, in_place_type_t<U>, Args &&...) noexcept

    +

    Removed in Outcome v2.2.0, unless BOOST_OUTCOME_ENABLE_LEGACY_SUPPORT_FOR + is set to less than 220 to +enable emulation. Use on_outcome_in_place_construction(T *, in_place_type_t<U>, Args &&...) noexcept + instead in new code.

    + +

    One of the constructor hooks for basic_outcome<T, EC, EP, NoValuePolicy> +, generally invoked by the in-place constructors of basic_outcome. See each constructor’s documentation to see which specific hook it invokes.

    + +

    Overridable: By Argument Dependent Lookup.

    + +

    Requires: Nothing.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE::hooks

    + +

    Header: <boost/outcome/basic_outcome.hpp>

    + + +

    Last revised: August 19, 2020 at 12:15:40 +0100

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/functions/hooks/hook_outcome_move_construction.html b/doc/html/reference/functions/hooks/hook_outcome_move_construction.html new file mode 100644 index 000000000..0780efd06 --- /dev/null +++ b/doc/html/reference/functions/hooks/hook_outcome_move_construction.html @@ -0,0 +1,37 @@ + + +void hook_outcome_move_construction(T *, U &&) noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    void hook_outcome_move_construction(T *, U &&) noexcept

    +

    Removed in Outcome v2.2.0, unless BOOST_OUTCOME_ENABLE_LEGACY_SUPPORT_FOR + is set to less than 220 to +enable emulation. Use on_outcome_move_construction(T *, U &&) noexcept + instead in new code.

    + +

    One of the constructor hooks for basic_outcome<T, EC, EP, NoValuePolicy> +, generally invoked by the converting move constructors of basic_outcome (NOT the standard move constructor). See each constructor’s documentation to see which specific hook it invokes.

    + +

    Overridable: By Argument Dependent Lookup.

    + +

    Requires: Nothing.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE::hooks

    + +

    Header: <boost/outcome/basic_outcome.hpp>

    + + +

    Last revised: August 19, 2020 at 12:15:40 +0100

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/functions/hooks/hook_outcome_move_construction2.html b/doc/html/reference/functions/hooks/hook_outcome_move_construction2.html new file mode 100644 index 000000000..077cafd90 --- /dev/null +++ b/doc/html/reference/functions/hooks/hook_outcome_move_construction2.html @@ -0,0 +1,37 @@ + + +void hook_outcome_move_construction(T *, U &&, V &&) noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    void hook_outcome_move_construction(T *, U &&, V &&) noexcept

    +

    Removed in Outcome v2.2.0, unless BOOST_OUTCOME_ENABLE_LEGACY_SUPPORT_FOR + is set to less than 220 to +enable emulation. Use on_outcome_move_construction(T *, U &&, V &&) noexcept + instead in new code.

    + +

    One of the constructor hooks for basic_outcome<T, EC, EP, NoValuePolicy> +, generally invoked by the converting move constructors of basic_outcome (NOT the standard move constructor) which consume two arguments. See each constructor’s documentation to see which specific hook it invokes.

    + +

    Overridable: By Argument Dependent Lookup.

    + +

    Requires: Nothing.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE::hooks

    + +

    Header: <boost/outcome/basic_outcome.hpp>

    + + +

    Last revised: August 19, 2020 at 12:15:40 +0100

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/functions/hooks/hook_result_construction.html b/doc/html/reference/functions/hooks/hook_result_construction.html new file mode 100644 index 000000000..252edd30d --- /dev/null +++ b/doc/html/reference/functions/hooks/hook_result_construction.html @@ -0,0 +1,37 @@ + + +void hook_result_construction(T *, U &&) noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    void hook_result_construction(T *, U &&) noexcept

    +

    Removed in Outcome v2.2.0, unless BOOST_OUTCOME_ENABLE_LEGACY_SUPPORT_FOR + is set to less than 220 to +enable emulation. Use on_result_construction(T *, U &&) noexcept + instead in new code.

    + +

    One of the constructor hooks for basic_result<T, E, NoValuePolicy> +, generally invoked by the implicit constructors of basic_result. See each constructor’s documentation to see which specific hook it invokes.

    + +

    Overridable: By Argument Dependent Lookup.

    + +

    Requires: Nothing.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE::hooks

    + +

    Header: <boost/outcome/basic_result.hpp>

    + + +

    Last revised: August 19, 2020 at 12:15:40 +0100

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/functions/hooks/hook_result_copy_construction.html b/doc/html/reference/functions/hooks/hook_result_copy_construction.html new file mode 100644 index 000000000..54c16db3e --- /dev/null +++ b/doc/html/reference/functions/hooks/hook_result_copy_construction.html @@ -0,0 +1,37 @@ + + +void hook_result_copy_construction(T *, U &&) noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    void hook_result_copy_construction(T *, U &&) noexcept

    +

    Removed in Outcome v2.2.0, unless BOOST_OUTCOME_ENABLE_LEGACY_SUPPORT_FOR + is set to less than 220 to +enable emulation. Use on_result_copy_construction(T *, U &&) noexcept + instead in new code.

    + +

    One of the constructor hooks for basic_result<T, E, NoValuePolicy> +, generally invoked by the converting copy constructors of basic_result (NOT the standard copy constructor). See each constructor’s documentation to see which specific hook it invokes.

    + +

    Overridable: By Argument Dependent Lookup.

    + +

    Requires: Nothing.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE::hooks

    + +

    Header: <boost/outcome/basic_result.hpp>

    + + +

    Last revised: August 19, 2020 at 12:15:40 +0100

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/functions/hooks/hook_result_in_place_construction.html b/doc/html/reference/functions/hooks/hook_result_in_place_construction.html new file mode 100644 index 000000000..77655e9b0 --- /dev/null +++ b/doc/html/reference/functions/hooks/hook_result_in_place_construction.html @@ -0,0 +1,37 @@ + + +void hook_result_in_place_construction(T *, in_place_type_t<U>, Args &&…) noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    void hook_result_in_place_construction(T *, in_place_type_t<U>, Args &&...) noexcept

    +

    Removed in Outcome v2.2.0, unless BOOST_OUTCOME_ENABLE_LEGACY_SUPPORT_FOR + is set to less than 220 to +enable emulation. Use on_result_in_place_construction(T *, in_place_type_t<U>, Args &&...) noexcept + instead in new code.

    + +

    One of the constructor hooks for basic_result<T, E, NoValuePolicy> +, generally invoked by the in-place constructors of basic_result. See each constructor’s documentation to see which specific hook it invokes.

    + +

    Overridable: By Argument Dependent Lookup.

    + +

    Requires: Nothing.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE::hooks

    + +

    Header: <boost/outcome/basic_result.hpp>

    + + +

    Last revised: August 19, 2020 at 12:15:40 +0100

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/functions/hooks/hook_result_move_construction.html b/doc/html/reference/functions/hooks/hook_result_move_construction.html new file mode 100644 index 000000000..6765b889e --- /dev/null +++ b/doc/html/reference/functions/hooks/hook_result_move_construction.html @@ -0,0 +1,37 @@ + + +void hook_result_move_construction(T *, U &&) noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    void hook_result_move_construction(T *, U &&) noexcept

    +

    Removed in Outcome v2.2.0, unless BOOST_OUTCOME_ENABLE_LEGACY_SUPPORT_FOR + is set to less than 220 to +enable emulation. Use on_result_move_construction(T *, U &&) noexcept + instead in new code.

    + +

    One of the constructor hooks for basic_result<T, E, NoValuePolicy> +, generally invoked by the converting move constructors of basic_result (NOT the standard move constructor). See each constructor’s documentation to see which specific hook it invokes.

    + +

    Overridable: By Argument Dependent Lookup.

    + +

    Requires: Nothing.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE::hooks

    + +

    Header: <boost/outcome/basic_result.hpp>

    + + +

    Last revised: August 19, 2020 at 12:15:40 +0100

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/functions/hooks/override_outcome_exception.html b/doc/html/reference/functions/hooks/override_outcome_exception.html new file mode 100644 index 000000000..9ae544642 --- /dev/null +++ b/doc/html/reference/functions/hooks/override_outcome_exception.html @@ -0,0 +1,40 @@ + + +void override_outcome_exception(basic_outcome<T, EC, EP, NoValuePolicy> *, U &&) noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    void override_outcome_exception(basic_outcome<T, EC, EP, NoValuePolicy> *, U &&) noexcept

    +

    Overrides the exception to something other than what was constructed. You almost certainly never +want to use this function. A much better way of overriding the exception returned is to create +a custom no-value policy which lazily synthesises a custom exception object at the point of need.

    + +

    The only reason that this function exists is because some people have very corner case needs +where a custom no-value policy can’t be used, and where move-constructing a new outcome from +an old outcome with the exception state replaced isn’t possible (e.g. when the types are +non-copyable and non-moveable).

    + +

    Unless you are in a situation where no other viable alternative exists, do not use this function.

    + +

    Overridable: Not overridable.

    + +

    Requires: Nothing.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE::hooks

    + +

    Header: <boost/outcome/basic_outcome.hpp>

    + + +

    Last revised: January 30, 2019 at 16:16:10 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/functions/hooks/set_spare_storage.html b/doc/html/reference/functions/hooks/set_spare_storage.html new file mode 100644 index 000000000..6780b7c36 --- /dev/null +++ b/doc/html/reference/functions/hooks/set_spare_storage.html @@ -0,0 +1,32 @@ + + +void set_spare_storage(basic_result|basic_outcome *, uint16_t) noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    void set_spare_storage(basic_result|basic_outcome *, uint16_t) noexcept

    +

    Sets the sixteen bits of spare storage in the specified result or outcome. You can retrieve these bits later using uint16_t spare_storage(const basic_result|basic_outcome *) noexcept +.

    + +

    Overridable: Not overridable.

    + +

    Requires: Nothing.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE::hooks

    + +

    Header: <boost/outcome/basic_result.hpp>

    + + +

    Last revised: January 21, 2019 at 18:00:41 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/functions/hooks/spare_storage.html b/doc/html/reference/functions/hooks/spare_storage.html new file mode 100644 index 000000000..20c9f2643 --- /dev/null +++ b/doc/html/reference/functions/hooks/spare_storage.html @@ -0,0 +1,32 @@ + + +uint16_t spare_storage(const basic_result|basic_outcome *) noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    uint16_t spare_storage(const basic_result|basic_outcome *) noexcept

    +

    Returns the sixteen bits of spare storage in the specified result or outcome. You can set these bits using void set_spare_storage(basic_result|basic_outcome *, uint16_t) noexcept +.

    + +

    Overridable: Not overridable.

    + +

    Requires: Nothing.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE::hooks

    + +

    Header: <boost/outcome/basic_result.hpp>

    + + +

    Last revised: January 21, 2019 at 18:00:41 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/functions/iostream.html b/doc/html/reference/functions/iostream.html new file mode 100644 index 000000000..05c116742 --- /dev/null +++ b/doc/html/reference/functions/iostream.html @@ -0,0 +1,42 @@ + + +Iostream - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    + +

    Iostream

    +
    1. + std::istream &operator>>(std::istream &, basic_outcome<T, EC, EP, NoValuePolicy> &) +

      Deserialises a basic_outcome from a std::istream.

    2. + std::istream &operator>>(std::istream &, basic_result<T, E, NoValuePolicy> &) +

      Deserialises a basic_result from a std::istream.

    3. + std::ostream &operator<<(std::ostream &, const basic_outcome<T, EC, EP, NoValuePolicy> &) +

      Serialises a basic_outcome to a std::ostream.

    4. + std::ostream &operator<<(std::ostream &, const basic_result<T, E, NoValuePolicy> &) +

      Serialises a basic_result to a std::ostream.

    5. + std::string print(const basic_outcome<T, EC, EP, NoValuePolicy> &) +

      Returns a string containing a human readable rendition of the basic_outcome.

    6. + std::string print(const basic_result<T, E, NoValuePolicy> &) +

      Returns a string containing a human readable rendition of the basic_result.

    + + + + + + + + +

    Last revised: March 03, 2019 at 21:04:29 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/functions/iostream/outcome_operator_in.html b/doc/html/reference/functions/iostream/outcome_operator_in.html new file mode 100644 index 000000000..2f9760603 --- /dev/null +++ b/doc/html/reference/functions/iostream/outcome_operator_in.html @@ -0,0 +1,36 @@ + + +std::istream &operator>>(std::istream &, basic_outcome<T, EC, EP, NoValuePolicy> &) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    std::istream &operator>>(std::istream &, basic_outcome<T, EC, EP, NoValuePolicy> &)

    +

    Deserialises a basic_outcome from a std::istream.

    + +

    Serialisation format is:

    + +
    <unsigned int flags><space><value_type if set and not void><error_type if set and not void><exception_type if set and not void>
    +
    + +

    Overridable: Not overridable.

    + +

    Requires: That operator>> is a valid expression for std::istream and T, EC and EP.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE

    + +

    Header: <boost/outcome/iostream_support.hpp> (must be explicitly included manually).

    + + +

    Last revised: March 03, 2019 at 21:04:29 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/functions/iostream/outcome_operator_out.html b/doc/html/reference/functions/iostream/outcome_operator_out.html new file mode 100644 index 000000000..a98701d48 --- /dev/null +++ b/doc/html/reference/functions/iostream/outcome_operator_out.html @@ -0,0 +1,40 @@ + + +std::ostream &operator<<(std::ostream &, const basic_outcome<T, EC, EP, NoValuePolicy> &) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    std::ostream &operator<<(std::ostream &, const basic_outcome<T, EC, EP, NoValuePolicy> &)

    +

    Serialises a basic_outcome to a std::ostream.

    + +

    Serialisation format is:

    + +
    <unsigned int flags><space><value_type if set and not void><error_type if set and not void><exception_type if set and not void>
    +
    + +

    This is the wrong function to use if you wish to print human readable output. +Use std::string print(const basic_outcome<T, EC, EP, NoValuePolicy> &) + instead.

    + +

    Overridable: Not overridable.

    + +

    Requires: That operator<< is a valid expression for std::ostream and T, EC and EP.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE

    + +

    Header: <boost/outcome/iostream_support.hpp> (must be explicitly included manually).

    + + +

    Last revised: March 03, 2019 at 21:04:29 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/functions/iostream/outcome_print.html b/doc/html/reference/functions/iostream/outcome_print.html new file mode 100644 index 000000000..994262573 --- /dev/null +++ b/doc/html/reference/functions/iostream/outcome_print.html @@ -0,0 +1,31 @@ + + +std::string print(const basic_outcome<T, EC, EP, NoValuePolicy> &) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    std::string print(const basic_outcome<T, EC, EP, NoValuePolicy> &)

    +

    Returns a string containing a human readable rendition of the basic_outcome.

    + +

    Overridable: Not overridable.

    + +

    Requires: Always available.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE

    + +

    Header: <boost/outcome/iostream_support.hpp> (must be explicitly included manually).

    + + +

    Last revised: March 03, 2019 at 21:04:29 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/functions/iostream/result_operator_in.html b/doc/html/reference/functions/iostream/result_operator_in.html new file mode 100644 index 000000000..2503285ac --- /dev/null +++ b/doc/html/reference/functions/iostream/result_operator_in.html @@ -0,0 +1,36 @@ + + +std::istream &operator>>(std::istream &, basic_result<T, E, NoValuePolicy> &) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    std::istream &operator>>(std::istream &, basic_result<T, E, NoValuePolicy> &)

    +

    Deserialises a basic_result from a std::istream.

    + +

    Serialisation format is:

    + +
    <unsigned int flags><space><value_type if set and not void><error_type if set and not void>
    +
    + +

    Overridable: Not overridable.

    + +

    Requires: That operator>> is a valid expression for std::istream and T and E.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE

    + +

    Header: <boost/outcome/iostream_support.hpp> (must be explicitly included manually).

    + + +

    Last revised: March 03, 2019 at 21:04:29 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/functions/iostream/result_operator_out.html b/doc/html/reference/functions/iostream/result_operator_out.html new file mode 100644 index 000000000..eb96de670 --- /dev/null +++ b/doc/html/reference/functions/iostream/result_operator_out.html @@ -0,0 +1,40 @@ + + +std::ostream &operator<<(std::ostream &, const basic_result<T, E, NoValuePolicy> &) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    std::ostream &operator<<(std::ostream &, const basic_result<T, E, NoValuePolicy> &)

    +

    Serialises a basic_result to a std::ostream.

    + +

    Serialisation format is:

    + +
    <unsigned int flags><space><value_type if set and not void><error_type if set and not void>
    +
    + +

    This is the wrong function to use if you wish to print human readable output. +Use std::string print(const basic_result<T, E, NoValuePolicy> &) + instead.

    + +

    Overridable: Not overridable.

    + +

    Requires: That operator<< is a valid expression for std::ostream and T and E.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE

    + +

    Header: <boost/outcome/iostream_support.hpp> (must be explicitly included manually).

    + + +

    Last revised: March 03, 2019 at 21:04:29 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/functions/iostream/result_print.html b/doc/html/reference/functions/iostream/result_print.html new file mode 100644 index 000000000..1ea9ce048 --- /dev/null +++ b/doc/html/reference/functions/iostream/result_print.html @@ -0,0 +1,31 @@ + + +std::string print(const basic_result<T, E, NoValuePolicy> &) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    std::string print(const basic_result<T, E, NoValuePolicy> &)

    +

    Returns a string containing a human readable rendition of the basic_result.

    + +

    Overridable: Not overridable.

    + +

    Requires: Always available.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE

    + +

    Header: <boost/outcome/iostream_support.hpp> (must be explicitly included manually).

    + + +

    Last revised: March 03, 2019 at 21:04:29 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/functions/policy.html b/doc/html/reference/functions/policy.html new file mode 100644 index 000000000..2ce265de8 --- /dev/null +++ b/doc/html/reference/functions/policy.html @@ -0,0 +1,44 @@ + + +Policy - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    + +

    Policy

    +
    1. + auto basic_outcome_failure_exception_from_error(const EC &) +

      ADL discovered free function synthesising an exception type from an error type, used by the .failure() observers.

    2. + decltype(auto) error_code(T &&) +

      Extracts a boost::system::error_code or std::error_code from the input via ADL discovery of a suitable make_error_code(T) function.

    3. + decltype(auto) exception_ptr(T &&) +

      Extracts a boost::exception_ptr or std::exception_ptr from the input via ADL discovery of a suitable make_exception_ptr(T) function.

    4. + void outcome_throw_as_system_error_with_payload(BoostErrorCodeEnum &&) +

      Specialisation of outcome_throw_as_system_error_with_payload() for input types where boost::system::is_error_code_enum<BoostErrorCodeEnum> or boost::system::is_error_condition_enum<BoostErrorCodeEnum> is true.

    5. + void outcome_throw_as_system_error_with_payload(ErrorCodeEnum &&) +

      Specialisation of outcome_throw_as_system_error_with_payload() for input types where std::is_error_code_enum<ErrorCodeEnum> or std::is_error_condition_enum<ErrorCodeEnum> is true.

    6. + void outcome_throw_as_system_error_with_payload(const boost::system::error_code &) +

      Specialisation of outcome_throw_as_system_error_with_payload() for boost::system::error_code.

    7. + void outcome_throw_as_system_error_with_payload(const std::error_code &) +

      Specialisation of outcome_throw_as_system_error_with_payload() for std::error_code.

    + + + + + + + + +

    Last revised: January 22, 2019 at 01:11:40 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/functions/policy/basic_outcome_failure_exception_from_error.html b/doc/html/reference/functions/policy/basic_outcome_failure_exception_from_error.html new file mode 100644 index 000000000..c6d7403a4 --- /dev/null +++ b/doc/html/reference/functions/policy/basic_outcome_failure_exception_from_error.html @@ -0,0 +1,38 @@ + + +auto basic_outcome_failure_exception_from_error(const EC &) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    auto basic_outcome_failure_exception_from_error(const EC &)

    +

    Synthesises an exception type from an error type, used by the exception_type failure() const noexcept + +observers. ADL discovered. Default +overloads for this function are defined in Outcome for + std::error_code + +and boost::system::error_code, these return std::make_exception_ptr(std::system_error(ec)) +and boost::copy_exception(boost::system::system_error(ec)) respectively.

    + +

    Overridable: Argument dependent lookup.

    + +

    Requires: Nothing.

    + +

    Namespace: Namespace of EC type.

    + +

    Header: <boost/outcome/std_outcome.hpp>, <boost/outcome/boost_outcome.hpp>

    + + +

    Last revised: February 06, 2019 at 16:50:01 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/functions/policy/error_code.html b/doc/html/reference/functions/policy/error_code.html new file mode 100644 index 000000000..dcb9159e7 --- /dev/null +++ b/doc/html/reference/functions/policy/error_code.html @@ -0,0 +1,33 @@ + + +decltype(auto) error_code(T &&) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    decltype(auto) error_code(T &&)

    +

    Extracts a boost::system::error_code or + std::error_code + from the input via ADL discovery of a suitable make_error_code(T) function.

    + +

    Overridable: Argument dependent lookup.

    + +

    Requires: Always available.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE::policy

    + +

    Header: <boost/outcome/std_result.hpp>

    + + +

    Last revised: February 11, 2019 at 15:13:33 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/functions/policy/exception_ptr.html b/doc/html/reference/functions/policy/exception_ptr.html new file mode 100644 index 000000000..7c87e1d36 --- /dev/null +++ b/doc/html/reference/functions/policy/exception_ptr.html @@ -0,0 +1,33 @@ + + +decltype(auto) exception_ptr(T &&) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    decltype(auto) exception_ptr(T &&)

    +

    Extracts a boost::exception_ptr or + std::exception_ptr + from the input via ADL discovery of a suitable make_exception_ptr(T) function.

    + +

    Overridable: Argument dependent lookup.

    + +

    Requires: Always available.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE::policy

    + +

    Header: <boost/outcome/std_result.hpp>

    + + +

    Last revised: January 23, 2019 at 01:27:31 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/functions/policy/outcome_throw_as_system_error_with_payload_boost_enum.html b/doc/html/reference/functions/policy/outcome_throw_as_system_error_with_payload_boost_enum.html new file mode 100644 index 000000000..80dc19bf0 --- /dev/null +++ b/doc/html/reference/functions/policy/outcome_throw_as_system_error_with_payload_boost_enum.html @@ -0,0 +1,32 @@ + + +void outcome_throw_as_system_error_with_payload(BoostErrorCodeEnum &&) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    void outcome_throw_as_system_error_with_payload(BoostErrorCodeEnum &&)

    +

    A specialisation of outcome_throw_as_system_error_with_payload() for types where boost::system::is_error_code_enum<BoostErrorCodeEnum> or boost::system::is_error_condition_enum<BoostErrorCodeEnum> is true. This executes BOOST_OUTCOME_THROW_EXCEPTION(expr) + with a boost::system::system_error constructed from the result of the ADL discovered free function make_error_code(BoostErrorCodeEnum).

    + +

    Overridable: Argument dependent lookup.

    + +

    Requires: Either boost::system::is_error_code_enum<T> or boost::system::is_error_condition_enum<T> to be true for a decayed BoostErrorCodeEnum.

    + +

    Namespace: boost::system

    + +

    Header: <boost/outcome/boost_result.hpp>

    + + +

    Last revised: August 13, 2019 at 13:55:04 -0400

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/functions/policy/outcome_throw_as_system_error_with_payload_boost_error_code.html b/doc/html/reference/functions/policy/outcome_throw_as_system_error_with_payload_boost_error_code.html new file mode 100644 index 000000000..c5a930a28 --- /dev/null +++ b/doc/html/reference/functions/policy/outcome_throw_as_system_error_with_payload_boost_error_code.html @@ -0,0 +1,32 @@ + + +void outcome_throw_as_system_error_with_payload(const boost::system::error_code &) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    void outcome_throw_as_system_error_with_payload(const boost::system::error_code &)

    +

    A specialisation of outcome_throw_as_system_error_with_payload() for boost::system::error_code. This executes BOOST_OUTCOME_THROW_EXCEPTION(expr) + with a boost::system::system_error constructed from the input.

    + +

    Overridable: Argument dependent lookup.

    + +

    Requires: Nothing.

    + +

    Namespace: boost::system

    + +

    Header: <boost/outcome/boost_result.hpp>

    + + +

    Last revised: January 24, 2019 at 01:15:16 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/functions/policy/outcome_throw_as_system_error_with_payload_std_enum.html b/doc/html/reference/functions/policy/outcome_throw_as_system_error_with_payload_std_enum.html new file mode 100644 index 000000000..ba00daa70 --- /dev/null +++ b/doc/html/reference/functions/policy/outcome_throw_as_system_error_with_payload_std_enum.html @@ -0,0 +1,38 @@ + + +void outcome_throw_as_system_error_with_payload(ErrorCodeEnum &&) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    void outcome_throw_as_system_error_with_payload(ErrorCodeEnum &&)

    +

    A specialisation of outcome_throw_as_system_error_with_payload() for types where std::is_error_code_enum<ErrorCodeEnum> or std::is_error_condition_enum<ErrorCodeEnum> is true. This executes BOOST_OUTCOME_THROW_EXCEPTION(expr) + with a + std::system_error + constructed from the result of the ADL discovered free function make_error_code(ErrorCodeEnum).

    + +

    Overridable: Argument dependent lookup.

    + +

    Requires: Either + std::is_error_code_enum<T> + or + std::is_error_condition_enum<T> + to be true for a decayed ErrorCodeEnum.

    + +

    Namespace: std

    + +

    Header: <boost/outcome/std_result.hpp>

    + + +

    Last revised: February 01, 2019 at 15:52:57 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/functions/policy/outcome_throw_as_system_error_with_payload_std_error_code.html b/doc/html/reference/functions/policy/outcome_throw_as_system_error_with_payload_std_error_code.html new file mode 100644 index 000000000..96c3ceaf5 --- /dev/null +++ b/doc/html/reference/functions/policy/outcome_throw_as_system_error_with_payload_std_error_code.html @@ -0,0 +1,34 @@ + + +void outcome_throw_as_system_error_with_payload(const std::error_code &) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    void outcome_throw_as_system_error_with_payload(const std::error_code &)

    +

    A specialisation of outcome_throw_as_system_error_with_payload() for std::error_code. This executes BOOST_OUTCOME_THROW_EXCEPTION(expr) + with a + std::system_error + constructed from the input.

    + +

    Overridable: Argument dependent lookup.

    + +

    Requires: Nothing.

    + +

    Namespace: std

    + +

    Header: <boost/outcome/std_result.hpp>

    + + +

    Last revised: February 01, 2019 at 15:52:57 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/functions/strong_swap.html b/doc/html/reference/functions/strong_swap.html new file mode 100644 index 000000000..cdbc5b5bf --- /dev/null +++ b/doc/html/reference/functions/strong_swap.html @@ -0,0 +1,34 @@ + + +void strong_swap(bool &all_good, T &a, T &b) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    void strong_swap(bool &all_good, T &a, T &b)

    +

    The standard swap() function provides the weak guarantee i.e. that no resources are lost. This ADL discovered function provides the strong guarantee instead: that if any of these operations throw an exception (i) move construct to temporary (ii) move assign b to a (iii) move assign temporary to b, an attempt is made to restore the exact pre-swapped state upon entry, and if that recovery too fails, then the boolean all_good will be false during stack unwind from the exception throw, to indicate that state has been lost.

    + +

    This function is used within basic_result::swap(basic_result &) + if, and only if, either or both of value_type or error_type have a throwing move constructor or move assignment. It permits you to customise the implementation of the strong guarantee swap in Outcome with a more efficient implementation.

    + +

    Overridable: By Argument Dependent Lookup (ADL).

    + +

    Requires: That T is both move constructible and move assignable.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE

    + +

    Header: <boost/outcome/basic_result.hpp>

    + + +

    Last revised: June 24, 2019 at 21:09:37 +0100

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/functions/success.html b/doc/html/reference/functions/success.html new file mode 100644 index 000000000..d2e3b5eaf --- /dev/null +++ b/doc/html/reference/functions/success.html @@ -0,0 +1,34 @@ + + +auto success(T &&, …) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    auto success(T &&, ...)

    +

    Returns appropriate type sugar for constructing a successful result or outcome, usually success_type<T> + with a decayed T.

    + +

    Two default overloads are provided, one taking a single required parameter with optional spare storage value parameter returning success_type<std::decay_t<T>> and perfectly forwarding the input. The other overload takes no parameters, and returns success_type<void>, which usually causes the construction of the receiving basic_result or basic_outcome’s with a default construction of their value type.

    + +

    Overridable: By Argument Dependent Lookup (ADL).

    + +

    Requires: Always available.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE

    + +

    Header: <boost/outcome/success_failure.hpp>

    + + +

    Last revised: February 23, 2021 at 17:37:27 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/functions/try_operation_extract_value.html b/doc/html/reference/functions/try_operation_extract_value.html new file mode 100644 index 000000000..847cb705b --- /dev/null +++ b/doc/html/reference/functions/try_operation_extract_value.html @@ -0,0 +1,29 @@ + + +decltype(auto) try_operation_extract_value(X) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    decltype(auto) try_operation_extract_value(X)

    +

    This default implementation returns whatever the .assume_value() or .value() member functions return, preferentially choosing the former where both are available.

    + +

    Requires: That the expression std::declval<T>().assume_value() and/or std::declval<T>().value() is a valid expression.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE

    + +

    Header: <boost/outcome/try.hpp>

    + + +

    Last revised: June 20, 2019 at 11:14:48 +0100

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/functions/try_operation_has_value.html b/doc/html/reference/functions/try_operation_has_value.html new file mode 100644 index 000000000..6bb53d746 --- /dev/null +++ b/doc/html/reference/functions/try_operation_has_value.html @@ -0,0 +1,29 @@ + + +bool try_operation_has_value(X) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    bool try_operation_has_value(X)

    +

    This default implementation returns whatever the .has_value() member function returns.

    + +

    Requires: That the expression std::declval<T>().has_value() is a valid expression.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE

    + +

    Header: <boost/outcome/try.hpp>

    + + +

    Last revised: June 20, 2019 at 11:14:48 +0100

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/functions/try_operation_return_as.html b/doc/html/reference/functions/try_operation_return_as.html new file mode 100644 index 000000000..476df7d07 --- /dev/null +++ b/doc/html/reference/functions/try_operation_return_as.html @@ -0,0 +1,34 @@ + + +decltype(auto) try_operation_return_as(X) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    decltype(auto) try_operation_return_as(X)

    +

    This default implementation preferentially returns whatever the input type’s .as_failure() member function returns. +basic_result and basic_outcome provide such a member function, see auto as_failure() const & +.

    + +

    If .as_failure() is not available, it will also match any .error() member function, which it wraps into a failure type sugar using failure(T &&, ...) +.

    + +

    Requires: That the expression std::declval<T>().as_failure() and/or std::declval<T>().error() is a valid expression.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE

    + +

    Header: <boost/outcome/try.hpp>

    + + +

    Last revised: June 20, 2019 at 11:14:48 +0100

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/functions/try_throw_std_exception_from_error.html b/doc/html/reference/functions/try_throw_std_exception_from_error.html new file mode 100644 index 000000000..6951a2b7c --- /dev/null +++ b/doc/html/reference/functions/try_throw_std_exception_from_error.html @@ -0,0 +1,63 @@ + + +void try_throw_std_exception_from_error(std::error_code ec, const std::string &msg = std::string{}) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    void try_throw_std_exception_from_error(std::error_code ec, const std::string &msg = std::string{})

    +

    This function saves writing boilerplate by throwing a standard library exception +type equivalent to the supplied error code, with an optional custom message.

    + +

    If the function returns, there is no standard library exception type equivalent +to the supplied error code. The following codes produce the following exception +throws:

    + +
    +
    EINVAL +
    std::invalid_argument +
    EDOM +
    std::domain_error +
    E2BIG +
    std::length_error +
    ERANGE +
    std::out_of_range +
    EOVERFLOW +
    std::overflow_error +
    ENOMEM +
    std::bad_alloc +
    + +

    The choice to refer to POSIX errno values above reflects the matching algorithm. +As + std::errc + exactly maps POSIX errno, on all platforms + + std::generic_category + error codes are matched by this function. +Only on POSIX platforms only are + std::system_category + error codes +also matched by this function.

    + +

    Overridable: Not overridable.

    + +

    Requires: C++ exceptions to be globally enabled.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE

    + +

    Header: <boost/outcome/utils.hpp>

    + + +

    Last revised: February 01, 2019 at 23:42:52 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/macros.html b/doc/html/reference/macros.html new file mode 100644 index 000000000..067383542 --- /dev/null +++ b/doc/html/reference/macros.html @@ -0,0 +1,82 @@ + + +Macros - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    + +

    Macros

    +
    1. + Constrained template macros
    2. + Version macros
    3. + BOOST_OUTCOME_CO_TRY(var, expr) +

      Evaluate within a coroutine an expression which results in an understood type, assigning T to a decl called var if successful, immediately returning try_operation_return_as(X) from the calling function if unsuccessful.

    4. + BOOST_OUTCOME_CO_TRYV(expr)/BOOST_OUTCOME_CO_TRY(expr) +

      Evaluate from within a coroutine an expression which results in an understood type, continuing execution if successful, immediately returning try_operation_return_as(X) from the calling function if unsuccessful.

    5. + BOOST_OUTCOME_CO_TRYV2(spec, expr) +

      Evaluate an expression which results in an understood type, continuing execution if successful, immediately returning try_operation_return_as(X) from the calling function if unsuccessful.

    6. + BOOST_OUTCOME_CO_TRYV2_FAILURE_LIKELY(spec, expr) +

      Evaluate an expression which results in an understood type, continuing execution if successful, immediately returning try_operation_return_as(X) from the calling function if unsuccessful.

    7. + BOOST_OUTCOME_CO_TRYV_FAILURE_LIKELY(expr)/BOOST_OUTCOME_CO_TRY_FAILURE_LIKELY(expr) +

      Evaluate from within a coroutine an expression which results in an understood type, continuing execution if successful, immediately returning try_operation_return_as(X) from the calling function if unsuccessful.

    8. + BOOST_OUTCOME_CO_TRYX(expr) +

      Evaluate from within a coroutine an expression which results in an understood type, emitting the T if successful, immediately returning try_operation_return_as(X) from the calling function if unsuccessful.

    9. + BOOST_OUTCOME_CO_TRYX_FAILURE_LIKELY(expr) +

      Evaluate from within a coroutine an expression which results in an understood type, emitting the T if successful, immediately returning try_operation_return_as(X) from the calling function if unsuccessful.

    10. + BOOST_OUTCOME_CO_TRY_FAILURE_LIKELY(var, expr) +

      Evaluate within a coroutine an expression which results in an understood type, assigning T to a decl called var if successful, immediately returning try_operation_return_as(X) from the calling function if unsuccessful.

    11. + BOOST_OUTCOME_DISABLE_EXECINFO +

      If defined, disables the use of the <execinfo.h> header (or the win32 emulation).

    12. + BOOST_OUTCOME_ENABLE_LEGACY_SUPPORT_FOR +

      Enables backwards features and naming compatibility for earlier versions of Outcome.

    13. + BOOST_OUTCOME_NODISCARD +

      How to tell the compiler than the return value of a function should not be discarded without examining it.

    14. + BOOST_OUTCOME_REQUIRES(...) +

      A C++ 20 requires(...), if available.

    15. + BOOST_OUTCOME_SYMBOL_VISIBLE +

      How to mark throwable types as always having default ELF symbol visibility.

    16. + BOOST_OUTCOME_THREAD_LOCAL +

      How to mark variables as having thread local storage duration.

    17. + BOOST_OUTCOME_THROW_EXCEPTION(expr) +

      How to throw a C++ exception, or equivalent thereof.

    18. + BOOST_OUTCOME_TRY(var, expr) +

      Evaluate an expression which results in an understood type, assigning T to a decl called var if successful, immediately returning try_operation_return_as(X) from the calling function if unsuccessful.

    19. + BOOST_OUTCOME_TRYV(expr)/BOOST_OUTCOME_TRY(expr) +

      Evaluate an expression which results in an understood type, continuing execution if successful, immediately returning try_operation_return_as(X) from the calling function if unsuccessful.

    20. + BOOST_OUTCOME_TRYV2(spec, expr) +

      Evaluate an expression which results in an understood type, continuing execution if successful, immediately returning try_operation_return_as(X) from the calling function if unsuccessful.

    21. + BOOST_OUTCOME_TRYV2_FAILURE_LIKELY(spec, expr) +

      Evaluate an expression which results in an understood type, continuing execution if successful, immediately returning try_operation_return_as(X) from the calling function if unsuccessful.

    22. + BOOST_OUTCOME_TRYV_FAILURE_LIKELY(expr)/BOOST_OUTCOME_TRY_FAILURE_LIKELY(expr) +

      Evaluate an expression which results in an understood type, continuing execution if successful, immediately returning try_operation_return_as(X) from the calling function if unsuccessful.

    23. + BOOST_OUTCOME_TRYX(expr) +

      Evaluate an expression which results in an understood type, emitting the T if successful, immediately returning try_operation_return_as(X) from the calling function if unsuccessful.

    24. + BOOST_OUTCOME_TRYX_FAILURE_LIKELY(expr) +

      Evaluate an expression which results in an understood type, emitting the T if successful, immediately returning try_operation_return_as(X) from the calling function if unsuccessful.

    25. + BOOST_OUTCOME_TRY_FAILURE_LIKELY(var, expr) +

      Evaluate an expression which results in an understood type, assigning T to a decl called var if successful, immediately returning try_operation_return_as(X) from the calling function if unsuccessful.

    26. + BOOST_OUTCOME_USE_STD_IN_PLACE_TYPE +

      How to implement in_place_type_t<T> and in_place_type<T>.

    27. + BOOST_OUTCOME_USE_STD_IS_NOTHROW_SWAPPABLE +

      How to implement is_nothrow_swappable<T>.

    + + + + + + + + +

    Last revised: December 10, 2018 at 20:32:00 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/macros/co_try.html b/doc/html/reference/macros/co_try.html new file mode 100644 index 000000000..d7b61a5f4 --- /dev/null +++ b/doc/html/reference/macros/co_try.html @@ -0,0 +1,51 @@ + + +BOOST_OUTCOME_CO_TRY(var, expr) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    BOOST_OUTCOME_CO_TRY(var, expr)

    +

    Evaluate within a coroutine an expression which results in a type matching the following customisation points, assigning T to a decl called var if successful, immediately returning try_operation_return_as(X) + from the calling function if unsuccessful:

    + + + +

    Default overloads for these customisation points are provided. See the recipe for supporting foreign input to BOOST_OUTCOME_TRY.

    + +

    Hints are given to the compiler that the expression will be successful. If you expect failure, you should use BOOST_OUTCOME_CO_TRY_FAILURE_LIKELY(var, expr) + instead.

    + +

    An internal temporary to hold the value of the expression is created, which generally invokes a copy/move. If you wish to never copy/move, you can tell this macro to create the internal temporary as a reference instead.

    + +

    Overridable: Not overridable.

    + +

    Definition: See BOOST_OUTCOME_CO_TRYV(expr) + for most of the mechanics.

    + +

    If successful, var is initialised or assigned to the expression result’s .assume_value() if available, else to its .value(). This binds a reference possibly to the T stored inside the bound result of the expression, but possibly also to a temporary emitted from the value observer function.

    + +

    Header: <boost/outcome/try.hpp>

    + +

    Legacy: Before Outcome v2.2, var was always declared as an automatic rvalue ref. You can use the backwards compatibility macro OUTCOME21_CO_TRY() if wish to retain the old behaviour.

    + + +

    Last revised: February 12, 2021 at 20:25:43 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/macros/co_try_failure_likely.html b/doc/html/reference/macros/co_try_failure_likely.html new file mode 100644 index 000000000..5160e6585 --- /dev/null +++ b/doc/html/reference/macros/co_try_failure_likely.html @@ -0,0 +1,51 @@ + + +BOOST_OUTCOME_CO_TRY_FAILURE_LIKELY(var, expr) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    BOOST_OUTCOME_CO_TRY_FAILURE_LIKELY(var, expr)

    +

    Evaluate within a coroutine an expression which results in a type matching the following customisation points, assigning T to a decl called var if successful, immediately returning try_operation_return_as(X) + from the calling function if unsuccessful:

    + + + +

    Default overloads for these customisation points are provided. See the recipe for supporting foreign input to BOOST_OUTCOME_TRY.

    + +

    Hints are given to the compiler that the expression will be unsuccessful. If you expect success, you should use BOOST_OUTCOME_CO_TRY(var, expr) + instead.

    + +

    An internal temporary to hold the value of the expression is created, which generally invokes a copy/move. If you wish to never copy/move, you can tell this macro to create the internal temporary as a reference instead.

    + +

    Overridable: Not overridable.

    + +

    Definition: See BOOST_OUTCOME_CO_TRYV(expr) + for most of the mechanics.

    + +

    If successful, var is initialised or assigned to the expression result’s .assume_value() if available, else to its .value(). This binds a reference possibly to the T stored inside the bound result of the expression, but possibly also to a temporary emitted from the value observer function.

    + +

    Header: <boost/outcome/try.hpp>

    + +

    Legacy: Before Outcome v2.2, var was always declared as an automatic rvalue ref. You can use the backwards compatibility macro OUTCOME21_CO_TRY() if wish to retain the old behaviour.

    + + +

    Last revised: February 12, 2021 at 20:25:43 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/macros/co_tryv.html b/doc/html/reference/macros/co_tryv.html new file mode 100644 index 000000000..66ed86c42 --- /dev/null +++ b/doc/html/reference/macros/co_tryv.html @@ -0,0 +1,49 @@ + + +BOOST_OUTCOME_CO_TRYV(expr)/BOOST_OUTCOME_CO_TRY(expr) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    BOOST_OUTCOME_CO_TRYV(expr)/BOOST_OUTCOME_CO_TRY(expr)

    +

    Evaluate from within a coroutine an expression which results in a type matching the following customisation points, continuing execution if successful, immediately returning try_operation_return_as(X) + from the calling function if unsuccessful:

    + + + +

    Default overloads for these customisation points are provided. See the recipe for supporting foreign input to BOOST_OUTCOME_TRY.

    + +

    The difference between the BOOST_OUTCOME_CO_TRYV(expr) and BOOST_OUTCOME_CO_TRY(expr) editions is that the latter will set a variable if two or more macro arguments are present (see BOOST_OUTCOME_CO_TRY(var, expr) +). The former requires the T to be void.

    + +

    Hints are given to the compiler that the expression will be successful. If you expect failure, you should use BOOST_OUTCOME_CO_TRYV_FAILURE_LIKELY(expr) + instead.

    + +

    An internal temporary to hold the value of the expression is created, which generally invokes a copy/move. If you wish to never copy/move, you can tell this macro to create the internal temporary as a reference instead.

    + +

    Overridable: Not overridable.

    + +

    Definition: Firstly the expression’s temporary is bound to a uniquely named, stack allocated, auto &&. If that reference’s bound object’s try_operation_has_value() is false, immediately execute return try_operation_return_as(propagated unique reference);, propagating the rvalue/lvalue/etc-ness of the original expression.

    + +

    Header: <boost/outcome/try.hpp>

    + + +

    Last revised: February 12, 2021 at 20:25:43 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/macros/co_tryv2.html b/doc/html/reference/macros/co_tryv2.html new file mode 100644 index 000000000..c1610938b --- /dev/null +++ b/doc/html/reference/macros/co_tryv2.html @@ -0,0 +1,44 @@ + + +BOOST_OUTCOME_CO_TRYV2(spec, expr) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    BOOST_OUTCOME_CO_TRYV2(spec, expr)

    +

    Evaluate an expression which results in a type matching the following customisation points, continuing execution if successful, immediately returning try_operation_return_as(X) + from the calling function if unsuccessful:

    + + + +

    Default overloads for these customisation points are provided. See the recipe for supporting foreign input to BOOST_OUTCOME_TRY.

    + +

    Hints are given to the compiler that the expression will be successful. If you expect failure, you should use BOOST_OUTCOME_TRYV2_FAILURE_LIKELY(spec, expr) + instead.

    + +

    Overridable: Not overridable.

    + +

    Definition: Firstly the expression’s temporary is bound to a uniquely named, stack allocated, spec. If that reference’s bound object’s try_operation_has_value() is false, immediately execute return try_operation_return_as(propagated unique reference);, propagating the rvalue/lvalue/etc-ness of the original expression.

    + +

    Header: <boost/outcome/try.hpp>

    + + +

    Last revised: February 12, 2021 at 20:25:43 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/macros/co_tryv2_failure_likely.html b/doc/html/reference/macros/co_tryv2_failure_likely.html new file mode 100644 index 000000000..7aa67d8ea --- /dev/null +++ b/doc/html/reference/macros/co_tryv2_failure_likely.html @@ -0,0 +1,44 @@ + + +BOOST_OUTCOME_CO_TRYV2_FAILURE_LIKELY(spec, expr) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    BOOST_OUTCOME_CO_TRYV2_FAILURE_LIKELY(spec, expr)

    +

    Evaluate an expression which results in a type matching the following customisation points, continuing execution if successful, immediately returning try_operation_return_as(X) + from the calling function if unsuccessful:

    + + + +

    Default overloads for these customisation points are provided. See the recipe for supporting foreign input to BOOST_OUTCOME_TRY.

    + +

    Hints are given to the compiler that the expression will be unsuccessful. If you expect success, you should use BOOST_OUTCOME_TRYV(expr) + instead.

    + +

    Overridable: Not overridable.

    + +

    Definition: Firstly the expression’s temporary is bound to a uniquely named, stack allocated, spec. If that reference’s bound object’s try_operation_has_value() is false, immediately execute return try_operation_return_as(propagated unique reference);, propagating the rvalue/lvalue/etc-ness of the original expression.

    + +

    Header: <boost/outcome/try.hpp>

    + + +

    Last revised: February 12, 2021 at 20:25:43 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/macros/co_tryv_failure_likely.html b/doc/html/reference/macros/co_tryv_failure_likely.html new file mode 100644 index 000000000..e9d892b6a --- /dev/null +++ b/doc/html/reference/macros/co_tryv_failure_likely.html @@ -0,0 +1,49 @@ + + +BOOST_OUTCOME_CO_TRYV_FAILURE_LIKELY(expr)/BOOST_OUTCOME_CO_TRY_FAILURE_LIKELY(expr) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    BOOST_OUTCOME_CO_TRYV_FAILURE_LIKELY(expr)/BOOST_OUTCOME_CO_TRY_FAILURE_LIKELY(expr)

    +

    Evaluate from within a coroutine an expression which results in a type matching the following customisation points, continuing execution if successful, immediately returning try_operation_return_as(X) + from the calling function if unsuccessful:

    + + + +

    Default overloads for these customisation points are provided. See the recipe for supporting foreign input to BOOST_OUTCOME_TRY.

    + +

    The difference between the BOOST_OUTCOME_CO_TRYV(expr) and BOOST_OUTCOME_CO_TRY(expr) editions is that the latter will set a variable if two or more macro arguments are present (see BOOST_OUTCOME_CO_TRY(var, expr) +). The former requires the T to be void.

    + +

    Hints are given to the compiler that the expression will be unsuccessful. If you expect success, you should use BOOST_OUTCOME_CO_TRYV(expr) + instead.

    + +

    An internal temporary to hold the value of the expression is created, which generally invokes a copy/move. If you wish to never copy/move, you can tell this macro to create the internal temporary as a reference instead.

    + +

    Overridable: Not overridable.

    + +

    Definition: Firstly the expression’s temporary is bound to a uniquely named, stack allocated, auto &&. If that reference’s bound object’s try_operation_has_value() is false, immediately execute return try_operation_return_as(propagated unique reference);, propagating the rvalue/lvalue/etc-ness of the original expression.

    + +

    Header: <boost/outcome/try.hpp>

    + + +

    Last revised: February 12, 2021 at 20:25:43 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/macros/co_tryx.html b/doc/html/reference/macros/co_tryx.html new file mode 100644 index 000000000..6ffaf93c5 --- /dev/null +++ b/doc/html/reference/macros/co_tryx.html @@ -0,0 +1,54 @@ + + +BOOST_OUTCOME_CO_TRYX(expr) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    BOOST_OUTCOME_CO_TRYX(expr)

    +

    Evaluate within a coroutine an expression which results in a type matching the following customisation points, emitting the T if successful, immediately returning try_operation_return_as(X) + from the calling function if unsuccessful:

    + + + +

    Default overloads for these customisation points are provided. See the recipe for supporting foreign input to BOOST_OUTCOME_TRY.

    + +

    Hints are given to the compiler that the expression will be successful. If you expect failure, you should use BOOST_OUTCOME_CO_TRYX_FAILURE_LIKELY(expr) + instead.

    + +

    An internal temporary to hold the value of the expression is created, which generally invokes a copy/move. If you wish to never copy/move, you can tell this macro to create the internal temporary as a reference instead.

    + +

    Availability: GCC and clang only. Use #ifdef BOOST_OUTCOME_CO_TRYX to determine if available.

    + +

    Overridable: Not overridable.

    + +

    Definition: See BOOST_OUTCOME_CO_TRYV(expr) + for most of the mechanics.

    + +

    This macro makes use of a proprietary extension in GCC and clang to emit the T from a successful expression. You can thus use BOOST_OUTCOME_CO_TRYX(expr) directly in expressions e.g. auto x = y + BOOST_OUTCOME_CO_TRYX(foo(z));.

    + +

    Be aware there are compiler quirks in preserving the rvalue/lvalue/etc-ness of emitted T’s, specifically copy or move constructors may be called unexpectedly and/or copy elision not work as expected. If these prove to be problematic, use BOOST_OUTCOME_CO_TRY(var, expr) + instead.

    + +

    Header: <boost/outcome/try.hpp>

    + + +

    Last revised: February 12, 2021 at 20:25:43 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/macros/co_tryx_failure_likely.html b/doc/html/reference/macros/co_tryx_failure_likely.html new file mode 100644 index 000000000..886bf969f --- /dev/null +++ b/doc/html/reference/macros/co_tryx_failure_likely.html @@ -0,0 +1,54 @@ + + +BOOST_OUTCOME_CO_TRYX_FAILURE_LIKELY(expr) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    BOOST_OUTCOME_CO_TRYX_FAILURE_LIKELY(expr)

    +

    Evaluate within a coroutine an expression which results in a type matching the following customisation points, emitting the T if successful, immediately returning try_operation_return_as(X) + from the calling function if unsuccessful:

    + + + +

    Default overloads for these customisation points are provided. See the recipe for supporting foreign input to BOOST_OUTCOME_TRY.

    + +

    Hints are given to the compiler that the expression will be unsuccessful. If you expect success, you should use BOOST_OUTCOME_CO_TRYX(expr) + instead.

    + +

    An internal temporary to hold the value of the expression is created, which generally invokes a copy/move. If you wish to never copy/move, you can tell this macro to create the internal temporary as a reference instead.

    + +

    Availability: GCC and clang only. Use #ifdef BOOST_OUTCOME_CO_TRYX to determine if available.

    + +

    Overridable: Not overridable.

    + +

    Definition: See BOOST_OUTCOME_CO_TRYV(expr) + for most of the mechanics.

    + +

    This macro makes use of a proprietary extension in GCC and clang to emit the T from a successful expression. You can thus use BOOST_OUTCOME_CO_TRYX(expr) directly in expressions e.g. auto x = y + BOOST_OUTCOME_CO_TRYX(foo(z));.

    + +

    Be aware there are compiler quirks in preserving the rvalue/lvalue/etc-ness of emitted T’s, specifically copy or move constructors may be called unexpectedly and/or copy elision not work as expected. If these prove to be problematic, use BOOST_OUTCOME_CO_TRY(var, expr) + instead.

    + +

    Header: <boost/outcome/try.hpp>

    + + +

    Last revised: February 12, 2021 at 20:25:43 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/macros/disable_execinfo.html b/doc/html/reference/macros/disable_execinfo.html new file mode 100644 index 000000000..8c58bc63a --- /dev/null +++ b/doc/html/reference/macros/disable_execinfo.html @@ -0,0 +1,31 @@ + + +BOOST_OUTCOME_DISABLE_EXECINFO - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    BOOST_OUTCOME_DISABLE_EXECINFO

    +

    If defined, disables the use of the <execinfo.h> header (or the win32 emulation).

    + +

    Some embedded Linux toolchains do not define <execinfo.h>, thus disabling C++ exceptions on those toolchains produces a failure to find this file. Avoid that problem by defining this macro to disable stack backtrace support entirely.

    + +

    Overridable: Define before inclusion.

    + +

    Default: Defined if __ANDROID__ is defined, else undefined.

    + +

    Header: <boost/outcome/config.hpp>

    + + +

    Last revised: December 12, 2018 at 22:01:42 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/macros/enable_legacy_support_for.html b/doc/html/reference/macros/enable_legacy_support_for.html new file mode 100644 index 000000000..4ba279cdf --- /dev/null +++ b/doc/html/reference/macros/enable_legacy_support_for.html @@ -0,0 +1,29 @@ + + +BOOST_OUTCOME_ENABLE_LEGACY_SUPPORT_FOR - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    BOOST_OUTCOME_ENABLE_LEGACY_SUPPORT_FOR

    +

    As Outcome has evolved, some features and especially naming were retired in newer versions. Define this macro to enable backwards compatibility aliasing from old features and naming to new features and naming.

    + +

    Overridable: Define before inclusion.

    + +

    Default: The current version of Outcome, expressed in hundreds e.g. Outcome v2.10 is 210.

    + +

    Header: <boost/outcome/config.hpp>

    + + +

    Last revised: May 24, 2020 at 12:48:39 +0100

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/macros/in_place_type.html b/doc/html/reference/macros/in_place_type.html new file mode 100644 index 000000000..ae3410c2e --- /dev/null +++ b/doc/html/reference/macros/in_place_type.html @@ -0,0 +1,37 @@ + + +BOOST_OUTCOME_USE_STD_IN_PLACE_TYPE - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    BOOST_OUTCOME_USE_STD_IN_PLACE_TYPE

    +

    How to implement in_place_type_t<T> + and in_place_type<T>.

    + +

    If set to 1, the <utility> header is included, and std::in_place_type_t<T> +is aliased into BOOST_OUTCOME_V2_NAMESPACE::in_place_type_t<T> along with +std::in_place_type<T>.

    + +

    If set to 0, a local emulation is used.

    + +

    Overridable: Define before inclusion.

    + +

    Default: If the current compiler implements C++ 17 or later, if unset +this macro is defaulted to 1, otherwise it is defaulted to 0.

    + +

    Header: <boost/outcome/config.hpp>

    + + +

    Last revised: January 30, 2019 at 16:16:10 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/macros/is_nothrow_swappable.html b/doc/html/reference/macros/is_nothrow_swappable.html new file mode 100644 index 000000000..da7d6dd95 --- /dev/null +++ b/doc/html/reference/macros/is_nothrow_swappable.html @@ -0,0 +1,31 @@ + + +BOOST_OUTCOME_USE_STD_IS_NOTHROW_SWAPPABLE - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    BOOST_OUTCOME_USE_STD_IS_NOTHROW_SWAPPABLE

    +

    Whether to implement is_nothrow_swappable<T> as std::is_nothrow_swappable<T>, +or else use a local emulation.

    + +

    Overridable: Define before inclusion.

    + +

    Default: If the current compiler implements C++ 17 or later, if unset +this macro is defaulted to 1, otherwise it is defaulted to 0.

    + +

    Header: <boost/outcome/config.hpp>

    + + +

    Last revised: February 05, 2019 at 17:14:18 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/macros/nodiscard.html b/doc/html/reference/macros/nodiscard.html new file mode 100644 index 000000000..3d343c257 --- /dev/null +++ b/doc/html/reference/macros/nodiscard.html @@ -0,0 +1,29 @@ + + +BOOST_OUTCOME_NODISCARD - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    BOOST_OUTCOME_NODISCARD

    +

    Compiler-specific markup used to tell the compiler than the return value of a function should not be discarded without examining it.

    + +

    Overridable: Define before inclusion.

    + +

    Default: To [[nodiscard]] if on C++ 17 or higher, __attribute__((warn_unused_result)) if on clang, SAL _Must_inspect_result_ if on MSVC, otherwise nothing.

    + +

    Header: <boost/outcome/config.hpp>

    + + +

    Last revised: December 12, 2018 at 22:01:42 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/macros/requires.html b/doc/html/reference/macros/requires.html new file mode 100644 index 000000000..7ccfc51a4 --- /dev/null +++ b/doc/html/reference/macros/requires.html @@ -0,0 +1,29 @@ + + +BOOST_OUTCOME_REQUIRES(…) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    BOOST_OUTCOME_REQUIRES(...)

    +

    A C++ 20 requires(...), if available.

    + +

    Overridable: Define before inclusion.

    + +

    Default: To requires(...) if on C++ 20 or later, else to nothing.

    + +

    Header: <boost/outcome/config.hpp>

    + + +

    Last revised: December 12, 2018 at 22:01:42 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/macros/symbol_visible.html b/doc/html/reference/macros/symbol_visible.html new file mode 100644 index 000000000..8ddc724c4 --- /dev/null +++ b/doc/html/reference/macros/symbol_visible.html @@ -0,0 +1,34 @@ + + +BOOST_OUTCOME_SYMBOL_VISIBLE - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    BOOST_OUTCOME_SYMBOL_VISIBLE

    +

    Compiler-specific markup used to mark throwable types as always having default ELF symbol visibility, without which it will be impossible to catch throws of such types across shared library boundaries on ELF only.

    + +

    Overridable: Define before inclusion.

    + +

    Default:

    +
    Standalone Outcome: +
    To __attribute__((visibility("default")) on GCC and clang when targeting ELF, otherwise nothing. +
    Boost.Outcome: +
    To BOOST_SYMBOL_VISIBLE. +

    + +

    Header: <boost/outcome/config.hpp>

    + + +

    Last revised: December 12, 2018 at 22:01:42 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/macros/template.html b/doc/html/reference/macros/template.html new file mode 100644 index 000000000..be0a95bad --- /dev/null +++ b/doc/html/reference/macros/template.html @@ -0,0 +1,56 @@ + + +Constrained template macros - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    Constrained template macros

    +

    Overridable: All of the following macros are overridable, define before inclusion.

    + +

    Header: <boost/outcome/config.hpp>

    + +

    These macros expand into either the syntax for directly specifying constrained templates in C++ 20, or into a SFINAE based emulation for earlier C++ versions. Form of usage looks as follows:

    +
    BOOST_OUTCOME_TEMPLATE(class ErrorCondEnum)
    +  BOOST_OUTCOME_TREQUIRES(
    +    // If this is a valid expression
    +    BOOST_OUTCOME_TEXPR(error_type(make_error_code(ErrorCondEnum()))),
    +    // If this predicate is true
    +    BOOST_OUTCOME_TPRED(predicate::template enable_error_condition_converting_constructor<ErrorCondEnum>)
    +    // Any additional requirements follow here ...
    +  )
    +  constexpr basic_result(ErrorCondEnum &&t, error_condition_converting_constructor_tag /*unused*/ = {});
    +
    +

    Be aware that slightly different semantics occur for real C++ 20 constrained templates than for the SFINAE emulation.

    + +
      +
    • BOOST_OUTCOME_TEMPLATE(template args ...)

      + +

      Begins a constrained template declaration.

    • + +
    • BOOST_OUTCOME_TREQUIRES(requirements ...)

      + +

      Specifies the requirements for the constrained template to be available for selection by the compiler.

    • + +
    • BOOST_OUTCOME_TEXPR(expression)

      + +

      A requirement that the given expression is valid.

    • + +
    • BOOST_OUTCOME_TPRED(boolean)

      + +

      A requirement that the given constant time expression is true.

    • +
    + + +

    Last revised: December 12, 2018 at 22:01:42 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/macros/thread_local.html b/doc/html/reference/macros/thread_local.html new file mode 100644 index 000000000..d557ab7f9 --- /dev/null +++ b/doc/html/reference/macros/thread_local.html @@ -0,0 +1,36 @@ + + +BOOST_OUTCOME_THREAD_LOCAL - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    BOOST_OUTCOME_THREAD_LOCAL

    +

    Compiler-specific markup used to mark variables as having thread local storage duration.

    + +
    +
    note
    +

    This isn’t used inside Outcome, but is used by its unit test suite.

    +
    +
    + + +

    Overridable: Define before inclusion.

    + +

    Default: To thread_local if the compiler implements C++ 11 thread_local, else __thread for the one supported compiler (older Mac OS XCode) which does not.

    + +

    Header: <boost/outcome/config.hpp>

    + + +

    Last revised: December 12, 2018 at 22:01:42 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/macros/throw_exception.html b/doc/html/reference/macros/throw_exception.html new file mode 100644 index 000000000..bde025a61 --- /dev/null +++ b/doc/html/reference/macros/throw_exception.html @@ -0,0 +1,36 @@ + + +BOOST_OUTCOME_THROW_EXCEPTION(expr) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    BOOST_OUTCOME_THROW_EXCEPTION(expr)

    +

    Throws a C++ exception, or equivalent thereof.

    + +

    Overridable: Define before inclusion.

    + +

    Default:

    +
    Standalone Outcome (C++ exceptions enabled): +
    To throw expr +
    Standalone Outcome (C++ exceptions disabled): +
    To BOOST_OUTCOME_V2_NAMESPACE::detail::do_fatal_exit(#expr) which is a function which prints a useful error message including a stack backtrace (where available) to stderr before calling abort(). +
    Boost.Outcome: +
    To BOOST_THROW_EXCEPTION(expr). +

    + +

    Header: <boost/outcome/config.hpp>

    + + +

    Last revised: December 12, 2018 at 22:01:42 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/macros/try.html b/doc/html/reference/macros/try.html new file mode 100644 index 000000000..80a1b6745 --- /dev/null +++ b/doc/html/reference/macros/try.html @@ -0,0 +1,51 @@ + + +BOOST_OUTCOME_TRY(var, expr) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    BOOST_OUTCOME_TRY(var, expr)

    +

    Evaluate an expression which results in a type matching the following customisation points, assigning T to a decl called var if successful, immediately returning try_operation_return_as(X) + from the calling function if unsuccessful:

    + + + +

    Default overloads for these customisation points are provided. See the recipe for supporting foreign input to BOOST_OUTCOME_TRY.

    + +

    Hints are given to the compiler that the expression will be successful. If you expect failure, you should use BOOST_OUTCOME_TRY_FAILURE_LIKELY(var, expr) + instead.

    + +

    An internal temporary to hold the value of the expression is created, which generally invokes a copy/move. If you wish to never copy/move, you can tell this macro to create the internal temporary as a reference instead.

    + +

    Overridable: Not overridable.

    + +

    Definition: See BOOST_OUTCOME_TRYV(expr) + for most of the mechanics.

    + +

    If successful, var is initialised or assigned to the expression result’s .assume_value() if available, else to its .value(). This binds a reference possibly to the T stored inside the bound result of the expression, but possibly also to a temporary emitted from the value observer function.

    + +

    Header: <boost/outcome/try.hpp>

    + +

    Legacy: Before Outcome v2.2, var was always declared as an automatic rvalue ref. You can use the backwards compatibility macro OUTCOME21_TRY() if wish to retain the old behaviour.

    + + +

    Last revised: February 12, 2021 at 20:25:43 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/macros/try_failure_likely.html b/doc/html/reference/macros/try_failure_likely.html new file mode 100644 index 000000000..0528a47c2 --- /dev/null +++ b/doc/html/reference/macros/try_failure_likely.html @@ -0,0 +1,51 @@ + + +BOOST_OUTCOME_TRY_FAILURE_LIKELY(var, expr) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    BOOST_OUTCOME_TRY_FAILURE_LIKELY(var, expr)

    +

    Evaluate an expression which results in a type matching the following customisation points, assigning T to a decl called var if successful, immediately returning try_operation_return_as(X) + from the calling function if unsuccessful:

    + + + +

    Default overloads for these customisation points are provided. See the recipe for supporting foreign input to BOOST_OUTCOME_TRY.

    + +

    Hints are given to the compiler that the expression will be unsuccessful. If you expect success, you should use BOOST_OUTCOME_TRY(var, expr) + instead.

    + +

    An internal temporary to hold the value of the expression is created, which generally invokes a copy/move. If you wish to never copy/move, you can tell this macro to create the internal temporary as a reference instead.

    + +

    Overridable: Not overridable.

    + +

    Definition: See BOOST_OUTCOME_TRYV(expr) + for most of the mechanics.

    + +

    If successful, var is initialised or assigned to the expression result’s .assume_value() if available, else to its .value(). This binds a reference possibly to the T stored inside the bound result of the expression, but possibly also to a temporary emitted from the value observer function.

    + +

    Header: <boost/outcome/try.hpp>

    + +

    Legacy: Before Outcome v2.2, var was always declared as an automatic rvalue ref. You can use the backwards compatibility macro OUTCOME21_CO_TRY() if wish to retain the old behaviour.

    + + +

    Last revised: February 12, 2021 at 20:25:43 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/macros/tryv.html b/doc/html/reference/macros/tryv.html new file mode 100644 index 000000000..7d83a6560 --- /dev/null +++ b/doc/html/reference/macros/tryv.html @@ -0,0 +1,49 @@ + + +BOOST_OUTCOME_TRYV(expr)/BOOST_OUTCOME_TRY(expr) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    BOOST_OUTCOME_TRYV(expr)/BOOST_OUTCOME_TRY(expr)

    +

    Evaluate an expression which results in a type matching the following customisation points, continuing execution if successful, immediately returning try_operation_return_as(X) + from the calling function if unsuccessful:

    + + + +

    Default overloads for these customisation points are provided. See the recipe for supporting foreign input to BOOST_OUTCOME_TRY.

    + +

    The difference between the BOOST_OUTCOME_TRYV(expr) and BOOST_OUTCOME_TRY(expr) editions is that the latter will set a variable if two or more macro arguments are present (see BOOST_OUTCOME_TRY(var, expr) +). The former requires the T to be void.

    + +

    Hints are given to the compiler that the expression will be successful. If you expect failure, you should use BOOST_OUTCOME_TRYV_FAILURE_LIKELY(expr) + instead.

    + +

    An internal temporary to hold the value of the expression is created, which generally invokes a copy/move. If you wish to never copy/move, you can tell this macro to create the internal temporary as a reference instead.

    + +

    Overridable: Not overridable.

    + +

    Definition: Firstly the expression’s temporary is bound to a uniquely named, stack allocated, auto &&. If that reference’s bound object’s try_operation_has_value() is false, immediately execute return try_operation_return_as(propagated unique reference);, propagating the rvalue/lvalue/etc-ness of the original expression.

    + +

    Header: <boost/outcome/try.hpp>

    + + +

    Last revised: February 12, 2021 at 20:25:43 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/macros/tryv2.html b/doc/html/reference/macros/tryv2.html new file mode 100644 index 000000000..17b434269 --- /dev/null +++ b/doc/html/reference/macros/tryv2.html @@ -0,0 +1,44 @@ + + +BOOST_OUTCOME_TRYV2(spec, expr) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    BOOST_OUTCOME_TRYV2(spec, expr)

    +

    Evaluate an expression which results in a type matching the following customisation points, continuing execution if successful, immediately returning try_operation_return_as(X) + from the calling function if unsuccessful:

    + + + +

    Default overloads for these customisation points are provided. See the recipe for supporting foreign input to BOOST_OUTCOME_TRY.

    + +

    Hints are given to the compiler that the expression will be successful. If you expect failure, you should use BOOST_OUTCOME_TRYV2_FAILURE_LIKELY(spec, expr) + instead.

    + +

    Overridable: Not overridable.

    + +

    Definition: Firstly the expression’s temporary is bound to a uniquely named, stack allocated, spec. If that reference’s bound object’s try_operation_has_value() is false, immediately execute return try_operation_return_as(propagated unique reference);, propagating the rvalue/lvalue/etc-ness of the original expression.

    + +

    Header: <boost/outcome/try.hpp>

    + + +

    Last revised: February 12, 2021 at 20:25:43 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/macros/tryv2_failure_likely.html b/doc/html/reference/macros/tryv2_failure_likely.html new file mode 100644 index 000000000..1b89d0f78 --- /dev/null +++ b/doc/html/reference/macros/tryv2_failure_likely.html @@ -0,0 +1,44 @@ + + +BOOST_OUTCOME_TRYV2_FAILURE_LIKELY(spec, expr) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    BOOST_OUTCOME_TRYV2_FAILURE_LIKELY(spec, expr)

    +

    Evaluate an expression which results in a type matching the following customisation points, continuing execution if successful, immediately returning try_operation_return_as(X) + from the calling function if unsuccessful:

    + + + +

    Default overloads for these customisation points are provided. See the recipe for supporting foreign input to BOOST_OUTCOME_TRY.

    + +

    Hints are given to the compiler that the expression will be unsuccessful. If you expect success, you should use BOOST_OUTCOME_TRYV(expr) + instead.

    + +

    Overridable: Not overridable.

    + +

    Definition: Firstly the expression’s temporary is bound to a uniquely named, stack allocated, spec. If that reference’s bound object’s try_operation_has_value() is false, immediately execute return try_operation_return_as(propagated unique reference);, propagating the rvalue/lvalue/etc-ness of the original expression.

    + +

    Header: <boost/outcome/try.hpp>

    + + +

    Last revised: February 12, 2021 at 20:25:43 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/macros/tryv_failure_likely.html b/doc/html/reference/macros/tryv_failure_likely.html new file mode 100644 index 000000000..db19cbee2 --- /dev/null +++ b/doc/html/reference/macros/tryv_failure_likely.html @@ -0,0 +1,49 @@ + + +BOOST_OUTCOME_TRYV_FAILURE_LIKELY(expr)/BOOST_OUTCOME_TRY_FAILURE_LIKELY(expr) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    BOOST_OUTCOME_TRYV_FAILURE_LIKELY(expr)/BOOST_OUTCOME_TRY_FAILURE_LIKELY(expr)

    +

    Evaluate an expression which results in a type matching the following customisation points, continuing execution if successful, immediately returning try_operation_return_as(X) + from the calling function if unsuccessful:

    + + + +

    Default overloads for these customisation points are provided. See the recipe for supporting foreign input to BOOST_OUTCOME_TRY.

    + +

    The difference between the BOOST_OUTCOME_TRYV(expr) and BOOST_OUTCOME_TRY(expr) editions is that the latter will set a variable if two or more macro arguments are present (see BOOST_OUTCOME_TRY(var, expr) +). The former requires the T to be void.

    + +

    Hints are given to the compiler that the expression will be unsuccessful. If you expect success, you should use BOOST_OUTCOME_TRYV(expr) + instead.

    + +

    An internal temporary to hold the value of the expression is created, which generally invokes a copy/move. If you wish to never copy/move, you can tell this macro to create the internal temporary as a reference instead.

    + +

    Overridable: Not overridable.

    + +

    Definition: Firstly the expression’s temporary is bound to a uniquely named, stack allocated, auto &&. If that reference’s bound object’s try_operation_has_value() is false, immediately execute return try_operation_return_as(propagated unique reference);, propagating the rvalue/lvalue/etc-ness of the original expression.

    + +

    Header: <boost/outcome/try.hpp>

    + + +

    Last revised: February 12, 2021 at 20:25:43 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/macros/tryx.html b/doc/html/reference/macros/tryx.html new file mode 100644 index 000000000..3423de5f3 --- /dev/null +++ b/doc/html/reference/macros/tryx.html @@ -0,0 +1,54 @@ + + +BOOST_OUTCOME_TRYX(expr) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    BOOST_OUTCOME_TRYX(expr)

    +

    Evaluate an expression which results in a type matching the following customisation points, emitting the T if successful, immediately returning try_operation_return_as(X) + from the calling function if unsuccessful:

    + + + +

    Default overloads for these customisation points are provided. See the recipe for supporting foreign input to BOOST_OUTCOME_TRY.

    + +

    Hints are given to the compiler that the expression will be successful. If you expect failure, you should use BOOST_OUTCOME_TRYX_FAILURE_LIKELY(expr) + instead.

    + +

    An internal temporary to hold the value of the expression is created, which generally invokes a copy/move. If you wish to never copy/move, you can tell this macro to create the internal temporary as a reference instead.

    + +

    Availability: GCC and clang only. Use #ifdef BOOST_OUTCOME_TRYX to determine if available.

    + +

    Overridable: Not overridable.

    + +

    Definition: See BOOST_OUTCOME_TRYV(expr) + for most of the mechanics.

    + +

    This macro makes use of a proprietary extension in GCC and clang to emit the T from a successful expression. You can thus use BOOST_OUTCOME_TRYX(expr) directly in expressions e.g. auto x = y + BOOST_OUTCOME_TRYX(foo(z));.

    + +

    Be aware there are compiler quirks in preserving the rvalue/lvalue/etc-ness of emitted T’s, specifically copy or move constructors may be called unexpectedly and/or copy elision not work as expected. If these prove to be problematic, use BOOST_OUTCOME_TRY(var, expr) + instead.

    + +

    Header: <boost/outcome/try.hpp>

    + + +

    Last revised: February 12, 2021 at 20:25:43 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/macros/tryx_failure_likely.html b/doc/html/reference/macros/tryx_failure_likely.html new file mode 100644 index 000000000..91e8cf8f0 --- /dev/null +++ b/doc/html/reference/macros/tryx_failure_likely.html @@ -0,0 +1,54 @@ + + +BOOST_OUTCOME_TRYX_FAILURE_LIKELY(expr) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    BOOST_OUTCOME_TRYX_FAILURE_LIKELY(expr)

    +

    Evaluate an expression which results in a type matching the following customisation points, emitting the T if successful, immediately returning try_operation_return_as(X) + from the calling function if unsuccessful:

    + + + +

    Default overloads for these customisation points are provided. See the recipe for supporting foreign input to BOOST_OUTCOME_TRY.

    + +

    Hints are given to the compiler that the expression will be unsuccessful. If you expect success, you should use BOOST_OUTCOME_TRYX(expr) + instead.

    + +

    An internal temporary to hold the value of the expression is created, which generally invokes a copy/move. If you wish to never copy/move, you can tell this macro to create the internal temporary as a reference instead.

    + +

    Availability: GCC and clang only. Use #ifdef BOOST_OUTCOME_TRYX to determine if available.

    + +

    Overridable: Not overridable.

    + +

    Definition: See BOOST_OUTCOME_TRYV(expr) + for most of the mechanics.

    + +

    This macro makes use of a proprietary extension in GCC and clang to emit the T from a successful expression. You can thus use BOOST_OUTCOME_TRYX(expr) directly in expressions e.g. auto x = y + BOOST_OUTCOME_TRYX(foo(z));.

    + +

    Be aware there are compiler quirks in preserving the rvalue/lvalue/etc-ness of emitted T’s, specifically copy or move constructors may be called unexpectedly and/or copy elision not work as expected. If these prove to be problematic, use BOOST_OUTCOME_TRY(var, expr) + instead.

    + +

    Header: <boost/outcome/try.hpp>

    + + +

    Last revised: February 12, 2021 at 20:25:43 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/macros/version.html b/doc/html/reference/macros/version.html new file mode 100644 index 000000000..cff9537a7 --- /dev/null +++ b/doc/html/reference/macros/version.html @@ -0,0 +1,67 @@ + + +Version macros - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    Version macros

    +

    Overridable: None of the following macros are overridable.

    + +

    Header: <boost/outcome/config.hpp>

    + +
      +
    • BOOST_OUTCOME_VERSION_MAJOR <number>

      + +

      Major version for cmake and DLL version stamping.

    • + +
    • BOOST_OUTCOME_VERSION_MINOR <number>

      + +

      Minor version for cmake and DLL version stamping.

    • + +
    • BOOST_OUTCOME_VERSION_PATCH <number>

      + +

      Patch version for cmake and DLL version stamping.

    • + +
    • BOOST_OUTCOME_VERSION_REVISION <number>

      + +

      Revision version for cmake and DLL version stamping.

    • + +
    • BOOST_OUTCOME_UNSTABLE_VERSION <number>

      + +

      Defined between stable releases of Outcome. It means the inline namespace will be permuted per-commit to ensure ABI uniqueness such that multiple versions of Outcome in a single process space cannot collide.

    • + +
    • BOOST_OUTCOME_V2 <tokens>

      + +

      The namespace configuration of this Outcome v2. Consists of a sequence of bracketed tokens later fused by the preprocessor into namespace and C++ module names.

    • + +
    • BOOST_OUTCOME_V2_NAMESPACE <identifier>

      + +

      The Outcome namespace, which may be permuted per SHA commit. This is not fully qualified.

    • + +
    • BOOST_OUTCOME_V2_NAMESPACE_BEGIN <keywords and identifiers>

      + +

      Expands into the appropriate namespace markup to enter the Outcome v2 namespace.

    • + +
    • BOOST_OUTCOME_V2_NAMESPACE_EXPORT_BEGIN <keywords and identifiers>

      + +

      Expands into the appropriate namespace markup to enter the C++ module exported Outcome v2 namespace.

    • + +
    • BOOST_OUTCOME_V2_NAMESPACE_END <keywords and identifiers>

      + +

      Expands into the appropriate namespace markup to exit the Outcome v2 namespace.

    • +
    + + +

    Last revised: December 12, 2018 at 22:01:42 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/policies.html b/doc/html/reference/policies.html new file mode 100644 index 000000000..9977a58f8 --- /dev/null +++ b/doc/html/reference/policies.html @@ -0,0 +1,100 @@ + + +Policies - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    + +

    Policies

    +
    1. + base +

      Base class of most policy classes defining the narrow observer policies.

      1. + static void _ub(Impl &&) +

        Special function which causes noticeable hard undefined behaviour.

      2. + static bool _has_value(Impl &&) noexcept +

        Returns true if a value is present in the implementation passed in. Constexpr, never throws.

      3. + static bool _has_error(Impl &&) noexcept +

        Returns true if an error is present in the implementation passed in. Constexpr, never throws.

      4. + static bool _has_exception(Impl &&) noexcept +

        Returns true if an exception is present in the implementation passed in. Constexpr, never throws.

      5. + static bool _has_error_is_errno(Impl &&) noexcept +

        Returns true if the error code in the implementation passed in has a domain or category matching that of POSIX errno. Constexpr, never throws.

      6. + static auto &&_value(Impl &&) noexcept +

        Returns a reference to the value in the implementation passed in. Constexpr, never throws.

      7. + static auto &&_error(Impl &&) noexcept +

        Returns a reference to the error in the implementation passed in. Constexpr, never throws.

      8. + static auto &&_exception(Impl &&) noexcept +

        Returns a reference to the exception in the implementation passed in. Constexpr, never throws.

      9. + static void _set_has_value(Impl &&, bool) noexcept +

        Sets whether the implementation has a value. Constexpr, never throws.

      10. + static void _set_has_error(Impl &&, bool) noexcept +

        Sets whether the implementation has an error. Constexpr, never throws.

      11. + static void _set_has_exception(Impl &&, bool) noexcept +

        Sets whether the implementation has an exception. Constexpr, never throws.

      12. + static void _set_has_exception(Impl &&, bool) noexcept +

        Sets whether the implementation’s error code has a domain or category matching that of POSIX errno. Constexpr, never throws.

      13. + static void narrow_value_check(Impl &&) noexcept +

        Observer policy performing hard UB if no value is present. Constexpr, never throws.

      14. + static void narrow_error_check(Impl &&) noexcept +

        Observer policy performing hard UB if no error is present. Constexpr, never throws.

      15. + static void narrow_exception_check(Impl &&) noexcept +

        Observer policy performing hard UB if no exception is present. Constexpr, never throws.

      16. + static void on_outcome_construction(T *, U &&) noexcept +

        (>= Outcome v2.2.0) Hook invoked by the implicit constructors of basic_outcome.

      17. + static void on_outcome_construction(T *, U &&, V &&) noexcept +

        (>= Outcome v2.2.0) Hook invoked by the implicit constructors of basic_outcome.

      18. + static void on_outcome_copy_construction(T *, U &&) noexcept +

        (>= Outcome v2.2.0) Hook invoked by the converting copy constructors of basic_outcome.

      19. + static void on_outcome_copy_construction(T *, U &&, V &&) noexcept +

        (>= Outcome v2.2.0) Hook invoked by the converting copy constructors of basic_outcome.

      20. + static void on_outcome_in_place_construction(T *, in_place_type_t<U>, Args &&...) noexcept +

        (>= Outcome v2.2.0) Hook invoked by the in-place constructors of basic_outcome.

      21. + static void on_outcome_move_construction(T *, U &&) noexcept +

        (>= Outcome v2.2.0) Hook invoked by the converting move constructors of basic_outcome.

      22. + static void on_outcome_move_construction(T *, U &&, V &&) noexcept +

        (>= Outcome v2.2.0) Hook invoked by the converting move constructors of basic_outcome.

      23. + static void on_result_construction(T *, U &&) noexcept +

        (>= Outcome v2.2.0) Hook invoked by the implicit constructors of basic_result.

      24. + static void on_result_copy_construction(T *, U &&) noexcept +

        (>= Outcome v2.2.0) Hook invoked by the converting copy constructors of basic_result.

      25. + static void on_result_in_place_construction(T *, in_place_type_t<U>, Args &&...) noexcept +

        (>= Outcome v2.2.0) Hook invoked by the in-place constructors of basic_result.

      26. + static void on_result_move_construction(T *, U &&) noexcept +

        (>= Outcome v2.2.0) Hook invoked by the converting move constructors of basic_result.

    2. + all_narrow +

      Policy class defining that hard undefined behaviour should occur on incorrect narrow and wide value, error or exception observation. Inherits publicly from base.

    3. + error_code_throw_as_system_error<T, EC, EP> +

      Policy class defining that EP ought to be rethrown if possible, then the ADL discovered free function outcome_throw_as_system_error_with_payload() should be called on incorrect wide value observation. Inherits publicly from base. Can only be used with basic_outcome.

    4. + error_code_throw_as_system_error<T, EC, void> +

      Policy class defining that the ADL discovered free function outcome_throw_as_system_error_with_payload() should be called on incorrect wide value observation. Inherits publicly from base. Can only be used with basic_result.

    5. + exception_ptr_rethrow<T, EC, EP> +

      Policy class defining that the ADL discovered free function rethrow_exception() should be called on incorrect wide value observation. Inherits publicly from base. Can only be used with basic_outcome.

    6. + exception_ptr_rethrow<T, EC, void> +

      Policy class defining that the ADL discovered free function rethrow_exception() should be called on incorrect wide value observation. Inherits publicly from base. Can only be used with basic_result.

    7. + fail_to_compile_observers +

      Policy class defining that a static assertion should occur upon compilation of the wide value, error or exception observation. Inherits publicly from base.

    8. + terminate +

      Policy class defining that std::terminate() should be called on incorrect wide value, error or exception observation. Inherits publicly from base.

    9. + throw_bad_result_access<EC> +

      Policy class defining that bad_result_access_with<EC> should be thrown on incorrect wide value observation. Inherits publicly from base.

    + + + + + + + + +

    Last revised: December 13, 2018 at 21:10:19 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/policies/all_narrow.html b/doc/html/reference/policies/all_narrow.html new file mode 100644 index 000000000..d08232299 --- /dev/null +++ b/doc/html/reference/policies/all_narrow.html @@ -0,0 +1,34 @@ + + +all_narrow - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    all_narrow

    +

    Policy class defining that hard undefined behaviour should occur on incorrect narrow and wide value, error or exception observation.

    + +

    Inherits publicly from base +, and simply defines its wide value, error and exception observer policies to call their corresponding narrow editions.

    + +

    Included by <basic_result.hpp>, and so is always available when basic_result is available.

    + +

    Requires: Nothing.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE::policy

    + +

    Header: <boost/outcome/policy/all_narrow.hpp>

    + + +

    Last revised: January 22, 2019 at 01:11:40 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/policies/base.html b/doc/html/reference/policies/base.html new file mode 100644 index 000000000..f9d31b50f --- /dev/null +++ b/doc/html/reference/policies/base.html @@ -0,0 +1,107 @@ + + +base - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    + +

    base

    + + +

    Implements the base class of most policy classes defining the narrow observer policies.

    + +

    Requires: Nothing.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE::policy

    + +

    Header: <boost/outcome/policy/base.hpp>

    + +

    Protected member functions

    + +

    Special

    + +
    1. + static void _ub(Impl &&) +

      Special function which causes noticeable hard undefined behaviour.

    + +

    Observers

    + +
    1. + static bool _has_value(Impl &&) noexcept +

      Returns true if a value is present in the implementation passed in. Constexpr, never throws.

    2. + static bool _has_error(Impl &&) noexcept +

      Returns true if an error is present in the implementation passed in. Constexpr, never throws.

    3. + static bool _has_exception(Impl &&) noexcept +

      Returns true if an exception is present in the implementation passed in. Constexpr, never throws.

    4. + static bool _has_error_is_errno(Impl &&) noexcept +

      Returns true if the error code in the implementation passed in has a domain or category matching that of POSIX errno. Constexpr, never throws.

    5. + static auto &&_value(Impl &&) noexcept +

      Returns a reference to the value in the implementation passed in. Constexpr, never throws.

    6. + static auto &&_error(Impl &&) noexcept +

      Returns a reference to the error in the implementation passed in. Constexpr, never throws.

    7. + static auto &&_exception(Impl &&) noexcept +

      Returns a reference to the exception in the implementation passed in. Constexpr, never throws.

    + +

    Modifiers

    + +
    1. + static void _set_has_value(Impl &&, bool) noexcept +

      Sets whether the implementation has a value. Constexpr, never throws.

    2. + static void _set_has_error(Impl &&, bool) noexcept +

      Sets whether the implementation has an error. Constexpr, never throws.

    3. + static void _set_has_exception(Impl &&, bool) noexcept +

      Sets whether the implementation has an exception. Constexpr, never throws.

    4. + static void _set_has_exception(Impl &&, bool) noexcept +

      Sets whether the implementation’s error code has a domain or category matching that of POSIX errno. Constexpr, never throws.

    + +

    Public member functions

    + +
    1. + static void narrow_value_check(Impl &&) noexcept +

      Observer policy performing hard UB if no value is present. Constexpr, never throws.

    2. + static void narrow_error_check(Impl &&) noexcept +

      Observer policy performing hard UB if no error is present. Constexpr, never throws.

    3. + static void narrow_exception_check(Impl &&) noexcept +

      Observer policy performing hard UB if no exception is present. Constexpr, never throws.

    4. + static void on_outcome_construction(T *, U &&) noexcept +

      (>= Outcome v2.2.0) Hook invoked by the implicit constructors of basic_outcome.

    5. + static void on_outcome_construction(T *, U &&, V &&) noexcept +

      (>= Outcome v2.2.0) Hook invoked by the implicit constructors of basic_outcome.

    6. + static void on_outcome_copy_construction(T *, U &&) noexcept +

      (>= Outcome v2.2.0) Hook invoked by the converting copy constructors of basic_outcome.

    7. + static void on_outcome_copy_construction(T *, U &&, V &&) noexcept +

      (>= Outcome v2.2.0) Hook invoked by the converting copy constructors of basic_outcome.

    8. + static void on_outcome_in_place_construction(T *, in_place_type_t<U>, Args &&...) noexcept +

      (>= Outcome v2.2.0) Hook invoked by the in-place constructors of basic_outcome.

    9. + static void on_outcome_move_construction(T *, U &&) noexcept +

      (>= Outcome v2.2.0) Hook invoked by the converting move constructors of basic_outcome.

    10. + static void on_outcome_move_construction(T *, U &&, V &&) noexcept +

      (>= Outcome v2.2.0) Hook invoked by the converting move constructors of basic_outcome.

    11. + static void on_result_construction(T *, U &&) noexcept +

      (>= Outcome v2.2.0) Hook invoked by the implicit constructors of basic_result.

    12. + static void on_result_copy_construction(T *, U &&) noexcept +

      (>= Outcome v2.2.0) Hook invoked by the converting copy constructors of basic_result.

    13. + static void on_result_in_place_construction(T *, in_place_type_t<U>, Args &&...) noexcept +

      (>= Outcome v2.2.0) Hook invoked by the in-place constructors of basic_result.

    14. + static void on_result_move_construction(T *, U &&) noexcept +

      (>= Outcome v2.2.0) Hook invoked by the converting move constructors of basic_result.

    + + + + + + + +

    Last revised: January 22, 2019 at 01:11:40 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/policies/base/error.html b/doc/html/reference/policies/base/error.html new file mode 100644 index 000000000..f04aba833 --- /dev/null +++ b/doc/html/reference/policies/base/error.html @@ -0,0 +1,29 @@ + + +static auto &&_error(Impl &&) noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    static auto &&_error(Impl &&) noexcept

    +

    Returns a reference to the error in the implementation passed in. No checking is done to ensure there is an error. Constexpr where possible.

    + +

    Requires: Always available.

    + +

    Complexity: Constant time.

    + +

    Guarantees: Never throws an exception.

    + + +

    Last revised: January 22, 2019 at 01:11:40 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/policies/base/exception.html b/doc/html/reference/policies/base/exception.html new file mode 100644 index 000000000..02472554c --- /dev/null +++ b/doc/html/reference/policies/base/exception.html @@ -0,0 +1,29 @@ + + +static auto &&_exception(Impl &&) noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    static auto &&_exception(Impl &&) noexcept

    +

    Returns a reference to the exception in the implementation passed in. No checking is done to ensure there is an error. Constexpr where possible.

    + +

    Requires: Always available.

    + +

    Complexity: Constant time.

    + +

    Guarantees: Never throws an exception.

    + + +

    Last revised: January 22, 2019 at 01:11:40 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/policies/base/has_error.html b/doc/html/reference/policies/base/has_error.html new file mode 100644 index 000000000..d3fd2cd63 --- /dev/null +++ b/doc/html/reference/policies/base/has_error.html @@ -0,0 +1,29 @@ + + +static bool _has_error(Impl &&) noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    static bool _has_error(Impl &&) noexcept

    +

    Returns true if an error is present in the implementation passed in. Constexpr where possible.

    + +

    Requires: Always available.

    + +

    Complexity: Constant time.

    + +

    Guarantees: Never throws an exception.

    + + +

    Last revised: January 22, 2019 at 01:11:40 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/policies/base/has_error_is_errno.html b/doc/html/reference/policies/base/has_error_is_errno.html new file mode 100644 index 000000000..83cb735f9 --- /dev/null +++ b/doc/html/reference/policies/base/has_error_is_errno.html @@ -0,0 +1,29 @@ + + +static bool _has_error_is_errno(Impl &&) noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    static bool _has_error_is_errno(Impl &&) noexcept

    +

    Returns true if the error code in the implementation passed in has a domain or category matching that of POSIX errno. Constexpr where possible.

    + +

    Requires: Always available.

    + +

    Complexity: Constant time.

    + +

    Guarantees: Never throws an exception.

    + + +

    Last revised: January 22, 2019 at 01:11:40 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/policies/base/has_exception.html b/doc/html/reference/policies/base/has_exception.html new file mode 100644 index 000000000..a64045f2f --- /dev/null +++ b/doc/html/reference/policies/base/has_exception.html @@ -0,0 +1,29 @@ + + +static bool _has_exception(Impl &&) noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    static bool _has_exception(Impl &&) noexcept

    +

    Returns true if an exception is present in the implementation passed in. Constexpr where possible.

    + +

    Requires: Always available.

    + +

    Complexity: Constant time.

    + +

    Guarantees: Never throws an exception.

    + + +

    Last revised: January 22, 2019 at 01:11:40 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/policies/base/has_value.html b/doc/html/reference/policies/base/has_value.html new file mode 100644 index 000000000..9f5790012 --- /dev/null +++ b/doc/html/reference/policies/base/has_value.html @@ -0,0 +1,29 @@ + + +static bool _has_value(Impl &&) noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    static bool _has_value(Impl &&) noexcept

    +

    Returns true if a value is present in the implementation passed in. Constexpr where possible.

    + +

    Requires: Always available.

    + +

    Complexity: Constant time.

    + +

    Guarantees: Never throws an exception.

    + + +

    Last revised: January 22, 2019 at 01:11:40 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/policies/base/narrow_error_check.html b/doc/html/reference/policies/base/narrow_error_check.html new file mode 100644 index 000000000..f274ad7d7 --- /dev/null +++ b/doc/html/reference/policies/base/narrow_error_check.html @@ -0,0 +1,30 @@ + + +static void narrow_error_check(Impl &&) noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    static void narrow_error_check(Impl &&) noexcept

    +

    Observer policy performing hard UB if no error is present, by calling static void _ub(Impl &&) +. Constexpr where possible.

    + +

    Requires: Always available.

    + +

    Complexity: Constant time.

    + +

    Guarantees: Never throws an exception.

    + + +

    Last revised: January 22, 2019 at 01:11:40 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/policies/base/narrow_exception_check.html b/doc/html/reference/policies/base/narrow_exception_check.html new file mode 100644 index 000000000..9cc4ce484 --- /dev/null +++ b/doc/html/reference/policies/base/narrow_exception_check.html @@ -0,0 +1,30 @@ + + +static void narrow_exception_check(Impl &&) noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    static void narrow_exception_check(Impl &&) noexcept

    +

    Observer policy performing hard UB if no exception is present, by calling static void _ub(Impl &&) +. Constexpr where possible.

    + +

    Requires: Always available.

    + +

    Complexity: Constant time.

    + +

    Guarantees: Never throws an exception.

    + + +

    Last revised: January 22, 2019 at 01:11:40 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/policies/base/narrow_value_check.html b/doc/html/reference/policies/base/narrow_value_check.html new file mode 100644 index 000000000..fb2ba7611 --- /dev/null +++ b/doc/html/reference/policies/base/narrow_value_check.html @@ -0,0 +1,30 @@ + + +static void narrow_value_check(Impl &&) noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    static void narrow_value_check(Impl &&) noexcept

    +

    Observer policy performing hard UB if no value is present, by calling static void _ub(Impl &&) +. Constexpr where possible.

    + +

    Requires: Always available.

    + +

    Complexity: Constant time.

    + +

    Guarantees: Never throws an exception.

    + + +

    Last revised: January 22, 2019 at 01:11:40 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/policies/base/on_outcome_construction.html b/doc/html/reference/policies/base/on_outcome_construction.html new file mode 100644 index 000000000..b8c2a70fe --- /dev/null +++ b/doc/html/reference/policies/base/on_outcome_construction.html @@ -0,0 +1,28 @@ + + +static void on_outcome_construction(T *, U &&) noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    static void on_outcome_construction(T *, U &&) noexcept

    +

    One of the constructor hooks for basic_outcome<T, EC, EP, NoValuePolicy> +, generally invoked by the implicit constructors of basic_outcome. See each constructor’s documentation to see which specific hook it invokes.

    + +

    Requires: Always available.

    + +

    Guarantees: Never throws an exception.

    + + +

    Last revised: December 17, 2020 at 11:27:06 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/policies/base/on_outcome_construction2.html b/doc/html/reference/policies/base/on_outcome_construction2.html new file mode 100644 index 000000000..9d779f066 --- /dev/null +++ b/doc/html/reference/policies/base/on_outcome_construction2.html @@ -0,0 +1,28 @@ + + +static void on_outcome_construction(T *, U &&, V &&) noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    static void on_outcome_construction(T *, U &&, V &&) noexcept

    +

    One of the constructor hooks for basic_outcome<T, EC, EP, NoValuePolicy> +, generally invoked by the implicit constructors of basic_outcome which consume two arguments. See each constructor’s documentation to see which specific hook it invokes.

    + +

    Requires: Always available.

    + +

    Guarantees: Never throws an exception.

    + + +

    Last revised: December 17, 2020 at 11:27:06 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/policies/base/on_outcome_copy_construction.html b/doc/html/reference/policies/base/on_outcome_copy_construction.html new file mode 100644 index 000000000..5e0423f82 --- /dev/null +++ b/doc/html/reference/policies/base/on_outcome_copy_construction.html @@ -0,0 +1,28 @@ + + +static void on_outcome_copy_construction(T *, U &&) noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    static void on_outcome_copy_construction(T *, U &&) noexcept

    +

    One of the constructor hooks for basic_outcome<T, EC, EP, NoValuePolicy> +, generally invoked by the converting copy constructors of basic_outcome (NOT the standard copy constructor). See each constructor’s documentation to see which specific hook it invokes.

    + +

    Requires: Always available.

    + +

    Guarantees: Never throws an exception.

    + + +

    Last revised: December 17, 2020 at 11:27:06 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/policies/base/on_outcome_copy_construction2.html b/doc/html/reference/policies/base/on_outcome_copy_construction2.html new file mode 100644 index 000000000..2e9daedb4 --- /dev/null +++ b/doc/html/reference/policies/base/on_outcome_copy_construction2.html @@ -0,0 +1,28 @@ + + +static void on_outcome_copy_construction(T *, U &&, V &&) noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    static void on_outcome_copy_construction(T *, U &&, V &&) noexcept

    +

    One of the constructor hooks for basic_outcome<T, EC, EP, NoValuePolicy> +, generally invoked by the converting copy constructors of basic_outcome (NOT the standard copy constructor) which consume two arguments. See each constructor’s documentation to see which specific hook it invokes.

    + +

    Requires: Always available.

    + +

    Guarantees: Never throws an exception.

    + + +

    Last revised: December 17, 2020 at 11:27:06 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/policies/base/on_outcome_in_place_construction.html b/doc/html/reference/policies/base/on_outcome_in_place_construction.html new file mode 100644 index 000000000..62838060c --- /dev/null +++ b/doc/html/reference/policies/base/on_outcome_in_place_construction.html @@ -0,0 +1,28 @@ + + +static void on_outcome_in_place_construction(T *, in_place_type_t<U>, Args &&…) noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    static void on_outcome_in_place_construction(T *, in_place_type_t<U>, Args &&...) noexcept

    +

    One of the constructor hooks for basic_outcome<T, EC, EP, NoValuePolicy> +, generally invoked by the in-place constructors of basic_outcome. See each constructor’s documentation to see which specific hook it invokes.

    + +

    Requires: Always available.

    + +

    Guarantees: Never throws an exception.

    + + +

    Last revised: December 17, 2020 at 11:27:06 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/policies/base/on_outcome_move_construction.html b/doc/html/reference/policies/base/on_outcome_move_construction.html new file mode 100644 index 000000000..b5022e0a1 --- /dev/null +++ b/doc/html/reference/policies/base/on_outcome_move_construction.html @@ -0,0 +1,28 @@ + + +static void on_outcome_move_construction(T *, U &&) noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    static void on_outcome_move_construction(T *, U &&) noexcept

    +

    One of the constructor hooks for basic_outcome<T, EC, EP, NoValuePolicy> +, generally invoked by the converting move constructors of basic_outcome (NOT the standard move constructor). See each constructor’s documentation to see which specific hook it invokes.

    + +

    Requires: Always available.

    + +

    Guarantees: Never throws an exception.

    + + +

    Last revised: December 17, 2020 at 11:27:06 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/policies/base/on_outcome_move_construction2.html b/doc/html/reference/policies/base/on_outcome_move_construction2.html new file mode 100644 index 000000000..465dc7ede --- /dev/null +++ b/doc/html/reference/policies/base/on_outcome_move_construction2.html @@ -0,0 +1,28 @@ + + +static void on_outcome_move_construction(T *, U &&, V &&) noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    static void on_outcome_move_construction(T *, U &&, V &&) noexcept

    +

    One of the constructor hooks for basic_outcome<T, EC, EP, NoValuePolicy> +, generally invoked by the converting move constructors of basic_outcome (NOT the standard move constructor) which consume two arguments. See each constructor’s documentation to see which specific hook it invokes.

    + +

    Requires: Always available.

    + +

    Guarantees: Never throws an exception.

    + + +

    Last revised: December 17, 2020 at 11:27:06 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/policies/base/on_result_construction.html b/doc/html/reference/policies/base/on_result_construction.html new file mode 100644 index 000000000..27e1731a0 --- /dev/null +++ b/doc/html/reference/policies/base/on_result_construction.html @@ -0,0 +1,28 @@ + + +static void on_result_construction(T *, U &&) noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    static void on_result_construction(T *, U &&) noexcept

    +

    One of the constructor hooks for basic_result<T, E, NoValuePolicy> +, generally invoked by the implicit constructors of basic_result. See each constructor’s documentation to see which specific hook it invokes.

    + +

    Requires: Always available.

    + +

    Guarantees: Never throws an exception.

    + + +

    Last revised: December 17, 2020 at 11:27:06 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/policies/base/on_result_copy_construction.html b/doc/html/reference/policies/base/on_result_copy_construction.html new file mode 100644 index 000000000..d6975a6c8 --- /dev/null +++ b/doc/html/reference/policies/base/on_result_copy_construction.html @@ -0,0 +1,28 @@ + + +static void on_result_copy_construction(T *, U &&) noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    static void on_result_copy_construction(T *, U &&) noexcept

    +

    One of the constructor hooks for basic_result<T, E, NoValuePolicy> +, generally invoked by the converting copy constructors of basic_result (NOT the standard copy constructor). See each constructor’s documentation to see which specific hook it invokes.

    + +

    Requires: Always available.

    + +

    Guarantees: Never throws an exception.

    + + +

    Last revised: December 17, 2020 at 11:27:06 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/policies/base/on_result_in_place_construction.html b/doc/html/reference/policies/base/on_result_in_place_construction.html new file mode 100644 index 000000000..662095b65 --- /dev/null +++ b/doc/html/reference/policies/base/on_result_in_place_construction.html @@ -0,0 +1,28 @@ + + +static void on_result_in_place_construction(T *, in_place_type_t<U>, Args &&…) noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    static void on_result_in_place_construction(T *, in_place_type_t<U>, Args &&...) noexcept

    +

    One of the constructor hooks for basic_result<T, E, NoValuePolicy> +, generally invoked by the in-place constructors of basic_result. See each constructor’s documentation to see which specific hook it invokes.

    + +

    Requires: Always available.

    + +

    Guarantees: Never throws an exception.

    + + +

    Last revised: December 17, 2020 at 11:27:06 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/policies/base/on_result_move_construction.html b/doc/html/reference/policies/base/on_result_move_construction.html new file mode 100644 index 000000000..67d96e873 --- /dev/null +++ b/doc/html/reference/policies/base/on_result_move_construction.html @@ -0,0 +1,28 @@ + + +static void on_result_move_construction(T *, U &&) noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    static void on_result_move_construction(T *, U &&) noexcept

    +

    One of the constructor hooks for basic_result<T, E, NoValuePolicy> +, generally invoked by the converting move constructors of basic_result (NOT the standard move constructor). See each constructor’s documentation to see which specific hook it invokes.

    + +

    Requires: Always available.

    + +

    Guarantees: Never throws an exception.

    + + +

    Last revised: December 17, 2020 at 11:27:06 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/policies/base/set_has_error.html b/doc/html/reference/policies/base/set_has_error.html new file mode 100644 index 000000000..9da9ff4f4 --- /dev/null +++ b/doc/html/reference/policies/base/set_has_error.html @@ -0,0 +1,29 @@ + + +static void _set_has_error(Impl &&, bool) noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    static void _set_has_error(Impl &&, bool) noexcept

    +

    Sets whether the implementation has an error by setting or clearing the relevant bit in the flags. Constexpr where possible.

    + +

    Requires: Always available.

    + +

    Complexity: Constant time.

    + +

    Guarantees: Never throws an exception.

    + + +

    Last revised: January 22, 2019 at 01:11:40 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/policies/base/set_has_error_is_errno.html b/doc/html/reference/policies/base/set_has_error_is_errno.html new file mode 100644 index 000000000..a9bbac9e5 --- /dev/null +++ b/doc/html/reference/policies/base/set_has_error_is_errno.html @@ -0,0 +1,29 @@ + + +static void _set_has_exception(Impl &&, bool) noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    static void _set_has_exception(Impl &&, bool) noexcept

    +

    Sets whether the implementation’s error code has a domain or category matching that of POSIX errno by setting or clearing the relevant bit in the flags. Constexpr where possible.

    + +

    Requires: Always available.

    + +

    Complexity: Constant time.

    + +

    Guarantees: Never throws an exception.

    + + +

    Last revised: January 22, 2019 at 01:11:40 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/policies/base/set_has_exception.html b/doc/html/reference/policies/base/set_has_exception.html new file mode 100644 index 000000000..b11334928 --- /dev/null +++ b/doc/html/reference/policies/base/set_has_exception.html @@ -0,0 +1,29 @@ + + +static void _set_has_exception(Impl &&, bool) noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    static void _set_has_exception(Impl &&, bool) noexcept

    +

    Sets whether the implementation has an exception by setting or clearing the relevant bit in the flags. Constexpr where possible.

    + +

    Requires: Always available.

    + +

    Complexity: Constant time.

    + +

    Guarantees: Never throws an exception.

    + + +

    Last revised: January 22, 2019 at 01:11:40 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/policies/base/set_has_value.html b/doc/html/reference/policies/base/set_has_value.html new file mode 100644 index 000000000..a28528c34 --- /dev/null +++ b/doc/html/reference/policies/base/set_has_value.html @@ -0,0 +1,29 @@ + + +static void _set_has_value(Impl &&, bool) noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    static void _set_has_value(Impl &&, bool) noexcept

    +

    Sets whether the implementation has a value by setting or clearing the relevant bit in the flags. Constexpr where possible.

    + +

    Requires: Always available.

    + +

    Complexity: Constant time.

    + +

    Guarantees: Never throws an exception.

    + + +

    Last revised: January 22, 2019 at 01:11:40 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/policies/base/ub.html b/doc/html/reference/policies/base/ub.html new file mode 100644 index 000000000..1640fb37b --- /dev/null +++ b/doc/html/reference/policies/base/ub.html @@ -0,0 +1,35 @@ + + +static void _ub(Impl &&) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    static void _ub(Impl &&)

    +

    This is a special function which does compiler-specific stuff to tell the compiler that this function can never, ever, ever be executed. The compiler’s optimiser will hard assume that this function can never be executed, and will prune the possibility of it being executed completely. Generally this means that the code path stops dead, and if execution does proceed down this path, it will run off the end of a branch which doesn’t go anywhere. Your program will have lost known state, and usually it will trash memory and registers and crash.

    + +

    This may seem highly undesirable. However, it also means that the optimiser can optimise more strongly, and so long as you never actually do execute this branch, you do get higher quality code generation.

    + +

    If the NDEBUG macro is not defined, an BOOST_OUTCOME_ASSERT(false) is present. This will cause attempts to execute this function to fail in a very obvious way, but it also generates runtime code to trigger the obvious failure.

    + +

    If the NDEBUG macro is defined, and the program is compiled with the undefined behaviour sanitiser, attempts to execute this function will trigger an undefined behaviour sanitiser action.

    + +

    Requires: Always available.

    + +

    Complexity: Zero runtime overhead if NDEBUG is defined, guaranteed. If this function returns, your program is now in hard loss of known program state. Usually, but not always, it will crash at some point later. Rarely it will corrupt registers and memory, and keep going.

    + +

    Guarantees: An exception is never thrown.

    + + +

    Last revised: December 16, 2023 at 20:51:26 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/policies/base/value.html b/doc/html/reference/policies/base/value.html new file mode 100644 index 000000000..693043061 --- /dev/null +++ b/doc/html/reference/policies/base/value.html @@ -0,0 +1,29 @@ + + +static auto &&_value(Impl &&) noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    static auto &&_value(Impl &&) noexcept

    +

    Returns a reference to the value in the implementation passed in. No checking is done to ensure there is a value. Constexpr where possible.

    + +

    Requires: Always available.

    + +

    Complexity: Constant time.

    + +

    Guarantees: Never throws an exception.

    + + +

    Last revised: January 22, 2019 at 01:11:40 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/policies/error_code_throw_as_system_error_outcome.html b/doc/html/reference/policies/error_code_throw_as_system_error_outcome.html new file mode 100644 index 000000000..ef83c9fbe --- /dev/null +++ b/doc/html/reference/policies/error_code_throw_as_system_error_outcome.html @@ -0,0 +1,41 @@ + + +error_code_throw_as_system_error<T, EC, EP> - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    error_code_throw_as_system_error<T, EC, EP>

    +

    Note: This policy class specialisation can only be used with basic_outcome, not basic_result. Use error_code_throw_as_system_error<T, EC, void> + with basic_result.

    + +

    Policy class defining that on incorrect wide value observation, EP ought to be rethrown if possible, then the ADL discovered free function outcome_throw_as_system_error_with_payload(impl.assume_error()) should be called. Some precanned overloads of that function are listed here.

    + +

    Incorrect wide error observation performs:

    +
    BOOST_OUTCOME_THROW_EXCEPTION(bad_outcome_access("no error"));
    +
    +

    Incorrect wide exception observation performs:

    +
    BOOST_OUTCOME_THROW_EXCEPTION(bad_outcome_access("no exception"));
    +
    +

    Inherits publicly from base +, and its narrow value, error and exception observer policies are inherited from there.

    + +

    Requires: Nothing.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE::policy

    + +

    Header: <boost/outcome/policy/outcome_error_code_throw_as_system_error.hpp>

    + + +

    Last revised: February 01, 2019 at 23:42:52 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/policies/error_code_throw_as_system_error_result.html b/doc/html/reference/policies/error_code_throw_as_system_error_result.html new file mode 100644 index 000000000..afac97642 --- /dev/null +++ b/doc/html/reference/policies/error_code_throw_as_system_error_result.html @@ -0,0 +1,38 @@ + + +error_code_throw_as_system_error<T, EC, void> - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    error_code_throw_as_system_error<T, EC, void>

    +

    Note: This policy class specialisation can only be used with basic_result, not basic_outcome. Use error_code_throw_as_system_error<T, EC, EP> + with basic_outcome.

    + +

    Policy class defining that the ADL discovered free function outcome_throw_as_system_error_with_payload(impl.assume_error()) should be called on incorrect wide value observation. Some precanned overloads of that function are listed here.

    + +

    Incorrect wide error observation performs:

    +
    BOOST_OUTCOME_THROW_EXCEPTION(bad_result_access("no error"));
    +
    +

    Inherits publicly from base +, and its narrow value, error and exception observer policies are inherited from there.

    + +

    Requires: Nothing.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE::policy

    + +

    Header: <boost/outcome/policy/result_error_code_throw_as_system_error.hpp>

    + + +

    Last revised: February 01, 2019 at 23:42:52 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/policies/exception_ptr_rethrow_outcome.html b/doc/html/reference/policies/exception_ptr_rethrow_outcome.html new file mode 100644 index 000000000..0e1c422fc --- /dev/null +++ b/doc/html/reference/policies/exception_ptr_rethrow_outcome.html @@ -0,0 +1,43 @@ + + +exception_ptr_rethrow<T, EC, EP> - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    exception_ptr_rethrow<T, EC, EP>

    +

    Note: This policy class specialisation can only be used with basic_outcome, not basic_result. Use exception_ptr_rethrow<T, EC, void> + with basic_result.

    + +

    Policy class defining that the ADL discovered free function rethrow_exception(impl.assume_exception()) if possible, followed by rethrow_exception(impl.assume_error()) should be called on incorrect wide value observation. Generally this will ADL discover + std::rethrow_exception() + or boost::rethrow_exception() depending on the EC type.

    + +

    Incorrect wide error observation performs:

    +
    BOOST_OUTCOME_THROW_EXCEPTION(bad_outcome_access("no error"));
    +
    +

    Incorrect wide exception observation performs:

    +
    BOOST_OUTCOME_THROW_EXCEPTION(bad_outcome_access("no exception"));
    +
    +

    Inherits publicly from base +, and its narrow value, error and exception observer policies are inherited from there.

    + +

    Requires: Nothing.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE::policy

    + +

    Header: <boost/outcome/policy/outcome_exception_ptr_rethrow.hpp>

    + + +

    Last revised: February 01, 2019 at 23:42:52 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/policies/exception_ptr_rethrow_result.html b/doc/html/reference/policies/exception_ptr_rethrow_result.html new file mode 100644 index 000000000..766e7fe86 --- /dev/null +++ b/doc/html/reference/policies/exception_ptr_rethrow_result.html @@ -0,0 +1,40 @@ + + +exception_ptr_rethrow<T, EC, void> - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    exception_ptr_rethrow<T, EC, void>

    +

    Note: This policy class specialisation can only be used with basic_result, not basic_outcome. Use exception_ptr_rethrow<T, EC, EP> + with basic_outcome.

    + +

    Policy class defining that the ADL discovered free function rethrow_exception(impl.assume_error()) should be called on incorrect wide value observation. Generally this will ADL discover + std::rethrow_exception() + or boost::rethrow_exception() depending on the EC type.

    + +

    Incorrect wide error observation performs:

    +
    BOOST_OUTCOME_THROW_EXCEPTION(bad_result_access("no error"));
    +
    +

    Inherits publicly from base +, and its narrow value, error and exception observer policies are inherited from there.

    + +

    Requires: Nothing.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE::policy

    + +

    Header: <boost/outcome/policy/result_exception_ptr_rethrow.hpp>

    + + +

    Last revised: February 01, 2019 at 23:42:52 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/policies/fail_to_compile_observers.html b/doc/html/reference/policies/fail_to_compile_observers.html new file mode 100644 index 000000000..dfdf4f783 --- /dev/null +++ b/doc/html/reference/policies/fail_to_compile_observers.html @@ -0,0 +1,36 @@ + + +fail_to_compile_observers - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    fail_to_compile_observers

    +

    Upon attempting to compile the wide observer policy functions, the following static assertion occurs which fails the build:

    + +
    +

    Attempt to wide observe value, error or exception for a result/outcome given an EC or E type which is not void, and for whom trait::has_error_code_v, trait::has_exception_ptr_v, and trait::has_exception_ptr_v are all false. Please specify a NoValuePolicy to tell result/outcome what to do, or else use a more specific convenience type alias such as unchecked to indicate you want the wide observers to be narrow, or checked to indicate you always want an exception throw etc.

    +
    + +

    This failure to compile was introduced after the Boost peer review of v2.0 of Outcome due to feedback that users were too often surprised by the default selection of the all_narrow + policy if the types were unrecognised. It was felt this introduced too much danger in the default configuration, so to ensure that existing code based on Outcome broke very loudly after an upgrade, the above very verbose static assertion was implemented.

    + +

    Requires: Nothing.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE::policy

    + +

    Header: <boost/outcome/policy/fail_to_compile_observers.hpp>

    + + +

    Last revised: January 23, 2019 at 01:27:31 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/policies/terminate.html b/doc/html/reference/policies/terminate.html new file mode 100644 index 000000000..ad5101843 --- /dev/null +++ b/doc/html/reference/policies/terminate.html @@ -0,0 +1,36 @@ + + +terminate - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    terminate

    +

    Policy class defining that + std::terminate() + should be called on incorrect wide value, error or exception observation.

    + +

    Inherits publicly from base +, and its narrow value, error and exception observer policies are inherited from there.

    + +

    Included by <basic_result.hpp>, and so is always available when basic_result is available.

    + +

    Requires: Nothing.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE::policy

    + +

    Header: <boost/outcome/policy/terminate.hpp>

    + + +

    Last revised: January 22, 2019 at 01:11:40 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/policies/throw_bad_result_access.html b/doc/html/reference/policies/throw_bad_result_access.html new file mode 100644 index 000000000..eecaf3db9 --- /dev/null +++ b/doc/html/reference/policies/throw_bad_result_access.html @@ -0,0 +1,44 @@ + + +throw_bad_result_access<EC> - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    throw_bad_result_access<EC>

    +

    Policy class defining that bad_result_access_with<EC> + should be thrown on incorrect wide value observation. The primary purpose of this policy is to enable standing in for + P0323 std::expected<T, E> + which throws a bad_expected_access<E> on incorrect wide value observation. This is why it is only ever EC which is thrown with bad_result_access_with<EC> on value observation only, and only when there is an error available.

    + +

    If used in basic_outcome, and the outcome is exceptioned and so no error is available, incorrect wide value observation performs instead:

    +
    BOOST_OUTCOME_THROW_EXCEPTION(bad_result_access("no value"));
    +
    +

    Incorrect wide error observation performs:

    +
    BOOST_OUTCOME_THROW_EXCEPTION(bad_result_access("no error"));
    +
    +

    Incorrect wide exception observation performs:

    +
    BOOST_OUTCOME_THROW_EXCEPTION(bad_outcome_access("no exception"));
    +
    +

    Inherits publicly from base +, and its narrow value, error and exception observer policies are inherited from there.

    + +

    Requires: Nothing.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE::policy

    + +

    Header: <boost/outcome/policy/throw_bad_result_access.hpp>

    + + +

    Last revised: January 23, 2019 at 01:27:31 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/traits.html b/doc/html/reference/traits.html new file mode 100644 index 000000000..b60aa2144 --- /dev/null +++ b/doc/html/reference/traits.html @@ -0,0 +1,50 @@ + + +Traits - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    + +

    Traits

    +
    1. + is_basic_outcome<T> +

      An integral constant type true for basic_outcome<T, EC, EP, NoValuePolicy> types.

    2. + is_basic_result<T> +

      An integral constant type true for basic_result<T, E, NoValuePolicy> types.

    3. + is_error_code_available<T> +

      True if an error code can be constructed from a T.

    4. + is_error_type<E> +

      A customisable integral constant type true for E types which are to receive error throwing no-value policies.

    5. + is_error_type_enum<E, Enum> +

      A customisable integral constant type true for E types constructible from Enum types which are to receive error throwing no-value policies.

    6. + is_exception_ptr_available<T> +

      True if an exception ptr can be constructed from a T.

    7. + is_failure_type<T> +

      An integral constant boolean variable true for failure_type<EC, E = void> types.

    8. + is_move_bitcopying<T> +

      (>= Outcome v2.2.0) A customisable integral constant type true for T types which are move bitcopying safe.

    9. + is_success_type<T> +

      An integral constant boolean variable true for success_type<T> types.

    10. + type_can_be_used_in_basic_result<R> +

      A constexpr boolean true for types permissible in basic_result<T, E, NoValuePolicy>.

    + + + + + + + + +

    Last revised: December 13, 2018 at 17:36:11 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/traits/is_basic_outcome.html b/doc/html/reference/traits/is_basic_outcome.html new file mode 100644 index 000000000..6843aba88 --- /dev/null +++ b/doc/html/reference/traits/is_basic_outcome.html @@ -0,0 +1,33 @@ + + +is_basic_outcome<T> - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    is_basic_outcome<T>

    +

    An integral constant type true for basic_outcome<T, EC, EP, NoValuePolicy> + types. This does not match anything not exactly a basic_outcome. If you want to match types like basic_outcome but not equal to it, consider basic_outcome<T> +..

    + +

    Overridable: Not overridable.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE

    + +

    Header: <boost/outcome/basic_outcome.hpp>

    + +

    Variable alias: is_basic_outcome_v<T>

    + + +

    Last revised: May 24, 2020 at 12:48:39 +0100

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/traits/is_basic_result.html b/doc/html/reference/traits/is_basic_result.html new file mode 100644 index 000000000..528b7ff2b --- /dev/null +++ b/doc/html/reference/traits/is_basic_result.html @@ -0,0 +1,34 @@ + + +is_basic_result<T> - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    is_basic_result<T>

    +

    An integral constant type true for basic_result<T, E, NoValuePolicy> + types. This does not match anything not exactly a basic_result. If you want to match types like basic_result but not equal to it, consider basic_result<T> + or value_or_error<T> +.

    + +

    Overridable: Not overridable.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE

    + +

    Header: <boost/outcome/basic_result.hpp>

    + +

    Variable alias: is_basic_result_v<T>

    + + +

    Last revised: May 24, 2020 at 12:48:39 +0100

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/traits/is_error_code_available.html b/doc/html/reference/traits/is_error_code_available.html new file mode 100644 index 000000000..5a646b8f2 --- /dev/null +++ b/doc/html/reference/traits/is_error_code_available.html @@ -0,0 +1,36 @@ + + +is_error_code_available<T> - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    is_error_code_available<T>

    +

    ::value is true if an error code can be constructed from a T e.g. if there exists an ADL discovered free function make_error_code(T). +::type is the type that would result if ::value is true, else void.

    + +

    Overridable: By template specialisation into the trait namespace.

    + +

    Default: True if T is an error code, else to metaprogramming which performs the ADL discovery of make_error_code(T). Note that the STL defines multiple overloads of an ADL discovered free function + std::make_error_code(T) + for its error enumerations, as does Boost.System for the Boost error enumerations. Thus this trait will pick up those free functions for those error types.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE::trait

    + +

    Header: <boost/outcome/trait.hpp>

    + +

    Variable alias: is_error_code_available_v<T>

    + + +

    Last revised: October 10, 2019 at 18:14:56 +0100

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/traits/is_error_type.html b/doc/html/reference/traits/is_error_type.html new file mode 100644 index 000000000..d6b6adace --- /dev/null +++ b/doc/html/reference/traits/is_error_type.html @@ -0,0 +1,54 @@ + + +is_error_type<E> - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    is_error_type<E>

    +

    A customisable integral constant type true for E types which are to receive +error throwing no-value policies. Special weakened implicit construction enable +is available for integral T types when combined with E types in this +whitelist – this permits boost_result<int, boost::system::errc::errc_t to +retain its implicit constructors, despite the fact that errc_t as a C enum +has an implicit conversion to int.

    + +

    Overridable: By template specialisation into the trait namespace.

    + +

    Default: False. Specialisations to true exist for:

    + +
      +
    • <boost/outcome/boost_result.hpp>

      + +
        +
      • boost::system::error_code
      • +
      • boost::system::errc::errc_t
      • +
      • boost::exception_ptr
      • +
    • + +
    • <boost/outcome/std_result.hpp>

      + +
        +
      • std::error_code
      • +
      • std::errc
      • +
      • std::exception_ptr
      • +
    • +
    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE::trait

    + +

    Header: <boost/outcome/trait.hpp>

    + + +

    Last revised: October 11, 2019 at 17:03:05 +0100

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/traits/is_error_type_enum.html b/doc/html/reference/traits/is_error_type_enum.html new file mode 100644 index 000000000..2f50ef6d3 --- /dev/null +++ b/doc/html/reference/traits/is_error_type_enum.html @@ -0,0 +1,45 @@ + + +is_error_type_enum<E, Enum> - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    is_error_type_enum<E, Enum>

    +

    A customisable integral constant type true for E types constructible from Enum types which are to receive error throwing no-value policies

    + +

    Overridable: By template specialisation into the trait namespace.

    + +

    Default: False. Specialisations exist for:

    + +
      +
    • <boost/outcome/boost_result.hpp>

      + +
        +
      • boost::system::error_code to boost::system::is_error_condition_enum<Enum>::value.
      • +
    • + +
    • <boost/outcome/std_result.hpp>

      + +
        +
      • std::error_code to std::is_error_condition_enum<Enum>::value.
      • +
    • +
    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE::trait

    + +

    Header: <boost/outcome/trait.hpp>

    + + +

    Last revised: December 13, 2018 at 17:36:11 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/traits/is_exception_ptr_available.html b/doc/html/reference/traits/is_exception_ptr_available.html new file mode 100644 index 000000000..7363f35f6 --- /dev/null +++ b/doc/html/reference/traits/is_exception_ptr_available.html @@ -0,0 +1,36 @@ + + +is_exception_ptr_available<T> - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    is_exception_ptr_available<T>

    +

    ::value is true if an exception ptr can be constructed from a T e.g. if there exists an ADL discovered free function make_exception_ptr(T). +::type is the type that would result if ::value is true, else void.

    + +

    Overridable: By template specialisation into the trait namespace.

    + +

    Default: True if T is an exception ptr, else to metaprogramming which performs the ADL discovery of make_exception_ptr(T). Note that the STL defines an ADL discovered free function + std::make_exception_ptr(T) +. Thus this trait will pick up that free function.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE::trait

    + +

    Header: <boost/outcome/trait.hpp>

    + +

    Variable alias: is_exception_ptr_available_v<T>

    + + +

    Last revised: October 10, 2019 at 18:14:56 +0100

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/traits/is_failure_type.html b/doc/html/reference/traits/is_failure_type.html new file mode 100644 index 000000000..1d41546c3 --- /dev/null +++ b/doc/html/reference/traits/is_failure_type.html @@ -0,0 +1,30 @@ + + +is_failure_type<T> - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    is_failure_type<T>

    +

    An integral constant boolean variable true for failure_type<EC, EP = void> + types.

    + +

    Overridable: Not overridable.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE

    + +

    Header: <boost/outcome/success_failure.hpp>

    + + +

    Last revised: January 24, 2019 at 01:15:16 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/traits/is_move_bitcopying.html b/doc/html/reference/traits/is_move_bitcopying.html new file mode 100644 index 000000000..d2f0fc08b --- /dev/null +++ b/doc/html/reference/traits/is_move_bitcopying.html @@ -0,0 +1,62 @@ + + +is_move_bitcopying<T> - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    is_move_bitcopying<T>

    +

    A customisable integral constant type true for T types which are move bitcopying +safe. As per P1029 move bitcopying, these are types for +which:

    + +
      +
    1. There is an inline, constexpr-available, default constructor.
    2. +
    3. The move constructor has side effects equivalent to memcpy of source to destination, +followed by a memcpy of a default constructed instance to source.
    4. +
    5. That the destruction of a default constructed instance has no visible +side effects.
    6. +
    + +

    This implies that if you move from a bit copying type, you need not call its +destructor, even if that is a virtual destructor.

    + +

    If you opt your types into this trait, Outcome will track moved-from state and +not call the destructor for your type on moved-from instances. Obviously enough +this is, in current C++ standards, undefined behaviour. However it very +significantly improves the quality of codegen during inlining.

    + +

    Overridable: By template specialisation into the trait namespace.

    + +

    Default: False. Default specialisations exist for:

    + +
      +
    • <boost/outcome/experimental/status_result.hpp> + +
        +
      • True for BOOST_OUTCOME_SYSTEM_ERROR2_NAMESPACE::status_code<DomainType> if trait +BOOST_OUTCOME_SYSTEM_ERROR2_NAMESPACE::traits::is_move_bitcopying<BOOST_OUTCOME_SYSTEM_ERROR2_NAMESPACE::status_code<DomainType>>::value +is true.
      • +
      • True for BOOST_OUTCOME_SYSTEM_ERROR2_NAMESPACE::errored_status_code<DomainType> if trait +BOOST_OUTCOME_SYSTEM_ERROR2_NAMESPACE::traits::is_move_bitcopying<BOOST_OUTCOME_SYSTEM_ERROR2_NAMESPACE::errored_status_code<DomainType>>::value +is true.
      • +
    • +
    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE::trait

    + +

    Header: <boost/outcome/trait.hpp>

    + + +

    Last revised: December 17, 2020 at 11:27:06 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/traits/is_success_type.html b/doc/html/reference/traits/is_success_type.html new file mode 100644 index 000000000..6705a3b0a --- /dev/null +++ b/doc/html/reference/traits/is_success_type.html @@ -0,0 +1,30 @@ + + +is_success_type<T> - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    is_success_type<T>

    +

    An integral constant boolean variable true for success_type<T> + types.

    + +

    Overridable: Not overridable.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE

    + +

    Header: <boost/outcome/success_failure.hpp>

    + + +

    Last revised: January 21, 2019 at 18:00:41 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/traits/type_can_be_used_in_basic_result.html b/doc/html/reference/traits/type_can_be_used_in_basic_result.html new file mode 100644 index 000000000..ee8b0a44e --- /dev/null +++ b/doc/html/reference/traits/type_can_be_used_in_basic_result.html @@ -0,0 +1,43 @@ + + +type_can_be_used_in_basic_result<R> - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    type_can_be_used_in_basic_result<R>

    +

    A constexpr boolean true for types permissible in basic_result<T, E, NoValuePolicy>.

    + +

    Overridable: Not overridable.

    + +

    Definition: True for a type which:

    + + + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE::trait

    + +

    Header: <boost/outcome/trait.hpp>

    + + +

    Last revised: January 24, 2019 at 01:15:16 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types.html b/doc/html/reference/types.html new file mode 100644 index 000000000..b8aba69ff --- /dev/null +++ b/doc/html/reference/types.html @@ -0,0 +1,332 @@ + + +Types - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    + +

    Types

    +
    1. + basic_outcome<T, EC, EP, NoValuePolicy> +

      A type carrying one of (i) a successful T (ii) a disappointment EC (iii) a failure EP (iv) both a disappointment EC and a failure EP, with NoValuePolicy specifying what to do if one tries to read state which isn’t there.

      1. + basic_outcome() = delete +

        The default constructor (disabled).

      2. + basic_outcome(basic_outcome &&) +

        Move constructor. Constexpr, triviality and noexcept propagating.

      3. + basic_outcome(const basic_outcome &) +

        Copy constructor. Constexpr, triviality and noexcept propagating.

      4. + basic_outcome &operator=(basic_outcome &&) +

        Move assignment. Constexpr, triviality and noexcept propagating.

      5. + basic_outcome &operator=(const basic_outcome &) +

        Copy assignment. Constexpr, triviality and noexcept propagating.

      6. + ~basic_outcome() +

        Destructor. Constexpr, triviality and noexcept propagating.

      7. + basic_outcome(Args...) = delete +

        Disabling catchall constructor used to give useful diagnostic error when trying to use non-inplace constructors when predicate::constructors_enabled is false.

      8. + basic_outcome(X &&) = delete +

        Disabling implicit constructor used to give useful diagnostic error when trying to use implicit constructors when predicate::implicit_constructors_enabled is false.

      9. + basic_outcome(R &&) +

        Implicit value_type constructor. Available if predicate::enable_value_converting_constructor<R> is true. Constexpr, triviality and noexcept propagating.

      10. + basic_outcome(S &&) +

        Implicit error_type constructor. Available if predicate::enable_error_converting_constructor<S> is true. Constexpr, triviality and noexcept propagating.

      11. + basic_outcome(ErrorCondEnum &&) +

        Implicit error_type from ErrorCondEnum constructor. Available if predicate::enable_error_condition_converting_constructor<ErrorCondEnum> is true. Constexpr, triviality and noexcept propagating.

      12. + basic_outcome(P &&) +

        Implicit exception_type constructor. Available if predicate::enable_exception_converting_constructor<P> is true. Constexpr, triviality and noexcept propagating.

      13. + basic_outcome(S &&, P &&) +

        Implicit error_type + exception_type constructor. Available if predicate::enable_error_exception_converting_constructor<S, P> is true. Constexpr, triviality and noexcept propagating.

      14. + explicit basic_outcome(concepts::value_or_error<T, E> &&) +

        Explicit converting constructor from concepts::value_or_error<T, E> concept matching types. Available if convert::value_or_error<> permits it. Constexpr, triviality and noexcept propagating.

      15. + explicit basic_outcome(const basic_outcome<A, B, C, D> &) +

        Explicit converting copy constructor from compatible basic_outcome. Available if predicate::enable_compatible_conversion<A, B, C, D> is true. Constexpr, triviality and noexcept propagating.

      16. + explicit basic_outcome(basic_outcome<A, B, C, D> &&) +

        Explicit converting move constructor from compatible basic_outcome. Available if predicate::enable_compatible_conversion<A, B, C, D> is true. Constexpr, triviality and noexcept propagating.

      17. + explicit basic_outcome(const basic_result<A, B, C> &) +

        Explicit converting copy constructor from compatible basic_result. Available if predicate::enable_compatible_conversion<A, B, void, C> is true. Constexpr, triviality and noexcept propagating.

      18. + explicit basic_outcome(basic_result<A, B, C> &&) +

        Explicit converting move constructor from compatible basic_result. Available if predicate::enable_compatible_conversion<A, B, void, C> is true. Constexpr, triviality and noexcept propagating.

      19. + explicit basic_outcome(const basic_result<A, B, C> &) +

        Explicit converting copy constructor from compatible basic_result. Available if predicate::enable_make_error_code_compatible_conversion<A, B, void, C> is true. Constexpr, triviality and noexcept propagating.

      20. + explicit basic_outcome(basic_result<A, B, C> &&) +

        Explicit converting move constructor from compatible basic_result. Available if predicate::enable_make_error_code_compatible_conversion<A, B, void, C> is true. Constexpr, triviality and noexcept propagating.

      21. + explicit basic_outcome(in_place_type_t<value_type_if_enabled>, Args ...) +

        Explicit inplace value constructor. Available if predicate::enable_inplace_value_constructor<Args ...> is true. Constexpr, triviality and noexcept propagating.

      22. + explicit basic_outcome(in_place_type_t<value_type_if_enabled>, std::initializer_list<U>, Args ...) +

        Explicit inplace value constructor. Available if predicate::enable_inplace_value_constructor<std::initializer_list<U>, Args ...> is true. Constexpr, triviality and noexcept propagating.

      23. + explicit basic_outcome(in_place_type_t<error_type_if_enabled>, Args ...) +

        Explicit inplace error constructor. Available if predicate::enable_inplace_error_constructor<Args ...> is true. Constexpr, triviality and noexcept propagating.

      24. + explicit basic_outcome(in_place_type_t<error_type_if_enabled>, std::initializer_list<U>, Args ...) +

        Explicit inplace error constructor. Available if predicate::enable_inplace_error_constructor<std::initializer_list<U>, Args ...> is true. Constexpr, triviality and noexcept propagating.

      25. + explicit basic_outcome(in_place_type_t<exception_type_if_enabled>, Args ...) +

        Explicit inplace exception constructor. Available if predicate::enable_inplace_exception_constructor<Args ...> is true. Constexpr, triviality and noexcept propagating.

      26. + explicit basic_outcome(in_place_type_t<exception_type_if_enabled>, std::initializer_list<U>, Args ...) +

        Explicit inplace exception constructor. Available if predicate::enable_inplace_exception_constructor<std::initializer_list<U>, Args ...> is true. Constexpr, triviality and noexcept propagating.

      27. + basic_outcome(A1 &&, A2 &&, Args ...) +

        Implicit inplace value or error or exception constructor. Available if predicate::enable_inplace_value_error_exception_constructor<A1, A2, Args ...> is true. Constexpr, triviality and noexcept propagating.

      28. + basic_outcome(const success_type<T> &) +

        Implicit value-from-success-type-sugar copy constructor. Available if predicate::enable_compatible_conversion<T, void, void> is true, or T is void. Constexpr, triviality and noexcept propagating.

      29. + basic_outcome(success_type<T> &&) +

        Implicit value-from-success-type-sugar move constructor. Available if predicate::enable_compatible_conversion<T, void, void> is true, or T is void. Constexpr, triviality and noexcept propagating.

      30. + basic_outcome(const failure_type<EC> &) +

        Implicit error-from-failure-type-sugar copy constructor. Available if predicate::enable_compatible_conversion<void, EC, void, void> is true. Constexpr, triviality and noexcept propagating.

      31. + basic_outcome(failure_type<EC> &&) +

        Implicit error-from-failure-type-sugar move constructor. Available if predicate::enable_compatible_conversion<void, EC, void, void> is true. Constexpr, triviality and noexcept propagating.

      32. + basic_outcome(const failure_type<EC> &) +

        Implicit error-from-failure-type-sugar copy constructor. Available if predicate::enable_make_error_code_compatible_conversion<void, EC, void, void> is true. Constexpr, triviality and noexcept propagating.

      33. + basic_outcome(failure_type<EC> &&) +

        Implicit error-from-failure-type-sugar move constructor. Available if predicate::enable_make_error_code_compatible_conversion<void, EC, void, void> is true. Constexpr, triviality and noexcept propagating.

      34. + basic_outcome(const failure_type<EP> &) +

        Implicit exception-from-failure-type-sugar copy constructor. Available if predicate::enable_compatible_conversion<void, void, EP, void> is true. Constexpr, triviality and noexcept propagating.

      35. + basic_outcome(failure_type<EP> &&) +

        Implicit exception-from-failure-type-sugar move constructor. Available if predicate::enable_compatible_conversion<void, void, EP, void> is true. Constexpr, triviality and noexcept propagating.

      36. + basic_outcome(const failure_type<EC, EP> &) +

        Implicit error-and-exception-from-failure-type-sugar copy constructor. Available if predicate::enable_compatible_conversion<void, EC, EP, void> is true. Constexpr, triviality and noexcept propagating.

      37. + basic_outcome(failure_type<EC, EP> &&) +

        Implicit error-and-exception-from-failure-type-sugar move constructor. Available if predicate::enable_compatible_conversion<void, EC, EP, void> is true. Constexpr, triviality and noexcept propagating.

      38. + explicit operator bool() const noexcept +

        Returns true if a value is present. Constexpr, never throws.

      39. + bool has_value() const noexcept +

        Returns true if a value is present. Constexpr, never throws.

      40. + bool has_error() const noexcept +

        Returns true if an error is present. Constexpr, never throws.

      41. + bool has_exception() const noexcept +

        Returns true if an exception is present. Constexpr, never throws.

      42. + bool has_failure() const noexcept +

        Returns true if there is either an error or an exception. Constexpr, never throws.

      43. + value_type &assume_value() & noexcept +

        Narrow contract lvalue reference observer of any value present. Constexpr propagating, never throws.

      44. + const value_type &assume_value() const & noexcept +

        Narrow contract const lvalue reference observer of any value present. Constexpr propagating, never throws.

      45. + value_type &&assume_value() && noexcept +

        Narrow contract rvalue reference observer of any value present. Constexpr propagating, never throws.

      46. + const value_type &&assume_value() const && noexcept +

        Narrow contract const rvalue reference observer of any value present. Constexpr propagating, never throws.

      47. + value_type &value() & +

        Wide contract lvalue reference observer of any value present. Constexpr propagating.

      48. + const value_type &value() const & +

        Wide contract const lvalue reference observer of any value present. Constexpr propagating.

      49. + value_type &&value() && +

        Wide contract rvalue reference observer of any value present. Constexpr propagating.

      50. + const value_type &&value() const && +

        Wide contract const rvalue reference observer of any value present. Constexpr propagating.

      51. + error_type &assume_error() & noexcept +

        Narrow contract lvalue reference observer of the stored error. Constexpr propagating, never throws.

      52. + const error_type &assume_error() const & noexcept +

        Narrow contract const lvalue reference observer of the stored error. Constexpr propagating, never throws.

      53. + error_type &&assume_error() && noexcept +

        Narrow contract rvalue reference observer of the stored error. Constexpr propagating, never throws.

      54. + const error_type &&assume_error() const && noexcept +

        Narrow contract const rvalue reference observer of the stored error. Constexpr propagating, never throws.

      55. + error_type &error() & +

        Wide contract lvalue reference observer of the stored error. Constexpr propagating.

      56. + const error_type &error() const & +

        Wide contract const lvalue reference observer of the stored error. Constexpr propagating.

      57. + error_type &&error() && +

        Wide contract rvalue reference observer of the stored error. Constexpr propagating.

      58. + const error_type &&error() const && +

        Wide contract const rvalue reference observer of the stored error. Constexpr propagating.

      59. + exception_type &assume_exception() & noexcept +

        Narrow contract lvalue reference observer of the stored exception. Constexpr propagating, never throws.

      60. + const exception_type &assume_exception() const & noexcept +

        Narrow contract const lvalue reference observer of the stored exception. Constexpr propagating, never throws.

      61. + const exception_type &&assume_exception() const && noexcept +

        Narrow contract const rvalue reference observer of the stored exception. Constexpr propagating, never throws.

      62. + exception_type &&assume_exception() && noexcept +

        Narrow contract rvalue reference observer of the stored exception. Constexpr propagating, never throws.

      63. + exception_type &exception() & +

        Wide contract lvalue reference observer of the stored exception. Constexpr propagating.

      64. + const exception_type &exception() const & +

        Wide contract const lvalue reference observer of the stored exception. Constexpr propagating.

      65. + exception_type &&exception() && +

        Wide contract rvalue reference observer of the stored exception. Constexpr propagating.

      66. + const exception_type &&exception() const && +

        Wide contract const rvalue reference observer of the stored exception. Constexpr propagating.

      67. + exception_type failure() const noexcept +

        Synthesising observer of the stored exception or error. Available if the traits is_error_code_available<T> and is_exception_ptr_available<T> are both true. Never throws.

      68. + bool operator==(const basic_result<A, B, C> &) const +

        Returns true if this outcome compares equal to the other result. Constexpr and noexcept propagating.

      69. + bool operator==(const basic_outcome<A, B, C, D> &) const +

        Returns true if this outcome compares equal to the other outcome. Constexpr and noexcept propagating.

      70. + bool operator==(const success_type<A> &) const +

        Returns true if this result compares equal to the success type sugar. Constexpr and noexcept propagating.

      71. + bool operator==(const failure_type<A, B> &) const +

        Returns true if this outcome compares equal to the failure type sugar. Constexpr and noexcept propagating.

      72. + bool operator!=(const basic_result<A, B, C> &) const +

        Returns true if this outcome does not compare equal to the other result. Constexpr and noexcept propagating.

      73. + bool operator!=(const basic_outcome<A, B, C, D> &) const +

        Returns true if this outcome does not compare equal to the other outcome. Constexpr and noexcept propagating.

      74. + bool operator!=(const success_type<A> &) const +

        Returns true if this outcome does not compare equal to the success type sugar. Constexpr and noexcept propagating.

      75. + bool operator!=(const failure_type<A, B> &) const +

        Returns true if this outcome does not compare equal to the failure type sugar. Constexpr and noexcept propagating.

      76. + void swap(basic_outcome &) +

        Swap one basic_outcome with another, with the strong guarantee. Noexcept propagating.

      77. + failure_type<error_type, exception_type> as_failure() const & +

        Return the output from free function failure() containing a copy of any errored and/or excepted state.

      78. + failure_type<error_type, exception_type> as_failure() && +

        Return the output from free function failure() containing a move of any errored and/or excepted state.

    2. + basic_result<T, E, NoValuePolicy> +

      A sum type carrying either a successful T, or a disappointment E, with NoValuePolicy specifying what to do if one tries to read state which isn’t there.

      1. + basic_result() = delete +

        The default constructor (disabled).

      2. + basic_result(basic_result &&) +

        Move constructor. Constexpr, triviality and noexcept propagating.

      3. + basic_result(const basic_result &) +

        Copy constructor. Constexpr, triviality and noexcept propagating.

      4. + basic_result &operator=(basic_result &&) +

        Move assignment. Constexpr, triviality and noexcept propagating.

      5. + basic_result &operator=(const basic_result &) +

        Copy assignment. Constexpr, triviality and noexcept propagating.

      6. + ~basic_result() +

        Destructor. Constexpr, triviality and noexcept propagating.

      7. + basic_result(Args...) = delete +

        Disabling catchall constructor used to give useful diagnostic error when trying to use non-inplace constructors when predicate::constructors_enabled is false.

      8. + basic_result(X &&) = delete +

        Disabling implicit constructor used to give useful diagnostic error when trying to use implicit constructors when predicate::implicit_constructors_enabled is false.

      9. + basic_result(R &&) +

        Implicit value_type constructor. Available if predicate::enable_value_converting_constructor<R> is true. Constexpr, triviality and noexcept propagating.

      10. + basic_result(S &&) +

        Implicit error_type constructor. Available if predicate::enable_error_converting_constructor<S> is true. Constexpr, triviality and noexcept propagating.

      11. + basic_result(ErrorCondEnum &&) +

        Implicit error_type from ErrorCondEnum constructor. Available if predicate::enable_error_condition_converting_constructor<ErrorCondEnum> is true. Constexpr, triviality and noexcept propagating.

      12. + explicit basic_result(concepts::value_or_error<T, E> &&) +

        Explicit converting constructor from concepts::value_or_error<T, E> concept matching types. Available if convert::value_or_error<> permits it. Constexpr, triviality and noexcept propagating.

      13. + explicit basic_result(const basic_result<R, S, P> &) +

        Explicit converting copy constructor from compatible basic_result. Available if predicate::enable_compatible_conversion<R, S, P> is true. Constexpr, triviality and noexcept propagating.

      14. + explicit basic_result(basic_result<R, S, P> &&) +

        Explicit converting move constructor from compatible basic_result. Available if predicate::enable_compatible_conversion<R, S, P> is true. Constexpr, triviality and noexcept propagating.

      15. + explicit basic_result(const basic_result<R, S, P> &) +

        Explicit converting copy constructor from compatible basic_result. Available if predicate::enable_make_error_code_compatible_conversion<R, S, P> is true. Constexpr, triviality and noexcept propagating.

      16. + explicit basic_result(basic_result<R, S, P> &&) +

        Explicit converting move constructor from compatible basic_result. Available if predicate::enable_make_error_code_compatible_conversion<R, S, P> is true. Constexpr, triviality and noexcept propagating.

      17. + explicit basic_result(const basic_result<R, S, P> &) +

        Explicit converting copy constructor from compatible basic_result. Available if predicate::enable_make_exception_ptr_compatible_conversion<R, S, P> is true. Constexpr, triviality and noexcept propagating.

      18. + explicit basic_result(basic_result<R, S, P> &&) +

        Explicit converting move constructor from compatible basic_result. Available if predicate::enable_make_exception_ptr_compatible_conversion<R, S, P> is true. Constexpr, triviality and noexcept propagating.

      19. + explicit basic_result(in_place_type_t<value_type_if_enabled>, Args ...) +

        Explicit inplace value constructor. Available if predicate::enable_inplace_value_constructor<Args ...> is true. Constexpr, triviality and noexcept propagating.

      20. + explicit basic_result(in_place_type_t<value_type_if_enabled>, std::initializer_list<U>, Args ...) +

        Explicit inplace value constructor. Available if predicate::enable_inplace_value_constructor<std::initializer_list<U>, Args ...> is true. Constexpr, triviality and noexcept propagating.

      21. + explicit basic_result(in_place_type_t<error_type_if_enabled>, Args ...) +

        Explicit inplace error constructor. Available if predicate::enable_inplace_error_constructor<Args ...> is true. Constexpr, triviality and noexcept propagating.

      22. + explicit basic_result(in_place_type_t<error_type_if_enabled>, std::initializer_list<U>, Args ...) +

        Explicit inplace error constructor. Available if predicate::enable_inplace_error_constructor<std::initializer_list<U>, Args ...> is true. Constexpr, triviality and noexcept propagating.

      23. + basic_result(A1 &&, A2 &&, Args ...) +

        Implicit inplace value or error constructor. Available if predicate::enable_inplace_value_error_constructor<A1, A2, Args ...> is true. Constexpr, triviality and noexcept propagating.

      24. + basic_result(const success_type<T> &) +

        Implicit value-from-success-type-sugar copy constructor. Available if predicate::enable_compatible_conversion<T, void, void> is true, or T is void. Constexpr, triviality and noexcept propagating.

      25. + basic_result(success_type<T> &&) +

        Implicit value-from-success-type-sugar move constructor. Available if predicate::enable_compatible_conversion<T, void, void> is true, or T is void. Constexpr, triviality and noexcept propagating.

      26. + basic_result(const failure_type<T> &) +

        Implicit error-from-failure-type-sugar copy constructor. Available if predicate::enable_compatible_conversion<void, T, void> is true, or T is void. Constexpr, triviality and noexcept propagating.

      27. + basic_result(failure_type<T> &&) +

        Implicit error-from-failure-type-sugar move constructor. Available if predicate::enable_compatible_conversion<void, T, void> is true, or T is void. Constexpr, triviality and noexcept propagating.

      28. + basic_result(const failure_type<T> &) +

        Implicit error-from-failure-type-sugar copy constructor. Available if predicate::enable_make_error_code_compatible_conversion<void, T, void> is true, or T is void. Constexpr, triviality and noexcept propagating.

      29. + basic_result(failure_type<T> &&) +

        Implicit error-from-failure-type-sugar move constructor. Available if predicate::enable_make_error_code_compatible_conversion<void, T, void> is true, or T is void. Constexpr, triviality and noexcept propagating.

      30. + basic_result(const failure_type<T> &) +

        Implicit error-from-failure-type-sugar copy constructor. Available if predicate::enable_make_exception_ptr_compatible_conversion<void, T, void> is true, or T is void. Constexpr, triviality and noexcept propagating.

      31. + basic_result(failure_type<T> &&) +

        Implicit error-from-failure-type-sugar move constructor. Available if predicate::enable_make_exception_ptr_compatible_conversion<void, T, void> is true, or T is void. Constexpr, triviality and noexcept propagating.

      32. + explicit operator bool() const noexcept +

        Returns true if a value is present. Constexpr, never throws.

      33. + bool has_value() const noexcept +

        Returns true if a value is present. Constexpr, never throws.

      34. + bool has_error() const noexcept +

        Returns true if an error is present. Constexpr, never throws.

      35. + bool has_exception() const noexcept +

        Always returns false for basic_result. Constexpr, never throws.

      36. + bool has_failure() const noexcept +

        Returns true if there is either an error or an exception. Constexpr, never throws.

      37. + bool has_lost_consistency() const noexcept +

        Returns true if a preceding swap involving this object failed to preserve the strong guarantee. Constexpr, never throws.

      38. + value_type &assume_value() & noexcept +

        Narrow contract lvalue reference observer of any value present. Constexpr propagating, never throws.

      39. + const value_type &assume_value() const & noexcept +

        Narrow contract const lvalue reference observer of any value present. Constexpr propagating, never throws.

      40. + value_type &&assume_value() && noexcept +

        Narrow contract rvalue reference observer of any value present. Constexpr propagating, never throws.

      41. + const value_type &&assume_value() const && noexcept +

        Narrow contract const rvalue reference observer of any value present. Constexpr propagating, never throws.

      42. + value_type &value() & +

        Wide contract lvalue reference observer of any value present. Constexpr propagating.

      43. + const value_type &value() const & +

        Wide contract const lvalue reference observer of any value present. Constexpr propagating.

      44. + value_type &&value() && +

        Wide contract rvalue reference observer of any value present. Constexpr propagating.

      45. + const value_type &&value() const && +

        Wide contract const rvalue reference observer of any value present. Constexpr propagating.

      46. + error_type &assume_error() & noexcept +

        Narrow contract lvalue reference observer of the stored error. Constexpr propagating, never throws.

      47. + const error_type &assume_error() const & noexcept +

        Narrow contract const lvalue reference observer of the stored error. Constexpr propagating, never throws.

      48. + error_type &&assume_error() && noexcept +

        Narrow contract rvalue reference observer of the stored error. Constexpr propagating, never throws.

      49. + const error_type &&assume_error() const && noexcept +

        Narrow contract const rvalue reference observer of the stored error. Constexpr propagating, never throws.

      50. + error_type &error() & +

        Wide contract lvalue reference observer of the stored error. Constexpr propagating.

      51. + const error_type &error() const & +

        Wide contract const lvalue reference observer of the stored error. Constexpr propagating.

      52. + error_type &&error() && +

        Wide contract rvalue reference observer of the stored error. Constexpr propagating.

      53. + const error_type &&error() const && +

        Wide contract const rvalue reference observer of the stored error. Constexpr propagating.

      54. + bool operator==(const basic_result<A, B, C> &) const +

        Returns true if this result compares equal to the other result. Constexpr and noexcept propagating.

      55. + bool operator==(const success_type<A> &) const +

        Returns true if this result compares equal to the success type sugar. Constexpr and noexcept propagating.

      56. + bool operator==(const failure_type<A, void> &) const +

        Returns true if this result compares equal to the failure type sugar. Constexpr and noexcept propagating.

      57. + bool operator!=(const basic_result<A, B, C> &) const +

        Returns true if this result does not compare equal to the other result. Constexpr and noexcept propagating.

      58. + bool operator!=(const success_type<A> &) const +

        Returns true if this result does not compare equal to the success type sugar. Constexpr and noexcept propagating.

      59. + bool operator!=(const failure_type<A, void> &) const +

        Returns true if this result does not compare equal to the failure type sugar. Constexpr and noexcept propagating.

      60. + void swap(basic_result &) +

        Swap one basic_result with another, with the strong guarantee. Noexcept propagating.

      61. + auto as_failure() const & +

        Return the output from free function failure() containing a copy of any errored state.

      62. + auto as_failure() && +

        Return the output from free function failure() containing a move of any errored state.

    3. + bad_outcome_access +

      Exception type publicly inheriting from std::logic_error indicating an incorrect observation of value or error or exception occurred.

    4. + bad_result_access_with<EC> +

      Exception type publicly inheriting from bad_result_access indicating an incorrect observation of value occurred, supplying the error value.

    5. + bad_result_access +

      Exception type publicly inheriting from std::logic_error indicating an incorrect observation of value or error occurred.

    6. + eager<T, Executor = void>/atomic_eager<T, Executor = void> +

      An eagerly evaluated coroutine awaitable with Outcome customisation.

    7. + failure_type<EC, EP = void> +

      Type sugar for constructing an unsuccessful result or outcome.

    8. + generator<T, Executor = void> +

      A lazily evaluated coroutine generator with Outcome customisation.

    9. + in_place_type_t<T> +

      Either std::in_place_type_t<T> or a local emulation, depending on the BOOST_OUTCOME_USE_STD_IN_PLACE_TYPE macro.

    10. + lazy<T, Executor = void>/atomic_lazy<T, Executor = void> +

      A lazily evaluated coroutine awaitable with Outcome customisation.

    11. + success_type<T> +

      Type sugar for constructing a successful result or outcome.

    + + + + + + + + +

    Last revised: December 13, 2018 at 21:10:19 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/awaitables/eager.html b/doc/html/reference/types/awaitables/eager.html new file mode 100644 index 000000000..7c74c6d2c --- /dev/null +++ b/doc/html/reference/types/awaitables/eager.html @@ -0,0 +1,67 @@ + + +eager<T, Executor = void>/atomic_eager<T, Executor = void> - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    eager<T, Executor = void>/atomic_eager<T, Executor = void>

    +

    This is very similar to lazy<T, Executor = void> +, except that execution of the eager<T> +returning function begins immediately, and if the function never suspends during the +course of its execution, no suspend-resume cycle occurs. Functions which return eager<T> +are therefore suitable for tasks which may require suspension, but will often complete +immediately.

    + +

    atomic_eager<T> is like eager<T>, except that the setting of the coroutine result +performs an atomic release, whilst the checking of whether the coroutine has finished +is an atomic acquire.

    + +

    The Executor template parameter is purely for compatibility with third party software +such as ASIO, and this awaitable can be directly used +by ASIO.

    + +

    Example of use (must be called from within a coroutinised function):

    +
    eager<int> func(int x)
    +{
    +  co_return x + 1;
    +}
    +...
    +// Executes like a non-coroutine function i.e. r is immediately set to 6.
    +int r = co_await func(5);
    +
    +

    eager<T> has special semantics if T is a type capable of constructing from +an exception_ptr or error_code – any exceptions thrown during the function’s body +are sent via T, preferably via the error code route if error_from_exception( +) +successfully matches the exception throw. This means that a +basic_result<T, E, NoValuePolicy> + or basic_outcome<T, EC, EP, NoValuePolicy> + where one of its types is +is compatible will have its .error() or .exception() set.

    + +

    Note that eager<T> does not otherwise transport exception throws, and rethrows +any exceptions thrown within the coroutine body through the coroutine machinery. +This does not produce reliable consequences in current C++ compilers. You should +therefore wrap the coroutine body in a try...catch if T is not able to transport +exceptions on its own.

    + +

    Requires: C++ coroutines to be available in your compiler.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE::awaitables

    + +

    Header: <boost/outcome/coroutine_support.hpp>

    + + +

    Last revised: March 18, 2022 at 14:45:32 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/awaitables/generator.html b/doc/html/reference/types/awaitables/generator.html new file mode 100644 index 000000000..26cf6721b --- /dev/null +++ b/doc/html/reference/types/awaitables/generator.html @@ -0,0 +1,71 @@ + + +generator<T, Executor = void> - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    generator<T, Executor = void>

    +

    This is a classic coroutine generator whereby the coroutine is resumed to calculate +the next value, and is suspended upon yielding that value. If the value being +yielded is an Outcome type, special semantics are used if the coroutine throws +an exception (see below).

    + +

    The Executor template parameter is purely for compatibility with third party software +such as ASIO, and this awaitable can be directly used +by ASIO.

    + +

    Example of use:

    +
    generator<int> func(int x)
    +{
    +  while(x >= 0)
    +  {
    +    co_yield x--;
    +  }
    +}
    +...
    +// Creates the coroutine, immediately suspending it.
    +auto f = func(5);
    +// If the coroutine has another value to yield ...
    +while(f)
    +{
    +  // Get the next value from the coroutine
    +  int r = f();
    +  ...
    +}
    +
    +

    generator<T> has special semantics if T is a type capable of constructing from +an exception_ptr or error_code – any exceptions thrown during the function’s body +are sent via T, preferably via the error code route if error_from_exception( +) +successfully matches the exception throw. This means that a +basic_result<T, E, NoValuePolicy> + or basic_outcome<T, EC, EP, NoValuePolicy> + where one of its types is +is compatible will have its .error() or .exception() set.

    + +

    Note that generator<T> does not otherwise transport exception throws, and rethrows +any exceptions thrown within the coroutine body through the coroutine machinery. +This does not produce reliable consequences in current C++ compilers. You should +therefore wrap the coroutine body in a try...catch if T is not able to transport +exceptions on its own.

    + +

    Requires: C++ coroutines to be available in your compiler.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE::awaitables

    + +

    Header: <boost/outcome/coroutine_support.hpp>

    + + +

    Last revised: March 18, 2022 at 14:45:32 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/awaitables/lazy.html b/doc/html/reference/types/awaitables/lazy.html new file mode 100644 index 000000000..03d2da9e7 --- /dev/null +++ b/doc/html/reference/types/awaitables/lazy.html @@ -0,0 +1,71 @@ + + +lazy<T, Executor = void>/atomic_lazy<T, Executor = void> - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    lazy<T, Executor = void>/atomic_lazy<T, Executor = void>

    +

    This is very similar to eager<T, Executor = void> +, except that execution of the +lazy<T> returning function suspends immediately. Functions which return lazy<T> +are therefore suitable for tasks which you need to instantiate right now, but whose +execution will occur elsewhere e.g. in a separate kernel thread. Because of the very +common use case of using worker threads to execute the body of lazily executed +coroutines, most people will want to use atomic_lazy<T> instead of lazy<T>.

    + +

    atomic_lazy<T> is like lazy<T>, except that the setting of the coroutine result +performs an atomic release, whilst the checking of whether the coroutine has finished +is an atomic acquire.

    + +

    lazy<T> has similar semantics to std::lazy<T>, which is being standardised. See +https://wg21.link/P1056 Add lazy coroutine (coroutine task) type.

    + +

    The Executor template parameter is purely for compatibility with third party software +such as ASIO, and this awaitable can be directly used +by ASIO.

    + +

    Example of use (must be called from within a coroutinised function):

    +
    lazy<int> func(int x)
    +{
    +  co_return x + 1;
    +}
    +...
    +// Always suspends perhaps causing other coroutines to execute, then resumes.
    +int r = co_await func(5);
    +
    +

    lazy<T> has special semantics if T is a type capable of constructing from +an exception_ptr or error_code – any exceptions thrown during the function’s body +are sent via T, preferably via the error code route if error_from_exception( +) +successfully matches the exception throw. This means that a +basic_result<T, E, NoValuePolicy> + or basic_outcome<T, EC, EP, NoValuePolicy> + where one of its types is +is compatible will have its .error() or .exception() set.

    + +

    Note that lazy<T> does not otherwise transport exception throws, and rethrows +any exceptions thrown within the coroutine body through the coroutine machinery. +This does not produce reliable consequences in current C++ compilers. You should +therefore wrap the coroutine body in a try...catch if T is not able to transport +exceptions on its own.

    + +

    Requires: C++ coroutines to be available in your compiler.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE::awaitables

    + +

    Header: <boost/outcome/coroutine_support.hpp>

    + + +

    Last revised: March 18, 2022 at 14:45:32 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/bad_outcome_access.html b/doc/html/reference/types/bad_outcome_access.html new file mode 100644 index 000000000..88fccc577 --- /dev/null +++ b/doc/html/reference/types/bad_outcome_access.html @@ -0,0 +1,40 @@ + + +bad_outcome_access - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    bad_outcome_access

    +

    Exception type publicly inheriting from + std::logic_error + indicating an incorrect observation of value or error or exception occurred by basic_outcome<T, EC, EP, NoValuePolicy> +.

    + +

    No member functions are added in addition to std::logic_error. Typical .what() strings are:

    + +
      +
    • "no value"
    • +
    • "no error"
    • +
    • "no exception"
    • +
    + +

    Requires: Nothing.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE

    + +

    Header: <boost/outcome/bad_access.hpp>

    + + +

    Last revised: January 25, 2019 at 01:51:37 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/bad_result_access.html b/doc/html/reference/types/bad_result_access.html new file mode 100644 index 000000000..b8c6cdea8 --- /dev/null +++ b/doc/html/reference/types/bad_result_access.html @@ -0,0 +1,39 @@ + + +bad_result_access - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    bad_result_access

    +

    Exception type publicly inheriting from + std::logic_error + indicating an incorrect observation of value or error occurred by basic_result<T, E, NoValuePolicy> +.

    + +

    No member functions are added in addition to std::logic_error. Typical .what() strings are:

    + +
      +
    • "no value"
    • +
    • "no error"
    • +
    + +

    Requires: Nothing.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE

    + +

    Header: <boost/outcome/bad_access.hpp>

    + + +

    Last revised: January 25, 2019 at 01:51:37 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/bad_result_access_with.html b/doc/html/reference/types/bad_result_access_with.html new file mode 100644 index 000000000..6631a2986 --- /dev/null +++ b/doc/html/reference/types/bad_result_access_with.html @@ -0,0 +1,37 @@ + + +bad_result_access_with<EC> - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    bad_result_access_with<EC>

    +

    Exception type publicly inheriting from bad_result_access +, and thus also + std::logic_error +, indicating an incorrect observation of value occurred. The error value at the time of the exception throw is moved or copied into this type, and is available using the .error() observer which comes in lvalue ref, const lvalue ref, rvalue ref, and const rvalue ref overloads.

    + +

    The primary purpose of this exception type is to enable standing in for + P0323 std::expected<T, E> +’s bad_expected_access<E> which is thrown on incorrect wide value observation. This is why it is only ever EC which is thrown with bad_result_access_with<EC> on value observation only, and only when there is an error available. See the throw_bad_result_access<EC> + policy for more information.

    + +

    Requires: Nothing.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE

    + +

    Header: <boost/outcome/bad_access.hpp>

    + + +

    Last revised: January 25, 2019 at 01:51:37 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome.html b/doc/html/reference/types/basic_outcome.html new file mode 100644 index 000000000..6f127d427 --- /dev/null +++ b/doc/html/reference/types/basic_outcome.html @@ -0,0 +1,511 @@ + + +basic_outcome<T, EC, EP, NoValuePolicy> - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    + +

    basic_outcome<T, EC, EP, NoValuePolicy>

    + + + +

    A type carrying one of (i) a successful T (ii) a disappointment EC (iii) a failure EP (iv) both a disappointment EC and a failure EP, with NoValuePolicy specifying what to do if one tries to read state which isn’t there, and enabling injection of hooks to trap when lifecycle events occur. Any one, two, or all of T, EC and EP can be void to indicate no value for that state is present. Detectable using is_basic_outcome<T> +.

    + +

    Requires: Concept requirements if C++ 20, else static asserted:

    + +
      +
    • That trait type_can_be_used_in_basic_result<R> + is true for T, EC and EP.
    • +
    • That either EC is void or DefaultConstructible (Outcome v2.1 and earlier only).
    • +
    • That either EP is void or DefaultConstructible.
    • +
    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE

    + +

    Header: <boost/outcome/basic_outcome.hpp>

    + +

    Inclusions: The very lightest weight of C and C++ header files:

    + +
      +
    1. <cstdint>
    2. +
    3. <initializer_list>
    4. +
    5. <iosfwd>
    6. +
    7. <new>
    8. +
    9. <type_traits>
    10. +
    11. If BOOST_OUTCOME_USE_STD_IN_PLACE_TYPE + is 1, <utility> (defaults to 1 for C++ 17 or later only)
    12. +
    13. If C++ exceptions disabled and BOOST_OUTCOME_DISABLE_EXECINFO undefined only (used to print stack backtraces on “exception throw”): + +
        +
      1. <sal.h> (Windows only)
      2. +
      3. <stddef.h> (Windows only)
      4. +
      5. <string.h> (Windows only)
      6. +
      7. <execinfo.h> (POSIX only)
      8. +
    14. +
    15. <cstdio>
    16. +
    17. <cstdlib>
    18. +
    19. <cassert>
    20. +
    + +

    This very light weight set of inclusion dependencies makes basic outcome suitable for use in global header files of very large C++ codebases.

    + +

    Design rationale

    + +

    basic_outcome extends basic_result<T, E, NoValuePolicy> + with a third state to transport, +conventionally (but not necessarily) some sort of “abort” or “exceptional” state which a function can +return to indicate that not only did the operation fail, but it did so catastrophically i.e. please +abort any attempt to retry the operation.

    + +

    A perfect alternative is to throw a C++ exception for the abort code path, and indeed most programs +ought to do exactly that instead of using basic_outcome. However there are a number of use cases +where choosing basic_outcome shines:

    + +
      +
    1. Where C++ exceptions or RTTI is not available, but the ability to fail catastrophically without +terminating the program is important.
    2. +
    3. Where deterministic behaviour is required even in the catastrophic failure situation.
    4. +
    5. In unit test suites of code using Outcome it is extremely convenient to accumulate test failures +into a basic_outcome for later reporting. A similar convenience applies to RPC situations, where +C++ exception throws need to be accumulated for reporting back to the initiating endpoint.
    6. +
    7. Where a function is “dual use deterministic” i.e. it can be used deterministically, in which case +one switches control flow based on .error(), or it can be used non-deterministically by throwing +an exception perhaps carrying a custom payload.
    8. +
    + +

    Public member type aliases

    + +
      +
    • value_type is T.
    • +
    • error_type is EC.
    • +
    • exception_type is EP.
    • +
    • no_value_policy_type is NoValuePolicy.
    • +
    • value_type_if_enabled is T if construction from T is available, else it is a usefully named unusable internal type.
    • +
    • error_type_if_enabled is EC if construction from EC is available, else it is a usefully named unusable internal type.
    • +
    • exception_type_if_enabled is EP if construction from EP is available, else it is a usefully named unusable internal type.
    • +
    • rebind<A, B = EC, C = EP, D = NoValuePolicy> is basic_outcome<A, B, C, D>.
    • +
    + +

    Protected member predicate booleans

    + +
      +
    • predicate::constructors_enabled is constexpr boolean true if:

      + +
        +
      1. Decayed value_type and decayed error_type are not the same type, or both are void.
      2. +
      3. Decayed value_type and decayed exception_type are not the same type, or both are void.
      4. +
      5. Decayed error_type and decayed exception_type are not the same type, or both are void.
      6. +
    • + +
    • predicate::implicit_constructors_enabled is constexpr boolean true if:

      + +
        +
      1. predicate::constructors_enabled is true.
      2. +
      3. Trait is_error_type<E> + is not true for both decayed value_type and decayed error_type at the same time.
      4. +
      5. value_type is not implicitly constructible from error_type and error_type is not implicitly constructible from value_type.
        OR
        trait is_error_type<E> + is true for decayed error_type and error_type is not implicitly constructible from value_type and value_type is an integral type.
      6. +
      7. value_type is not implicitly constructible from exception_type.
      8. +
      9. error_type is not implicitly constructible from exception_type.
      10. +
      11. exception_type is not implicitly constructible from value_type.
      12. +
      13. exception_type is not implicitly constructible from error_type.
      14. +
    • + +
    • predicate::enable_value_converting_constructor<A> is constexpr boolean true if:

      + +
        +
      1. predicate::constructors_enabled is true.
      2. +
      3. Decayed A is not this basic_outcome type.
      4. +
      5. predicate::implicit_constructors_enabled is true.
      6. +
      7. Decayed A is not an in_place_type_t.
      8. +
      9. Trait is_error_type_enum<E, Enum> + is false for error_type and decayed A.
      10. +
      11. value_type is implicitly constructible from A and error_type is not implicitly constructible from A.
        OR
        value_type is the exact same type as decayed A and value_type is implicitly constructible from A.
      12. +
      13. exception_type is not implicitly constructible from A.
      14. +
    • + +
    • predicate::enable_error_converting_constructor<A> is constexpr boolean true if:

      + +
        +
      1. predicate::constructors_enabled is true.
      2. +
      3. Decayed A is not this basic_outcome type.
      4. +
      5. predicate::implicit_constructors_enabled is true.
      6. +
      7. Decayed A is not an in_place_type_t.
      8. +
      9. Trait is_error_type_enum<E, Enum> + is false for error_type and decayed A.
      10. +
      11. value_type is not implicitly constructible from A and error_type is implicitly constructible from A.
        OR
        error_type is the exact same type as decayed A and error_type is implicitly constructible from A.
      12. +
      13. exception_type is not implicitly constructible from A.
      14. +
    • + +
    • predicate::enable_error_condition_converting_constructor<ErrorCondEnum> is constexpr boolean true if:

      + +
        +
      1. predicate::constructors_enabled is true.
      2. +
      3. Decayed ErrorCondEnum is not this basic_outcome type.
      4. +
      5. Decayed ErrorCondEnum is not an in_place_type_t.
      6. +
      7. Trait is_error_type_enum<E, Enum> + is true for error_type and decayed ErrorCondEnum.
      8. +
      9. exception_type is not implicitly constructible from ErrorCondEnum.
      10. +
    • + +
    • predicate::enable_exception_converting_constructor<A> is constexpr boolean true if:

      + +
        +
      1. predicate::constructors_enabled is true.
      2. +
      3. Decayed A is not this basic_outcome type.
      4. +
      5. predicate::implicit_constructors_enabled is true.
      6. +
      7. Decayed A is not an in_place_type_t.
      8. +
      9. value_type is not implicitly constructible from A.
      10. +
      11. error_type is not implicitly constructible from A.
      12. +
      13. exception_type is implicitly constructible from A.
      14. +
    • + +
    • predicate::enable_error_exception_converting_constructor<A, B> is constexpr boolean true if:

      + +
        +
      1. predicate::constructors_enabled is true.
      2. +
      3. Decayed A is not this basic_outcome type.
      4. +
      5. predicate::implicit_constructors_enabled is true.
      6. +
      7. Decayed A is not an in_place_type_t.
      8. +
      9. value_type is not implicitly constructible from A.
      10. +
      11. error_type is implicitly constructible from A.
      12. +
      13. value_type is not implicitly constructible from B.
      14. +
      15. exception_type is implicitly constructible from B.
      16. +
    • + +
    • predicate::enable_compatible_conversion<A, B, C, D> is constexpr boolean true if:

      + +
        +
      1. predicate::constructors_enabled is true.
      2. +
      3. basic_outcome<A, B, C, D> is not this basic_outcome type.
      4. +
      5. A is void OR value_type is explicitly constructible from A.
      6. +
      7. B is void OR error_type is explicitly constructible from B.
      8. +
      9. C is void OR exception_type is explicitly constructible from C.
      10. +
    • + +
    • predicate::enable_make_error_code_compatible_conversion<A, B, C, D> is constexpr boolean true if:

      + +
        +
      1. predicate::constructors_enabled is true.
      2. +
      3. basic_outcome<A, B, C, D> is not this basic_outcome type.
      4. +
      5. Trait is_error_code_available<T> + is true for decayed error_type.
      6. +
      7. predicate::enable_compatible_conversion<A, B, C, D> is not true.
      8. +
      9. A is void OR value_type is explicitly constructible from A.
      10. +
      11. error_type is explicitly constructible from make_error_code(B).
      12. +
      13. C is void OR exception_type is explicitly constructible from C.
      14. +
    • + +
    • predicate::enable_inplace_value_constructor<Args...> is constexpr boolean true if:

      + +
        +
      1. predicate::constructors_enabled is true.
      2. +
      3. value_type is void OR value_type is explicitly constructible from Args....
      4. +
    • + +
    • predicate::enable_inplace_error_constructor<Args...> is constexpr boolean true if:

      + +
        +
      1. predicate::constructors_enabled is true.
      2. +
      3. error_type is void OR error_type is explicitly constructible from Args....
      4. +
    • + +
    • predicate::enable_inplace_exception_constructor<Args...> is constexpr boolean true if:

      + +
        +
      1. predicate::constructors_enabled is true.
      2. +
      3. exception_type is void OR exception_type is explicitly constructible from Args....
      4. +
    • + +
    • predicate::enable_inplace_value_error_exception_constructor<Args...> is constexpr boolean true if:

      + +
        +
      1. predicate::constructors_enabled is true.
      2. +
      3. predicate::implicit_constructors_enabled is true.
      4. +
      5. Exactly one of value_type is explicitly constructible from Args..., or error_type is explicitly constructible from Args..., or exception_type is explicitly constructible +from Args....
      6. +
    • +
    + +

    Summary of standard requirements provided

    + +
      +
    • DefaultConstructible, always deleted to force user to choose valued or errored or excepted for every outcome instanced.
    • +
    • MoveConstructible, if all of value_type, error_type and exception_type implement move constructors.
    • +
    • CopyConstructible, if all of value_type, error_type and exception_type implement copy constructors.
    • +
    • MoveAssignable, if all of value_type, error_type and exception_type implement move constructors and move assignment.
    • +
    • CopyAssignable, if all of value_type, error_type and exception_type implement copy constructors and copy assignment.
    • +
    • Destructible.
    • +
    • Swappable, with the strong rather than weak guarantee. See void swap(basic_outcome &) + for more information.
    • +
    • TriviallyCopyable, if all of value_type, error_type and exception_type are trivially copyable.
    • +
    • TrivialType, if all of value_type, error_type and exception_type are trivial types.
    • +
    • LiteralType, if all of value_type, error_type and exception_type are literal types.
    • + +
    • StandardLayoutType. It is implementation defined if basic_outcome can be used by C. +However all of the three major compilers MSVC, GCC and clang implement C layout of basic_outcome as follows:

      +
      struct outcome_layout {
      +  struct trivially_copyable_result_layout {
      +    union {
      +      value_type value;
      +      error_type error;
      +    };
      +    unsigned int flags;
      +  };
      +  exception_type exception;
      +};
      +
      +

      … if both value_type and error_type are TriviallyCopyable, otherwise:

      +
      struct outcome_layout {
      +  struct non_trivially_copyable_result_layout {
      +    value_type value;
      +    unsigned int flags;
      +    error_type error;
      +  };
      +  exception_type exception;
      +};
      +
      +

      If you choose standard layout value_type, error_type and exception_type, basic_outcome +works fine from C on MSVC, GCC and clang.

    • + +
    • EqualityComparable, if all of value_type, error_type and exception_type implement equality comparisons with one another.

    • + +
    • LessThanComparable, not implemented due to availability of implicit conversions from value_type, error_type and exception_type, this can cause major surprise (i.e. hard to diagnose bugs), so we don’t implement these at all.

    • + +
    • Hash, not implemented as a generic implementation of a unique hash for non-valued items which are unequal would require a dependency on RTTI being enabled.

    • +
    + +

    Thus basic_outcome meets the Regular concept if all of value_type, error_type and exception_type are Regular, except for the lack of a default constructor. Often where one needs a default constructor, wrapping basic_outcome into + std::optional<T> + will suffice.

    + +

    Public member functions

    + +

    Disabling constructors

    + +
    1. + basic_outcome(Args...) = delete +

      Disabling catchall constructor used to give useful diagnostic error when trying to use non-inplace constructors when predicate::constructors_enabled is false.

    2. + basic_outcome(X &&) = delete +

      Disabling implicit constructor used to give useful diagnostic error when trying to use implicit constructors when predicate::implicit_constructors_enabled is false.

    + +

    Copy and move constructors and assignment, and destructor

    + +
    1. + basic_outcome() = delete +

      The default constructor (disabled).

    2. + basic_outcome(basic_outcome &&) +

      Move constructor. Constexpr, triviality and noexcept propagating.

    3. + basic_outcome(const basic_outcome &) +

      Copy constructor. Constexpr, triviality and noexcept propagating.

    4. + basic_outcome &operator=(basic_outcome &&) +

      Move assignment. Constexpr, triviality and noexcept propagating.

    5. + basic_outcome &operator=(const basic_outcome &) +

      Copy assignment. Constexpr, triviality and noexcept propagating.

    6. + ~basic_outcome() +

      Destructor. Constexpr, triviality and noexcept propagating.

    + +

    Converting constructors

    + +
    1. + basic_outcome(R &&) +

      Implicit value_type constructor. Available if predicate::enable_value_converting_constructor<R> is true. Constexpr, triviality and noexcept propagating.

    2. + basic_outcome(S &&) +

      Implicit error_type constructor. Available if predicate::enable_error_converting_constructor<S> is true. Constexpr, triviality and noexcept propagating.

    3. + basic_outcome(ErrorCondEnum &&) +

      Implicit error_type from ErrorCondEnum constructor. Available if predicate::enable_error_condition_converting_constructor<ErrorCondEnum> is true. Constexpr, triviality and noexcept propagating.

    4. + basic_outcome(P &&) +

      Implicit exception_type constructor. Available if predicate::enable_exception_converting_constructor<P> is true. Constexpr, triviality and noexcept propagating.

    5. + basic_outcome(S &&, P &&) +

      Implicit error_type + exception_type constructor. Available if predicate::enable_error_exception_converting_constructor<S, P> is true. Constexpr, triviality and noexcept propagating.

    6. + explicit basic_outcome(concepts::value_or_error<T, E> &&) +

      Explicit converting constructor from concepts::value_or_error<T, E> concept matching types. Available if convert::value_or_error<> permits it. Constexpr, triviality and noexcept propagating.

    7. + explicit basic_outcome(const basic_outcome<A, B, C, D> &) +

      Explicit converting copy constructor from compatible basic_outcome. Available if predicate::enable_compatible_conversion<A, B, C, D> is true. Constexpr, triviality and noexcept propagating.

    8. + explicit basic_outcome(basic_outcome<A, B, C, D> &&) +

      Explicit converting move constructor from compatible basic_outcome. Available if predicate::enable_compatible_conversion<A, B, C, D> is true. Constexpr, triviality and noexcept propagating.

    9. + explicit basic_outcome(const basic_result<A, B, C> &) +

      Explicit converting copy constructor from compatible basic_result. Available if predicate::enable_compatible_conversion<A, B, void, C> is true. Constexpr, triviality and noexcept propagating.

    10. + explicit basic_outcome(basic_result<A, B, C> &&) +

      Explicit converting move constructor from compatible basic_result. Available if predicate::enable_compatible_conversion<A, B, void, C> is true. Constexpr, triviality and noexcept propagating.

    11. + explicit basic_outcome(const basic_result<A, B, C> &) +

      Explicit converting copy constructor from compatible basic_result. Available if predicate::enable_make_error_code_compatible_conversion<A, B, void, C> is true. Constexpr, triviality and noexcept propagating.

    12. + explicit basic_outcome(basic_result<A, B, C> &&) +

      Explicit converting move constructor from compatible basic_result. Available if predicate::enable_make_error_code_compatible_conversion<A, B, void, C> is true. Constexpr, triviality and noexcept propagating.

    + +

    Inplace constructors

    + +
    1. + explicit basic_outcome(in_place_type_t<value_type_if_enabled>, Args ...) +

      Explicit inplace value constructor. Available if predicate::enable_inplace_value_constructor<Args ...> is true. Constexpr, triviality and noexcept propagating.

    2. + explicit basic_outcome(in_place_type_t<value_type_if_enabled>, std::initializer_list<U>, Args ...) +

      Explicit inplace value constructor. Available if predicate::enable_inplace_value_constructor<std::initializer_list<U>, Args ...> is true. Constexpr, triviality and noexcept propagating.

    3. + explicit basic_outcome(in_place_type_t<error_type_if_enabled>, Args ...) +

      Explicit inplace error constructor. Available if predicate::enable_inplace_error_constructor<Args ...> is true. Constexpr, triviality and noexcept propagating.

    4. + explicit basic_outcome(in_place_type_t<error_type_if_enabled>, std::initializer_list<U>, Args ...) +

      Explicit inplace error constructor. Available if predicate::enable_inplace_error_constructor<std::initializer_list<U>, Args ...> is true. Constexpr, triviality and noexcept propagating.

    5. + explicit basic_outcome(in_place_type_t<exception_type_if_enabled>, Args ...) +

      Explicit inplace exception constructor. Available if predicate::enable_inplace_exception_constructor<Args ...> is true. Constexpr, triviality and noexcept propagating.

    6. + explicit basic_outcome(in_place_type_t<exception_type_if_enabled>, std::initializer_list<U>, Args ...) +

      Explicit inplace exception constructor. Available if predicate::enable_inplace_exception_constructor<std::initializer_list<U>, Args ...> is true. Constexpr, triviality and noexcept propagating.

    7. + basic_outcome(A1 &&, A2 &&, Args ...) +

      Implicit inplace value or error or exception constructor. Available if predicate::enable_inplace_value_error_exception_constructor<A1, A2, Args ...> is true. Constexpr, triviality and noexcept propagating.

    + +

    Tagged constructors

    + +
    1. + basic_outcome(const success_type<T> &) +

      Implicit value-from-success-type-sugar copy constructor. Available if predicate::enable_compatible_conversion<T, void, void> is true, or T is void. Constexpr, triviality and noexcept propagating.

    2. + basic_outcome(success_type<T> &&) +

      Implicit value-from-success-type-sugar move constructor. Available if predicate::enable_compatible_conversion<T, void, void> is true, or T is void. Constexpr, triviality and noexcept propagating.

    3. + basic_outcome(const failure_type<EC> &) +

      Implicit error-from-failure-type-sugar copy constructor. Available if predicate::enable_compatible_conversion<void, EC, void, void> is true. Constexpr, triviality and noexcept propagating.

    4. + basic_outcome(failure_type<EC> &&) +

      Implicit error-from-failure-type-sugar move constructor. Available if predicate::enable_compatible_conversion<void, EC, void, void> is true. Constexpr, triviality and noexcept propagating.

    5. + basic_outcome(const failure_type<EC> &) +

      Implicit error-from-failure-type-sugar copy constructor. Available if predicate::enable_make_error_code_compatible_conversion<void, EC, void, void> is true. Constexpr, triviality and noexcept propagating.

    6. + basic_outcome(failure_type<EC> &&) +

      Implicit error-from-failure-type-sugar move constructor. Available if predicate::enable_make_error_code_compatible_conversion<void, EC, void, void> is true. Constexpr, triviality and noexcept propagating.

    7. + basic_outcome(const failure_type<EP> &) +

      Implicit exception-from-failure-type-sugar copy constructor. Available if predicate::enable_compatible_conversion<void, void, EP, void> is true. Constexpr, triviality and noexcept propagating.

    8. + basic_outcome(failure_type<EP> &&) +

      Implicit exception-from-failure-type-sugar move constructor. Available if predicate::enable_compatible_conversion<void, void, EP, void> is true. Constexpr, triviality and noexcept propagating.

    9. + basic_outcome(const failure_type<EC, EP> &) +

      Implicit error-and-exception-from-failure-type-sugar copy constructor. Available if predicate::enable_compatible_conversion<void, EC, EP, void> is true. Constexpr, triviality and noexcept propagating.

    10. + basic_outcome(failure_type<EC, EP> &&) +

      Implicit error-and-exception-from-failure-type-sugar move constructor. Available if predicate::enable_compatible_conversion<void, EC, EP, void> is true. Constexpr, triviality and noexcept propagating.

    + +

    Observers

    + +
    1. + explicit operator bool() const noexcept +

      Returns true if a value is present. Constexpr, never throws.

    2. + bool has_value() const noexcept +

      Returns true if a value is present. Constexpr, never throws.

    3. + bool has_error() const noexcept +

      Returns true if an error is present. Constexpr, never throws.

    4. + bool has_exception() const noexcept +

      Returns true if an exception is present. Constexpr, never throws.

    5. + bool has_failure() const noexcept +

      Returns true if there is either an error or an exception. Constexpr, never throws.

    6. + value_type &assume_value() & noexcept +

      Narrow contract lvalue reference observer of any value present. Constexpr propagating, never throws.

    7. + const value_type &assume_value() const & noexcept +

      Narrow contract const lvalue reference observer of any value present. Constexpr propagating, never throws.

    8. + value_type &&assume_value() && noexcept +

      Narrow contract rvalue reference observer of any value present. Constexpr propagating, never throws.

    9. + const value_type &&assume_value() const && noexcept +

      Narrow contract const rvalue reference observer of any value present. Constexpr propagating, never throws.

    10. + value_type &value() & +

      Wide contract lvalue reference observer of any value present. Constexpr propagating.

    11. + const value_type &value() const & +

      Wide contract const lvalue reference observer of any value present. Constexpr propagating.

    12. + value_type &&value() && +

      Wide contract rvalue reference observer of any value present. Constexpr propagating.

    13. + const value_type &&value() const && +

      Wide contract const rvalue reference observer of any value present. Constexpr propagating.

    14. + error_type &assume_error() & noexcept +

      Narrow contract lvalue reference observer of the stored error. Constexpr propagating, never throws.

    15. + const error_type &assume_error() const & noexcept +

      Narrow contract const lvalue reference observer of the stored error. Constexpr propagating, never throws.

    16. + error_type &&assume_error() && noexcept +

      Narrow contract rvalue reference observer of the stored error. Constexpr propagating, never throws.

    17. + const error_type &&assume_error() const && noexcept +

      Narrow contract const rvalue reference observer of the stored error. Constexpr propagating, never throws.

    18. + error_type &error() & +

      Wide contract lvalue reference observer of the stored error. Constexpr propagating.

    19. + const error_type &error() const & +

      Wide contract const lvalue reference observer of the stored error. Constexpr propagating.

    20. + error_type &&error() && +

      Wide contract rvalue reference observer of the stored error. Constexpr propagating.

    21. + const error_type &&error() const && +

      Wide contract const rvalue reference observer of the stored error. Constexpr propagating.

    22. + exception_type &assume_exception() & noexcept +

      Narrow contract lvalue reference observer of the stored exception. Constexpr propagating, never throws.

    23. + const exception_type &assume_exception() const & noexcept +

      Narrow contract const lvalue reference observer of the stored exception. Constexpr propagating, never throws.

    24. + const exception_type &&assume_exception() const && noexcept +

      Narrow contract const rvalue reference observer of the stored exception. Constexpr propagating, never throws.

    25. + exception_type &&assume_exception() && noexcept +

      Narrow contract rvalue reference observer of the stored exception. Constexpr propagating, never throws.

    26. + exception_type &exception() & +

      Wide contract lvalue reference observer of the stored exception. Constexpr propagating.

    27. + const exception_type &exception() const & +

      Wide contract const lvalue reference observer of the stored exception. Constexpr propagating.

    28. + exception_type &&exception() && +

      Wide contract rvalue reference observer of the stored exception. Constexpr propagating.

    29. + const exception_type &&exception() const && +

      Wide contract const rvalue reference observer of the stored exception. Constexpr propagating.

    30. + exception_type failure() const noexcept +

      Synthesising observer of the stored exception or error. Available if the traits is_error_code_available<T> and is_exception_ptr_available<T> are both true. Never throws.

    31. + failure_type<error_type, exception_type> as_failure() const & +

      Return the output from free function failure() containing a copy of any errored and/or excepted state.

    + +

    Modifiers

    + +
    1. + void swap(basic_outcome &) +

      Swap one basic_outcome with another, with the strong guarantee. Noexcept propagating.

    2. + failure_type<error_type, exception_type> as_failure() && +

      Return the output from free function failure() containing a move of any errored and/or excepted state.

    + +

    Comparisons

    + +

    See above for why LessThanComparable is not implemented.

    + +
    1. + bool operator==(const basic_result<A, B, C> &) const +

      Returns true if this outcome compares equal to the other result. Constexpr and noexcept propagating.

    2. + bool operator==(const basic_outcome<A, B, C, D> &) const +

      Returns true if this outcome compares equal to the other outcome. Constexpr and noexcept propagating.

    3. + bool operator==(const success_type<A> &) const +

      Returns true if this result compares equal to the success type sugar. Constexpr and noexcept propagating.

    4. + bool operator==(const failure_type<A, B> &) const +

      Returns true if this outcome compares equal to the failure type sugar. Constexpr and noexcept propagating.

    5. + bool operator!=(const basic_result<A, B, C> &) const +

      Returns true if this outcome does not compare equal to the other result. Constexpr and noexcept propagating.

    6. + bool operator!=(const basic_outcome<A, B, C, D> &) const +

      Returns true if this outcome does not compare equal to the other outcome. Constexpr and noexcept propagating.

    7. + bool operator!=(const success_type<A> &) const +

      Returns true if this outcome does not compare equal to the success type sugar. Constexpr and noexcept propagating.

    8. + bool operator!=(const failure_type<A, B> &) const +

      Returns true if this outcome does not compare equal to the failure type sugar. Constexpr and noexcept propagating.

    + + + + + + + +

    Last revised: December 17, 2020 at 11:27:06 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/as_failure_lvalue.html b/doc/html/reference/types/basic_outcome/as_failure_lvalue.html new file mode 100644 index 000000000..0e5e26c97 --- /dev/null +++ b/doc/html/reference/types/basic_outcome/as_failure_lvalue.html @@ -0,0 +1,32 @@ + + +failure_type<error_type, exception_type> as_failure() const & - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    failure_type<error_type, exception_type> as_failure() const &

    +

    Return the output from free function auto failure(T &&, ...) + containing a copy of any errored and/or excepted state. The error and/or exception state is accessed using const error_type &assume_error() const & noexcept + and const exception_type &assume_exception() const & noexcept +.

    + +

    Requires: Always available.

    + +

    Complexity: Whatever that of error_type’s and/or exception_type’s copy constructor is.

    + +

    Guarantees: None.

    + + +

    Last revised: February 01, 2019 at 15:52:57 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/as_failure_rvalue.html b/doc/html/reference/types/basic_outcome/as_failure_rvalue.html new file mode 100644 index 000000000..7cf90020c --- /dev/null +++ b/doc/html/reference/types/basic_outcome/as_failure_rvalue.html @@ -0,0 +1,32 @@ + + +failure_type<error_type, exception_type> as_failure() && - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    failure_type<error_type, exception_type> as_failure() &&

    +

    Return the output from free function auto failure(T &&, ...) + containing a move from any errored and/or excepted state, thus leaving the outcome’s error and exception values in a moved-from state. Depending on the choice of error_type and/or exception_type, this function may therefore be destructive. The error and exception states are accessed using error_type &&assume_error() && noexcept + and exception_type &&assume_exception() && noexcept +.

    + +

    Requires: Always available.

    + +

    Complexity: Whatever that of error_type’s and/or exception_type’s move constructor is.

    + +

    Guarantees: None.

    + + +

    Last revised: February 01, 2019 at 15:52:57 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/assume_error_lvalue.html b/doc/html/reference/types/basic_outcome/assume_error_lvalue.html new file mode 100644 index 000000000..b0a44fa1b --- /dev/null +++ b/doc/html/reference/types/basic_outcome/assume_error_lvalue.html @@ -0,0 +1,31 @@ + + +error_type &assume_error() & noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    error_type &assume_error() & noexcept

    +

    Narrow contract lvalue reference observer of the stored error. NoValuePolicy::narrow_error_check() is first invoked, then the reference to the error is returned. As a valid default constructed error is always present, no undefined behaviour occurs unless NoValuePolicy::narrow_error_check() does that.

    + +

    Note that if error_type is void, only a const overload returning void is present.

    + +

    Requires: Always available.

    + +

    Complexity: Depends on NoValuePolicy::narrow_error_check().

    + +

    Guarantees: An exception is never thrown.

    + + +

    Last revised: February 12, 2019 at 16:36:24 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/assume_error_lvalue_const.html b/doc/html/reference/types/basic_outcome/assume_error_lvalue_const.html new file mode 100644 index 000000000..556cb367b --- /dev/null +++ b/doc/html/reference/types/basic_outcome/assume_error_lvalue_const.html @@ -0,0 +1,31 @@ + + +const error_type &assume_error() const & noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    const error_type &assume_error() const & noexcept

    +

    Narrow contract const lvalue reference observer of the stored error. NoValuePolicy::narrow_error_check() is first invoked, then the reference to the error is returned. As a valid default constructed error is always present, no undefined behaviour occurs unless NoValuePolicy::narrow_error_check() does that.

    + +

    Note that if error_type is void, only a const overload returning void is present.

    + +

    Requires: Always available.

    + +

    Complexity: Depends on NoValuePolicy::narrow_error_check().

    + +

    Guarantees: An exception is never thrown.

    + + +

    Last revised: February 12, 2019 at 16:36:24 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/assume_error_rvalue.html b/doc/html/reference/types/basic_outcome/assume_error_rvalue.html new file mode 100644 index 000000000..81fd2dddd --- /dev/null +++ b/doc/html/reference/types/basic_outcome/assume_error_rvalue.html @@ -0,0 +1,31 @@ + + +error_type &&assume_error() && noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    error_type &&assume_error() && noexcept

    +

    Narrow contract rvalue reference observer of the stored error. NoValuePolicy::narrow_error_check() is first invoked, then the reference to the error is returned. As a valid default constructed error is always present, no undefined behaviour occurs unless NoValuePolicy::narrow_error_check() does that.

    + +

    Note that if error_type is void, only a const overload returning void is present.

    + +

    Requires: Always available.

    + +

    Complexity: Depends on NoValuePolicy::narrow_error_check().

    + +

    Guarantees: An exception is never thrown.

    + + +

    Last revised: February 12, 2019 at 16:36:24 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/assume_error_rvalue_const.html b/doc/html/reference/types/basic_outcome/assume_error_rvalue_const.html new file mode 100644 index 000000000..e1868c565 --- /dev/null +++ b/doc/html/reference/types/basic_outcome/assume_error_rvalue_const.html @@ -0,0 +1,31 @@ + + +const error_type &&assume_error() const && noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    const error_type &&assume_error() const && noexcept

    +

    Narrow contract const rvalue reference observer of the stored error. NoValuePolicy::narrow_error_check() is first invoked, then the reference to the error is returned. As a valid default constructed error is always present, no undefined behaviour occurs unless NoValuePolicy::narrow_error_check() does that.

    + +

    Note that if error_type is void, only a const overload returning void is present.

    + +

    Requires: Always available.

    + +

    Complexity: Depends on NoValuePolicy::narrow_error_check().

    + +

    Guarantees: An exception is never thrown.

    + + +

    Last revised: February 12, 2019 at 16:36:24 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/assume_exception_lvalue.html b/doc/html/reference/types/basic_outcome/assume_exception_lvalue.html new file mode 100644 index 000000000..239837fa5 --- /dev/null +++ b/doc/html/reference/types/basic_outcome/assume_exception_lvalue.html @@ -0,0 +1,31 @@ + + +exception_type &assume_exception() & noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    exception_type &assume_exception() & noexcept

    +

    Narrow contract lvalue reference observer of the stored exception. NoValuePolicy::narrow_exception_check() is first invoked, then the reference to the exception is returned. As a valid default constructed exception is always present, no undefined behaviour occurs unless NoValuePolicy::narrow_exception_check() does that.

    + +

    Note that if exception_type is void, only a const overload returning void is present.

    + +

    Requires: Always available.

    + +

    Complexity: Depends on NoValuePolicy::narrow_exception_check().

    + +

    Guarantees: An exception is never thrown.

    + + +

    Last revised: February 12, 2019 at 16:36:24 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/assume_exception_lvalue_const.html b/doc/html/reference/types/basic_outcome/assume_exception_lvalue_const.html new file mode 100644 index 000000000..5fc60f046 --- /dev/null +++ b/doc/html/reference/types/basic_outcome/assume_exception_lvalue_const.html @@ -0,0 +1,31 @@ + + +const exception_type &assume_exception() const & noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    const exception_type &assume_exception() const & noexcept

    +

    Narrow contract const lvalue reference observer of the stored exception. NoValuePolicy::narrow_exception_check() is first invoked, then the reference to the exception is returned. As a valid default constructed exception is always present, no undefined behaviour occurs unless NoValuePolicy::narrow_exception_check() does that.

    + +

    Note that if exception_type is void, only a const overload returning void is present.

    + +

    Requires: Always available.

    + +

    Complexity: Depends on NoValuePolicy::narrow_exception_check().

    + +

    Guarantees: An exception is never thrown.

    + + +

    Last revised: February 12, 2019 at 16:36:24 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/assume_exception_rvalue.html b/doc/html/reference/types/basic_outcome/assume_exception_rvalue.html new file mode 100644 index 000000000..038385d44 --- /dev/null +++ b/doc/html/reference/types/basic_outcome/assume_exception_rvalue.html @@ -0,0 +1,31 @@ + + +exception_type &&assume_exception() && noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    exception_type &&assume_exception() && noexcept

    +

    Narrow contract rvalue reference observer of the stored exception. NoValuePolicy::narrow_exception_check() is first invoked, then the reference to the exception is returned. As a valid default constructed exception is always present, no undefined behaviour occurs unless NoValuePolicy::narrow_exception_check() does that.

    + +

    Note that if exception_type is void, only a const overload returning void is present.

    + +

    Requires: Always available.

    + +

    Complexity: Depends on NoValuePolicy::narrow_exception_check().

    + +

    Guarantees: An exception is never thrown.

    + + +

    Last revised: February 12, 2019 at 16:36:24 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/assume_exception_rvalue_const.html b/doc/html/reference/types/basic_outcome/assume_exception_rvalue_const.html new file mode 100644 index 000000000..1c3c4c957 --- /dev/null +++ b/doc/html/reference/types/basic_outcome/assume_exception_rvalue_const.html @@ -0,0 +1,31 @@ + + +const exception_type &&assume_exception() const && noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    const exception_type &&assume_exception() const && noexcept

    +

    Narrow contract const rvalue reference observer of the stored exception. NoValuePolicy::narrow_exception_check() is first invoked, then the reference to the exception is returned. As a valid default constructed exception is always present, no undefined behaviour occurs unless NoValuePolicy::narrow_exception_check() does that.

    + +

    Note that if exception_type is void, only a const overload returning void is present.

    + +

    Requires: Always available.

    + +

    Complexity: Depends on NoValuePolicy::narrow_exception_check().

    + +

    Guarantees: An exception is never thrown.

    + + +

    Last revised: February 12, 2019 at 16:36:24 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/assume_value_lvalue.html b/doc/html/reference/types/basic_outcome/assume_value_lvalue.html new file mode 100644 index 000000000..f5acf204e --- /dev/null +++ b/doc/html/reference/types/basic_outcome/assume_value_lvalue.html @@ -0,0 +1,31 @@ + + +value_type &assume_value() & noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    value_type &assume_value() & noexcept

    +

    Narrow contract lvalue reference observer of any value present. NoValuePolicy::narrow_value_check() is first invoked, then the reference to the value is returned. The convention is that hard undefined behaviour occurs if no value is actually present, however NoValuePolicy::narrow_value_check() can do something to avoid that.

    + +

    Note that if value_type is void, only a const overload returning void is present.

    + +

    Requires: Always available.

    + +

    Complexity: Depends on NoValuePolicy::narrow_value_check().

    + +

    Guarantees: An exception is never thrown.

    + + +

    Last revised: February 12, 2019 at 16:36:24 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/assume_value_lvalue_const.html b/doc/html/reference/types/basic_outcome/assume_value_lvalue_const.html new file mode 100644 index 000000000..cc51be5e7 --- /dev/null +++ b/doc/html/reference/types/basic_outcome/assume_value_lvalue_const.html @@ -0,0 +1,31 @@ + + +const value_type &assume_value() const & noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    const value_type &assume_value() const & noexcept

    +

    Narrow contract const lvalue reference observer of any value present. NoValuePolicy::narrow_value_check() is first invoked, then the reference to the value is returned. The convention is that hard undefined behaviour occurs if no value is actually present, however NoValuePolicy::narrow_value_check() can do something to avoid that.

    + +

    Note that if value_type is void, only a const overload returning void is present.

    + +

    Requires: Always available.

    + +

    Complexity: Depends on NoValuePolicy::narrow_value_check().

    + +

    Guarantees: An exception is never thrown.

    + + +

    Last revised: February 12, 2019 at 16:36:24 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/assume_value_rvalue.html b/doc/html/reference/types/basic_outcome/assume_value_rvalue.html new file mode 100644 index 000000000..8c75b9968 --- /dev/null +++ b/doc/html/reference/types/basic_outcome/assume_value_rvalue.html @@ -0,0 +1,31 @@ + + +value_type &&assume_value() && noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    value_type &&assume_value() && noexcept

    +

    Narrow contract rvalue reference observer of any value present. NoValuePolicy::narrow_value_check() is first invoked, then the reference to the value is returned. The convention is that hard undefined behaviour occurs if no value is actually present, however NoValuePolicy::narrow_value_check() can do something to avoid that.

    + +

    Note that if value_type is void, only a const overload returning void is present.

    + +

    Requires: Always available.

    + +

    Complexity: Depends on NoValuePolicy::narrow_value_check().

    + +

    Guarantees: An exception is never thrown.

    + + +

    Last revised: February 12, 2019 at 16:36:24 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/assume_value_rvalue_const.html b/doc/html/reference/types/basic_outcome/assume_value_rvalue_const.html new file mode 100644 index 000000000..41e7bb117 --- /dev/null +++ b/doc/html/reference/types/basic_outcome/assume_value_rvalue_const.html @@ -0,0 +1,31 @@ + + +const value_type &&assume_value() const && noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    const value_type &&assume_value() const && noexcept

    +

    Narrow contract const rvalue reference observer of any value present. NoValuePolicy::narrow_value_check() is first invoked, then the reference to the value is returned. The convention is that hard undefined behaviour occurs if no value is actually present, however NoValuePolicy::narrow_value_check() can do something to avoid that.

    + +

    Note that if value_type is void, only a const overload returning void is present.

    + +

    Requires: Always available.

    + +

    Complexity: Depends on NoValuePolicy::narrow_value_check().

    + +

    Guarantees: An exception is never thrown.

    + + +

    Last revised: February 12, 2019 at 16:36:24 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/copy_assignment.html b/doc/html/reference/types/basic_outcome/copy_assignment.html new file mode 100644 index 000000000..8b3835966 --- /dev/null +++ b/doc/html/reference/types/basic_outcome/copy_assignment.html @@ -0,0 +1,29 @@ + + +basic_outcome &operator=(const basic_outcome &) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    basic_outcome &operator=(const basic_outcome &)

    +

    Copy assignment.

    + +

    Requires: that value_type, error_type and exception_type all implement copy assignment.

    + +

    Complexity: If the value_type for both is present, uses value_type’s copy assignment operator, else either destructs or copy constructs value_type as appropriate. error_type’s and exception_type’s copy assignment operator is always used. Constexpr, triviality and noexcept of underlying operations is propagated.

    + +

    Guarantees: If an exception is thrown during the operation, the object is left in a partially completed state, as per the normal rules for the same operation on a struct.

    + + +

    Last revised: March 03, 2019 at 00:11:47 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/copy_constructor.html b/doc/html/reference/types/basic_outcome/copy_constructor.html new file mode 100644 index 000000000..09e1de5dc --- /dev/null +++ b/doc/html/reference/types/basic_outcome/copy_constructor.html @@ -0,0 +1,29 @@ + + +basic_outcome(const basic_outcome &) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    basic_outcome(const basic_outcome &)

    +

    Copy constructor.

    + +

    Requires: that value_type, error_type and exception_type all implement a copy constructor.

    + +

    Complexity: Same as for value_type’s, error_type’s and exception_type’s copy constructors. Constexpr, triviality and noexcept of underlying operations is propagated.

    + +

    Guarantees: If an exception is thrown during the operation, the object is left in a partially completed state, as per the normal rules for the same operation on a struct.

    + + +

    Last revised: March 03, 2019 at 00:11:47 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/default.html b/doc/html/reference/types/basic_outcome/default.html new file mode 100644 index 000000000..09442b598 --- /dev/null +++ b/doc/html/reference/types/basic_outcome/default.html @@ -0,0 +1,23 @@ + + +basic_outcome() = delete - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    basic_outcome() = delete

    +

    The default constructor for basic outcome is always disabled.

    + + +

    Last revised: January 31, 2019 at 01:07:35 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/destructor.html b/doc/html/reference/types/basic_outcome/destructor.html new file mode 100644 index 000000000..9ce886db7 --- /dev/null +++ b/doc/html/reference/types/basic_outcome/destructor.html @@ -0,0 +1,27 @@ + + +~basic_outcome() - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    ~basic_outcome()

    +

    Destructor.

    + +

    Requires: Always available.

    + +

    Complexity: Same as for value_type’s, error_type’s and exception_type’s destructors. Constexpr, triviality and noexcept of underlying operations is propagated.

    + + +

    Last revised: January 31, 2019 at 01:07:35 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/disabling_catchall.html b/doc/html/reference/types/basic_outcome/disabling_catchall.html new file mode 100644 index 000000000..e128634f5 --- /dev/null +++ b/doc/html/reference/types/basic_outcome/disabling_catchall.html @@ -0,0 +1,27 @@ + + +basic_outcome(Args…) = delete - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    basic_outcome(Args...) = delete

    +

    Disabling catchall constructor used to give useful diagnostic error when trying to use non-inplace constructors when predicate::constructors_enabled is false.

    + +

    Requires: predicate::constructors_enabled is false.

    + +

    Complexity: N/A.

    + + +

    Last revised: January 31, 2019 at 01:07:35 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/disabling_implicit_constructor.html b/doc/html/reference/types/basic_outcome/disabling_implicit_constructor.html new file mode 100644 index 000000000..fba14bbad --- /dev/null +++ b/doc/html/reference/types/basic_outcome/disabling_implicit_constructor.html @@ -0,0 +1,27 @@ + + +basic_outcome(X &&) = delete - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    basic_outcome(X &&) = delete

    +

    Disabling implicit constructor used to give useful diagnostic error when trying to use implicit constructors when predicate::implicit_constructors_enabled is false.

    + +

    Requires: predicate::implicit_constructors_enabled is false.

    + +

    Complexity: N/A.

    + + +

    Last revised: January 31, 2019 at 01:07:35 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/equality_basic_outcome.html b/doc/html/reference/types/basic_outcome/equality_basic_outcome.html new file mode 100644 index 000000000..cc2e8a39e --- /dev/null +++ b/doc/html/reference/types/basic_outcome/equality_basic_outcome.html @@ -0,0 +1,29 @@ + + +bool operator==(const basic_outcome<A, B, C, D> &) const - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    bool operator==(const basic_outcome<A, B, C, D> &) const

    +

    Returns true if this outcome compares equal to the other outcome. Comparison is done using operator== on value_type or error_type and/or exception_type if the currently chosen state is the same for both outcomes, otherwise false is returned.

    + +

    Requires: operator== must be a valid expression between value_type and A, and between error_type and B, and between exception_type and C. If value_type is void, then so must be A; similarly for error_type and B; similarly for exception_type and C.

    + +

    Complexity: Whatever the underlying operator== have. Constexpr and noexcept of underlying operations is propagated.

    + +

    Guarantees: None.

    + + +

    Last revised: February 01, 2019 at 15:52:57 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/equality_basic_result.html b/doc/html/reference/types/basic_outcome/equality_basic_result.html new file mode 100644 index 000000000..4d9973e4c --- /dev/null +++ b/doc/html/reference/types/basic_outcome/equality_basic_result.html @@ -0,0 +1,29 @@ + + +bool operator==(const basic_result<A, B, C> &) const - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    bool operator==(const basic_result<A, B, C> &) const

    +

    Returns true if this outcome compares equal to the other result. Comparison is done using operator== on value_type or error_type if the currently chosen state is the same for both outcome and result, otherwise false is returned. Note that if the outcome is excepted, it will never compare equal to a result.

    + +

    Requires: operator== must be a valid expression between value_type and A, and between error_type and B. If value_type is void, then so must be A; similarly for error_type and B.

    + +

    Complexity: Whatever the underlying operator== have. Constexpr and noexcept of underlying operations is propagated.

    + +

    Guarantees: None.

    + + +

    Last revised: February 01, 2019 at 15:52:57 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/equality_failure_type.html b/doc/html/reference/types/basic_outcome/equality_failure_type.html new file mode 100644 index 000000000..eebfa8650 --- /dev/null +++ b/doc/html/reference/types/basic_outcome/equality_failure_type.html @@ -0,0 +1,29 @@ + + +bool operator==(const failure_type<A, B> &) const - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    bool operator==(const failure_type<A, B> &) const

    +

    Returns true if this outcome is unsuccessful and its error compares equal to the error in the failure type sugar. Comparison is done using operator== on error_type and A and on exception_type and B.

    + +

    Requires: operator== must be a valid expression between error_type and A, or A is void; operator== must be a valid expression between exception_type and B, or B is void. If error_type is void, then so must be A; if exception_type is void, then so must be B.

    + +

    Complexity: Whatever the underlying operator== has. Constexpr and noexcept of underlying operations is propagated.

    + +

    Guarantees: None.

    + + +

    Last revised: January 31, 2019 at 01:07:35 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/equality_success_type.html b/doc/html/reference/types/basic_outcome/equality_success_type.html new file mode 100644 index 000000000..ced262a8a --- /dev/null +++ b/doc/html/reference/types/basic_outcome/equality_success_type.html @@ -0,0 +1,30 @@ + + +bool operator!=(const success_type<A> &) const - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    bool operator!=(const success_type<A> &) const

    +

    Returns true if this outcome is not successful or its value does not compares equal to the value in the success type sugar. Comparison is done using operator!= on value_type and A. If A is void, this call aliases bool has_error() const noexcept +.

    + +

    Requires: operator!= must be a valid expression between value_type and A, or A is void. If value_type is void, then so must be A.

    + +

    Complexity: Whatever the underlying operator!= has. Constexpr and noexcept of underlying operations is propagated.

    + +

    Guarantees: None.

    + + +

    Last revised: January 31, 2019 at 01:07:35 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/error_lvalue.html b/doc/html/reference/types/basic_outcome/error_lvalue.html new file mode 100644 index 000000000..9ab7a4c74 --- /dev/null +++ b/doc/html/reference/types/basic_outcome/error_lvalue.html @@ -0,0 +1,31 @@ + + +error_type &error() & - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    error_type &error() &

    +

    Wide contract lvalue reference observer of the stored error. NoValuePolicy::wide_error_check() is first invoked, then the reference to the error is returned. As a valid default constructed error is always present, no undefined behaviour occurs if NoValuePolicy::wide_error_check() returns.

    + +

    Note that if error_type is void, only a const overload returning void is present.

    + +

    Requires: Always available.

    + +

    Complexity: Depends on NoValuePolicy::wide_error_check().

    + +

    Guarantees: None.

    + + +

    Last revised: February 12, 2019 at 16:36:24 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/error_lvalue_const.html b/doc/html/reference/types/basic_outcome/error_lvalue_const.html new file mode 100644 index 000000000..1f639ee98 --- /dev/null +++ b/doc/html/reference/types/basic_outcome/error_lvalue_const.html @@ -0,0 +1,31 @@ + + +const error_type &error() const & - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    const error_type &error() const &

    +

    Wide contract const lvalue reference observer of the stored error. NoValuePolicy::wide_error_check() is first invoked, then the reference to the error is returned. As a valid default constructed error is always present, no undefined behaviour occurs if NoValuePolicy::wide_error_check() returns.

    + +

    Note that if error_type is void, only a const overload returning void is present.

    + +

    Requires: Always available.

    + +

    Complexity: Depends on NoValuePolicy::wide_error_check().

    + +

    Guarantees: None.

    + + +

    Last revised: February 12, 2019 at 16:36:24 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/error_rvalue.html b/doc/html/reference/types/basic_outcome/error_rvalue.html new file mode 100644 index 000000000..4d89e8734 --- /dev/null +++ b/doc/html/reference/types/basic_outcome/error_rvalue.html @@ -0,0 +1,31 @@ + + +error_type &&error() && - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    error_type &&error() &&

    +

    Wide contract rvalue reference observer of the stored error. NoValuePolicy::wide_error_check() is first invoked, then the reference to the error is returned. As a valid default constructed error is always present, no undefined behaviour occurs if NoValuePolicy::wide_error_check() returns.

    + +

    Note that if error_type is void, only a const overload returning void is present.

    + +

    Requires: Always available.

    + +

    Complexity: Depends on NoValuePolicy::wide_error_check().

    + +

    Guarantees: None.

    + + +

    Last revised: February 12, 2019 at 16:36:24 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/error_rvalue_const.html b/doc/html/reference/types/basic_outcome/error_rvalue_const.html new file mode 100644 index 000000000..497c634e5 --- /dev/null +++ b/doc/html/reference/types/basic_outcome/error_rvalue_const.html @@ -0,0 +1,31 @@ + + +const error_type &&error() const && - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    const error_type &&error() const &&

    +

    Wide contract const rvalue reference observer of the stored error. NoValuePolicy::wide_error_check() is first invoked, then the reference to the error is returned. As a valid default constructed error is always present, no undefined behaviour occurs if NoValuePolicy::wide_error_check() returns.

    + +

    Note that if error_type is void, only a const overload returning void is present.

    + +

    Requires: Always available.

    + +

    Complexity: Depends on NoValuePolicy::wide_error_check().

    + +

    Guarantees: None.

    + + +

    Last revised: February 12, 2019 at 16:36:24 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/exception_lvalue.html b/doc/html/reference/types/basic_outcome/exception_lvalue.html new file mode 100644 index 000000000..7198d35d2 --- /dev/null +++ b/doc/html/reference/types/basic_outcome/exception_lvalue.html @@ -0,0 +1,31 @@ + + +exception_type &exception() & - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    exception_type &exception() &

    +

    Wide contract lvalue reference observer of the stored exception. NoValuePolicy::wide_exception_check() is first invoked, then the reference to the exception is returned. As a valid default constructed exception is always present, no undefined behaviour occurs if NoValuePolicy::wide_exception_check() returns.

    + +

    Note that if exception_type is void, only a const overload returning void is present.

    + +

    Requires: Always available.

    + +

    Complexity: Depends on NoValuePolicy::wide_exception_check().

    + +

    Guarantees: None.

    + + +

    Last revised: February 12, 2019 at 16:36:24 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/exception_lvalue_const.html b/doc/html/reference/types/basic_outcome/exception_lvalue_const.html new file mode 100644 index 000000000..e49a377d5 --- /dev/null +++ b/doc/html/reference/types/basic_outcome/exception_lvalue_const.html @@ -0,0 +1,31 @@ + + +const exception_type &exception() const & - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    const exception_type &exception() const &

    +

    Wide contract const lvalue reference observer of the stored exception. NoValuePolicy::wide_exception_check() is first invoked, then the reference to the exception is returned. As a valid default constructed exception is always present, no undefined behaviour occurs if NoValuePolicy::wide_exception_check() returns.

    + +

    Note that if exception_type is void, only a const overload returning void is present.

    + +

    Requires: Always available.

    + +

    Complexity: Depends on NoValuePolicy::wide_exception_check().

    + +

    Guarantees: None.

    + + +

    Last revised: February 12, 2019 at 16:36:24 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/exception_rvalue.html b/doc/html/reference/types/basic_outcome/exception_rvalue.html new file mode 100644 index 000000000..89d7a5948 --- /dev/null +++ b/doc/html/reference/types/basic_outcome/exception_rvalue.html @@ -0,0 +1,31 @@ + + +exception_type &&exception() && - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    exception_type &&exception() &&

    +

    Wide contract rvalue reference observer of the stored exception. NoValuePolicy::wide_exception_check() is first invoked, then the reference to the exception is returned. As a valid default constructed exception is always present, no undefined behaviour occurs if NoValuePolicy::wide_exception_check() returns.

    + +

    Note that if exception_type is void, only a const overload returning void is present.

    + +

    Requires: Always available.

    + +

    Complexity: Depends on NoValuePolicy::wide_exception_check().

    + +

    Guarantees: None.

    + + +

    Last revised: February 12, 2019 at 16:36:24 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/exception_rvalue_const.html b/doc/html/reference/types/basic_outcome/exception_rvalue_const.html new file mode 100644 index 000000000..6921eea4e --- /dev/null +++ b/doc/html/reference/types/basic_outcome/exception_rvalue_const.html @@ -0,0 +1,31 @@ + + +const exception_type &&exception() const && - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    const exception_type &&exception() const &&

    +

    Wide contract const rvalue reference observer of the stored exception. NoValuePolicy::wide_exception_check() is first invoked, then the reference to the exception is returned. As a valid default constructed exception is always present, no undefined behaviour occurs if NoValuePolicy::wide_exception_check() returns.

    + +

    Note that if exception_type is void, only a const overload returning void is present.

    + +

    Requires: Always available.

    + +

    Complexity: Depends on NoValuePolicy::wide_exception_check().

    + +

    Guarantees: None.

    + + +

    Last revised: February 12, 2019 at 16:36:24 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/explicit_copy_converting_constructor.html b/doc/html/reference/types/basic_outcome/explicit_copy_converting_constructor.html new file mode 100644 index 000000000..128584db4 --- /dev/null +++ b/doc/html/reference/types/basic_outcome/explicit_copy_converting_constructor.html @@ -0,0 +1,30 @@ + + +explicit basic_outcome(const basic_outcome<A, B, C, D> &) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    explicit basic_outcome(const basic_outcome<A, B, C, D> &)

    +

    Explicit converting copy constructor from compatible basic_outcome. Calls void on_outcome_copy_construction(T *, U &&) noexcept + with this and the input.

    + +

    Requires: predicate::enable_compatible_conversion<A, B, C, D> is true.

    + +

    Complexity: Same as for the copy constructors of the underlying types. Constexpr, triviality and noexcept of underlying operations is propagated.

    + +

    Guarantees: If an exception is thrown during the operation, the object is left in a partially completed state, as per the normal rules for the same operation on a struct.

    + + +

    Last revised: December 17, 2020 at 11:27:06 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/explicit_inplace_error_constructor.html b/doc/html/reference/types/basic_outcome/explicit_inplace_error_constructor.html new file mode 100644 index 000000000..e66fdf213 --- /dev/null +++ b/doc/html/reference/types/basic_outcome/explicit_inplace_error_constructor.html @@ -0,0 +1,30 @@ + + +explicit basic_outcome(in_place_type_t<error_type_if_enabled>, Args …) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    explicit basic_outcome(in_place_type_t<error_type_if_enabled>, Args ...)

    +

    Explicit inplace error constructor. Calls void on_outcome_in_place_construction(T *, in_place_type_t<U>, Args &&...) noexcept + with this, in_place_type<error_type> and Args ....

    + +

    Requires: predicate::enable_inplace_error_constructor<Args ...> is true.

    + +

    Complexity: Same as for the error_type constructor which accepts Args .... Constexpr, triviality and noexcept of underlying operations is propagated.

    + +

    Guarantees: If an exception is thrown during the operation, the state of the Args is left indeterminate.

    + + +

    Last revised: December 17, 2020 at 11:27:06 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/explicit_inplace_error_constructor_il.html b/doc/html/reference/types/basic_outcome/explicit_inplace_error_constructor_il.html new file mode 100644 index 000000000..88f7bdd66 --- /dev/null +++ b/doc/html/reference/types/basic_outcome/explicit_inplace_error_constructor_il.html @@ -0,0 +1,30 @@ + + +explicit basic_outcome(in_place_type_t<error_type_if_enabled>, std::initializer_list<U>, Args …) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    explicit basic_outcome(in_place_type_t<error_type_if_enabled>, std::initializer_list<U>, Args ...)

    +

    Explicit inplace error constructor. Calls void on_outcome_in_place_construction(T *, in_place_type_t<U>, Args &&...) noexcept + with this, in_place_type<error_type>, std::initializer_list<U> and Args ....

    + +

    Requires: predicate::enable_inplace_error_constructor<std::initializer_list<U>, Args ...> is true.

    + +

    Complexity: Same as for the error_type constructor which accepts std::initializer_list<U>, Args .... Constexpr, triviality and noexcept of underlying operations is propagated.

    + +

    Guarantees: If an exception is thrown during the operation, the state of the Args is left indeterminate.

    + + +

    Last revised: December 17, 2020 at 11:27:06 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/explicit_inplace_exception_constructor.html b/doc/html/reference/types/basic_outcome/explicit_inplace_exception_constructor.html new file mode 100644 index 000000000..e5c806636 --- /dev/null +++ b/doc/html/reference/types/basic_outcome/explicit_inplace_exception_constructor.html @@ -0,0 +1,30 @@ + + +explicit basic_outcome(in_place_type_t<exception_type_if_enabled>, Args …) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    explicit basic_outcome(in_place_type_t<exception_type_if_enabled>, Args ...)

    +

    Explicit inplace exception constructor. Calls void on_outcome_in_place_construction(T *, in_place_type_t<U>, Args &&...) noexcept + with this, in_place_type<exception_type> and Args ....

    + +

    Requires: predicate::enable_inplace_exception_constructor<Args ...> is true.

    + +

    Complexity: Same as for the exception_type constructor which accepts Args .... Constexpr, triviality and noexcept of underlying operations is propagated.

    + +

    Guarantees: If an exception is thrown during the operation, the state of the Args is left indeterminate.

    + + +

    Last revised: December 17, 2020 at 11:27:06 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/explicit_inplace_exception_constructor_il.html b/doc/html/reference/types/basic_outcome/explicit_inplace_exception_constructor_il.html new file mode 100644 index 000000000..58b176567 --- /dev/null +++ b/doc/html/reference/types/basic_outcome/explicit_inplace_exception_constructor_il.html @@ -0,0 +1,30 @@ + + +explicit basic_outcome(in_place_type_t<exception_type_if_enabled>, std::initializer_list<U>, Args …) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    explicit basic_outcome(in_place_type_t<exception_type_if_enabled>, std::initializer_list<U>, Args ...)

    +

    Explicit inplace exception constructor. Calls void on_outcome_in_place_construction(T *, in_place_type_t<U>, Args &&...) noexcept + with this, in_place_type<exception_type>, std::initializer_list<U> and Args ....

    + +

    Requires: predicate::enable_inplace_exception_constructor<std::initializer_list<U>, Args ...> is true.

    + +

    Complexity: Same as for the exception_type constructor which accepts std::initializer_list<U>, Args .... Constexpr, triviality and noexcept of underlying operations is propagated.

    + +

    Guarantees: If an exception is thrown during the operation, the state of the Args is left indeterminate.

    + + +

    Last revised: December 17, 2020 at 11:27:06 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/explicit_inplace_value_constructor.html b/doc/html/reference/types/basic_outcome/explicit_inplace_value_constructor.html new file mode 100644 index 000000000..0c7baee59 --- /dev/null +++ b/doc/html/reference/types/basic_outcome/explicit_inplace_value_constructor.html @@ -0,0 +1,30 @@ + + +explicit basic_outcome(in_place_type_t<value_type_if_enabled>, Args …) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    explicit basic_outcome(in_place_type_t<value_type_if_enabled>, Args ...)

    +

    Explicit inplace value constructor. Calls void on_outcome_in_place_construction(T *, in_place_type_t<U>, Args &&...) noexcept + with this, in_place_type<value_type> and Args ....

    + +

    Requires: predicate::enable_inplace_value_constructor<Args ...> is true.

    + +

    Complexity: Same as for the value_type constructor which accepts Args .... Constexpr, triviality and noexcept of underlying operations is propagated.

    + +

    Guarantees: If an exception is thrown during the operation, the state of the Args is left indeterminate.

    + + +

    Last revised: December 17, 2020 at 11:27:06 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/explicit_inplace_value_constructor_il.html b/doc/html/reference/types/basic_outcome/explicit_inplace_value_constructor_il.html new file mode 100644 index 000000000..e58891709 --- /dev/null +++ b/doc/html/reference/types/basic_outcome/explicit_inplace_value_constructor_il.html @@ -0,0 +1,30 @@ + + +explicit basic_outcome(in_place_type_t<value_type_if_enabled>, std::initializer_list<U>, Args …) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    explicit basic_outcome(in_place_type_t<value_type_if_enabled>, std::initializer_list<U>, Args ...)

    +

    Explicit inplace value constructor. Calls void on_outcome_in_place_construction(T *, in_place_type_t<U>, Args &&...) noexcept + with this, in_place_type<value_type>, ‘std::initializer_list’ and Args ....

    + +

    Requires: predicate::enable_inplace_value_constructor<std::initializer_list<U>, Args ...> is true.

    + +

    Complexity: Same as for the value_type constructor which accepts std::initializer_list<U>, Args .... Constexpr, triviality and noexcept of underlying operations is propagated.

    + +

    Guarantees: If an exception is thrown during the operation, the state of the Args is left indeterminate.

    + + +

    Last revised: December 17, 2020 at 11:27:06 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/explicit_move_converting_constructor.html b/doc/html/reference/types/basic_outcome/explicit_move_converting_constructor.html new file mode 100644 index 000000000..f92a5330e --- /dev/null +++ b/doc/html/reference/types/basic_outcome/explicit_move_converting_constructor.html @@ -0,0 +1,30 @@ + + +explicit basic_outcome(basic_outcome<A, B, C, D> &&) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    explicit basic_outcome(basic_outcome<A, B, C, D> &&)

    +

    Explicit converting move constructor from compatible basic_outcome. Calls void on_outcome_move_construction(T *, U &&) noexcept + with this and the input.

    + +

    Requires: predicate::enable_compatible_conversion<A, B, C, D> is true.

    + +

    Complexity: Same as for the move constructors of the underlying types. Constexpr, triviality and noexcept of underlying operations is propagated.

    + +

    Guarantees: If an exception is thrown during the operation, the object is left in a partially completed state, as per the normal rules for the same operation on a struct.

    + + +

    Last revised: December 17, 2020 at 11:27:06 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/explicit_result_copy_converting_constructor.html b/doc/html/reference/types/basic_outcome/explicit_result_copy_converting_constructor.html new file mode 100644 index 000000000..bc82ca3ad --- /dev/null +++ b/doc/html/reference/types/basic_outcome/explicit_result_copy_converting_constructor.html @@ -0,0 +1,30 @@ + + +explicit basic_outcome(const basic_result<A, B, C> &) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    explicit basic_outcome(const basic_result<A, B, C> &)

    +

    Explicit converting copy constructor from compatible basic_result. Calls void on_outcome_copy_construction(T *, U &&) noexcept + with this and the input.

    + +

    Requires: predicate::enable_compatible_conversion<A, B, void, C> is true.

    + +

    Complexity: Same as for the copy constructors of the underlying types. Constexpr, triviality and noexcept of underlying operations is propagated.

    + +

    Guarantees: If an exception is thrown during the operation, the object is left in a partially completed state, as per the normal rules for the same operation on a struct.

    + + +

    Last revised: December 17, 2020 at 11:27:06 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/explicit_result_make_error_code_copy_converting_constructor.html b/doc/html/reference/types/basic_outcome/explicit_result_make_error_code_copy_converting_constructor.html new file mode 100644 index 000000000..eacf94bf8 --- /dev/null +++ b/doc/html/reference/types/basic_outcome/explicit_result_make_error_code_copy_converting_constructor.html @@ -0,0 +1,30 @@ + + +explicit basic_outcome(const basic_result<A, B, C> &) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    explicit basic_outcome(const basic_result<A, B, C> &)

    +

    Explicit converting copy constructor from compatible basic_result. Calls void on_outcome_copy_construction(T *, U &&) noexcept + with this and the input.

    + +

    Requires: predicate::enable_make_error_code_compatible_conversion<A, B, void, C> is true.

    + +

    Complexity: Same as for the copy constructors of the underlying types. Constexpr, triviality and noexcept of underlying operations is propagated.

    + +

    Guarantees: If an exception is thrown during the operation, the object is left in a partially completed state, as per the normal rules for the same operation on a struct.

    + + +

    Last revised: December 17, 2020 at 11:27:06 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/explicit_result_make_error_code_move_converting_constructor.html b/doc/html/reference/types/basic_outcome/explicit_result_make_error_code_move_converting_constructor.html new file mode 100644 index 000000000..724064e47 --- /dev/null +++ b/doc/html/reference/types/basic_outcome/explicit_result_make_error_code_move_converting_constructor.html @@ -0,0 +1,30 @@ + + +explicit basic_outcome(basic_result<A, B, C> &&) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    explicit basic_outcome(basic_result<A, B, C> &&)

    +

    Explicit converting move constructor from compatible basic_result. Calls void on_outcome_move_construction(T *, U &&) noexcept + with this and the input.

    + +

    Requires: predicate::enable_make_error_code_compatible_conversion<A, B, void, C> is true.

    + +

    Complexity: Same as for the move constructors of the underlying types. Constexpr, triviality and noexcept of underlying operations is propagated.

    + +

    Guarantees: If an exception is thrown during the operation, the object is left in a partially completed state, as per the normal rules for the same operation on a struct.

    + + +

    Last revised: December 17, 2020 at 11:27:06 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/explicit_result_move_converting_constructor.html b/doc/html/reference/types/basic_outcome/explicit_result_move_converting_constructor.html new file mode 100644 index 000000000..7298904eb --- /dev/null +++ b/doc/html/reference/types/basic_outcome/explicit_result_move_converting_constructor.html @@ -0,0 +1,30 @@ + + +explicit basic_outcome(basic_result<A, B, C> &&) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    explicit basic_outcome(basic_result<A, B, C> &&)

    +

    Explicit converting move constructor from compatible basic_result. Calls void on_outcome_move_construction(T *, U &&) noexcept + with this and the input.

    + +

    Requires: predicate::enable_compatible_conversion<A, B, void, C> is true.

    + +

    Complexity: Same as for the move constructors of the underlying types. Constexpr, triviality and noexcept of underlying operations is propagated.

    + +

    Guarantees: If an exception is thrown during the operation, the object is left in a partially completed state, as per the normal rules for the same operation on a struct.

    + + +

    Last revised: December 17, 2020 at 11:27:06 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/explicit_valueorerror_converting_constructor.html b/doc/html/reference/types/basic_outcome/explicit_valueorerror_converting_constructor.html new file mode 100644 index 000000000..bac339063 --- /dev/null +++ b/doc/html/reference/types/basic_outcome/explicit_valueorerror_converting_constructor.html @@ -0,0 +1,32 @@ + + +explicit basic_outcome(concepts::value_or_error<T, E> &&) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    explicit basic_outcome(concepts::value_or_error<T, E> &&)

    +

    Explicit converting constructor from concepts::value_or_error<T, E> + concept matching types. Delegates to the basic_result move constructor explicit basic_outcome(basic_result<A, B, C> &&) +.

    + +

    Requires: convert::value_or_error<T, U> + has an available call operator, and if the input is a basic_result or basic_outcome, then convert::value_or_error<> has enabled those inputs for that convert::value_or_error<> specialisation.

    + +

    Complexity: Same as for the copy or move constructor from the input’s .value() or .error() respectively. Constexpr, triviality and noexcept of underlying operations is propagated.

    + +

    Guarantees: If an exception is thrown during the operation, the object is left in a partially completed state, as per the normal rules for the same operation on a struct.

    + + +

    Last revised: December 15, 2020 at 12:22:39 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/failure.html b/doc/html/reference/types/basic_outcome/failure.html new file mode 100644 index 000000000..6579a5678 --- /dev/null +++ b/doc/html/reference/types/basic_outcome/failure.html @@ -0,0 +1,41 @@ + + +exception_type failure() const noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    exception_type failure() const noexcept

    +

    Synthesising observer of the stored exception or error. If an exception is available, +returns a copy of that directly. If an error is available, and not an exception, an +ADL discovered free function auto basic_outcome_failure_exception_from_error(const EC &) + +is invoked. Default overloads for this function are defined in Outcome for + std::error_code + +and boost::system::error_code, these return std::make_exception_ptr(std::system_error(ec)) +and boost::copy_exception(boost::system::system_error(ec)) respectively.

    + +

    Requires: Both the traits is_error_code_available<T> + and +is_exception_ptr_available<T> + are true.

    + +

    Complexity: Depends on basic_outcome_failure_exception_from_error(const EC &).

    + +

    Guarantees: Never throws. If an exception is thrown during the copy of the exception, +that exception (from std::current_exception()) is returned instead.

    + + +

    Last revised: February 05, 2019 at 21:41:47 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/has_error.html b/doc/html/reference/types/basic_outcome/has_error.html new file mode 100644 index 000000000..3dcd3562b --- /dev/null +++ b/doc/html/reference/types/basic_outcome/has_error.html @@ -0,0 +1,29 @@ + + +bool has_error() const noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    bool has_error() const noexcept

    +

    Returns true if an error is present. Constexpr where possible.

    + +

    Requires: Always available.

    + +

    Complexity: Constant time.

    + +

    Guarantees: Never throws an exception.

    + + +

    Last revised: January 31, 2019 at 01:07:35 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/has_exception.html b/doc/html/reference/types/basic_outcome/has_exception.html new file mode 100644 index 000000000..dd45e1091 --- /dev/null +++ b/doc/html/reference/types/basic_outcome/has_exception.html @@ -0,0 +1,29 @@ + + +bool has_exception() const noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    bool has_exception() const noexcept

    +

    Returns true if an exception is present. Constexpr where possible.

    + +

    Requires: Always available.

    + +

    Complexity: Constant time.

    + +

    Guarantees: Never throws an exception.

    + + +

    Last revised: January 31, 2019 at 01:07:35 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/has_failure.html b/doc/html/reference/types/basic_outcome/has_failure.html new file mode 100644 index 000000000..39e38da12 --- /dev/null +++ b/doc/html/reference/types/basic_outcome/has_failure.html @@ -0,0 +1,29 @@ + + +bool has_failure() const noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    bool has_failure() const noexcept

    +

    Returns true if there is either an error or an exception. Constexpr where possible.

    + +

    Requires: Always available.

    + +

    Complexity: Constant time.

    + +

    Guarantees: Never throws an exception.

    + + +

    Last revised: January 31, 2019 at 01:07:35 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/has_value.html b/doc/html/reference/types/basic_outcome/has_value.html new file mode 100644 index 000000000..194c2cc0c --- /dev/null +++ b/doc/html/reference/types/basic_outcome/has_value.html @@ -0,0 +1,30 @@ + + +bool has_value() const noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    bool has_value() const noexcept

    +

    Returns true if a value is present. Constexpr where possible. Alias for explicit operator bool() const noexcept +.

    + +

    Requires: Always available.

    + +

    Complexity: Constant time.

    + +

    Guarantees: Never throws an exception.

    + + +

    Last revised: January 31, 2019 at 01:07:35 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/implicit_error_condition_converting_constructor.html b/doc/html/reference/types/basic_outcome/implicit_error_condition_converting_constructor.html new file mode 100644 index 000000000..468a01b44 --- /dev/null +++ b/doc/html/reference/types/basic_outcome/implicit_error_condition_converting_constructor.html @@ -0,0 +1,30 @@ + + +basic_outcome(ErrorCondEnum &&) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    basic_outcome(ErrorCondEnum &&)

    +

    Implicit error_type from ErrorCondEnum constructor. Calls void on_outcome_construction(T *, U &&) noexcept + with this and ErrorCondEnum.

    + +

    Requires: predicate::enable_error_condition_converting_constructor<R> is true.

    + +

    Complexity: Same as for error_type’s copy or move constructor from the result of make_error_code(ErrorCondEnum). Constexpr, triviality and noexcept of underlying operations is propagated.

    + +

    Guarantees: If an exception is thrown during the operation, the state of the input is left indeterminate.

    + + +

    Last revised: December 17, 2020 at 11:27:06 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/implicit_error_converting_constructor.html b/doc/html/reference/types/basic_outcome/implicit_error_converting_constructor.html new file mode 100644 index 000000000..cea850736 --- /dev/null +++ b/doc/html/reference/types/basic_outcome/implicit_error_converting_constructor.html @@ -0,0 +1,28 @@ + + +basic_outcome(S &&) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    basic_outcome(S &&)

    +

    Implicit error_type constructor. Calls void on_outcome_construction(T *, U &&) noexcept + with this and S.

    + +

    Requires: predicate::enable_error_converting_constructor<S> is true.

    + +

    Complexity: Same as for error_type’s copy or move constructor. Constexpr, triviality and noexcept of underlying operations is propagated.

    + + +

    Last revised: December 17, 2020 at 11:27:06 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/implicit_error_exception_converting_constructor.html b/doc/html/reference/types/basic_outcome/implicit_error_exception_converting_constructor.html new file mode 100644 index 000000000..2e02d3ffc --- /dev/null +++ b/doc/html/reference/types/basic_outcome/implicit_error_exception_converting_constructor.html @@ -0,0 +1,28 @@ + + +basic_outcome(S &&, P &&) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    basic_outcome(S &&, P &&)

    +

    Implicit error_type + exception_type constructor. Calls void on_outcome_construction(T *, U &&, V &&) noexcept + with this, S and P.

    + +

    Requires: predicate::enable_error_exception_converting_constructor<S, P> is true.

    + +

    Complexity: Same as for error_type’s and exception_type’s copy or move constructor. Constexpr, triviality and noexcept of underlying operations is propagated.

    + + +

    Last revised: December 17, 2020 at 11:27:06 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/implicit_exception_converting_constructor.html b/doc/html/reference/types/basic_outcome/implicit_exception_converting_constructor.html new file mode 100644 index 000000000..38f29657f --- /dev/null +++ b/doc/html/reference/types/basic_outcome/implicit_exception_converting_constructor.html @@ -0,0 +1,28 @@ + + +basic_outcome(P &&) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    basic_outcome(P &&)

    +

    Implicit exception_type constructor. Calls void on_outcome_construction(T *, U &&) noexcept + with this and P.

    + +

    Requires: predicate::enable_exception_converting_constructor<P> is true.

    + +

    Complexity: Same as for exception_type’s copy or move constructor. Constexpr, triviality and noexcept of underlying operations is propagated.

    + + +

    Last revised: December 17, 2020 at 11:27:06 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/implicit_failure_error_copy_constructor.html b/doc/html/reference/types/basic_outcome/implicit_failure_error_copy_constructor.html new file mode 100644 index 000000000..9e8554840 --- /dev/null +++ b/doc/html/reference/types/basic_outcome/implicit_failure_error_copy_constructor.html @@ -0,0 +1,29 @@ + + +basic_outcome(const failure_type<EC> &) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    basic_outcome(const failure_type<EC> &)

    +

    Implicit error-from-failure-type-sugar copy constructor used to disambiguate the construction of the error type. +Calls void on_outcome_copy_construction(T *, U &&) noexcept + with this and const failure_type<EC> &.

    + +

    Requires: predicate::enable_compatible_conversion<void, EC, void, void> is true.

    + +

    Complexity: Same as for the error_type constructor which accepts EC. Constexpr, triviality and noexcept of underlying operations is propagated.

    + + +

    Last revised: December 17, 2020 at 11:27:06 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/implicit_failure_error_exception_copy_constructor.html b/doc/html/reference/types/basic_outcome/implicit_failure_error_exception_copy_constructor.html new file mode 100644 index 000000000..bc105544e --- /dev/null +++ b/doc/html/reference/types/basic_outcome/implicit_failure_error_exception_copy_constructor.html @@ -0,0 +1,29 @@ + + +basic_outcome(const failure_type<EC, EP> &) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    basic_outcome(const failure_type<EC, EP> &)

    +

    Implicit error-and-exception-from-failure-type-sugar copy constructor used to disambiguate the construction of the error + exception types. +Calls void on_outcome_copy_construction(T *, U &&, V &&) noexcept + with this, const failure_type<EC> & and const failure_type<EP> &.

    + +

    Requires: predicate::enable_compatible_conversion<void, EC, EP, void> is true.

    + +

    Complexity: Same as for the error_type and exception_type constructors which accept EC and EP. Constexpr, triviality and noexcept of underlying operations is propagated.

    + + +

    Last revised: December 17, 2020 at 11:27:06 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/implicit_failure_error_exception_move_constructor.html b/doc/html/reference/types/basic_outcome/implicit_failure_error_exception_move_constructor.html new file mode 100644 index 000000000..4062ae8dc --- /dev/null +++ b/doc/html/reference/types/basic_outcome/implicit_failure_error_exception_move_constructor.html @@ -0,0 +1,29 @@ + + +basic_outcome(failure_type<EC, EP> &&) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    basic_outcome(failure_type<EC, EP> &&)

    +

    Implicit error-and-exception-from-failure-type-sugar move constructor used to disambiguate the construction of the error + exception types. +Calls void on_outcome_move_construction(T *, U &&, V &&) noexcept + with this, failure_type<EC> && and failure_type<EP> &&.

    + +

    Requires: predicate::enable_compatible_conversion<void, EC, EP, void> is true.

    + +

    Complexity: Same as for the error_type and exception_type constructors which accept EC and EP. Constexpr, triviality and noexcept of underlying operations is propagated.

    + + +

    Last revised: December 17, 2020 at 11:27:06 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/implicit_failure_error_make_error_code_copy_constructor.html b/doc/html/reference/types/basic_outcome/implicit_failure_error_make_error_code_copy_constructor.html new file mode 100644 index 000000000..c79828407 --- /dev/null +++ b/doc/html/reference/types/basic_outcome/implicit_failure_error_make_error_code_copy_constructor.html @@ -0,0 +1,29 @@ + + +basic_outcome(const failure_type<EC> &) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    basic_outcome(const failure_type<EC> &)

    +

    Implicit error-from-failure-type-sugar copy constructor used to disambiguate the construction of the error type. +Calls void on_outcome_copy_construction(T *, U &&) noexcept + with this and const failure_type<EC> &.

    + +

    Requires: predicate::enable_make_error_code_compatible_conversion<void, EC, void, void> is true.

    + +

    Complexity: Same as for the error_type constructor which accepts EC. Constexpr, triviality and noexcept of underlying operations is propagated.

    + + +

    Last revised: December 17, 2020 at 11:27:06 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/implicit_failure_error_make_error_code_move_constructor.html b/doc/html/reference/types/basic_outcome/implicit_failure_error_make_error_code_move_constructor.html new file mode 100644 index 000000000..dd1e0fe32 --- /dev/null +++ b/doc/html/reference/types/basic_outcome/implicit_failure_error_make_error_code_move_constructor.html @@ -0,0 +1,29 @@ + + +basic_outcome(failure_type<EC> &&) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    basic_outcome(failure_type<EC> &&)

    +

    Implicit error-from-failure-type-sugar move constructor used to disambiguate the construction of the error type. +Calls void on_outcome_move_construction(T *, U &&) noexcept + with this and failure_type<EC> &&.

    + +

    Requires: predicate::enable_make_error_code_compatible_conversion<void, EC, void, void> is true.

    + +

    Complexity: Same as for the error_type constructor which accepts EC. Constexpr, triviality and noexcept of underlying operations is propagated.

    + + +

    Last revised: December 17, 2020 at 11:27:06 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/implicit_failure_error_move_constructor.html b/doc/html/reference/types/basic_outcome/implicit_failure_error_move_constructor.html new file mode 100644 index 000000000..71ab444d0 --- /dev/null +++ b/doc/html/reference/types/basic_outcome/implicit_failure_error_move_constructor.html @@ -0,0 +1,29 @@ + + +basic_outcome(failure_type<EC> &&) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    basic_outcome(failure_type<EC> &&)

    +

    Implicit error-from-failure-type-sugar move constructor used to disambiguate the construction of the error type. +Calls void on_outcome_move_construction(T *, U &&) noexcept + with this and failure_type<EC> &&.

    + +

    Requires: predicate::enable_compatible_conversion<void, EC, void, void> is true.

    + +

    Complexity: Same as for the error_type constructor which accepts EC. Constexpr, triviality and noexcept of underlying operations is propagated.

    + + +

    Last revised: December 17, 2020 at 11:27:06 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/implicit_failure_exception_copy_constructor.html b/doc/html/reference/types/basic_outcome/implicit_failure_exception_copy_constructor.html new file mode 100644 index 000000000..6dd257fc3 --- /dev/null +++ b/doc/html/reference/types/basic_outcome/implicit_failure_exception_copy_constructor.html @@ -0,0 +1,29 @@ + + +basic_outcome(const failure_type<EP> &) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    basic_outcome(const failure_type<EP> &)

    +

    Implicit exception-from-failure-type-sugar copy constructor used to disambiguate the construction of the exception type. +Calls void on_outcome_copy_construction(T *, U &&) noexcept + with this and const failure_type<EP> &.

    + +

    Requires: predicate::enable_compatible_conversion<void, void, EP, void> is true.

    + +

    Complexity: Same as for the exception_type constructor which accepts EP. Constexpr, triviality and noexcept of underlying operations is propagated.

    + + +

    Last revised: December 17, 2020 at 11:27:06 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/implicit_failure_exception_move_constructor.html b/doc/html/reference/types/basic_outcome/implicit_failure_exception_move_constructor.html new file mode 100644 index 000000000..daf0c4b7c --- /dev/null +++ b/doc/html/reference/types/basic_outcome/implicit_failure_exception_move_constructor.html @@ -0,0 +1,29 @@ + + +basic_outcome(failure_type<EP> &&) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    basic_outcome(failure_type<EP> &&)

    +

    Implicit exception-from-failure-type-sugar move constructor used to disambiguate the construction of the exception type. +Calls void on_outcome_move_construction(T *, U &&) noexcept + with this and failure_type<EP> &&.

    + +

    Requires: predicate::enable_compatible_conversion<void, void, EP, void> is true.

    + +

    Complexity: Same as for the exception_type constructor which accepts EP. Constexpr, triviality and noexcept of underlying operations is propagated.

    + + +

    Last revised: December 17, 2020 at 11:27:06 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/implicit_inplace_value_error_exception_constructor.html b/doc/html/reference/types/basic_outcome/implicit_inplace_value_error_exception_constructor.html new file mode 100644 index 000000000..1de9a3d73 --- /dev/null +++ b/doc/html/reference/types/basic_outcome/implicit_inplace_value_error_exception_constructor.html @@ -0,0 +1,29 @@ + + +basic_outcome(A1 &&, A2 &&, Args …) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    basic_outcome(A1 &&, A2 &&, Args ...)

    +

    Implicit inplace value or error or exception constructor. Delegates to an appropriate explicit inplace constructor depending on input.

    + +

    Requires: predicate::enable_inplace_value_error_exception_constructor` is true.

    + +

    Complexity: Same as for the value_type or error_type or exception_type constructor which accepts A1, A2, Args .... Constexpr, triviality and noexcept of underlying operations is propagated.

    + +

    Guarantees: If an exception is thrown during the operation, the state of the Args is left indeterminate.

    + + +

    Last revised: January 31, 2019 at 01:07:35 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/implicit_success_copy_constructor.html b/doc/html/reference/types/basic_outcome/implicit_success_copy_constructor.html new file mode 100644 index 000000000..ab8e66aeb --- /dev/null +++ b/doc/html/reference/types/basic_outcome/implicit_success_copy_constructor.html @@ -0,0 +1,29 @@ + + +basic_outcome(const success_type<T> &) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    basic_outcome(const success_type<T> &)

    +

    Implicit value-from-success-type-sugar copy constructor used to disambiguate the construction of the value type. +Note that if T = void, value_type will be default constructed. Calls void on_outcome_copy_construction(T *, U &&) noexcept + with this and const success_type<T> &.

    + +

    Requires: predicate::enable_compatible_conversion<T, void, void> is true, or T is void.

    + +

    Complexity: Same as for the value_type constructor which accepts T, or the value_type default constructor if T is void. Constexpr, triviality and noexcept of underlying operations is propagated.

    + + +

    Last revised: December 17, 2020 at 11:27:06 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/implicit_success_move_constructor.html b/doc/html/reference/types/basic_outcome/implicit_success_move_constructor.html new file mode 100644 index 000000000..cc7f66368 --- /dev/null +++ b/doc/html/reference/types/basic_outcome/implicit_success_move_constructor.html @@ -0,0 +1,29 @@ + + +basic_outcome(success_type<T> &&) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    basic_outcome(success_type<T> &&)

    +

    Implicit value-from-success-type-sugar move constructor used to disambiguate the construction of the value type. +Note that if T = void, value_type will be default constructed. Calls void on_outcome_move_construction(T *, U &&) noexcept + with this and success_type<T> &&.

    + +

    Requires: predicate::enable_compatible_conversion<T, void, void> is true, or T is void.

    + +

    Complexity: Same as for the value_type constructor which accepts T, or the value_type default constructor if T is void. Constexpr, triviality and noexcept of underlying operations is propagated.

    + + +

    Last revised: December 17, 2020 at 11:27:06 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/implicit_value_converting_constructor.html b/doc/html/reference/types/basic_outcome/implicit_value_converting_constructor.html new file mode 100644 index 000000000..2f329d675 --- /dev/null +++ b/doc/html/reference/types/basic_outcome/implicit_value_converting_constructor.html @@ -0,0 +1,28 @@ + + +basic_outcome(R &&) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    basic_outcome(R &&)

    +

    Implicit value_type constructor. Calls void on_outcome_construction(T *, U &&) noexcept + with this and R.

    + +

    Requires: predicate::enable_value_converting_constructor<R> is true.

    + +

    Complexity: Same as for value_type’s copy or move constructor. Constexpr, triviality and noexcept of underlying operations is propagated.

    + + +

    Last revised: December 17, 2020 at 11:27:06 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/inequality_basic_outcome.html b/doc/html/reference/types/basic_outcome/inequality_basic_outcome.html new file mode 100644 index 000000000..418ef4816 --- /dev/null +++ b/doc/html/reference/types/basic_outcome/inequality_basic_outcome.html @@ -0,0 +1,29 @@ + + +bool operator!=(const basic_outcome<A, B, C, D> &) const - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    bool operator!=(const basic_outcome<A, B, C, D> &) const

    +

    Returns true if this outcome does not compare equal to the other outcome. Comparison is done using operator!= on value_type, error_type and/or exception_type if the currently chosen state is the same for both outcomes, otherwise true is returned.

    + +

    Requires: operator!= must be a valid expression between value_type and A, and between error_type and B, and between exception_type and C. If value_type is void, then so must be A; similarly for error_type and B; similarly for exception_type and C.

    + +

    Complexity: Whatever the underlying operator!= have. Constexpr and noexcept of underlying operations is propagated.

    + +

    Guarantees: None.

    + + +

    Last revised: February 01, 2019 at 15:52:57 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/inequality_basic_result.html b/doc/html/reference/types/basic_outcome/inequality_basic_result.html new file mode 100644 index 000000000..08693108a --- /dev/null +++ b/doc/html/reference/types/basic_outcome/inequality_basic_result.html @@ -0,0 +1,29 @@ + + +bool operator!=(const basic_result<A, B, C> &) const - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    bool operator!=(const basic_result<A, B, C> &) const

    +

    Returns true if this outcome does not compare equal to the other result. Comparison is done using operator!= on value_type or error_type if the currently chosen state is the same for both outcome and result, otherwise true is returned. Note that an excepted outcome is always unequal to a result.

    + +

    Requires: operator!= must be a valid expression between value_type and A, and between error_type and B. If value_type is void, then so must be A; similarly for error_type and B.

    + +

    Complexity: Whatever the underlying operator!= have. Constexpr and noexcept of underlying operations is propagated.

    + +

    Guarantees: None.

    + + +

    Last revised: February 01, 2019 at 15:52:57 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/inequality_failure_type.html b/doc/html/reference/types/basic_outcome/inequality_failure_type.html new file mode 100644 index 000000000..5bcdd8d4f --- /dev/null +++ b/doc/html/reference/types/basic_outcome/inequality_failure_type.html @@ -0,0 +1,29 @@ + + +bool operator!=(const failure_type<A, B> &) const - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    bool operator!=(const failure_type<A, B> &) const

    +

    Returns true if this outcome is successful or its error or exception does not compare equal to the error in the failure type sugar. Comparison is done using operator!= on error_type and A and on exception_type and B.

    + +

    Requires: operator!= must be a valid expression between error_type and A, or A is void; operator!= must be a valid expression between exception_type and B, or B is void. If error_type is void, then so must be A; if exception_type is void, then so must be B.

    + +

    Complexity: Whatever the underlying operator!= has. Constexpr and noexcept of underlying operations is propagated.

    + +

    Guarantees: None.

    + + +

    Last revised: January 31, 2019 at 01:07:35 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/inequality_success_type.html b/doc/html/reference/types/basic_outcome/inequality_success_type.html new file mode 100644 index 000000000..37a49566a --- /dev/null +++ b/doc/html/reference/types/basic_outcome/inequality_success_type.html @@ -0,0 +1,30 @@ + + +bool operator==(const success_type<A> &) const - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    bool operator==(const success_type<A> &) const

    +

    Returns true if this result is successful and its value compares equal to the value in the success type sugar. Comparison is done using operator== on value_type and A. If A is void, this call aliases bool has_value() const noexcept +.

    + +

    Requires: operator== must be a valid expression between value_type and A, or A is void. If value_type is void, then so must be A.

    + +

    Complexity: Whatever the underlying operator== has. Constexpr and noexcept of underlying operations is propagated.

    + +

    Guarantees: None.

    + + +

    Last revised: January 31, 2019 at 01:07:35 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/move_assignment.html b/doc/html/reference/types/basic_outcome/move_assignment.html new file mode 100644 index 000000000..427e2eb99 --- /dev/null +++ b/doc/html/reference/types/basic_outcome/move_assignment.html @@ -0,0 +1,29 @@ + + +basic_outcome &operator=(basic_outcome &&) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    basic_outcome &operator=(basic_outcome &&)

    +

    Move assignment.

    + +

    Requires: that value_type, error_type and exception_type all implement move assignment.

    + +

    Complexity: If the value_type for both is present, uses value_type’s move assignment operator, else either destructs or move constructs value_type as appropriate. error_type’s and exception_type’s move assignment operator are always used. Constexpr, triviality and noexcept of underlying operations is propagated.

    + +

    Guarantees: If an exception is thrown during the operation, the object is left in a partially completed state, as per the normal rules for the same operation on a struct.

    + + +

    Last revised: March 03, 2019 at 00:11:47 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/move_constructor.html b/doc/html/reference/types/basic_outcome/move_constructor.html new file mode 100644 index 000000000..f68b711e3 --- /dev/null +++ b/doc/html/reference/types/basic_outcome/move_constructor.html @@ -0,0 +1,29 @@ + + +basic_outcome(basic_outcome &&) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    basic_outcome(basic_outcome &&)

    +

    Move constructor.

    + +

    Requires: that value_type, error_type and exception_type all implement a move constructor.

    + +

    Complexity: Same as for value_type’s, error_type’s and exception_type’s move constructors. Constexpr, triviality and noexcept of underlying operations is propagated.

    + +

    Guarantees: If an exception is thrown during the operation, the object is left in a partially completed state, as per the normal rules for the same operation on a struct.

    + + +

    Last revised: March 03, 2019 at 00:11:47 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/operator_bool.html b/doc/html/reference/types/basic_outcome/operator_bool.html new file mode 100644 index 000000000..010b2dd62 --- /dev/null +++ b/doc/html/reference/types/basic_outcome/operator_bool.html @@ -0,0 +1,30 @@ + + +explicit operator bool() const noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    explicit operator bool() const noexcept

    +

    Returns true if a value is present. Constexpr where possible. Alias for bool has_value() const noexcept +.

    + +

    Requires: Always available.

    + +

    Complexity: Constant time.

    + +

    Guarantees: Never throws an exception.

    + + +

    Last revised: January 31, 2019 at 01:07:35 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/swap.html b/doc/html/reference/types/basic_outcome/swap.html new file mode 100644 index 000000000..8369e0916 --- /dev/null +++ b/doc/html/reference/types/basic_outcome/swap.html @@ -0,0 +1,31 @@ + + +void swap(basic_outcome &) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    void swap(basic_outcome &)

    +

    Swap one basic_outcome with another, with the strong guarantee. Constexpr if move constructors and move assignments of value_type, error_type and exception_type are noexcept.

    + +

    Requires: Always available.

    + +

    Complexity: If the move constructor and move assignment for value_type, error_type and exception_type are noexcept, the complexity is the same as for the swap() implementations of the value_type, error_type and exception_type. Otherwise, complexity is not preserved, as strong_swap(bool &all_good, T &a, T &b) + is used instead of swap(). This function defaults to using one move construction and two assignments, and it will attempt extra move assignments in order to restore the state upon entry if a failure occurs.

    + +

    Guarantees: If an exception is thrown during the swap operation, the state of all three operands on entry is attempted to be restored, in order to implement the strong guarantee. If that too fails, the flag bits are forced to something consistent such that there can be no simultaneously valued and errored/excepted state, or valueless and errorless/exceptionless. The flag has_lost_consistency() + becomes true for both operands, which are now likely in an inconsistent state.

    + + +

    Last revised: June 25, 2019 at 17:01:21 +0100

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/value_lvalue.html b/doc/html/reference/types/basic_outcome/value_lvalue.html new file mode 100644 index 000000000..d820fce71 --- /dev/null +++ b/doc/html/reference/types/basic_outcome/value_lvalue.html @@ -0,0 +1,31 @@ + + +value_type &value() & - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    value_type &value() &

    +

    Wide contract lvalue reference observer of any value present. NoValuePolicy::wide_value_check() is first invoked, then the reference to the value is returned.

    + +

    Note that if value_type is void, only a const overload returning void is present.

    + +

    Requires: Always available.

    + +

    Complexity: Depends on NoValuePolicy::wide_value_check().

    + +

    Guarantees: None.

    + + +

    Last revised: February 12, 2019 at 16:36:24 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/value_lvalue_const.html b/doc/html/reference/types/basic_outcome/value_lvalue_const.html new file mode 100644 index 000000000..79592e944 --- /dev/null +++ b/doc/html/reference/types/basic_outcome/value_lvalue_const.html @@ -0,0 +1,31 @@ + + +const value_type &value() const & - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    const value_type &value() const &

    +

    Wide contract const lvalue reference observer of any value present. NoValuePolicy::wide_value_check() is first invoked, then the reference to the value is returned.

    + +

    Note that if value_type is void, only a const overload returning void is present.

    + +

    Requires: Always available.

    + +

    Complexity: Depends on NoValuePolicy::wide_value_check().

    + +

    Guarantees: None.

    + + +

    Last revised: February 12, 2019 at 16:36:24 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/value_rvalue.html b/doc/html/reference/types/basic_outcome/value_rvalue.html new file mode 100644 index 000000000..a90939ea0 --- /dev/null +++ b/doc/html/reference/types/basic_outcome/value_rvalue.html @@ -0,0 +1,31 @@ + + +value_type &&value() && - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    value_type &&value() &&

    +

    Wide contract rvalue reference observer of any value present. NoValuePolicy::wide_value_check() is first invoked, then the reference to the value is returned.

    + +

    Note that if value_type is void, only a const overload returning void is present.

    + +

    Requires: Always available.

    + +

    Complexity: Depends on NoValuePolicy::wide_value_check().

    + +

    Guarantees: None.

    + + +

    Last revised: February 12, 2019 at 16:36:24 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_outcome/value_rvalue_const.html b/doc/html/reference/types/basic_outcome/value_rvalue_const.html new file mode 100644 index 000000000..2d0b6c2c2 --- /dev/null +++ b/doc/html/reference/types/basic_outcome/value_rvalue_const.html @@ -0,0 +1,31 @@ + + +const value_type &&value() const && - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    const value_type &&value() const &&

    +

    Wide contract const rvalue reference observer of any value present. NoValuePolicy::wide_value_check() is first invoked, then the reference to the value is returned.

    + +

    Note that if value_type is void, only a const overload returning void is present.

    + +

    Requires: Always available.

    + +

    Complexity: Depends on NoValuePolicy::wide_value_check().

    + +

    Guarantees: None.

    + + +

    Last revised: February 12, 2019 at 16:36:24 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_result.html b/doc/html/reference/types/basic_result.html new file mode 100644 index 000000000..7a633dc86 --- /dev/null +++ b/doc/html/reference/types/basic_result.html @@ -0,0 +1,425 @@ + + +basic_result<T, E, NoValuePolicy> - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    + +

    basic_result<T, E, NoValuePolicy>

    + + + +

    A sum type carrying either a T or an E, with NoValuePolicy specifying what to do if one tries to read state which isn’t there, and enabling injection of hooks to trap when lifecycle events occur. Either or both of T and E can be void to indicate no value for that state is present. Note that E = void makes basic result into effectively an optional<T>, but with NoValuePolicy configurable behaviour. Detectable using is_basic_result<T> +.

    + +

    Requires: Concept requirements if C++ 20, else static asserted:

    + + + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE

    + +

    Header: <boost/outcome/basic_result.hpp>

    + +

    Inclusions: The very lightest weight of C and C++ header files:

    + +
      +
    1. <cstdint>
    2. +
    3. <initializer_list>
    4. +
    5. <iosfwd>
    6. +
    7. <new>
    8. +
    9. <type_traits>
    10. +
    11. If BOOST_OUTCOME_USE_STD_IN_PLACE_TYPE + is 1, <utility> (defaults to 1 for C++ 17 or later only)
    12. +
    13. If C++ exceptions disabled and BOOST_OUTCOME_DISABLE_EXECINFO undefined only (used to print stack backtraces on “exception throw”): + +
        +
      1. <sal.h> (Windows only)
      2. +
      3. <stddef.h> (Windows only)
      4. +
      5. <string.h> (Windows only)
      6. +
      7. <execinfo.h> (POSIX only)
      8. +
    14. +
    15. <cstdio>
    16. +
    17. <cstdlib>
    18. +
    19. <cassert>
    20. +
    + +

    This very light weight set of inclusion dependencies makes basic result suitable for use in global header files of very large C++ codebases.

    + +

    Design rationale

    + +

    The basic result type is the main workhorse type of the Outcome library, providing a simple sum type with optional values representing success or disappointment. Unlike + P0323 std::expected<T, E> +, Outcome’s result type is designed specifically for convenience when implementing failure handling across very large codebases, and it has a number of API differences to facilitate that.

    + +

    The first major design difference is that basic result models its constructor design on + std::variant<...> +, rather than modelling + std::optional<T> +’s constructor design like std::expected<T, E> does. This means that basic result will implicitly construct either a T or an E if doing so is unambiguous, same as variant does. Where implicit construction is ambiguous, the implicit constructors disable and a T or E can be specified via in_place_type_t<T> +, or via success_type<T> + or failure_type<T> +. We implement a subset of variant’s constructors for improved compile time impact, so the implicit and explicit constructor design is split into fixed subsets to reduce SFINAE execution.

    + +

    The second major design difference is that union storage is ONLY used when both T and E are trivially copyable or void, otherwise struct storage is used. This is usually not a problem, as it is assumed that sizeof(E) will be small for failure handling. The choice to only use union storage for trivially copyable types only very considerably reduces load on the compiler, and substantially improves compile times in very large C++ 14 codebases, because copies and moves do not need to jump through complex ceremony in order to implement the never-empty guarantees which would be required in a union storage based implementation (C++ 17 onwards does far fewer copy and move constructor instantiations, but it all adds up – work avoided is always the fastest).

    + +

    Public member type aliases

    + +
      +
    • value_type is T.
    • +
    • error_type is E.
    • +
    • no_value_policy_type is NoValuePolicy.
    • +
    • value_type_if_enabled is T if construction from T is available, else it is a usefully named unusable internal type.
    • +
    • error_type_if_enabled is E if construction from E is available, else it is a usefully named unusable internal type.
    • +
    • rebind<A, B = E, C = NoValuePolicy> is basic_result<A, B, C>.
    • +
    + +

    Protected member predicate booleans

    + +
      +
    • predicate::constructors_enabled is constexpr boolean true if decayed value_type and decayed error_type are not the same type.

    • + +
    • predicate::implicit_constructors_enabled is constexpr boolean true if:

      + +
        +
      1. predicate::constructors_enabled is true.
      2. +
      3. Trait is_error_type<E> + is not true for both decayed value_type and decayed error_type at the same time.
      4. +
      5. value_type is not implicitly constructible from error_type and error_type is not implicitly constructible from value_type.
        OR
        trait is_error_type<E> + is true for decayed error_type and error_type is not implicitly constructible from value_type and value_type is an integral type.
      6. +
    • + +
    • predicate::enable_value_converting_constructor<A> is constexpr boolean true if:

      + +
        +
      1. predicate::constructors_enabled is true.
      2. +
      3. Decayed A is not this basic_result type.
      4. +
      5. predicate::implicit_constructors_enabled is true.
      6. +
      7. Decayed A is not an in_place_type_t.
      8. +
      9. Trait is_error_type_enum<E, Enum> + is false for error_type and decayed A.
      10. +
      11. value_type is implicitly constructible from A and error_type is not implicitly constructible from A.
        OR
        value_type is the exact same type as decayed A and value_type is implicitly constructible from A.
      12. +
    • + +
    • predicate::enable_error_converting_constructor<A> is constexpr boolean true if:

      + +
        +
      1. predicate::constructors_enabled is true.
      2. +
      3. Decayed A is not this basic_result type.
      4. +
      5. predicate::implicit_constructors_enabled is true.
      6. +
      7. Decayed A is not an in_place_type_t.
      8. +
      9. Trait is_error_type_enum<E, Enum> + is false for error_type and decayed A.
      10. +
      11. value_type is not implicitly constructible from A and error_type is implicitly constructible from A.
        OR
        error_type is the exact same type as decayed A and error_type is implicitly constructible from A.
      12. +
    • + +
    • predicate::enable_error_condition_converting_constructor<ErrorCondEnum> is constexpr boolean true if:

      + +
        +
      1. predicate::constructors_enabled is true.
      2. +
      3. Decayed ErrorCondEnum is not this basic_result type.
      4. +
      5. Decayed ErrorCondEnum is not an in_place_type_t.
      6. +
      7. Trait is_error_type_enum<E, Enum> + is true for error_type and decayed ErrorCondEnum.
      8. +
    • + +
    • predicate::enable_compatible_conversion<A, B, C> is constexpr boolean true if:

      + +
        +
      1. predicate::constructors_enabled is true.
      2. +
      3. basic_result<A, B, C> is not this basic_result type.
      4. +
      5. A is void OR value_type is explicitly constructible from A.
      6. +
      7. B is void OR error_type is explicitly constructible from B.
      8. +
    • + +
    • predicate::enable_make_error_code_compatible_conversion<A, B, C> is constexpr boolean true if:

      + +
        +
      1. predicate::constructors_enabled is true.
      2. +
      3. basic_result<A, B, C> is not this basic_result type.
      4. +
      5. Trait is_error_code_available<T> + is true for decayed error_type.
      6. +
      7. predicate::enable_compatible_conversion<A, B, C> is not true.
      8. +
      9. A is void OR value_type is explicitly constructible from A.
      10. +
      11. error_type is explicitly constructible from make_error_code(B).
      12. +
    • + +
    • predicate::enable_make_exception_ptr_compatible_conversion<A, B, C> is constexpr boolean true if:

      + +
        +
      1. predicate::constructors_enabled is true.
      2. +
      3. basic_result<A, B, C> is not this basic_result type.
      4. +
      5. Trait is_exception_ptr_available<T> + is true for decayed error_type.
      6. +
      7. predicate::enable_compatible_conversion<A, B, C> is not true.
      8. +
      9. A is void OR value_type is explicitly constructible from A.
      10. +
      11. error_type is explicitly constructible from make_exception_ptr(B).
      12. +
    • + +
    • predicate::enable_inplace_value_constructor<Args...> is constexpr boolean true if:

      + +
        +
      1. predicate::constructors_enabled is true.
      2. +
      3. value_type is void OR value_type is explicitly constructible from Args....
      4. +
    • + +
    • predicate::enable_inplace_error_constructor<Args...> is constexpr boolean true if:

      + +
        +
      1. predicate::constructors_enabled is true.
      2. +
      3. error_type is void OR error_type is explicitly constructible from Args....
      4. +
    • + +
    • predicate::enable_inplace_value_error_constructor<Args...> is constexpr boolean true if:

      + +
        +
      1. predicate::constructors_enabled is true.
      2. +
      3. predicate::implicit_constructors_enabled is true.
      4. +
      5. Either, but not both, of value_type is explicitly constructible from Args... or error_type is explicitly constructible from Args....
      6. +
    • +
    + +

    Summary of standard requirements provided

    + +
      +
    • DefaultConstructible, always deleted to force user to choose valued or errored for every result instanced.
    • +
    • MoveConstructible, if both value_type and error_type implement move constructors.
    • +
    • CopyConstructible, if both value_type and error_type implement copy constructors.
    • +
    • MoveAssignable, if both value_type and error_type implement move constructors and move assignment.
    • +
    • CopyAssignable, if both value_type and error_type implement copy constructors and copy assignment.
    • +
    • Destructible.
    • +
    • Swappable, with the strong rather than weak guarantee. See void swap(basic_result &) + for more information.
    • +
    • TriviallyCopyable, if both value_type and error_type are trivially copyable.
    • +
    • TrivialType, if both value_type and error_type are trivial types.
    • +
    • LiteralType, if both value_type and error_type are literal types.
    • + +
    • StandardLayoutType, if both value_type and error_type are standard layout types. If so, layout of basic_result in C is guaranteed to be one of:

      +
      struct trivially_copyable_result_layout {
      +  union {
      +    value_type value;
      +    error_type error;
      +  };
      +  unsigned int flags;
      +};
      +
      +

      … if both value_type and error_type are TriviallyCopyable, otherwise:

      +
      struct non_trivially_copyable_result_layout {
      +  value_type value;
      +  unsigned int flags;
      +  error_type error;
      +};
      +
      +

      Obviously, all C compatible C++ types are TriviallyCopyable, so if you are passing non-trivially copyable types from C++ to C, you are doing undefined behaviour.

    • + +
    • EqualityComparable, if both value_type and error_type implement equality comparisons with one another.

    • + +
    • LessThanComparable, not implemented due to availability of implicit conversions from value_type and error_type, this can cause major surprise (i.e. hard to diagnose bugs), so we don’t implement these at all.

    • + +
    • Hash, not implemented as a generic implementation of a unique hash for non-valued items which are unequal would require a dependency on RTTI being enabled.

    • +
    + +

    Thus basic_result meets the Regular concept if both value_type and error_type are Regular, except for the lack of a default constructor. Often where one needs a default constructor, wrapping basic_result into + std::optional<T> + will suffice.

    + +

    Public member functions

    + +

    Disabling constructors

    + +
    1. + basic_result(Args...) = delete +

      Disabling catchall constructor used to give useful diagnostic error when trying to use non-inplace constructors when predicate::constructors_enabled is false.

    2. + basic_result(X &&) = delete +

      Disabling implicit constructor used to give useful diagnostic error when trying to use implicit constructors when predicate::implicit_constructors_enabled is false.

    + +

    Copy and move constructors and assignment, and destructor

    + +
    1. + basic_result() = delete +

      The default constructor (disabled).

    2. + basic_result(basic_result &&) +

      Move constructor. Constexpr, triviality and noexcept propagating.

    3. + basic_result(const basic_result &) +

      Copy constructor. Constexpr, triviality and noexcept propagating.

    4. + basic_result &operator=(basic_result &&) +

      Move assignment. Constexpr, triviality and noexcept propagating.

    5. + basic_result &operator=(const basic_result &) +

      Copy assignment. Constexpr, triviality and noexcept propagating.

    6. + ~basic_result() +

      Destructor. Constexpr, triviality and noexcept propagating.

    + +

    Converting constructors

    + +
    1. + basic_result(R &&) +

      Implicit value_type constructor. Available if predicate::enable_value_converting_constructor<R> is true. Constexpr, triviality and noexcept propagating.

    2. + basic_result(S &&) +

      Implicit error_type constructor. Available if predicate::enable_error_converting_constructor<S> is true. Constexpr, triviality and noexcept propagating.

    3. + basic_result(ErrorCondEnum &&) +

      Implicit error_type from ErrorCondEnum constructor. Available if predicate::enable_error_condition_converting_constructor<ErrorCondEnum> is true. Constexpr, triviality and noexcept propagating.

    4. + explicit basic_result(concepts::value_or_error<T, E> &&) +

      Explicit converting constructor from concepts::value_or_error<T, E> concept matching types. Available if convert::value_or_error<> permits it. Constexpr, triviality and noexcept propagating.

    5. + explicit basic_result(const basic_result<R, S, P> &) +

      Explicit converting copy constructor from compatible basic_result. Available if predicate::enable_compatible_conversion<R, S, P> is true. Constexpr, triviality and noexcept propagating.

    6. + explicit basic_result(basic_result<R, S, P> &&) +

      Explicit converting move constructor from compatible basic_result. Available if predicate::enable_compatible_conversion<R, S, P> is true. Constexpr, triviality and noexcept propagating.

    7. + explicit basic_result(const basic_result<R, S, P> &) +

      Explicit converting copy constructor from compatible basic_result. Available if predicate::enable_make_error_code_compatible_conversion<R, S, P> is true. Constexpr, triviality and noexcept propagating.

    8. + explicit basic_result(basic_result<R, S, P> &&) +

      Explicit converting move constructor from compatible basic_result. Available if predicate::enable_make_error_code_compatible_conversion<R, S, P> is true. Constexpr, triviality and noexcept propagating.

    9. + explicit basic_result(const basic_result<R, S, P> &) +

      Explicit converting copy constructor from compatible basic_result. Available if predicate::enable_make_exception_ptr_compatible_conversion<R, S, P> is true. Constexpr, triviality and noexcept propagating.

    10. + explicit basic_result(basic_result<R, S, P> &&) +

      Explicit converting move constructor from compatible basic_result. Available if predicate::enable_make_exception_ptr_compatible_conversion<R, S, P> is true. Constexpr, triviality and noexcept propagating.

    + +

    Inplace constructors

    + +
    1. + explicit basic_result(in_place_type_t<value_type_if_enabled>, Args ...) +

      Explicit inplace value constructor. Available if predicate::enable_inplace_value_constructor<Args ...> is true. Constexpr, triviality and noexcept propagating.

    2. + explicit basic_result(in_place_type_t<value_type_if_enabled>, std::initializer_list<U>, Args ...) +

      Explicit inplace value constructor. Available if predicate::enable_inplace_value_constructor<std::initializer_list<U>, Args ...> is true. Constexpr, triviality and noexcept propagating.

    3. + explicit basic_result(in_place_type_t<error_type_if_enabled>, Args ...) +

      Explicit inplace error constructor. Available if predicate::enable_inplace_error_constructor<Args ...> is true. Constexpr, triviality and noexcept propagating.

    4. + explicit basic_result(in_place_type_t<error_type_if_enabled>, std::initializer_list<U>, Args ...) +

      Explicit inplace error constructor. Available if predicate::enable_inplace_error_constructor<std::initializer_list<U>, Args ...> is true. Constexpr, triviality and noexcept propagating.

    5. + basic_result(A1 &&, A2 &&, Args ...) +

      Implicit inplace value or error constructor. Available if predicate::enable_inplace_value_error_constructor<A1, A2, Args ...> is true. Constexpr, triviality and noexcept propagating.

    + +

    Tagged constructors

    + +
    1. + basic_result(const success_type<T> &) +

      Implicit value-from-success-type-sugar copy constructor. Available if predicate::enable_compatible_conversion<T, void, void> is true, or T is void. Constexpr, triviality and noexcept propagating.

    2. + basic_result(success_type<T> &&) +

      Implicit value-from-success-type-sugar move constructor. Available if predicate::enable_compatible_conversion<T, void, void> is true, or T is void. Constexpr, triviality and noexcept propagating.

    3. + basic_result(const failure_type<T> &) +

      Implicit error-from-failure-type-sugar copy constructor. Available if predicate::enable_compatible_conversion<void, T, void> is true, or T is void. Constexpr, triviality and noexcept propagating.

    4. + basic_result(failure_type<T> &&) +

      Implicit error-from-failure-type-sugar move constructor. Available if predicate::enable_compatible_conversion<void, T, void> is true, or T is void. Constexpr, triviality and noexcept propagating.

    5. + basic_result(const failure_type<T> &) +

      Implicit error-from-failure-type-sugar copy constructor. Available if predicate::enable_make_error_code_compatible_conversion<void, T, void> is true, or T is void. Constexpr, triviality and noexcept propagating.

    6. + basic_result(failure_type<T> &&) +

      Implicit error-from-failure-type-sugar move constructor. Available if predicate::enable_make_error_code_compatible_conversion<void, T, void> is true, or T is void. Constexpr, triviality and noexcept propagating.

    7. + basic_result(const failure_type<T> &) +

      Implicit error-from-failure-type-sugar copy constructor. Available if predicate::enable_make_exception_ptr_compatible_conversion<void, T, void> is true, or T is void. Constexpr, triviality and noexcept propagating.

    8. + basic_result(failure_type<T> &&) +

      Implicit error-from-failure-type-sugar move constructor. Available if predicate::enable_make_exception_ptr_compatible_conversion<void, T, void> is true, or T is void. Constexpr, triviality and noexcept propagating.

    + +

    Observers

    + +
    1. + explicit operator bool() const noexcept +

      Returns true if a value is present. Constexpr, never throws.

    2. + bool has_value() const noexcept +

      Returns true if a value is present. Constexpr, never throws.

    3. + bool has_error() const noexcept +

      Returns true if an error is present. Constexpr, never throws.

    4. + bool has_exception() const noexcept +

      Always returns false for basic_result. Constexpr, never throws.

    5. + bool has_failure() const noexcept +

      Returns true if there is either an error or an exception. Constexpr, never throws.

    6. + bool has_lost_consistency() const noexcept +

      Returns true if a preceding swap involving this object failed to preserve the strong guarantee. Constexpr, never throws.

    7. + value_type &assume_value() & noexcept +

      Narrow contract lvalue reference observer of any value present. Constexpr propagating, never throws.

    8. + const value_type &assume_value() const & noexcept +

      Narrow contract const lvalue reference observer of any value present. Constexpr propagating, never throws.

    9. + value_type &&assume_value() && noexcept +

      Narrow contract rvalue reference observer of any value present. Constexpr propagating, never throws.

    10. + const value_type &&assume_value() const && noexcept +

      Narrow contract const rvalue reference observer of any value present. Constexpr propagating, never throws.

    11. + value_type &value() & +

      Wide contract lvalue reference observer of any value present. Constexpr propagating.

    12. + const value_type &value() const & +

      Wide contract const lvalue reference observer of any value present. Constexpr propagating.

    13. + value_type &&value() && +

      Wide contract rvalue reference observer of any value present. Constexpr propagating.

    14. + const value_type &&value() const && +

      Wide contract const rvalue reference observer of any value present. Constexpr propagating.

    15. + error_type &assume_error() & noexcept +

      Narrow contract lvalue reference observer of the stored error. Constexpr propagating, never throws.

    16. + const error_type &assume_error() const & noexcept +

      Narrow contract const lvalue reference observer of the stored error. Constexpr propagating, never throws.

    17. + error_type &&assume_error() && noexcept +

      Narrow contract rvalue reference observer of the stored error. Constexpr propagating, never throws.

    18. + const error_type &&assume_error() const && noexcept +

      Narrow contract const rvalue reference observer of the stored error. Constexpr propagating, never throws.

    19. + error_type &error() & +

      Wide contract lvalue reference observer of the stored error. Constexpr propagating.

    20. + const error_type &error() const & +

      Wide contract const lvalue reference observer of the stored error. Constexpr propagating.

    21. + error_type &&error() && +

      Wide contract rvalue reference observer of the stored error. Constexpr propagating.

    22. + const error_type &&error() const && +

      Wide contract const rvalue reference observer of the stored error. Constexpr propagating.

    23. + auto as_failure() const & +

      Return the output from free function failure() containing a copy of any errored state.

    + +

    Modifiers

    + +
    1. + void swap(basic_result &) +

      Swap one basic_result with another, with the strong guarantee. Noexcept propagating.

    2. + auto as_failure() && +

      Return the output from free function failure() containing a move of any errored state.

    + +

    Comparisons

    + +

    See above for why LessThanComparable is not implemented.

    + +
    1. + bool operator==(const basic_result<A, B, C> &) const +

      Returns true if this result compares equal to the other result. Constexpr and noexcept propagating.

    2. + bool operator==(const success_type<A> &) const +

      Returns true if this result compares equal to the success type sugar. Constexpr and noexcept propagating.

    3. + bool operator==(const failure_type<A, void> &) const +

      Returns true if this result compares equal to the failure type sugar. Constexpr and noexcept propagating.

    4. + bool operator!=(const basic_result<A, B, C> &) const +

      Returns true if this result does not compare equal to the other result. Constexpr and noexcept propagating.

    5. + bool operator!=(const success_type<A> &) const +

      Returns true if this result does not compare equal to the success type sugar. Constexpr and noexcept propagating.

    6. + bool operator!=(const failure_type<A, void> &) const +

      Returns true if this result does not compare equal to the failure type sugar. Constexpr and noexcept propagating.

    + + + + + + + +

    Last revised: December 17, 2020 at 11:27:06 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_result/as_failure_lvalue.html b/doc/html/reference/types/basic_result/as_failure_lvalue.html new file mode 100644 index 000000000..dd5b15983 --- /dev/null +++ b/doc/html/reference/types/basic_result/as_failure_lvalue.html @@ -0,0 +1,31 @@ + + +auto as_failure() const & - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    auto as_failure() const &

    +

    Return the output from free function auto failure(T &&, ...) + containing a copy of any errored state. The error state is accessed using const error_type &assume_error() const & noexcept +.

    + +

    Requires: Always available.

    + +

    Complexity: Whatever that of error_type’s copy constructor is.

    + +

    Guarantees: None.

    + + +

    Last revised: January 24, 2019 at 01:15:16 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_result/as_failure_rvalue.html b/doc/html/reference/types/basic_result/as_failure_rvalue.html new file mode 100644 index 000000000..07a9a2066 --- /dev/null +++ b/doc/html/reference/types/basic_result/as_failure_rvalue.html @@ -0,0 +1,31 @@ + + +auto as_failure() && - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    auto as_failure() &&

    +

    Return the output from free function auto failure(T &&, ...) + containing a move from any errored state, thus leaving the result’s error value in a moved-from state. Depending on the choice of error_type, this function may therefore be destructive. The error state is accessed using error_type &&assume_error() && noexcept +.

    + +

    Requires: Always available.

    + +

    Complexity: Whatever that of error_type’s move constructor is.

    + +

    Guarantees: None.

    + + +

    Last revised: January 24, 2019 at 01:15:16 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_result/assume_error_lvalue.html b/doc/html/reference/types/basic_result/assume_error_lvalue.html new file mode 100644 index 000000000..7ce38b850 --- /dev/null +++ b/doc/html/reference/types/basic_result/assume_error_lvalue.html @@ -0,0 +1,31 @@ + + +error_type &assume_error() & noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    error_type &assume_error() & noexcept

    +

    Narrow contract lvalue reference observer of the stored error. NoValuePolicy::narrow_error_check() is first invoked, then the reference to the error is returned. As a valid default constructed error is always present, no undefined behaviour occurs unless NoValuePolicy::narrow_error_check() does that.

    + +

    Note that if error_type is void, only a const overload returning void is present.

    + +

    Requires: Always available.

    + +

    Complexity: Depends on NoValuePolicy::narrow_error_check().

    + +

    Guarantees: An exception is never thrown.

    + + +

    Last revised: February 12, 2019 at 16:36:24 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_result/assume_error_lvalue_const.html b/doc/html/reference/types/basic_result/assume_error_lvalue_const.html new file mode 100644 index 000000000..62769f96d --- /dev/null +++ b/doc/html/reference/types/basic_result/assume_error_lvalue_const.html @@ -0,0 +1,31 @@ + + +const error_type &assume_error() const & noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    const error_type &assume_error() const & noexcept

    +

    Narrow contract const lvalue reference observer of the stored error. NoValuePolicy::narrow_error_check() is first invoked, then the reference to the error is returned. As a valid default constructed error is always present, no undefined behaviour occurs unless NoValuePolicy::narrow_error_check() does that.

    + +

    Note that if error_type is void, only a const overload returning void is present.

    + +

    Requires: Always available.

    + +

    Complexity: Depends on NoValuePolicy::narrow_error_check().

    + +

    Guarantees: An exception is never thrown.

    + + +

    Last revised: February 12, 2019 at 16:36:24 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_result/assume_error_rvalue.html b/doc/html/reference/types/basic_result/assume_error_rvalue.html new file mode 100644 index 000000000..72b39e170 --- /dev/null +++ b/doc/html/reference/types/basic_result/assume_error_rvalue.html @@ -0,0 +1,31 @@ + + +error_type &&assume_error() && noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    error_type &&assume_error() && noexcept

    +

    Narrow contract rvalue reference observer of the stored error. NoValuePolicy::narrow_error_check() is first invoked, then the reference to the error is returned. As a valid default constructed error is always present, no undefined behaviour occurs unless NoValuePolicy::narrow_error_check() does that.

    + +

    Note that if error_type is void, only a const overload returning void is present.

    + +

    Requires: Always available.

    + +

    Complexity: Depends on NoValuePolicy::narrow_error_check().

    + +

    Guarantees: An exception is never thrown.

    + + +

    Last revised: February 12, 2019 at 16:36:24 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_result/assume_error_rvalue_const.html b/doc/html/reference/types/basic_result/assume_error_rvalue_const.html new file mode 100644 index 000000000..31d05acfb --- /dev/null +++ b/doc/html/reference/types/basic_result/assume_error_rvalue_const.html @@ -0,0 +1,31 @@ + + +const error_type &&assume_error() const && noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    const error_type &&assume_error() const && noexcept

    +

    Narrow contract const rvalue reference observer of the stored error. NoValuePolicy::narrow_error_check() is first invoked, then the reference to the error is returned. As a valid default constructed error is always present, no undefined behaviour occurs unless NoValuePolicy::narrow_error_check() does that.

    + +

    Note that if error_type is void, only a const overload returning void is present.

    + +

    Requires: Always available.

    + +

    Complexity: Depends on NoValuePolicy::narrow_error_check().

    + +

    Guarantees: An exception is never thrown.

    + + +

    Last revised: February 12, 2019 at 16:36:24 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_result/assume_value_lvalue.html b/doc/html/reference/types/basic_result/assume_value_lvalue.html new file mode 100644 index 000000000..0e42153d3 --- /dev/null +++ b/doc/html/reference/types/basic_result/assume_value_lvalue.html @@ -0,0 +1,31 @@ + + +value_type &assume_value() & noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    value_type &assume_value() & noexcept

    +

    Narrow contract lvalue reference observer of any value present. NoValuePolicy::narrow_value_check() is first invoked, then the reference to the value is returned. The convention is that hard undefined behaviour occurs if no value is actually present, however NoValuePolicy::narrow_value_check() can do something to avoid that.

    + +

    Note that if value_type is void, only a const overload returning void is present.

    + +

    Requires: Always available.

    + +

    Complexity: Depends on NoValuePolicy::narrow_value_check().

    + +

    Guarantees: An exception is never thrown.

    + + +

    Last revised: February 12, 2019 at 16:36:24 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_result/assume_value_lvalue_const.html b/doc/html/reference/types/basic_result/assume_value_lvalue_const.html new file mode 100644 index 000000000..3439715f1 --- /dev/null +++ b/doc/html/reference/types/basic_result/assume_value_lvalue_const.html @@ -0,0 +1,31 @@ + + +const value_type &assume_value() const & noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    const value_type &assume_value() const & noexcept

    +

    Narrow contract const lvalue reference observer of any value present. NoValuePolicy::narrow_value_check() is first invoked, then the reference to the value is returned. The convention is that hard undefined behaviour occurs if no value is actually present, however NoValuePolicy::narrow_value_check() can do something to avoid that.

    + +

    Note that if value_type is void, only a const overload returning void is present.

    + +

    Requires: Always available.

    + +

    Complexity: Depends on NoValuePolicy::narrow_value_check().

    + +

    Guarantees: An exception is never thrown.

    + + +

    Last revised: February 12, 2019 at 16:36:24 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_result/assume_value_rvalue.html b/doc/html/reference/types/basic_result/assume_value_rvalue.html new file mode 100644 index 000000000..890dca5cf --- /dev/null +++ b/doc/html/reference/types/basic_result/assume_value_rvalue.html @@ -0,0 +1,31 @@ + + +value_type &&assume_value() && noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    value_type &&assume_value() && noexcept

    +

    Narrow contract rvalue reference observer of any value present. NoValuePolicy::narrow_value_check() is first invoked, then the reference to the value is returned. The convention is that hard undefined behaviour occurs if no value is actually present, however NoValuePolicy::narrow_value_check() can do something to avoid that.

    + +

    Note that if value_type is void, only a const overload returning void is present.

    + +

    Requires: Always available.

    + +

    Complexity: Depends on NoValuePolicy::narrow_value_check().

    + +

    Guarantees: An exception is never thrown.

    + + +

    Last revised: February 12, 2019 at 16:36:24 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_result/assume_value_rvalue_const.html b/doc/html/reference/types/basic_result/assume_value_rvalue_const.html new file mode 100644 index 000000000..2a5dbfbe6 --- /dev/null +++ b/doc/html/reference/types/basic_result/assume_value_rvalue_const.html @@ -0,0 +1,31 @@ + + +const value_type &&assume_value() const && noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    const value_type &&assume_value() const && noexcept

    +

    Narrow contract const rvalue reference observer of any value present. NoValuePolicy::narrow_value_check() is first invoked, then the reference to the value is returned. The convention is that hard undefined behaviour occurs if no value is actually present, however NoValuePolicy::narrow_value_check() can do something to avoid that.

    + +

    Note that if value_type is void, only a const overload returning void is present.

    + +

    Requires: Always available.

    + +

    Complexity: Depends on NoValuePolicy::narrow_value_check().

    + +

    Guarantees: An exception is never thrown.

    + + +

    Last revised: February 12, 2019 at 16:36:24 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_result/copy_assignment.html b/doc/html/reference/types/basic_result/copy_assignment.html new file mode 100644 index 000000000..66542893d --- /dev/null +++ b/doc/html/reference/types/basic_result/copy_assignment.html @@ -0,0 +1,29 @@ + + +basic_result &operator=(const basic_result &) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    basic_result &operator=(const basic_result &)

    +

    Copy assignment.

    + +

    Requires: that value_type and error_type both implement copy assignment.

    + +

    Complexity: If the value_type for both is present, uses value_type’s copy assignment operator, else either destructs or copy constructs value_type as appropriate. error_type’s copy assignment operator is always used. Constexpr, triviality and noexcept of underlying operations is propagated.

    + +

    Guarantees: If an exception is thrown during the operation, the object is left in a partially completed state, as per the normal rules for the same operation on a struct.

    + + +

    Last revised: March 03, 2019 at 00:11:47 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_result/copy_constructor.html b/doc/html/reference/types/basic_result/copy_constructor.html new file mode 100644 index 000000000..e0f488134 --- /dev/null +++ b/doc/html/reference/types/basic_result/copy_constructor.html @@ -0,0 +1,29 @@ + + +basic_result(const basic_result &) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    basic_result(const basic_result &)

    +

    Copy constructor.

    + +

    Requires: that value_type and error_type both implement a copy constructor.

    + +

    Complexity: Same as for value_type’s and error_type’s copy constructors. Constexpr, triviality and noexcept of underlying operations is propagated.

    + +

    Guarantees: If an exception is thrown during the operation, the object is left in a partially completed state, as per the normal rules for the same operation on a struct.

    + + +

    Last revised: March 03, 2019 at 00:11:47 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_result/default.html b/doc/html/reference/types/basic_result/default.html new file mode 100644 index 000000000..3bc391415 --- /dev/null +++ b/doc/html/reference/types/basic_result/default.html @@ -0,0 +1,23 @@ + + +basic_result() = delete - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    basic_result() = delete

    +

    The default constructor for basic result is always disabled.

    + + +

    Last revised: December 15, 2018 at 17:49:37 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_result/destructor.html b/doc/html/reference/types/basic_result/destructor.html new file mode 100644 index 000000000..82439dd0d --- /dev/null +++ b/doc/html/reference/types/basic_result/destructor.html @@ -0,0 +1,27 @@ + + +~basic_result() - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    ~basic_result()

    +

    Destructor.

    + +

    Requires: Always available.

    + +

    Complexity: Same as for value_type’s and error_type’s destructors. Constexpr, triviality and noexcept of underlying operations is propagated.

    + + +

    Last revised: December 15, 2018 at 17:49:37 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_result/disabling_catchall.html b/doc/html/reference/types/basic_result/disabling_catchall.html new file mode 100644 index 000000000..b1ec74001 --- /dev/null +++ b/doc/html/reference/types/basic_result/disabling_catchall.html @@ -0,0 +1,27 @@ + + +basic_result(Args…) = delete - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    basic_result(Args...) = delete

    +

    Disabling catchall constructor used to give useful diagnostic error when trying to use non-inplace constructors when predicate::constructors_enabled is false.

    + +

    Requires: predicate::constructors_enabled is false.

    + +

    Complexity: N/A.

    + + +

    Last revised: December 15, 2018 at 17:49:37 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_result/disabling_implicit_constructor.html b/doc/html/reference/types/basic_result/disabling_implicit_constructor.html new file mode 100644 index 000000000..a8c6eb268 --- /dev/null +++ b/doc/html/reference/types/basic_result/disabling_implicit_constructor.html @@ -0,0 +1,27 @@ + + +basic_result(X &&) = delete - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    basic_result(X &&) = delete

    +

    Disabling implicit constructor used to give useful diagnostic error when trying to use implicit constructors when predicate::implicit_constructors_enabled is false.

    + +

    Requires: predicate::implicit_constructors_enabled is false.

    + +

    Complexity: N/A.

    + + +

    Last revised: December 15, 2018 at 17:49:37 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_result/equality_basic_result.html b/doc/html/reference/types/basic_result/equality_basic_result.html new file mode 100644 index 000000000..fa5f54f77 --- /dev/null +++ b/doc/html/reference/types/basic_result/equality_basic_result.html @@ -0,0 +1,31 @@ + + +bool operator==(const basic_result<A, B, C> &) const - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    bool operator==(const basic_result<A, B, C> &) const

    +

    Returns true if this result compares equal to the other result. Comparison is done using operator== on either value_type or error_type if the currently chosen state is the same for both results, otherwise false is returned.

    + +

    Requires: operator== must be a valid expression between value_type and A, and between error_type and B. If value_type is void, then so must be A; similarly for error_type and B.

    + +

    Complexity: Whatever the underlying operator== have. Constexpr and noexcept of underlying operations is propagated.

    + +

    Guarantees: None.

    + +

    Free function alias: There is a free function bool operator==(const basic_result<A, B, C> &, const basic_outcome<A, B, C, D> &) which forwards perfectly to this function, by reversing the operands.

    + + +

    Last revised: February 01, 2019 at 15:52:57 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_result/equality_failure_type.html b/doc/html/reference/types/basic_result/equality_failure_type.html new file mode 100644 index 000000000..016b6d4bc --- /dev/null +++ b/doc/html/reference/types/basic_result/equality_failure_type.html @@ -0,0 +1,30 @@ + + +bool operator==(const failure_type<A, void> &) const - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    bool operator==(const failure_type<A, void> &) const

    +

    Returns true if this result is unsuccessful and its error compares equal to the error in the failure type sugar. Comparison is done using operator== on error_type and A. If A is void, this call aliases bool has_error() const noexcept +.

    + +

    Requires: operator== must be a valid expression between error_type and A, or A is void. If error_type is void, then so must be A.

    + +

    Complexity: Whatever the underlying operator== has. Constexpr and noexcept of underlying operations is propagated.

    + +

    Guarantees: None.

    + + +

    Last revised: January 31, 2019 at 01:07:35 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_result/equality_success_type.html b/doc/html/reference/types/basic_result/equality_success_type.html new file mode 100644 index 000000000..7688aaa03 --- /dev/null +++ b/doc/html/reference/types/basic_result/equality_success_type.html @@ -0,0 +1,30 @@ + + +bool operator!=(const success_type<A> &) const - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    bool operator!=(const success_type<A> &) const

    +

    Returns true if this result is not successful or its value does not compares equal to the value in the success type sugar. Comparison is done using operator!= on value_type and A. If A is void, this call aliases bool has_error() const noexcept +.

    + +

    Requires: operator!= must be a valid expression between value_type and A, or A is void. If value_type is void, then so must be A.

    + +

    Complexity: Whatever the underlying operator!= has. Constexpr and noexcept of underlying operations is propagated.

    + +

    Guarantees: None.

    + + +

    Last revised: January 20, 2019 at 16:02:33 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_result/error_lvalue.html b/doc/html/reference/types/basic_result/error_lvalue.html new file mode 100644 index 000000000..64abe0d6d --- /dev/null +++ b/doc/html/reference/types/basic_result/error_lvalue.html @@ -0,0 +1,31 @@ + + +error_type &error() & - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    error_type &error() &

    +

    Wide contract lvalue reference observer of the stored error. NoValuePolicy::wide_error_check() is first invoked, then the reference to the error is returned. As a valid default constructed error is always present, no undefined behaviour occurs if NoValuePolicy::wide_error_check() returns.

    + +

    Note that if error_type is void, only a const overload returning void is present.

    + +

    Requires: Always available.

    + +

    Complexity: Depends on NoValuePolicy::wide_error_check().

    + +

    Guarantees: None.

    + + +

    Last revised: February 12, 2019 at 16:36:24 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_result/error_lvalue_const.html b/doc/html/reference/types/basic_result/error_lvalue_const.html new file mode 100644 index 000000000..486a5e4d4 --- /dev/null +++ b/doc/html/reference/types/basic_result/error_lvalue_const.html @@ -0,0 +1,31 @@ + + +const error_type &error() const & - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    const error_type &error() const &

    +

    Wide contract const lvalue reference observer of the stored error. NoValuePolicy::wide_error_check() is first invoked, then the reference to the error is returned. As a valid default constructed error is always present, no undefined behaviour occurs if NoValuePolicy::wide_error_check() returns.

    + +

    Note that if error_type is void, only a const overload returning void is present.

    + +

    Requires: Always available.

    + +

    Complexity: Depends on NoValuePolicy::wide_error_check().

    + +

    Guarantees: None.

    + + +

    Last revised: February 12, 2019 at 16:36:24 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_result/error_rvalue.html b/doc/html/reference/types/basic_result/error_rvalue.html new file mode 100644 index 000000000..9d92e77da --- /dev/null +++ b/doc/html/reference/types/basic_result/error_rvalue.html @@ -0,0 +1,31 @@ + + +error_type &&error() && - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    error_type &&error() &&

    +

    Wide contract rvalue reference observer of the stored error. NoValuePolicy::wide_error_check() is first invoked, then the reference to the error is returned. As a valid default constructed error is always present, no undefined behaviour occurs if NoValuePolicy::wide_error_check() returns.

    + +

    Note that if error_type is void, only a const overload returning void is present.

    + +

    Requires: Always available.

    + +

    Complexity: Depends on NoValuePolicy::wide_error_check().

    + +

    Guarantees: None.

    + + +

    Last revised: February 12, 2019 at 16:36:24 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_result/error_rvalue_const.html b/doc/html/reference/types/basic_result/error_rvalue_const.html new file mode 100644 index 000000000..e68e5e12f --- /dev/null +++ b/doc/html/reference/types/basic_result/error_rvalue_const.html @@ -0,0 +1,31 @@ + + +const error_type &&error() const && - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    const error_type &&error() const &&

    +

    Wide contract const rvalue reference observer of the stored error. NoValuePolicy::wide_error_check() is first invoked, then the reference to the error is returned. As a valid default constructed error is always present, no undefined behaviour occurs if NoValuePolicy::wide_error_check() returns.

    + +

    Note that if error_type is void, only a const overload returning void is present.

    + +

    Requires: Always available.

    + +

    Complexity: Depends on NoValuePolicy::wide_error_check().

    + +

    Guarantees: None.

    + + +

    Last revised: February 12, 2019 at 16:36:24 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_result/explicit_copy_converting_constructor.html b/doc/html/reference/types/basic_result/explicit_copy_converting_constructor.html new file mode 100644 index 000000000..f02e3d545 --- /dev/null +++ b/doc/html/reference/types/basic_result/explicit_copy_converting_constructor.html @@ -0,0 +1,30 @@ + + +explicit basic_result(const basic_result<R, S, P> &) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    explicit basic_result(const basic_result<R, S, P> &)

    +

    Explicit converting copy constructor from compatible basic_result. Calls void on_result_copy_construction(T *, U &&) noexcept + with this and the input.

    + +

    Requires: predicate::enable_compatible_conversion<R, S, P> is true.

    + +

    Complexity: Same as for the copy constructors of the underlying types. Constexpr, triviality and noexcept of underlying operations is propagated.

    + +

    Guarantees: If an exception is thrown during the operation, the object is left in a partially completed state, as per the normal rules for the same operation on a struct.

    + + +

    Last revised: December 17, 2020 at 11:27:06 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_result/explicit_inplace_error_constructor.html b/doc/html/reference/types/basic_result/explicit_inplace_error_constructor.html new file mode 100644 index 000000000..f1a856a32 --- /dev/null +++ b/doc/html/reference/types/basic_result/explicit_inplace_error_constructor.html @@ -0,0 +1,30 @@ + + +explicit basic_result(in_place_type_t<error_type_if_enabled>, Args …) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    explicit basic_result(in_place_type_t<error_type_if_enabled>, Args ...)

    +

    Explicit inplace error constructor. Calls void on_result_in_place_construction(T *, in_place_type_t<U>, Args &&...) noexcept + with this, in_place_type<error_type> and Args ....

    + +

    Requires: predicate::enable_inplace_error_constructor<Args ...> is true.

    + +

    Complexity: Same as for the error_type constructor which accepts Args .... Constexpr, triviality and noexcept of underlying operations is propagated.

    + +

    Guarantees: If an exception is thrown during the operation, the state of the Args is left indeterminate.

    + + +

    Last revised: December 17, 2020 at 11:27:06 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_result/explicit_inplace_error_constructor_il.html b/doc/html/reference/types/basic_result/explicit_inplace_error_constructor_il.html new file mode 100644 index 000000000..ea398275e --- /dev/null +++ b/doc/html/reference/types/basic_result/explicit_inplace_error_constructor_il.html @@ -0,0 +1,30 @@ + + +explicit basic_result(in_place_type_t<error_type_if_enabled>, std::initializer_list<U>, Args …) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    explicit basic_result(in_place_type_t<error_type_if_enabled>, std::initializer_list<U>, Args ...)

    +

    Explicit inplace error constructor. Calls void on_result_in_place_construction(T *, in_place_type_t<U>, Args &&...) noexcept + with this, in_place_type<error_type>, std::initializer_list<U> and Args ....

    + +

    Requires: predicate::enable_inplace_error_constructor<std::initializer_list<U>, Args ...> is true.

    + +

    Complexity: Same as for the error_type constructor which accepts std::initializer_list<U>, Args .... Constexpr, triviality and noexcept of underlying operations is propagated.

    + +

    Guarantees: If an exception is thrown during the operation, the state of the Args is left indeterminate.

    + + +

    Last revised: December 17, 2020 at 11:27:06 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_result/explicit_inplace_value_constructor.html b/doc/html/reference/types/basic_result/explicit_inplace_value_constructor.html new file mode 100644 index 000000000..b168b9700 --- /dev/null +++ b/doc/html/reference/types/basic_result/explicit_inplace_value_constructor.html @@ -0,0 +1,30 @@ + + +explicit basic_result(in_place_type_t<value_type_if_enabled>, Args …) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    explicit basic_result(in_place_type_t<value_type_if_enabled>, Args ...)

    +

    Explicit inplace value constructor. Calls void on_result_in_place_construction(T *, in_place_type_t<U>, Args &&...) noexcept + with this, in_place_type<value_type> and Args ....

    + +

    Requires: predicate::enable_inplace_value_constructor<Args ...> is true.

    + +

    Complexity: Same as for the value_type constructor which accepts Args .... Constexpr, triviality and noexcept of underlying operations is propagated.

    + +

    Guarantees: If an exception is thrown during the operation, the state of the Args is left indeterminate.

    + + +

    Last revised: December 17, 2020 at 11:27:06 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_result/explicit_inplace_value_constructor_il.html b/doc/html/reference/types/basic_result/explicit_inplace_value_constructor_il.html new file mode 100644 index 000000000..5cea59369 --- /dev/null +++ b/doc/html/reference/types/basic_result/explicit_inplace_value_constructor_il.html @@ -0,0 +1,30 @@ + + +explicit basic_result(in_place_type_t<value_type_if_enabled>, std::initializer_list<U>, Args …) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    explicit basic_result(in_place_type_t<value_type_if_enabled>, std::initializer_list<U>, Args ...)

    +

    Explicit inplace value constructor. Calls void on_result_in_place_construction(T *, in_place_type_t<U>, Args &&...) noexcept + with this, in_place_type<value_type>, ‘std::initializer_list’ and Args ....

    + +

    Requires: predicate::enable_inplace_value_constructor<std::initializer_list<U>, Args ...> is true.

    + +

    Complexity: Same as for the value_type constructor which accepts std::initializer_list<U>, Args .... Constexpr, triviality and noexcept of underlying operations is propagated.

    + +

    Guarantees: If an exception is thrown during the operation, the state of the Args is left indeterminate.

    + + +

    Last revised: December 17, 2020 at 11:27:06 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_result/explicit_make_error_code_copy_converting_constructor.html b/doc/html/reference/types/basic_result/explicit_make_error_code_copy_converting_constructor.html new file mode 100644 index 000000000..475120129 --- /dev/null +++ b/doc/html/reference/types/basic_result/explicit_make_error_code_copy_converting_constructor.html @@ -0,0 +1,30 @@ + + +explicit basic_result(const basic_result<R, S, P> &) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    explicit basic_result(const basic_result<R, S, P> &)

    +

    Explicit converting copy constructor from compatible basic_result. Calls void on_result_copy_construction(T *, U &&) noexcept + with this and the input.

    + +

    Requires: predicate::enable_make_error_code_compatible_conversion<R, S, P> is true.

    + +

    Complexity: Same as for the copy constructors of the underlying types. Constexpr, triviality and noexcept of underlying operations is propagated.

    + +

    Guarantees: If an exception is thrown during the operation, the object is left in a partially completed state, as per the normal rules for the same operation on a struct.

    + + +

    Last revised: December 17, 2020 at 11:27:06 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_result/explicit_make_error_code_move_converting_constructor.html b/doc/html/reference/types/basic_result/explicit_make_error_code_move_converting_constructor.html new file mode 100644 index 000000000..5d0c5a057 --- /dev/null +++ b/doc/html/reference/types/basic_result/explicit_make_error_code_move_converting_constructor.html @@ -0,0 +1,30 @@ + + +explicit basic_result(basic_result<R, S, P> &&) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    explicit basic_result(basic_result<R, S, P> &&)

    +

    Explicit converting move constructor from compatible basic_result. Calls void on_result_move_construction(T *, U &&) noexcept + with this and the input.

    + +

    Requires: predicate::enable_make_error_code_compatible_conversion<R, S, P> is true.

    + +

    Complexity: Same as for the move constructors of the underlying types. Constexpr, triviality and noexcept of underlying operations is propagated.

    + +

    Guarantees: If an exception is thrown during the operation, the object is left in a partially completed state, as per the normal rules for the same operation on a struct.

    + + +

    Last revised: December 17, 2020 at 11:27:06 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_result/explicit_make_exception_ptr_copy_converting_constructor.html b/doc/html/reference/types/basic_result/explicit_make_exception_ptr_copy_converting_constructor.html new file mode 100644 index 000000000..413db1570 --- /dev/null +++ b/doc/html/reference/types/basic_result/explicit_make_exception_ptr_copy_converting_constructor.html @@ -0,0 +1,30 @@ + + +explicit basic_result(const basic_result<R, S, P> &) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    explicit basic_result(const basic_result<R, S, P> &)

    +

    Explicit converting copy constructor from compatible basic_result. Calls void on_result_copy_construction(T *, U &&) noexcept + with this and the input.

    + +

    Requires: predicate::enable_make_exception_ptr_compatible_conversion<R, S, P> is true.

    + +

    Complexity: Same as for the copy constructors of the underlying types. Constexpr, triviality and noexcept of underlying operations is propagated.

    + +

    Guarantees: If an exception is thrown during the operation, the object is left in a partially completed state, as per the normal rules for the same operation on a struct.

    + + +

    Last revised: December 17, 2020 at 11:27:06 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_result/explicit_make_exception_ptr_move_converting_constructor.html b/doc/html/reference/types/basic_result/explicit_make_exception_ptr_move_converting_constructor.html new file mode 100644 index 000000000..231537081 --- /dev/null +++ b/doc/html/reference/types/basic_result/explicit_make_exception_ptr_move_converting_constructor.html @@ -0,0 +1,30 @@ + + +explicit basic_result(basic_result<R, S, P> &&) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    explicit basic_result(basic_result<R, S, P> &&)

    +

    Explicit converting move constructor from compatible basic_result. Calls void on_result_move_construction(T *, U &&) noexcept + with this and the input.

    + +

    Requires: predicate::enable_make_exception_ptr_compatible_conversion<R, S, P> is true.

    + +

    Complexity: Same as for the move constructors of the underlying types. Constexpr, triviality and noexcept of underlying operations is propagated.

    + +

    Guarantees: If an exception is thrown during the operation, the object is left in a partially completed state, as per the normal rules for the same operation on a struct.

    + + +

    Last revised: December 17, 2020 at 11:27:06 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_result/explicit_move_converting_constructor.html b/doc/html/reference/types/basic_result/explicit_move_converting_constructor.html new file mode 100644 index 000000000..f3b92ed04 --- /dev/null +++ b/doc/html/reference/types/basic_result/explicit_move_converting_constructor.html @@ -0,0 +1,30 @@ + + +explicit basic_result(basic_result<R, S, P> &&) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    explicit basic_result(basic_result<R, S, P> &&)

    +

    Explicit converting move constructor from compatible basic_result. Calls void on_result_move_construction(T *, U &&) noexcept + with this and the input.

    + +

    Requires: predicate::enable_compatible_conversion<R, S, P> is true.

    + +

    Complexity: Same as for the move constructors of the underlying types. Constexpr, triviality and noexcept of underlying operations is propagated.

    + +

    Guarantees: If an exception is thrown during the operation, the object is left in a partially completed state, as per the normal rules for the same operation on a struct.

    + + +

    Last revised: December 17, 2020 at 11:27:06 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_result/explicit_valueorerror_converting_constructor.html b/doc/html/reference/types/basic_result/explicit_valueorerror_converting_constructor.html new file mode 100644 index 000000000..2331d65f1 --- /dev/null +++ b/doc/html/reference/types/basic_result/explicit_valueorerror_converting_constructor.html @@ -0,0 +1,31 @@ + + +explicit basic_result(concepts::value_or_error<T, E> &&) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    explicit basic_result(concepts::value_or_error<T, E> &&)

    +

    Explicit converting constructor from concepts::value_or_error<T, E> + concept matching types. Delegates to the basic_result move constructor.

    + +

    Requires: convert::value_or_error<T, U> + has an available call operator, and if the input is a basic_result or basic_outcome, then convert::value_or_error<> has enabled those inputs for that convert::value_or_error<> specialisation.

    + +

    Complexity: Same as for the copy or move constructor from the input’s .value() or .error() respectively. Constexpr, triviality and noexcept of underlying operations is propagated.

    + +

    Guarantees: If an exception is thrown during the operation, the object is left in a partially completed state, as per the normal rules for the same operation on a struct.

    + + +

    Last revised: December 15, 2020 at 12:22:39 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_result/has_error.html b/doc/html/reference/types/basic_result/has_error.html new file mode 100644 index 000000000..aa9f6f772 --- /dev/null +++ b/doc/html/reference/types/basic_result/has_error.html @@ -0,0 +1,29 @@ + + +bool has_error() const noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    bool has_error() const noexcept

    +

    Returns true if an error is present. Constexpr where possible.

    + +

    Requires: Always available.

    + +

    Complexity: Constant time.

    + +

    Guarantees: Never throws an exception.

    + + +

    Last revised: January 20, 2019 at 16:02:33 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_result/has_exception.html b/doc/html/reference/types/basic_result/has_exception.html new file mode 100644 index 000000000..32818ce4b --- /dev/null +++ b/doc/html/reference/types/basic_result/has_exception.html @@ -0,0 +1,29 @@ + + +bool has_exception() const noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    bool has_exception() const noexcept

    +

    Always returns false for basic_result. Constexpr where possible.

    + +

    Requires: Always available.

    + +

    Complexity: Constant time.

    + +

    Guarantees: Never throws an exception.

    + + +

    Last revised: January 20, 2019 at 16:02:33 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_result/has_failure.html b/doc/html/reference/types/basic_result/has_failure.html new file mode 100644 index 000000000..e358ab367 --- /dev/null +++ b/doc/html/reference/types/basic_result/has_failure.html @@ -0,0 +1,29 @@ + + +bool has_failure() const noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    bool has_failure() const noexcept

    +

    Returns true if there is either an error or an exception. Constexpr where possible.

    + +

    Requires: Always available.

    + +

    Complexity: Constant time.

    + +

    Guarantees: Never throws an exception.

    + + +

    Last revised: January 20, 2019 at 16:02:33 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_result/has_lost_consistency.html b/doc/html/reference/types/basic_result/has_lost_consistency.html new file mode 100644 index 000000000..b1c1cb0d7 --- /dev/null +++ b/doc/html/reference/types/basic_result/has_lost_consistency.html @@ -0,0 +1,29 @@ + + +bool has_lost_consistency() const noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    bool has_lost_consistency() const noexcept

    +

    Returns true if a preceding swap involving this object failed to preserve the strong guarantee. Constexpr where possible.

    + +

    Requires: Always available.

    + +

    Complexity: Constant time.

    + +

    Guarantees: Never throws an exception.

    + + +

    Last revised: June 23, 2019 at 16:48:29 +0100

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_result/has_value.html b/doc/html/reference/types/basic_result/has_value.html new file mode 100644 index 000000000..79cd45a4d --- /dev/null +++ b/doc/html/reference/types/basic_result/has_value.html @@ -0,0 +1,30 @@ + + +bool has_value() const noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    bool has_value() const noexcept

    +

    Returns true if a value is present. Constexpr where possible. Alias for explicit operator bool() const noexcept +.

    + +

    Requires: Always available.

    + +

    Complexity: Constant time.

    + +

    Guarantees: Never throws an exception.

    + + +

    Last revised: January 20, 2019 at 16:02:33 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_result/implicit_error_condition_converting_constructor.html b/doc/html/reference/types/basic_result/implicit_error_condition_converting_constructor.html new file mode 100644 index 000000000..b1d100e6e --- /dev/null +++ b/doc/html/reference/types/basic_result/implicit_error_condition_converting_constructor.html @@ -0,0 +1,30 @@ + + +basic_result(ErrorCondEnum &&) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    basic_result(ErrorCondEnum &&)

    +

    Implicit error_type from ErrorCondEnum constructor. Calls void on_result_construction(T *, U &&) noexcept + with this and ErrorCondEnum.

    + +

    Requires: predicate::enable_error_condition_converting_constructor<R> is true.

    + +

    Complexity: Same as for error_type’s copy or move constructor from the result of make_error_code(ErrorCondEnum). Constexpr, triviality and noexcept of underlying operations is propagated.

    + +

    Guarantees: If an exception is thrown during the operation, the state of the input is left indeterminate.

    + + +

    Last revised: December 17, 2020 at 11:27:06 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_result/implicit_error_converting_constructor.html b/doc/html/reference/types/basic_result/implicit_error_converting_constructor.html new file mode 100644 index 000000000..27395115a --- /dev/null +++ b/doc/html/reference/types/basic_result/implicit_error_converting_constructor.html @@ -0,0 +1,28 @@ + + +basic_result(S &&) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    basic_result(S &&)

    +

    Implicit error_type constructor. Calls void on_result_construction(T *, U &&) noexcept + with this and S.

    + +

    Requires: predicate::enable_error_converting_constructor<S> is true.

    + +

    Complexity: Same as for error_type’s copy or move constructor. Constexpr, triviality and noexcept of underlying operations is propagated.

    + + +

    Last revised: December 17, 2020 at 11:27:06 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_result/implicit_failure_copy_constructor.html b/doc/html/reference/types/basic_result/implicit_failure_copy_constructor.html new file mode 100644 index 000000000..8b80e1e4c --- /dev/null +++ b/doc/html/reference/types/basic_result/implicit_failure_copy_constructor.html @@ -0,0 +1,29 @@ + + +basic_result(const failure_type<T> &) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    basic_result(const failure_type<T> &)

    +

    Implicit error-from-failure-type-sugar copy constructor used to disambiguate the construction of the error type. +Note that if T = void, error_type will be default constructed. Calls void on_result_copy_construction(T *, U &&) noexcept + with this and const failure_type<T> &.

    + +

    Requires: predicate::enable_compatible_conversion<void, T, void> is true, or T is void.

    + +

    Complexity: Same as for the error_type constructor which accepts T, or the error_type default constructor if T is void. Constexpr, triviality and noexcept of underlying operations is propagated.

    + + +

    Last revised: December 17, 2020 at 11:27:06 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_result/implicit_failure_make_error_code_copy_constructor.html b/doc/html/reference/types/basic_result/implicit_failure_make_error_code_copy_constructor.html new file mode 100644 index 000000000..f3fa3bde5 --- /dev/null +++ b/doc/html/reference/types/basic_result/implicit_failure_make_error_code_copy_constructor.html @@ -0,0 +1,29 @@ + + +basic_result(const failure_type<T> &) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    basic_result(const failure_type<T> &)

    +

    Implicit error-from-failure-type-sugar copy constructor used to disambiguate the construction of the error type. +Note that if T = void, error_type will be default constructed. Calls void on_result_copy_construction(T *, U &&) noexcept + with this and const failure_type<T> &.

    + +

    Requires: predicate::enable_make_error_code_compatible_conversion<void, T, void> is true, or T is void.

    + +

    Complexity: Same as for the error_type constructor which accepts T, or the error_type default constructor if T is void. Constexpr, triviality and noexcept of underlying operations is propagated.

    + + +

    Last revised: December 17, 2020 at 11:27:06 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_result/implicit_failure_make_error_code_move_constructor.html b/doc/html/reference/types/basic_result/implicit_failure_make_error_code_move_constructor.html new file mode 100644 index 000000000..f8fc1c816 --- /dev/null +++ b/doc/html/reference/types/basic_result/implicit_failure_make_error_code_move_constructor.html @@ -0,0 +1,29 @@ + + +basic_result(failure_type<T> &&) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    basic_result(failure_type<T> &&)

    +

    Implicit error-from-failure-type-sugar move constructor used to disambiguate the construction of the error type. +Note that if T = void, error_type will be default constructed. Calls void on_result_move_construction(T *, U &&) noexcept + with this and failure_type<T> &&.

    + +

    Requires: predicate::enable_make_error_code_compatible_conversion<void, T, void> is true, or T is void.

    + +

    Complexity: Same as for the error_type constructor which accepts T, or the error_type default constructor if T is void. Constexpr, triviality and noexcept of underlying operations is propagated.

    + + +

    Last revised: December 17, 2020 at 11:27:06 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_result/implicit_failure_make_exception_ptr_copy_constructor.html b/doc/html/reference/types/basic_result/implicit_failure_make_exception_ptr_copy_constructor.html new file mode 100644 index 000000000..07c21faa2 --- /dev/null +++ b/doc/html/reference/types/basic_result/implicit_failure_make_exception_ptr_copy_constructor.html @@ -0,0 +1,29 @@ + + +basic_result(const failure_type<T> &) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    basic_result(const failure_type<T> &)

    +

    Implicit error-from-failure-type-sugar copy constructor used to disambiguate the construction of the error type. +Note that if T = void, error_type will be default constructed. Calls void on_result_copy_construction(T *, U &&) noexcept + with this and const failure_type<T> &.

    + +

    Requires: predicate::enable_make_exception_ptr_compatible_conversion<void, T, void> is true, or T is void.

    + +

    Complexity: Same as for the error_type constructor which accepts T, or the error_type default constructor if T is void. Constexpr, triviality and noexcept of underlying operations is propagated.

    + + +

    Last revised: December 17, 2020 at 11:27:06 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_result/implicit_failure_make_exception_ptr_move_constructor.html b/doc/html/reference/types/basic_result/implicit_failure_make_exception_ptr_move_constructor.html new file mode 100644 index 000000000..2c895ac55 --- /dev/null +++ b/doc/html/reference/types/basic_result/implicit_failure_make_exception_ptr_move_constructor.html @@ -0,0 +1,29 @@ + + +basic_result(failure_type<T> &&) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    basic_result(failure_type<T> &&)

    +

    Implicit error-from-failure-type-sugar move constructor used to disambiguate the construction of the error type. +Note that if T = void, error_type will be default constructed. Calls void on_result_move_construction(T *, U &&) noexcept + with this and failure_type<T> &&.

    + +

    Requires: predicate::enable_make_exception_ptr_compatible_conversion<void, T, void> is true, or T is void.

    + +

    Complexity: Same as for the error_type constructor which accepts T, or the error_type default constructor if T is void. Constexpr, triviality and noexcept of underlying operations is propagated.

    + + +

    Last revised: December 17, 2020 at 11:27:06 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_result/implicit_failure_move_constructor.html b/doc/html/reference/types/basic_result/implicit_failure_move_constructor.html new file mode 100644 index 000000000..bf24ee1b7 --- /dev/null +++ b/doc/html/reference/types/basic_result/implicit_failure_move_constructor.html @@ -0,0 +1,29 @@ + + +basic_result(failure_type<T> &&) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    basic_result(failure_type<T> &&)

    +

    Implicit error-from-failure-type-sugar move constructor used to disambiguate the construction of the error type. +Note that if T = void, error_type will be default constructed. Calls void on_result_move_construction(T *, U &&) noexcept + with this and failure_type<T> &&.

    + +

    Requires: predicate::enable_compatible_conversion<void, T, void> is true, or T is void.

    + +

    Complexity: Same as for the error_type constructor which accepts T, or the error_type default constructor if T is void. Constexpr, triviality and noexcept of underlying operations is propagated.

    + + +

    Last revised: December 17, 2020 at 11:27:06 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_result/implicit_inplace_value_error_constructor.html b/doc/html/reference/types/basic_result/implicit_inplace_value_error_constructor.html new file mode 100644 index 000000000..dff0c9967 --- /dev/null +++ b/doc/html/reference/types/basic_result/implicit_inplace_value_error_constructor.html @@ -0,0 +1,29 @@ + + +basic_result(A1 &&, A2 &&, Args …) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    basic_result(A1 &&, A2 &&, Args ...)

    +

    Implicit inplace value or error constructor. Delegates to an appropriate explicit inplace constructor depending on input.

    + +

    Requires: predicate::enable_inplace_value_error_constructor` is true.

    + +

    Complexity: Same as for the value_type or error_type constructor which accepts A1, A2, Args .... Constexpr, triviality and noexcept of underlying operations is propagated.

    + +

    Guarantees: If an exception is thrown during the operation, the state of the Args is left indeterminate.

    + + +

    Last revised: January 17, 2019 at 21:24:36 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_result/implicit_success_copy_constructor.html b/doc/html/reference/types/basic_result/implicit_success_copy_constructor.html new file mode 100644 index 000000000..78f57a09c --- /dev/null +++ b/doc/html/reference/types/basic_result/implicit_success_copy_constructor.html @@ -0,0 +1,29 @@ + + +basic_result(const success_type<T> &) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    basic_result(const success_type<T> &)

    +

    Implicit value-from-success-type-sugar copy constructor used to disambiguate the construction of the value type. +Note that if T = void, value_type will be default constructed. Calls void on_result_copy_construction(T *, U &&) noexcept + with this and const success_type<T> &.

    + +

    Requires: predicate::enable_compatible_conversion<T, void, void> is true, or T is void.

    + +

    Complexity: Same as for the value_type constructor which accepts T, or the value_type default constructor if T is void. Constexpr, triviality and noexcept of underlying operations is propagated.

    + + +

    Last revised: December 17, 2020 at 11:27:06 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_result/implicit_success_move_constructor.html b/doc/html/reference/types/basic_result/implicit_success_move_constructor.html new file mode 100644 index 000000000..81d171d55 --- /dev/null +++ b/doc/html/reference/types/basic_result/implicit_success_move_constructor.html @@ -0,0 +1,29 @@ + + +basic_result(success_type<T> &&) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    basic_result(success_type<T> &&)

    +

    Implicit value-from-success-type-sugar move constructor used to disambiguate the construction of the value type. +Note that if T = void, value_type will be default constructed. Calls void on_result_move_construction(T *, U &&) noexcept + with this and success_type<T> &&.

    + +

    Requires: predicate::enable_compatible_conversion<T, void, void> is true, or T is void.

    + +

    Complexity: Same as for the value_type constructor which accepts T, or the value_type default constructor if T is void. Constexpr, triviality and noexcept of underlying operations is propagated.

    + + +

    Last revised: December 17, 2020 at 11:27:06 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_result/implicit_value_converting_constructor.html b/doc/html/reference/types/basic_result/implicit_value_converting_constructor.html new file mode 100644 index 000000000..4892b6231 --- /dev/null +++ b/doc/html/reference/types/basic_result/implicit_value_converting_constructor.html @@ -0,0 +1,28 @@ + + +basic_result(R &&) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    basic_result(R &&)

    +

    Implicit value_type constructor. Calls void on_result_construction(T *, U &&) noexcept + with this and R.

    + +

    Requires: predicate::enable_value_converting_constructor<R> is true.

    + +

    Complexity: Same as for value_type’s copy or move constructor. Constexpr, triviality and noexcept of underlying operations is propagated.

    + + +

    Last revised: December 17, 2020 at 11:27:06 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_result/inequality_basic_result.html b/doc/html/reference/types/basic_result/inequality_basic_result.html new file mode 100644 index 000000000..fbe1fa0e3 --- /dev/null +++ b/doc/html/reference/types/basic_result/inequality_basic_result.html @@ -0,0 +1,31 @@ + + +bool operator!=(const basic_result<A, B, C> &) const - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    bool operator!=(const basic_result<A, B, C> &) const

    +

    Returns true if this result does not compare equal to the other result. Comparison is done using operator!= on either value_type or error_type if the currently chosen state is the same for both results, otherwise true is returned.

    + +

    Requires: operator!= must be a valid expression between value_type and A, and between error_type and B. If value_type is void, then so must be A; similarly for error_type and B.

    + +

    Complexity: Whatever the underlying operator!= have. Constexpr and noexcept of underlying operations is propagated.

    + +

    Guarantees: None.

    + +

    Free function alias: There is a free function bool operator!=(const basic_result<A, B, C> &, const basic_outcome<A, B, C, D> &) which forwards perfectly to this function, by reversing the operands.

    + + +

    Last revised: February 01, 2019 at 15:52:57 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_result/inequality_failure_type.html b/doc/html/reference/types/basic_result/inequality_failure_type.html new file mode 100644 index 000000000..41518857c --- /dev/null +++ b/doc/html/reference/types/basic_result/inequality_failure_type.html @@ -0,0 +1,30 @@ + + +bool operator!=(const failure_type<A, void> &) const - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    bool operator!=(const failure_type<A, void> &) const

    +

    Returns true if this result is successful or its error does not compare equal to the error in the failure type sugar. Comparison is done using operator!= on error_type and A. If A is void, this call aliases bool has_value() const noexcept +.

    + +

    Requires: operator!= must be a valid expression between error_type and A, or A is void. If error_type is void, then so must be A.

    + +

    Complexity: Whatever the underlying operator!= has. Constexpr and noexcept of underlying operations is propagated.

    + +

    Guarantees: None.

    + + +

    Last revised: January 31, 2019 at 01:07:35 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_result/inequality_success_type.html b/doc/html/reference/types/basic_result/inequality_success_type.html new file mode 100644 index 000000000..c6de639ca --- /dev/null +++ b/doc/html/reference/types/basic_result/inequality_success_type.html @@ -0,0 +1,30 @@ + + +bool operator==(const success_type<A> &) const - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    bool operator==(const success_type<A> &) const

    +

    Returns true if this result is successful and its value compares equal to the value in the success type sugar. Comparison is done using operator== on value_type and A. If A is void, this call aliases bool has_value() const noexcept +.

    + +

    Requires: operator== must be a valid expression between value_type and A, or A is void. If value_type is void, then so must be A.

    + +

    Complexity: Whatever the underlying operator== has. Constexpr and noexcept of underlying operations is propagated.

    + +

    Guarantees: None.

    + + +

    Last revised: January 20, 2019 at 16:02:33 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_result/move_assignment.html b/doc/html/reference/types/basic_result/move_assignment.html new file mode 100644 index 000000000..12ef53a43 --- /dev/null +++ b/doc/html/reference/types/basic_result/move_assignment.html @@ -0,0 +1,29 @@ + + +basic_result &operator=(basic_result &&) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    basic_result &operator=(basic_result &&)

    +

    Move assignment.

    + +

    Requires: that value_type and error_type both implement move assignment.

    + +

    Complexity: If the value_type for both is present, uses value_type’s move assignment operator, else either destructs or move constructs value_type as appropriate. error_type’s move assignment operator is always used. Constexpr, triviality and noexcept of underlying operations is propagated.

    + +

    Guarantees: If an exception is thrown during the operation, the object is left in a partially completed state, as per the normal rules for the same operation on a struct.

    + + +

    Last revised: March 03, 2019 at 00:11:47 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_result/move_constructor.html b/doc/html/reference/types/basic_result/move_constructor.html new file mode 100644 index 000000000..9a40a77fe --- /dev/null +++ b/doc/html/reference/types/basic_result/move_constructor.html @@ -0,0 +1,29 @@ + + +basic_result(basic_result &&) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    basic_result(basic_result &&)

    +

    Move constructor.

    + +

    Requires: that value_type and error_type both implement a move constructor.

    + +

    Complexity: Same as for value_type’s and error_type’s move constructors. Constexpr, triviality and noexcept of underlying operations is propagated.

    + +

    Guarantees: If an exception is thrown during the operation, the object is left in a partially completed state, as per the normal rules for the same operation on a struct.

    + + +

    Last revised: March 03, 2019 at 00:11:47 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_result/operator_bool.html b/doc/html/reference/types/basic_result/operator_bool.html new file mode 100644 index 000000000..cd8deb3d7 --- /dev/null +++ b/doc/html/reference/types/basic_result/operator_bool.html @@ -0,0 +1,30 @@ + + +explicit operator bool() const noexcept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    explicit operator bool() const noexcept

    +

    Returns true if a value is present. Constexpr where possible. Alias for bool has_value() const noexcept +.

    + +

    Requires: Always available.

    + +

    Complexity: Constant time.

    + +

    Guarantees: Never throws an exception.

    + + +

    Last revised: January 20, 2019 at 16:02:33 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_result/swap.html b/doc/html/reference/types/basic_result/swap.html new file mode 100644 index 000000000..0dd943f70 --- /dev/null +++ b/doc/html/reference/types/basic_result/swap.html @@ -0,0 +1,31 @@ + + +void swap(basic_result &) - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    void swap(basic_result &)

    +

    Swap one basic_result with another, with the strong guarantee. Constexpr if move constructors and move assignments of value_type and error_type are noexcept.

    + +

    Requires: Always available.

    + +

    Complexity: If the move constructor and move assignment for value_type and error_type are noexcept, the complexity is the same as for the swap() implementations of the value_type and error_type. Otherwise, complexity is not preserved, as strong_swap(bool &all_good, T &a, T &b) + is used instead of swap(). This function defaults to using one move construction and two assignments, and it will attempt extra move assignments in order to restore the state upon entry if a failure occurs.

    + +

    Guarantees: If an exception is thrown during the swap operation, the state of both operands on entry is attempted to be restored, in order to implement the strong guarantee. If that too fails, the flag bits are forced to something consistent such that there can be no simultaneously valued and errored state, or valueless and errorless. The flag has_lost_consistency() + becomes true for both operands, which are now likely in an inconsistent state.

    + + +

    Last revised: June 25, 2019 at 17:01:21 +0100

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_result/value_lvalue.html b/doc/html/reference/types/basic_result/value_lvalue.html new file mode 100644 index 000000000..4cd23d03c --- /dev/null +++ b/doc/html/reference/types/basic_result/value_lvalue.html @@ -0,0 +1,31 @@ + + +value_type &value() & - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    value_type &value() &

    +

    Wide contract lvalue reference observer of any value present. NoValuePolicy::wide_value_check() is first invoked, then the reference to the value is returned.

    + +

    Note that if value_type is void, only a const overload returning void is present.

    + +

    Requires: Always available.

    + +

    Complexity: Depends on NoValuePolicy::wide_value_check().

    + +

    Guarantees: None.

    + + +

    Last revised: February 12, 2019 at 16:36:24 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_result/value_lvalue_const.html b/doc/html/reference/types/basic_result/value_lvalue_const.html new file mode 100644 index 000000000..9cef05886 --- /dev/null +++ b/doc/html/reference/types/basic_result/value_lvalue_const.html @@ -0,0 +1,31 @@ + + +const value_type &value() const & - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    const value_type &value() const &

    +

    Wide contract const lvalue reference observer of any value present. NoValuePolicy::wide_value_check() is first invoked, then the reference to the value is returned.

    + +

    Note that if value_type is void, only a const overload returning void is present.

    + +

    Requires: Always available.

    + +

    Complexity: Depends on NoValuePolicy::wide_value_check().

    + +

    Guarantees: None.

    + + +

    Last revised: February 12, 2019 at 16:36:24 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_result/value_rvalue.html b/doc/html/reference/types/basic_result/value_rvalue.html new file mode 100644 index 000000000..5a8a65fbb --- /dev/null +++ b/doc/html/reference/types/basic_result/value_rvalue.html @@ -0,0 +1,31 @@ + + +value_type &&value() && - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    value_type &&value() &&

    +

    Wide contract rvalue reference observer of any value present. NoValuePolicy::wide_value_check() is first invoked, then the reference to the value is returned.

    + +

    Note that if value_type is void, only a const overload returning void is present.

    + +

    Requires: Always available.

    + +

    Complexity: Depends on NoValuePolicy::wide_value_check().

    + +

    Guarantees: None.

    + + +

    Last revised: February 12, 2019 at 16:36:24 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/basic_result/value_rvalue_const.html b/doc/html/reference/types/basic_result/value_rvalue_const.html new file mode 100644 index 000000000..674dcd620 --- /dev/null +++ b/doc/html/reference/types/basic_result/value_rvalue_const.html @@ -0,0 +1,31 @@ + + +const value_type &&value() const && - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    const value_type &&value() const &&

    +

    Wide contract const rvalue reference observer of any value present. NoValuePolicy::wide_value_check() is first invoked, then the reference to the value is returned.

    + +

    Note that if value_type is void, only a const overload returning void is present.

    + +

    Requires: Always available.

    + +

    Complexity: Depends on NoValuePolicy::wide_value_check().

    + +

    Guarantees: None.

    + + +

    Last revised: February 12, 2019 at 16:36:24 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/failure_type.html b/doc/html/reference/types/failure_type.html new file mode 100644 index 000000000..af7c3f2d5 --- /dev/null +++ b/doc/html/reference/types/failure_type.html @@ -0,0 +1,45 @@ + + +failure_type<EC, EP = void> - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    failure_type<EC, EP = void>

    +

    Type sugar for constructing an unsuccessful result or outcome. Generally not constructed directly, but via the free function failure(T &&, ...) +. Detectable using is_failure_type<T> +.

    + +

    This is a regular wrapper type, with defaulted default, copy and move constructor, defaulted assignment, and defaulted destructor.

    + +

    Member type aliases error_type and exception_type indicate EC and E.

    + +

    There is an explicit initialising constructor taking any types U and V which will forward construct the contained error_type and exception_type respectively. It also has an optional parameter spare_storage, if you wish to specify a spare storage value.

    + +

    There are two tagged initialising constructors taking in_place_type_t<error_type> or in_place_type_t<exception_type>, and a U which will forward construct the contained error_type and exception_type respectively. These both also have an optional parameter spare_storage, if you wish to specify a spare storage value.

    + +

    There are .error() and .exception() reference observers with the usual constexpr lvalue, const lvalue, rvalue and const rvalue overloads. One can discover which or both of these is valid using the usual .has_error() and .has_exception() observers.

    + +

    There is a .spare_storage() observer which returns the spare storage value with which the failure type sugar was constructed.

    + +

    There are specialisations failure_type<EC, void> and failure_type<void, E> which store nothing for the voided type and do not provide their observer functions.

    + +

    Requires: Nothing.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE

    + +

    Header: <boost/outcome/success_failure.hpp>

    + + +

    Last revised: February 23, 2021 at 17:37:27 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/in_place_type_t.html b/doc/html/reference/types/in_place_type_t.html new file mode 100644 index 000000000..b47518e92 --- /dev/null +++ b/doc/html/reference/types/in_place_type_t.html @@ -0,0 +1,33 @@ + + +in_place_type_t<T> - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    in_place_type_t<T>

    +

    Either std::in_place_type_t<T> or a local emulation, depending on the +BOOST_OUTCOME_USE_STD_IN_PLACE_TYPE + macro.

    + +

    Note that the templated variable in_place_type is also aliased or emulated locally.

    + +

    Requires: Nothing.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE

    + +

    Header: <boost/outcome/config.hpp>

    + + +

    Last revised: January 31, 2019 at 01:07:35 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/reference/types/success_type.html b/doc/html/reference/types/success_type.html new file mode 100644 index 000000000..b78bd3c95 --- /dev/null +++ b/doc/html/reference/types/success_type.html @@ -0,0 +1,43 @@ + + +success_type<T> - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    success_type<T>

    +

    Type sugar for constructing a successful result or outcome. Generally not constructed directly, but via the free function success(T &&, ...) +. Detectable using is_success_type<T> +.

    + +

    This is a regular wrapper type, with defaulted default, copy and move constructor, defaulted assignment, and defaulted destructor.

    + +

    A member type alias value_type indicates T.

    + +

    There is an explicit initialising constructor taking any type U which is not a success_type<T>, and which will forward construct the contained T from that U. It also has an optional parameter spare_storage, if you wish to specify a spare storage value.

    + +

    There is a .value() reference observer with the usual constexpr lvalue, const lvalue, rvalue and const rvalue overloads.

    + +

    There is a specialisation success_type<void> which stores nothing and provides no .value() observers.

    + +

    There is a .spare_storage() observer which returns the spare storage value with which the success type sugar was constructed.

    + +

    Requires: Nothing.

    + +

    Namespace: BOOST_OUTCOME_V2_NAMESPACE

    + +

    Header: <boost/outcome/success_failure.hpp>

    + + +

    Last revised: February 23, 2021 at 17:37:27 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/requirements.html b/doc/html/requirements.html new file mode 100644 index 000000000..68ecb8abf --- /dev/null +++ b/doc/html/requirements.html @@ -0,0 +1,79 @@ + + +Prerequisites - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    + +

    Prerequisites

    +

    Outcome is a header-only C++ 14 library known to work well on the latest +point releases of these compiler-platform combinations or better:

    + +
      +
    • clang 4.0.1 (LLVM) [FreeBSD, Linux, OS X]
    • +
    • GCC 6.5 [Linux]
    • +
    • Visual Studio 2017.9 [Windows]
    • +
    • XCode 9 [MacOS]
    • +
    + +

    For non-Windows non-POSIX platforms (typically embedded systems), Outcome +is usable in its Outcome.Experimental form with the macro BOOST_OUTCOME_SYSTEM_ERROR2_NOT_POSIX +defined.

    + +

    It is worth turning on C++ 17 or C++ 20 if you can, as there are many usability and +performance improvements. Any Concepts TS or Coroutines TS implemented +by your compiler is automatically detected and used.

    + +

    Known compiler issues (this was last updated April 2023):

    + +
      +
    • clang 3.5 - 3.9 can compile varying degrees of the test suite, the +problem is lack of complete and unbuggy C++ 14 language support.

    • + +
    • Older point releases of GCCs 7 and 8 have internal compiler error bugs +in their constexpr implementation which tend to be triggered by using +Outcome in constexpr. If you don’t use Outcome in constexpr, you won’t +see these problems. If you need your GCC to not ICE, upgrade to the +very latest point release, the constexpr ICE has been since fixed.

    • + +
    • Early editions of Visual Studio 2017 have many corner case problems. +From VS2017.9 onwards there remain a number of usually untroublesome corner +case issues, but use should be relatively unsurprising for most use cases. +Be aware that only from Visual Studio 2022 onwards are almost all corner +case problems fixed.

    • + +
    • Some point releases of GCC 10 with libstdc++ 10 can induce an infinite +template instantiation, which fails the build for some rare use cases. Earlier +or later GCCs or different point releases of the 10 series do not have +this issue.

    • +
    + +
    + +

    “C++ 14” compilers which do not work, and will not work until their +maintainers fix them:

    + +
      +
    • GCC 5, due to a bug in nested template variables parsing which was fixed +in GCC 6. I appreciate that this upsets a lot of users. Please raise your +upset at https://gcc.gnu.org/bugzilla/. In the meantime, you can get fairly +far in Outcome with even clang 3.5.
    • +
    • Any compiler which uses the libstdc++ version which comes with GCC 5, as it does +not implement enough of the C++ 14 standard library for Outcome to compile.
    • +
    + + + +

    Last revised: April 18, 2023 at 20:57:50 +0100

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/sitemap.xml b/doc/html/sitemap.xml new file mode 100644 index 000000000..723903b37 --- /dev/null +++ b/doc/html/sitemap.xml @@ -0,0 +1,2285 @@ + + + + + /requirements.html + 2023-04-18T20:57:50+01:00 + + + + /build.html + 2021-04-02T11:06:20+01:00 + + + + /tutorial/essential/before.html + 2020-12-15T12:22:39+00:00 + + + + /tutorial/advanced/interop/problem.html + 2019-02-09T15:18:26+00:00 + + + + /experimental/advantages.html + 2024-07-16T21:33:35+01:00 + + + + /tutorial/advanced/interop/value-or-error.html + 2020-12-15T12:22:39+00:00 + + + + /motivation.html + 2019-06-27T16:00:40+01:00 + + + + /alternatives.html + 2022-01-10T14:29:13+00:00 + + + + /abi-stability.html + 2021-12-15T11:47:12+00:00 + + + + /tutorial/essential/no-value/custom.html + 2019-02-08T22:18:08+00:00 + + + + /experimental/map.html + 2020-12-16T14:14:42+00:00 + + + + /experimental/c-api/from-c/system_code.html + 2024-07-17T17:54:05+01:00 + + + + /tutorial/essential/coroutines/try.html + 2020-04-07T10:22:38+01:00 + + + + /experimental/worked-example-long/preamble.html + 2024-07-16T21:33:35+01:00 + + + + /tutorial/essential.html + 2019-02-08T22:18:08+00:00 + + + + /motivation/exceptions.html + 2019-03-22T13:58:05-07:00 + + + + /experimental/worked-example/implicit-construction.html + 2024-07-16T21:33:35+01:00 + + + + /tutorial/advanced/hooks/keeping_state.html + 2019-02-08T22:18:08+00:00 + + + + /reference/macros.html + 2018-12-10T20:32:00+00:00 + + + + /tutorial/advanced/payload/copy_file.html + 2019-02-08T22:18:08+00:00 + + + + /tutorial/advanced/interop/httplib.html + 2019-02-08T22:18:08+00:00 + + + + /tutorial.html + 2020-12-15T12:22:39+00:00 + + + + /tutorial/advanced/constructors/two-phase-init.html + 2019-02-08T22:18:08+00:00 + + + + /tutorial/essential/result.html + 2021-02-23T17:37:27+00:00 + + + + /alternatives/exceptions.html + 2022-01-10T14:29:13+00:00 + + + + /recipes.html + 2019-02-08T22:18:08+00:00 + + + + /experimental.html + 2020-12-17T11:27:06+00:00 + + + + /tutorial/advanced/interop/tidylib.html + 2019-02-08T22:18:08+00:00 + + + + /tutorial/advanced/constructors/file_handle.html + 2019-02-08T22:18:08+00:00 + + + + /tutorial/advanced/hooks/adl_bridging.html + 2020-12-15T12:22:39+00:00 + + + + /reference.html + 2018-12-10T20:32:00+00:00 + + + + /tutorial/advanced.html + 2019-02-08T22:18:08+00:00 + + + + /tutorial/essential/no-value/builtin.html + 2019-02-09T15:18:26+00:00 + + + + /experimental/c-api/from-cxx.html + 2024-07-16T21:33:35+01:00 + + + + /reference/concepts.html + 2018-12-11T14:56:04+00:00 + + + + /tutorial/essential/coroutines/awaitables.html + 2022-03-18T14:45:32+00:00 + + + + /experimental/c-api/from-c/declare.html + 2024-07-16T21:33:35+01:00 + + + + /experimental/c-api/from-cxx/example.html + 2024-07-16T21:33:35+01:00 + + + + /tutorial/essential/result/inspecting.html + 2019-03-22T15:01:40-07:00 + + + + /experimental/differences.html + 2020-12-16T14:14:42+00:00 + + + + /tutorial/advanced/interop/filelib.html + 2019-02-08T22:18:08+00:00 + + + + /experimental/worked-example-long/value_type.html + 2024-07-16T21:33:35+01:00 + + + + /changelog/upgrade_v21_v22.html + 2021-02-23T17:37:27+00:00 + + + + /tutorial/advanced/payload/copy_file2.html + 2019-02-08T22:18:08+00:00 + + + + /motivation/errno.html + 2019-01-16T01:05:39+01:00 + + + + /tutorial/essential/outcome.html + 2019-03-19T22:57:48+01:00 + + + + /alternatives/error_code.html + 2022-01-10T14:29:13+00:00 + + + + /reference/converters.html + 2018-12-15T17:49:37+00:00 + + + + /tutorial/essential/no-value.html + 2019-02-08T22:18:08+00:00 + + + + /tutorial/advanced/interop/app.html + 2019-02-11T17:14:51+00:00 + + + + /tutorial/advanced/payload/copy_file3.html + 2019-02-08T22:18:08+00:00 + + + + /experimental/c-api/from-c.html + 2024-07-17T17:54:05+01:00 + + + + /experimental/c-api/from-cxx/example2.html + 2024-07-16T21:33:35+01:00 + + + + /tutorial/essential/coroutines.html + 2022-03-18T14:45:32+00:00 + + + + /tutorial/advanced/payload.html + 2019-02-08T22:18:08+00:00 + + + + /motivation/error_codes.html + 2019-01-16T01:05:39+01:00 + + + + /faq.html + 2021-04-20T11:39:35+01:00 + + + + /tutorial/advanced/hooks/hook_result.html + 2020-12-15T12:22:39+00:00 + + + + /reference/functions/hooks.html + 2019-01-22T01:11:40+00:00 + + + + /tutorial/essential/outcome/inspecting.html + 2020-06-19T15:42:26+01:00 + + + + /tutorial/advanced/interop/app-map-httplib1.html + 2019-02-11T13:38:04+00:00 + + + + /tutorial/advanced/constructors/static-constructor.html + 2019-02-08T22:18:08+00:00 + + + + /tutorial/essential/coroutines/returning.html + 2022-03-18T14:45:32+00:00 + + + + /tutorial/essential/result/try.html + 2021-02-12T20:25:43+00:00 + + + + /experimental/worked-example-long/constructor.html + 2024-07-16T21:33:35+01:00 + + + + /reference/traits.html + 2018-12-13T17:36:11+00:00 + + + + /experimental/c-api/from-c/use.html + 2024-07-16T21:33:35+01:00 + + + + /alternatives/expected.html + 2022-01-10T14:29:13+00:00 + + + + /changelog/v22.html + 2021-02-23T17:37:27+00:00 + + + + /reference/functions/iostream.html + 2019-03-03T21:04:29+00:00 + + + + /tutorial/advanced/interop/app-map-httplib2.html + 2020-12-15T12:22:39+00:00 + + + + /tutorial/advanced/hooks/poke_exception.html + 2020-12-15T12:22:39+00:00 + + + + /tutorial/advanced/interop/app-map-filelib.html + 2019-02-11T13:38:04+00:00 + + + + /alternatives/outcome.html + 2022-01-10T14:29:13+00:00 + + + + /tutorial/advanced/constructors/metaprogrammg1.html + 2019-02-08T22:18:08+00:00 + + + + /reference/policies.html + 2018-12-13T21:10:19+00:00 + + + + /reference/functions/policy.html + 2019-01-22T01:11:40+00:00 + + + + /experimental/worked-example-long/string_ref.html + 2024-07-16T21:33:35+01:00 + + + + /experimental/c-api/from-c/try.html + 2024-07-16T21:33:35+01:00 + + + + /tutorial/essential/result/try_greedy.html + 2020-02-03T12:05:24+00:00 + + + + /videos.html + 2018-09-20T09:21:47+01:00 + + + + /tutorial/essential/coroutines/co_await.html + 2020-04-07T10:22:38+01:00 + + + + /experimental/status_result.html + 2020-12-16T14:14:42+00:00 + + + + /motivation/std_error_code.html + 2019-01-16T01:05:39+01:00 + + + + /tutorial/advanced/interop/app-map-tidylib.html + 2019-02-08T22:18:08+00:00 + + + + /tutorial/advanced/constructors.html + 2019-06-24T21:48:18+01:00 + + + + /tutorial/advanced/hooks/hook_outcome.html + 2020-12-15T12:22:39+00:00 + + + + /tutorial/advanced/hooks.html + 2020-09-16T11:58:04+01:00 + + + + /tutorial/advanced/interop/app-go.html + 2020-12-15T12:22:39+00:00 + + + + /alternatives/leaf.html + 2022-01-10T14:29:13+00:00 + + + + /motivation/plug_error_code.html + 2021-09-10T11:56:40+01:00 + + + + /experimental/worked-example-long/message.html + 2024-07-16T21:33:35+01:00 + + + + /tutorial/essential/result/try_ref.html + 2021-02-12T20:25:43+00:00 + + + + /reference/types.html + 2018-12-13T21:10:19+00:00 + + + + /tutorial/advanced/constructors/metaprogrammg2.html + 2019-02-08T22:18:08+00:00 + + + + /tutorial/advanced/interop/conclusion.html + 2020-12-15T12:22:39+00:00 + + + + /motivation/plug_error_code2.html + 2021-09-10T11:56:40+01:00 + + + + /reference/aliases.html + 2018-12-13T21:10:19+00:00 + + + + /tutorial/advanced/constructors/metaprogrammg3.html + 2019-02-08T22:18:08+00:00 + + + + /experimental/worked-example-long/source.html + 2024-07-16T21:33:35+01:00 + + + + /motivation/narrow_contract.html + 2019-04-26T17:43:41+02:00 + + + + /reference/functions.html + 2018-12-13T21:10:19+00:00 + + + + /experimental/worked-example-long/implicit_conversion.html + 2024-07-16T21:33:35+01:00 + + + + /experimental/outcome.html + 2024-07-16T21:33:35+01:00 + + + + /changelog.html + 2024-08-14T18:00:39+01:00 + + + + /tutorial/essential/conventions.html + 2019-02-09T15:18:26+00:00 + + + + /tutorial/advanced/interop.html + 2019-02-08T22:18:08+00:00 + + + + /experimental/worked-example.html + 2024-07-16T21:33:35+01:00 + + + + /experimental/worked-example-long.html + 2024-07-16T21:33:35+01:00 + + + + /history.html + 2021-12-16T11:42:04+00:00 + + + + /experimental/c-api.html + 2019-02-05T17:14:18+00:00 + + + + /reference/types/basic_outcome/default.html + 2019-01-31T01:07:35+00:00 + + + + /reference/types/basic_result/default.html + 2018-12-15T17:49:37+00:00 + + + + /reference/policies/base/ub.html + 2023-12-16T20:51:26+00:00 + + + + /reference/types/basic_outcome/move_constructor.html + 2019-03-03T00:11:47+00:00 + + + + /reference/types/basic_result/move_constructor.html + 2019-03-03T00:11:47+00:00 + + + + /reference/types/basic_outcome/copy_constructor.html + 2019-03-03T00:11:47+00:00 + + + + /reference/types/basic_result/copy_constructor.html + 2019-03-03T00:11:47+00:00 + + + + /reference/types/basic_outcome/move_assignment.html + 2019-03-03T00:11:47+00:00 + + + + /reference/types/basic_result/move_assignment.html + 2019-03-03T00:11:47+00:00 + + + + /reference/types/basic_outcome/copy_assignment.html + 2019-03-03T00:11:47+00:00 + + + + /reference/types/basic_result/copy_assignment.html + 2019-03-03T00:11:47+00:00 + + + + /reference/types/basic_outcome/destructor.html + 2019-01-31T01:07:35+00:00 + + + + /reference/types/basic_result/destructor.html + 2018-12-15T17:49:37+00:00 + + + + /reference/types/basic_outcome/disabling_catchall.html + 2019-01-31T01:07:35+00:00 + + + + /reference/types/basic_result/disabling_catchall.html + 2018-12-15T17:49:37+00:00 + + + + /reference/types/basic_outcome/disabling_implicit_constructor.html + 2019-01-31T01:07:35+00:00 + + + + /reference/types/basic_result/disabling_implicit_constructor.html + 2018-12-15T17:49:37+00:00 + + + + /reference/types/basic_outcome/implicit_value_converting_constructor.html + 2020-12-17T11:27:06+00:00 + + + + /reference/types/basic_result/implicit_value_converting_constructor.html + 2020-12-17T11:27:06+00:00 + + + + /reference/types/basic_outcome/implicit_error_converting_constructor.html + 2020-12-17T11:27:06+00:00 + + + + /reference/types/basic_result/implicit_error_converting_constructor.html + 2020-12-17T11:27:06+00:00 + + + + /reference/types/basic_outcome/implicit_error_condition_converting_constructor.html + 2020-12-17T11:27:06+00:00 + + + + /reference/types/basic_result/implicit_error_condition_converting_constructor.html + 2020-12-17T11:27:06+00:00 + + + + /reference/policies/base/has_value.html + 2019-01-22T01:11:40+00:00 + + + + /reference/types/basic_outcome/implicit_exception_converting_constructor.html + 2020-12-17T11:27:06+00:00 + + + + /reference/types/basic_outcome/implicit_error_exception_converting_constructor.html + 2020-12-17T11:27:06+00:00 + + + + /reference/policies/base/has_error.html + 2019-01-22T01:11:40+00:00 + + + + /reference/policies/base/has_exception.html + 2019-01-22T01:11:40+00:00 + + + + /reference/policies/base/has_error_is_errno.html + 2019-01-22T01:11:40+00:00 + + + + /reference/policies/base/value.html + 2019-01-22T01:11:40+00:00 + + + + /reference/policies/base/error.html + 2019-01-22T01:11:40+00:00 + + + + /reference/policies/base/exception.html + 2019-01-22T01:11:40+00:00 + + + + /reference/types/basic_outcome/explicit_valueorerror_converting_constructor.html + 2020-12-15T12:22:39+00:00 + + + + /reference/types/basic_result/explicit_valueorerror_converting_constructor.html + 2020-12-15T12:22:39+00:00 + + + + /reference/policies/base/set_has_value.html + 2019-01-22T01:11:40+00:00 + + + + /reference/types/basic_outcome/explicit_copy_converting_constructor.html + 2020-12-17T11:27:06+00:00 + + + + /reference/types/basic_result/explicit_copy_converting_constructor.html + 2020-12-17T11:27:06+00:00 + + + + /reference/policies/base/set_has_error.html + 2019-01-22T01:11:40+00:00 + + + + /reference/types/basic_outcome/explicit_move_converting_constructor.html + 2020-12-17T11:27:06+00:00 + + + + /reference/types/basic_result/explicit_move_converting_constructor.html + 2020-12-17T11:27:06+00:00 + + + + /reference/types/basic_result/explicit_make_error_code_copy_converting_constructor.html + 2020-12-17T11:27:06+00:00 + + + + /reference/types/basic_result/explicit_make_error_code_move_converting_constructor.html + 2020-12-17T11:27:06+00:00 + + + + /reference/types/basic_result/explicit_make_exception_ptr_copy_converting_constructor.html + 2020-12-17T11:27:06+00:00 + + + + /reference/types/basic_result/explicit_make_exception_ptr_move_converting_constructor.html + 2020-12-17T11:27:06+00:00 + + + + /reference/types/basic_outcome/explicit_result_copy_converting_constructor.html + 2020-12-17T11:27:06+00:00 + + + + /reference/policies/base/set_has_exception.html + 2019-01-22T01:11:40+00:00 + + + + /reference/types/basic_outcome/explicit_result_move_converting_constructor.html + 2020-12-17T11:27:06+00:00 + + + + /reference/policies/base/set_has_error_is_errno.html + 2019-01-22T01:11:40+00:00 + + + + /reference/types/basic_outcome/explicit_result_make_error_code_copy_converting_constructor.html + 2020-12-17T11:27:06+00:00 + + + + /reference/types/basic_outcome/explicit_result_make_error_code_move_converting_constructor.html + 2020-12-17T11:27:06+00:00 + + + + /reference/types/basic_outcome/explicit_inplace_value_constructor.html + 2020-12-17T11:27:06+00:00 + + + + /reference/types/basic_result/explicit_inplace_value_constructor.html + 2020-12-17T11:27:06+00:00 + + + + /reference/policies/base/narrow_value_check.html + 2019-01-22T01:11:40+00:00 + + + + /reference/types/basic_outcome/explicit_inplace_value_constructor_il.html + 2020-12-17T11:27:06+00:00 + + + + /reference/types/basic_result/explicit_inplace_value_constructor_il.html + 2020-12-17T11:27:06+00:00 + + + + /reference/policies/base/narrow_error_check.html + 2019-01-22T01:11:40+00:00 + + + + /reference/types/basic_outcome/explicit_inplace_error_constructor.html + 2020-12-17T11:27:06+00:00 + + + + /reference/types/basic_result/explicit_inplace_error_constructor.html + 2020-12-17T11:27:06+00:00 + + + + /reference/policies/base/narrow_exception_check.html + 2019-01-22T01:11:40+00:00 + + + + /reference/types/basic_outcome/explicit_inplace_error_constructor_il.html + 2020-12-17T11:27:06+00:00 + + + + /reference/types/basic_result/explicit_inplace_error_constructor_il.html + 2020-12-17T11:27:06+00:00 + + + + /reference/types/basic_outcome/explicit_inplace_exception_constructor.html + 2020-12-17T11:27:06+00:00 + + + + /reference/types/basic_outcome/explicit_inplace_exception_constructor_il.html + 2020-12-17T11:27:06+00:00 + + + + /reference/types/basic_outcome/implicit_inplace_value_error_exception_constructor.html + 2019-01-31T01:07:35+00:00 + + + + /reference/types/basic_result/implicit_inplace_value_error_constructor.html + 2019-01-17T21:24:36+00:00 + + + + /reference/policies/base/on_outcome_construction.html + 2020-12-17T11:27:06+00:00 + + + + /reference/policies/base/on_outcome_construction2.html + 2020-12-17T11:27:06+00:00 + + + + /reference/policies/base/on_outcome_copy_construction.html + 2020-12-17T11:27:06+00:00 + + + + /reference/policies/base/on_outcome_copy_construction2.html + 2020-12-17T11:27:06+00:00 + + + + /reference/policies/base/on_outcome_in_place_construction.html + 2020-12-17T11:27:06+00:00 + + + + /reference/policies/base/on_outcome_move_construction.html + 2020-12-17T11:27:06+00:00 + + + + /reference/policies/base/on_outcome_move_construction2.html + 2020-12-17T11:27:06+00:00 + + + + /reference/policies/base/on_result_construction.html + 2020-12-17T11:27:06+00:00 + + + + /reference/policies/base/on_result_copy_construction.html + 2020-12-17T11:27:06+00:00 + + + + /reference/policies/base/on_result_in_place_construction.html + 2020-12-17T11:27:06+00:00 + + + + /reference/policies/base/on_result_move_construction.html + 2020-12-17T11:27:06+00:00 + + + + /reference/types/basic_outcome/implicit_success_copy_constructor.html + 2020-12-17T11:27:06+00:00 + + + + /reference/types/basic_result/implicit_success_copy_constructor.html + 2020-12-17T11:27:06+00:00 + + + + /reference/types/basic_outcome/implicit_success_move_constructor.html + 2020-12-17T11:27:06+00:00 + + + + /reference/types/basic_result/implicit_success_move_constructor.html + 2020-12-17T11:27:06+00:00 + + + + /reference/types/basic_outcome/implicit_failure_error_copy_constructor.html + 2020-12-17T11:27:06+00:00 + + + + /reference/types/basic_result/implicit_failure_copy_constructor.html + 2020-12-17T11:27:06+00:00 + + + + /reference/types/basic_outcome/implicit_failure_error_move_constructor.html + 2020-12-17T11:27:06+00:00 + + + + /reference/types/basic_result/implicit_failure_move_constructor.html + 2020-12-17T11:27:06+00:00 + + + + /reference/types/basic_outcome/implicit_failure_error_make_error_code_copy_constructor.html + 2020-12-17T11:27:06+00:00 + + + + /reference/types/basic_result/implicit_failure_make_error_code_copy_constructor.html + 2020-12-17T11:27:06+00:00 + + + + /reference/types/basic_outcome/implicit_failure_error_make_error_code_move_constructor.html + 2020-12-17T11:27:06+00:00 + + + + /reference/types/basic_result/implicit_failure_make_error_code_move_constructor.html + 2020-12-17T11:27:06+00:00 + + + + /reference/types/basic_result/implicit_failure_make_exception_ptr_copy_constructor.html + 2020-12-17T11:27:06+00:00 + + + + /reference/types/basic_outcome/implicit_failure_exception_copy_constructor.html + 2020-12-17T11:27:06+00:00 + + + + /reference/types/basic_result/implicit_failure_make_exception_ptr_move_constructor.html + 2020-12-17T11:27:06+00:00 + + + + /reference/types/basic_outcome/implicit_failure_exception_move_constructor.html + 2020-12-17T11:27:06+00:00 + + + + /reference/types/basic_outcome/implicit_failure_error_exception_copy_constructor.html + 2020-12-17T11:27:06+00:00 + + + + /reference/types/basic_outcome/implicit_failure_error_exception_move_constructor.html + 2020-12-17T11:27:06+00:00 + + + + /reference/types/basic_outcome/operator_bool.html + 2019-01-31T01:07:35+00:00 + + + + /reference/types/basic_result/operator_bool.html + 2019-01-20T16:02:33+00:00 + + + + /reference/types/basic_outcome/has_value.html + 2019-01-31T01:07:35+00:00 + + + + /reference/types/basic_result/has_value.html + 2019-01-20T16:02:33+00:00 + + + + /reference/types/basic_outcome/has_error.html + 2019-01-31T01:07:35+00:00 + + + + /reference/types/basic_result/has_error.html + 2019-01-20T16:02:33+00:00 + + + + /reference/types/basic_outcome/has_exception.html + 2019-01-31T01:07:35+00:00 + + + + /reference/types/basic_result/has_exception.html + 2019-01-20T16:02:33+00:00 + + + + /reference/types/basic_outcome/has_failure.html + 2019-01-31T01:07:35+00:00 + + + + /reference/types/basic_result/has_failure.html + 2019-01-20T16:02:33+00:00 + + + + /reference/types/basic_result/has_lost_consistency.html + 2019-06-23T16:48:29+01:00 + + + + /reference/types/basic_outcome/assume_value_lvalue.html + 2019-02-12T16:36:24+00:00 + + + + /reference/types/basic_result/assume_value_lvalue.html + 2019-02-12T16:36:24+00:00 + + + + /reference/types/basic_outcome/assume_value_lvalue_const.html + 2019-02-12T16:36:24+00:00 + + + + /reference/types/basic_result/assume_value_lvalue_const.html + 2019-02-12T16:36:24+00:00 + + + + /reference/types/basic_outcome/assume_value_rvalue.html + 2019-02-12T16:36:24+00:00 + + + + /reference/types/basic_result/assume_value_rvalue.html + 2019-02-12T16:36:24+00:00 + + + + /reference/types/basic_outcome/assume_value_rvalue_const.html + 2019-02-12T16:36:24+00:00 + + + + /reference/types/basic_result/assume_value_rvalue_const.html + 2019-02-12T16:36:24+00:00 + + + + /reference/types/basic_outcome/value_lvalue.html + 2019-02-12T16:36:24+00:00 + + + + /reference/types/basic_result/value_lvalue.html + 2019-02-12T16:36:24+00:00 + + + + /reference/types/basic_outcome/value_lvalue_const.html + 2019-02-12T16:36:24+00:00 + + + + /reference/types/basic_result/value_lvalue_const.html + 2019-02-12T16:36:24+00:00 + + + + /reference/types/basic_outcome/value_rvalue.html + 2019-02-12T16:36:24+00:00 + + + + /reference/types/basic_result/value_rvalue.html + 2019-02-12T16:36:24+00:00 + + + + /reference/types/basic_outcome/value_rvalue_const.html + 2019-02-12T16:36:24+00:00 + + + + /reference/types/basic_result/value_rvalue_const.html + 2019-02-12T16:36:24+00:00 + + + + /reference/types/basic_outcome/assume_error_lvalue.html + 2019-02-12T16:36:24+00:00 + + + + /reference/types/basic_result/assume_error_lvalue.html + 2019-02-12T16:36:24+00:00 + + + + /reference/types/basic_outcome/assume_error_lvalue_const.html + 2019-02-12T16:36:24+00:00 + + + + /reference/types/basic_result/assume_error_lvalue_const.html + 2019-02-12T16:36:24+00:00 + + + + /reference/types/basic_outcome/assume_error_rvalue.html + 2019-02-12T16:36:24+00:00 + + + + /reference/types/basic_result/assume_error_rvalue.html + 2019-02-12T16:36:24+00:00 + + + + /reference/types/basic_outcome/assume_error_rvalue_const.html + 2019-02-12T16:36:24+00:00 + + + + /reference/types/basic_result/assume_error_rvalue_const.html + 2019-02-12T16:36:24+00:00 + + + + /reference/types/basic_outcome/error_lvalue.html + 2019-02-12T16:36:24+00:00 + + + + /reference/types/basic_result/error_lvalue.html + 2019-02-12T16:36:24+00:00 + + + + /reference/types/basic_outcome/error_lvalue_const.html + 2019-02-12T16:36:24+00:00 + + + + /reference/types/basic_result/error_lvalue_const.html + 2019-02-12T16:36:24+00:00 + + + + /reference/types/basic_outcome/error_rvalue.html + 2019-02-12T16:36:24+00:00 + + + + /reference/types/basic_result/error_rvalue.html + 2019-02-12T16:36:24+00:00 + + + + /reference/types/basic_outcome/error_rvalue_const.html + 2019-02-12T16:36:24+00:00 + + + + /reference/types/basic_result/error_rvalue_const.html + 2019-02-12T16:36:24+00:00 + + + + /reference/types/basic_outcome/assume_exception_lvalue.html + 2019-02-12T16:36:24+00:00 + + + + /reference/types/basic_outcome/assume_exception_lvalue_const.html + 2019-02-12T16:36:24+00:00 + + + + /reference/types/basic_outcome/assume_exception_rvalue_const.html + 2019-02-12T16:36:24+00:00 + + + + /reference/types/basic_outcome/assume_exception_rvalue.html + 2019-02-12T16:36:24+00:00 + + + + /reference/types/basic_outcome/exception_lvalue.html + 2019-02-12T16:36:24+00:00 + + + + /reference/types/basic_outcome/exception_lvalue_const.html + 2019-02-12T16:36:24+00:00 + + + + /reference/types/basic_outcome/exception_rvalue.html + 2019-02-12T16:36:24+00:00 + + + + /reference/types/basic_outcome/exception_rvalue_const.html + 2019-02-12T16:36:24+00:00 + + + + /reference/types/basic_outcome/failure.html + 2019-02-05T21:41:47+00:00 + + + + /reference/types/basic_outcome/equality_basic_result.html + 2019-02-01T15:52:57+00:00 + + + + /reference/types/basic_result/equality_basic_result.html + 2019-02-01T15:52:57+00:00 + + + + /reference/types/basic_outcome/equality_basic_outcome.html + 2019-02-01T15:52:57+00:00 + + + + /reference/types/basic_outcome/inequality_success_type.html + 2019-01-31T01:07:35+00:00 + + + + /reference/types/basic_result/inequality_success_type.html + 2019-01-20T16:02:33+00:00 + + + + /reference/types/basic_outcome/equality_failure_type.html + 2019-01-31T01:07:35+00:00 + + + + /reference/types/basic_result/equality_failure_type.html + 2019-01-31T01:07:35+00:00 + + + + /reference/types/basic_result/inequality_basic_result.html + 2019-02-01T15:52:57+00:00 + + + + /reference/types/basic_outcome/inequality_basic_result.html + 2019-02-01T15:52:57+00:00 + + + + /reference/types/basic_outcome/inequality_basic_outcome.html + 2019-02-01T15:52:57+00:00 + + + + /reference/types/basic_outcome/equality_success_type.html + 2019-01-31T01:07:35+00:00 + + + + /reference/types/basic_result/equality_success_type.html + 2019-01-20T16:02:33+00:00 + + + + /reference/types/basic_outcome/inequality_failure_type.html + 2019-01-31T01:07:35+00:00 + + + + /reference/types/basic_result/inequality_failure_type.html + 2019-01-31T01:07:35+00:00 + + + + /reference/types/basic_outcome/swap.html + 2019-06-25T17:01:21+01:00 + + + + /reference/types/basic_result/swap.html + 2019-06-25T17:01:21+01:00 + + + + /reference/types/basic_result/as_failure_lvalue.html + 2019-01-24T01:15:16+00:00 + + + + /reference/types/basic_outcome/as_failure_lvalue.html + 2019-02-01T15:52:57+00:00 + + + + /reference/types/basic_result/as_failure_rvalue.html + 2019-01-24T01:15:16+00:00 + + + + /reference/types/basic_outcome/as_failure_rvalue.html + 2019-02-01T15:52:57+00:00 + + + + /_footer.html + + + + /_header.html + + + + /recipes/asio-integration.html + 2019-08-06T10:42:06+01:00 + + + + /recipes/asio-integration-1-70.html + 2019-08-06T10:42:06+01:00 + + + + /credits.html + 2019-01-25T23:04:27+00:00 + + + + /tags/adl-bridging.html + 2020-12-15T12:22:39+00:00 + 0 + + + + /tags/asio.html + 2019-08-06T10:42:06+01:00 + 0 + + + + /categories/assignment.html + 2019-03-03T00:11:47+00:00 + 0 + + + + /tags/awaitables.html + 2022-03-18T14:45:32+00:00 + 0 + + + + /tags/backtrace.html + 2019-02-08T22:18:08+00:00 + 0 + + + + /tags/best-practice.html + 2019-02-09T15:18:26+00:00 + 0 + + + + /categories.html + 2019-03-03T00:11:47+00:00 + 0 + + + + /tags/co_await.html + 2020-04-07T10:22:38+01:00 + 0 + + + + /categories/comparisons.html + 2019-01-20T16:02:33+00:00 + 0 + + + + /reference/macros/template.html + 2018-12-12T22:01:42+00:00 + + + + /tags/constructors.html + 2019-06-24T21:48:18+01:00 + 0 + + + + /categories/constructors.html + 2020-12-17T11:27:06+00:00 + 0 + + + + /tags/conventions.html + 2019-02-09T15:18:26+00:00 + 0 + + + + /categories/converting-constructors.html + 2020-12-17T11:27:06+00:00 + 0 + + + + /categories/copy-assignment.html + 2019-03-03T00:11:47+00:00 + 0 + + + + /categories/copy-constructors.html + 2019-03-03T00:11:47+00:00 + 0 + + + + /tags/coroutines.html + 2022-03-18T14:45:32+00:00 + 0 + + + + /tags/default-actions.html + 2019-02-08T22:18:08+00:00 + 0 + + + + /categories/default-constructors.html + 2018-12-15T17:49:37+00:00 + 0 + + + + /categories/destructors.html + 2018-12-15T17:49:37+00:00 + 0 + + + + /categories/disabling-constructors.html + 2018-12-15T17:49:37+00:00 + 0 + + + + /tags/dual-api.html + 2019-02-08T22:18:08+00:00 + 0 + + + + /tags/eager.html + 2022-03-18T14:45:32+00:00 + 0 + + + + /tags/error.html + 2019-03-22T15:01:40-07:00 + 0 + + + + /tags/exception.html + 2020-06-19T15:42:26+01:00 + 0 + + + + /categories/explicit-constructors.html + 2020-12-17T11:27:06+00:00 + 0 + + + + /recipes/foreign-try.html + 2020-12-15T12:22:39+00:00 + + + + /tags/has_error_code.html + 2019-02-08T22:18:08+00:00 + 0 + + + + / + 2024-07-16T21:33:35+01:00 + + + + /tags/hooks.html + 2020-09-16T11:58:04+01:00 + 0 + + + + /tags/idioms.html + 2019-02-09T15:18:26+00:00 + 0 + + + + /categories/implicit-constructors.html + 2020-12-17T11:27:06+00:00 + 0 + + + + /categories/inplace-constructors.html + 2020-12-17T11:27:06+00:00 + 0 + + + + /tags/lazy.html + 2022-03-18T14:45:32+00:00 + 0 + + + + /tags/make_error_code.html + 2019-02-08T22:18:08+00:00 + 0 + + + + /categories/modifiers.html + 2019-06-25T17:01:21+01:00 + 0 + + + + /categories/move-assignment.html + 2019-03-03T00:11:47+00:00 + 0 + + + + /categories/move-constructors.html + 2019-03-03T00:11:47+00:00 + 0 + + + + /tags/namespace.html + 2021-02-23T17:37:27+00:00 + 0 + + + + /tags/networking-ts.html + 2019-08-06T10:42:06+01:00 + 0 + + + + /tags/nodiscard.html + 2019-03-22T15:01:40-07:00 + 0 + + + + /categories/observer-policies.html + 2020-12-17T11:27:06+00:00 + 0 + + + + /categories/observers.html + 2019-02-12T16:36:24+00:00 + 0 + + + + /categories/operators.html + 2019-03-03T00:11:47+00:00 + 0 + + + + /tags/outcome.html + 2019-03-19T22:57:48+01:00 + 0 + + + + /tags/payload.html + 2019-02-08T22:18:08+00:00 + 0 + + + + /tags/playpen.html + 2020-12-15T12:22:39+00:00 + 0 + + + + /tags/policies.html + 2019-02-08T22:18:08+00:00 + 0 + + + + /tags/result.html + 2021-02-23T17:37:27+00:00 + 0 + + + + /categories/special.html + 2023-12-16T20:51:26+00:00 + 0 + + + + /categories/tagged-constructors.html + 2020-12-17T11:27:06+00:00 + 0 + + + + /tags.html + 2019-02-09T15:18:26+00:00 + 0 + + + + /tags/try.html + 2021-02-23T17:37:27+00:00 + 0 + + + + /tags/value.html + 2019-03-22T15:01:40-07:00 + 0 + + + + /tags/value-or-error.html + 2020-12-15T12:22:39+00:00 + 0 + + + + /reference/macros/version.html + 2018-12-12T22:01:42+00:00 + + + + /reference/macros/co_try.html + 2021-02-12T20:25:43+00:00 + + + + /reference/macros/co_tryv.html + 2021-02-12T20:25:43+00:00 + + + + /reference/macros/co_tryv2.html + 2021-02-12T20:25:43+00:00 + + + + /reference/macros/co_tryv2_failure_likely.html + 2021-02-12T20:25:43+00:00 + + + + /reference/macros/co_tryv_failure_likely.html + 2021-02-12T20:25:43+00:00 + + + + /reference/macros/co_tryx.html + 2021-02-12T20:25:43+00:00 + + + + /reference/macros/co_tryx_failure_likely.html + 2021-02-12T20:25:43+00:00 + + + + /reference/macros/co_try_failure_likely.html + 2021-02-12T20:25:43+00:00 + + + + /reference/macros/disable_execinfo.html + 2018-12-12T22:01:42+00:00 + + + + /reference/macros/enable_legacy_support_for.html + 2020-05-24T12:48:39+01:00 + + + + /reference/macros/nodiscard.html + 2018-12-12T22:01:42+00:00 + + + + /reference/macros/requires.html + 2018-12-12T22:01:42+00:00 + + + + /reference/macros/symbol_visible.html + 2018-12-12T22:01:42+00:00 + + + + /reference/macros/thread_local.html + 2018-12-12T22:01:42+00:00 + + + + /reference/macros/throw_exception.html + 2018-12-12T22:01:42+00:00 + + + + /reference/macros/try.html + 2021-02-12T20:25:43+00:00 + + + + /reference/macros/tryv.html + 2021-02-12T20:25:43+00:00 + + + + /reference/macros/tryv2.html + 2021-02-12T20:25:43+00:00 + + + + /reference/macros/tryv2_failure_likely.html + 2021-02-12T20:25:43+00:00 + + + + /reference/macros/tryv_failure_likely.html + 2021-02-12T20:25:43+00:00 + + + + /reference/macros/tryx.html + 2021-02-12T20:25:43+00:00 + + + + /reference/macros/tryx_failure_likely.html + 2021-02-12T20:25:43+00:00 + + + + /reference/macros/try_failure_likely.html + 2021-02-12T20:25:43+00:00 + + + + /reference/macros/in_place_type.html + 2019-01-30T16:16:10+00:00 + + + + /reference/macros/is_nothrow_swappable.html + 2019-02-05T17:14:18+00:00 + + + + /reference/policies/all_narrow.html + 2019-01-22T01:11:40+00:00 + + + + /reference/functions/policy/basic_outcome_failure_exception_from_error.html + 2019-02-06T16:50:01+00:00 + + + + /reference/functions/failure.html + 2021-02-23T17:37:27+00:00 + + + + /reference/functions/success.html + 2021-02-23T17:37:27+00:00 + + + + /reference/types/bad_outcome_access.html + 2019-01-25T01:51:37+00:00 + + + + /reference/types/bad_result_access_with.html + 2019-01-25T01:51:37+00:00 + + + + /reference/types/bad_result_access.html + 2019-01-25T01:51:37+00:00 + + + + /reference/policies/base.html + 2019-01-22T01:11:40+00:00 + + + + /reference/types/basic_outcome.html + 2020-12-17T11:27:06+00:00 + + + + /reference/concepts/basic_outcome.html + 2020-05-24T12:48:39+01:00 + + + + /reference/types/basic_result.html + 2020-12-17T11:27:06+00:00 + + + + /reference/concepts/basic_result.html + 2020-05-24T12:48:39+01:00 + + + + /reference/functions/try_operation_has_value.html + 2019-06-20T11:14:48+01:00 + + + + /reference/aliases/boost_checked.html + 2019-01-24T01:15:16+00:00 + + + + /reference/aliases/boost_outcome.html + 2019-02-01T23:42:52+00:00 + + + + /reference/aliases/boost_result.html + 2019-01-24T01:15:16+00:00 + + + + /reference/aliases/boost_unchecked.html + 2019-01-24T01:15:16+00:00 + + + + /reference/aliases/checked.html + 2019-01-24T01:15:16+00:00 + + + + /reference/functions/policy/error_code.html + 2019-02-11T15:13:33+00:00 + + + + /reference/functions/policy/exception_ptr.html + 2019-01-23T01:27:31+00:00 + + + + /reference/functions/try_operation_extract_value.html + 2019-06-20T11:14:48+01:00 + + + + /reference/functions/try_operation_return_as.html + 2019-06-20T11:14:48+01:00 + + + + /reference/aliases/default_policy.html + 2019-02-05T21:41:47+00:00 + + + + /reference/types/awaitables/eager.html + 2022-03-18T14:45:32+00:00 + + + + /reference/policies/error_code_throw_as_system_error_outcome.html + 2019-02-01T23:42:52+00:00 + + + + /reference/policies/error_code_throw_as_system_error_result.html + 2019-02-01T23:42:52+00:00 + + + + /reference/policies/exception_ptr_rethrow_outcome.html + 2019-02-01T23:42:52+00:00 + + + + /reference/policies/exception_ptr_rethrow_result.html + 2019-02-01T23:42:52+00:00 + + + + /reference/policies/fail_to_compile_observers.html + 2019-01-23T01:27:31+00:00 + + + + /reference/types/failure_type.html + 2021-02-23T17:37:27+00:00 + + + + /reference/types/awaitables/generator.html + 2022-03-18T14:45:32+00:00 + + + + /reference/types/in_place_type_t.html + 2019-01-31T01:07:35+00:00 + + + + /reference/traits/is_basic_outcome.html + 2020-05-24T12:48:39+01:00 + + + + /reference/traits/is_basic_result.html + 2020-05-24T12:48:39+01:00 + + + + /reference/traits/is_error_code_available.html + 2019-10-10T18:14:56+01:00 + + + + /reference/traits/is_error_type.html + 2019-10-11T17:03:05+01:00 + + + + /reference/traits/is_error_type_enum.html + 2018-12-13T17:36:11+00:00 + + + + /reference/traits/is_exception_ptr_available.html + 2019-10-10T18:14:56+01:00 + + + + /reference/traits/is_failure_type.html + 2019-01-24T01:15:16+00:00 + + + + /reference/traits/is_move_bitcopying.html + 2020-12-17T11:27:06+00:00 + + + + /reference/traits/is_success_type.html + 2019-01-21T18:00:41+00:00 + + + + /reference/types/awaitables/lazy.html + 2022-03-18T14:45:32+00:00 + + + + /reference/aliases/outcome.html + 2019-02-01T23:42:52+00:00 + + + + /reference/aliases/result.html + 2019-01-24T01:15:16+00:00 + + + + /reference/functions/error_from_exception.html + 2019-02-01T23:42:52+00:00 + + + + /reference/functions/iostream/outcome_operator_in.html + 2019-03-03T21:04:29+00:00 + + + + /reference/functions/iostream/result_operator_in.html + 2019-03-03T21:04:29+00:00 + + + + /reference/functions/iostream/outcome_operator_out.html + 2019-03-03T21:04:29+00:00 + + + + /reference/functions/iostream/result_operator_out.html + 2019-03-03T21:04:29+00:00 + + + + /reference/functions/iostream/outcome_print.html + 2019-03-03T21:04:29+00:00 + + + + /reference/functions/iostream/result_print.html + 2019-03-03T21:04:29+00:00 + + + + /reference/aliases/std_checked.html + 2019-01-23T01:27:31+00:00 + + + + /reference/aliases/std_outcome.html + 2019-02-01T23:42:52+00:00 + + + + /reference/aliases/std_result.html + 2019-01-24T01:15:16+00:00 + + + + /reference/aliases/std_unchecked.html + 2019-01-23T01:27:31+00:00 + + + + /reference/types/success_type.html + 2021-02-23T17:37:27+00:00 + + + + /reference/policies/terminate.html + 2019-01-22T01:11:40+00:00 + + + + /reference/policies/throw_bad_result_access.html + 2019-01-23T01:27:31+00:00 + + + + /reference/traits/type_can_be_used_in_basic_result.html + 2019-01-24T01:15:16+00:00 + + + + /reference/functions/hooks/spare_storage.html + 2019-01-21T18:00:41+00:00 + + + + /reference/aliases/unchecked.html + 2019-01-24T01:15:16+00:00 + + + + /reference/converters/value_or_error.html + 2020-12-15T12:22:39+00:00 + + + + /reference/concepts/value_or_error.html + 2020-08-19T12:15:40+01:00 + + + + /reference/concepts/value_or_none.html + 2020-12-15T12:22:39+00:00 + + + + /reference/functions/hooks/hook_outcome_construction.html + 2020-08-19T12:15:40+01:00 + + + + /reference/functions/hooks/hook_outcome_construction2.html + 2020-08-19T12:15:40+01:00 + + + + /reference/functions/hooks/hook_outcome_copy_construction.html + 2020-08-19T12:15:40+01:00 + + + + /reference/functions/hooks/hook_outcome_copy_construction2.html + 2020-08-19T12:15:40+01:00 + + + + /reference/functions/hooks/hook_outcome_in_place_construction.html + 2020-08-19T12:15:40+01:00 + + + + /reference/functions/hooks/hook_outcome_move_construction.html + 2020-08-19T12:15:40+01:00 + + + + /reference/functions/hooks/hook_outcome_move_construction2.html + 2020-08-19T12:15:40+01:00 + + + + /reference/functions/hooks/hook_result_construction.html + 2020-08-19T12:15:40+01:00 + + + + /reference/functions/hooks/hook_result_copy_construction.html + 2020-08-19T12:15:40+01:00 + + + + /reference/functions/hooks/hook_result_in_place_construction.html + 2020-08-19T12:15:40+01:00 + + + + /reference/functions/hooks/hook_result_move_construction.html + 2020-08-19T12:15:40+01:00 + + + + /reference/functions/policy/outcome_throw_as_system_error_with_payload_boost_enum.html + 2019-08-13T13:55:04-04:00 + + + + /reference/functions/policy/outcome_throw_as_system_error_with_payload_std_enum.html + 2019-02-01T15:52:57+00:00 + + + + /reference/functions/policy/outcome_throw_as_system_error_with_payload_boost_error_code.html + 2019-01-24T01:15:16+00:00 + + + + /reference/functions/policy/outcome_throw_as_system_error_with_payload_std_error_code.html + 2019-02-01T15:52:57+00:00 + + + + /reference/functions/hooks/override_outcome_exception.html + 2019-01-30T16:16:10+00:00 + + + + /reference/functions/hooks/set_spare_storage.html + 2019-01-21T18:00:41+00:00 + + + + /reference/functions/strong_swap.html + 2019-06-24T21:09:37+01:00 + + + + /reference/functions/try_throw_std_exception_from_error.html + 2019-02-01T23:42:52+00:00 + + + \ No newline at end of file diff --git a/doc/html/tags.html b/doc/html/tags.html new file mode 100644 index 000000000..c185f7890 --- /dev/null +++ b/doc/html/tags.html @@ -0,0 +1,67 @@ + + +Tags - Boost.Outcome documentation + + + + + +
    + + HomeNext
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + +

    Last revised: February 09, 2019 at 15:18:26 UTC

    +
    +
    +Prev + + HomeNext
    + diff --git a/doc/html/tags/adl-bridging.html b/doc/html/tags/adl-bridging.html new file mode 100644 index 000000000..15b1b87c1 --- /dev/null +++ b/doc/html/tags/adl-bridging.html @@ -0,0 +1,45 @@ + + +Adl Bridging - Boost.Outcome documentation + + + + + +
    + + HomeNext
    + + + +
    + + +
    + + + + + +
    + + + + + + +

    Last revised: December 15, 2020 at 12:22:39 UTC

    +
    +
    +Prev + + HomeNext
    + diff --git a/doc/html/tags/adl-bridging/page/1.html b/doc/html/tags/adl-bridging/page/1.html new file mode 100644 index 000000000..36470a68e --- /dev/null +++ b/doc/html/tags/adl-bridging/page/1.html @@ -0,0 +1 @@ +/tags/adl-bridging.html \ No newline at end of file diff --git a/doc/html/tags/asio.html b/doc/html/tags/asio.html new file mode 100644 index 000000000..0fccf0a80 --- /dev/null +++ b/doc/html/tags/asio.html @@ -0,0 +1,47 @@ + + +Asio - Boost.Outcome documentation + + + + + +
    + + HomeNext
    + + + +
    + + +
    + + + + + + + +
    + + + + + + +

    Last revised: August 06, 2019 at 10:42:06 +0100

    +
    +
    +Prev + + HomeNext
    + diff --git a/doc/html/tags/asio/page/1.html b/doc/html/tags/asio/page/1.html new file mode 100644 index 000000000..b757d3d56 --- /dev/null +++ b/doc/html/tags/asio/page/1.html @@ -0,0 +1 @@ +/tags/asio.html \ No newline at end of file diff --git a/doc/html/tags/awaitables.html b/doc/html/tags/awaitables.html new file mode 100644 index 000000000..6c536ec27 --- /dev/null +++ b/doc/html/tags/awaitables.html @@ -0,0 +1,45 @@ + + +Awaitables - Boost.Outcome documentation + + + + + +
    + + HomeNext
    + + + +
    + + +
    + + + + + +
    + + + + + + +

    Last revised: March 18, 2022 at 14:45:32 UTC

    +
    +
    +Prev + + HomeNext
    + diff --git a/doc/html/tags/awaitables/page/1.html b/doc/html/tags/awaitables/page/1.html new file mode 100644 index 000000000..d31edf1f8 --- /dev/null +++ b/doc/html/tags/awaitables/page/1.html @@ -0,0 +1 @@ +/tags/awaitables.html \ No newline at end of file diff --git a/doc/html/tags/backtrace.html b/doc/html/tags/backtrace.html new file mode 100644 index 000000000..c1dcfe4c2 --- /dev/null +++ b/doc/html/tags/backtrace.html @@ -0,0 +1,45 @@ + + +Backtrace - Boost.Outcome documentation + + + + + +
    + + HomeNext
    + + + +
    + + +
    + + + + + +
    + + + + + + +

    Last revised: February 08, 2019 at 22:18:08 UTC

    +
    +
    +Prev + + HomeNext
    + diff --git a/doc/html/tags/backtrace/page/1.html b/doc/html/tags/backtrace/page/1.html new file mode 100644 index 000000000..6972982c8 --- /dev/null +++ b/doc/html/tags/backtrace/page/1.html @@ -0,0 +1 @@ +/tags/backtrace.html \ No newline at end of file diff --git a/doc/html/tags/best-practice.html b/doc/html/tags/best-practice.html new file mode 100644 index 000000000..dfe0d56c4 --- /dev/null +++ b/doc/html/tags/best-practice.html @@ -0,0 +1,45 @@ + + +Best Practice - Boost.Outcome documentation + + + + + +
    + + HomeNext
    + + + +
    + + +
    + + + + + +
    + + + + + + +

    Last revised: February 09, 2019 at 15:18:26 UTC

    +
    +
    +Prev + + HomeNext
    + diff --git a/doc/html/tags/best-practice/page/1.html b/doc/html/tags/best-practice/page/1.html new file mode 100644 index 000000000..489c8b395 --- /dev/null +++ b/doc/html/tags/best-practice/page/1.html @@ -0,0 +1 @@ +/tags/best-practice.html \ No newline at end of file diff --git a/doc/html/tags/co_await.html b/doc/html/tags/co_await.html new file mode 100644 index 000000000..820917235 --- /dev/null +++ b/doc/html/tags/co_await.html @@ -0,0 +1,45 @@ + + +Co_await - Boost.Outcome documentation + + + + + +
    + + HomeNext
    + + + +
    + + +
    + + + + + +
    + + + + + + +

    Last revised: April 07, 2020 at 10:22:38 +0100

    +
    +
    +Prev + + HomeNext
    + diff --git a/doc/html/tags/co_await/page/1.html b/doc/html/tags/co_await/page/1.html new file mode 100644 index 000000000..c726aec3d --- /dev/null +++ b/doc/html/tags/co_await/page/1.html @@ -0,0 +1 @@ +/tags/co_await.html \ No newline at end of file diff --git a/doc/html/tags/constructors.html b/doc/html/tags/constructors.html new file mode 100644 index 000000000..f150cbc5b --- /dev/null +++ b/doc/html/tags/constructors.html @@ -0,0 +1,45 @@ + + +Constructors - Boost.Outcome documentation + + + + + +
    + + HomeNext
    + + + +
    + + +
    + + + + + +
    + + + + + + +

    Last revised: June 24, 2019 at 21:48:18 +0100

    +
    +
    +Prev + + HomeNext
    + diff --git a/doc/html/tags/constructors/page/1.html b/doc/html/tags/constructors/page/1.html new file mode 100644 index 000000000..d30baea4a --- /dev/null +++ b/doc/html/tags/constructors/page/1.html @@ -0,0 +1 @@ +/tags/constructors.html \ No newline at end of file diff --git a/doc/html/tags/conventions.html b/doc/html/tags/conventions.html new file mode 100644 index 000000000..5eaf5e0a4 --- /dev/null +++ b/doc/html/tags/conventions.html @@ -0,0 +1,45 @@ + + +Conventions - Boost.Outcome documentation + + + + + +
    + + HomeNext
    + + + +
    + + +
    + + + + + +
    + + + + + + +

    Last revised: February 09, 2019 at 15:18:26 UTC

    +
    +
    +Prev + + HomeNext
    + diff --git a/doc/html/tags/conventions/page/1.html b/doc/html/tags/conventions/page/1.html new file mode 100644 index 000000000..b58cf4362 --- /dev/null +++ b/doc/html/tags/conventions/page/1.html @@ -0,0 +1 @@ +/tags/conventions.html \ No newline at end of file diff --git a/doc/html/tags/coroutines.html b/doc/html/tags/coroutines.html new file mode 100644 index 000000000..4f8c46227 --- /dev/null +++ b/doc/html/tags/coroutines.html @@ -0,0 +1,53 @@ + + +Coroutines - Boost.Outcome documentation + + + + + +
    + + HomeNext
    + + + +
    + + +
    + + + + + + + + + + + + + +
    + + + + + + +

    Last revised: March 18, 2022 at 14:45:32 UTC

    +
    +
    +Prev + + HomeNext
    + diff --git a/doc/html/tags/coroutines/page/1.html b/doc/html/tags/coroutines/page/1.html new file mode 100644 index 000000000..22bb2b57d --- /dev/null +++ b/doc/html/tags/coroutines/page/1.html @@ -0,0 +1 @@ +/tags/coroutines.html \ No newline at end of file diff --git a/doc/html/tags/default-actions.html b/doc/html/tags/default-actions.html new file mode 100644 index 000000000..492e2932d --- /dev/null +++ b/doc/html/tags/default-actions.html @@ -0,0 +1,45 @@ + + +Default Actions - Boost.Outcome documentation + + + + + +
    + + HomeNext
    + + + +
    + + +
    + + + + + +
    + + + + + + +

    Last revised: February 08, 2019 at 22:18:08 UTC

    +
    +
    +Prev + + HomeNext
    + diff --git a/doc/html/tags/default-actions/page/1.html b/doc/html/tags/default-actions/page/1.html new file mode 100644 index 000000000..86bd8d15e --- /dev/null +++ b/doc/html/tags/default-actions/page/1.html @@ -0,0 +1 @@ +/tags/default-actions.html \ No newline at end of file diff --git a/doc/html/tags/dual-api.html b/doc/html/tags/dual-api.html new file mode 100644 index 000000000..76fd71c2d --- /dev/null +++ b/doc/html/tags/dual-api.html @@ -0,0 +1,45 @@ + + +Dual Api - Boost.Outcome documentation + + + + + +
    + + HomeNext
    + + + +
    + + +
    + + + + + +
    + + + + + + +

    Last revised: February 08, 2019 at 22:18:08 UTC

    +
    +
    +Prev + + HomeNext
    + diff --git a/doc/html/tags/dual-api/page/1.html b/doc/html/tags/dual-api/page/1.html new file mode 100644 index 000000000..bef90479f --- /dev/null +++ b/doc/html/tags/dual-api/page/1.html @@ -0,0 +1 @@ +/tags/dual-api.html \ No newline at end of file diff --git a/doc/html/tags/eager.html b/doc/html/tags/eager.html new file mode 100644 index 000000000..126822b41 --- /dev/null +++ b/doc/html/tags/eager.html @@ -0,0 +1,45 @@ + + +Eager - Boost.Outcome documentation + + + + + +
    + + HomeNext
    + + + +
    + + +
    + + + + + +
    + + + + + + +

    Last revised: March 18, 2022 at 14:45:32 UTC

    +
    +
    +Prev + + HomeNext
    + diff --git a/doc/html/tags/eager/page/1.html b/doc/html/tags/eager/page/1.html new file mode 100644 index 000000000..487163e84 --- /dev/null +++ b/doc/html/tags/eager/page/1.html @@ -0,0 +1 @@ +/tags/eager.html \ No newline at end of file diff --git a/doc/html/tags/error.html b/doc/html/tags/error.html new file mode 100644 index 000000000..d1d9e4faf --- /dev/null +++ b/doc/html/tags/error.html @@ -0,0 +1,47 @@ + + +Error - Boost.Outcome documentation + + + + + +
    + + HomeNext
    + + + +
    + + +
    + + + + + + + +
    + + + + + + +

    Last revised: March 22, 2019 at 15:01:40 -0700

    +
    +
    +Prev + + HomeNext
    + diff --git a/doc/html/tags/error/page/1.html b/doc/html/tags/error/page/1.html new file mode 100644 index 000000000..e1261e6a8 --- /dev/null +++ b/doc/html/tags/error/page/1.html @@ -0,0 +1 @@ +/tags/error.html \ No newline at end of file diff --git a/doc/html/tags/exception.html b/doc/html/tags/exception.html new file mode 100644 index 000000000..3f9457c93 --- /dev/null +++ b/doc/html/tags/exception.html @@ -0,0 +1,45 @@ + + +Exception - Boost.Outcome documentation + + + + + +
    + + HomeNext
    + + + +
    + + +
    + + + + + +
    + + + + + + +

    Last revised: June 19, 2020 at 15:42:26 +0100

    +
    +
    +Prev + + HomeNext
    + diff --git a/doc/html/tags/exception/page/1.html b/doc/html/tags/exception/page/1.html new file mode 100644 index 000000000..369f7505b --- /dev/null +++ b/doc/html/tags/exception/page/1.html @@ -0,0 +1 @@ +/tags/exception.html \ No newline at end of file diff --git a/doc/html/tags/has_error_code.html b/doc/html/tags/has_error_code.html new file mode 100644 index 000000000..83fa6d6c3 --- /dev/null +++ b/doc/html/tags/has_error_code.html @@ -0,0 +1,45 @@ + + +Has_error_code - Boost.Outcome documentation + + + + + +
    + + HomeNext
    + + + +
    + + +
    + + + + + +
    + + + + + + +

    Last revised: February 08, 2019 at 22:18:08 UTC

    +
    +
    +Prev + + HomeNext
    + diff --git a/doc/html/tags/has_error_code/page/1.html b/doc/html/tags/has_error_code/page/1.html new file mode 100644 index 000000000..645517eb8 --- /dev/null +++ b/doc/html/tags/has_error_code/page/1.html @@ -0,0 +1 @@ +/tags/has_error_code.html \ No newline at end of file diff --git a/doc/html/tags/hooks.html b/doc/html/tags/hooks.html new file mode 100644 index 000000000..2308bf4a9 --- /dev/null +++ b/doc/html/tags/hooks.html @@ -0,0 +1,45 @@ + + +Hooks - Boost.Outcome documentation + + + + + +
    + + HomeNext
    + + + +
    + + +
    + + + + + +
    + + + + + + +

    Last revised: September 16, 2020 at 11:58:04 +0100

    +
    +
    +Prev + + HomeNext
    + diff --git a/doc/html/tags/hooks/page/1.html b/doc/html/tags/hooks/page/1.html new file mode 100644 index 000000000..121472c5a --- /dev/null +++ b/doc/html/tags/hooks/page/1.html @@ -0,0 +1 @@ +/tags/hooks.html \ No newline at end of file diff --git a/doc/html/tags/idioms.html b/doc/html/tags/idioms.html new file mode 100644 index 000000000..56c474def --- /dev/null +++ b/doc/html/tags/idioms.html @@ -0,0 +1,45 @@ + + +Idioms - Boost.Outcome documentation + + + + + +
    + + HomeNext
    + + + +
    + + +
    + + + + + +
    + + + + + + +

    Last revised: February 09, 2019 at 15:18:26 UTC

    +
    +
    +Prev + + HomeNext
    + diff --git a/doc/html/tags/idioms/page/1.html b/doc/html/tags/idioms/page/1.html new file mode 100644 index 000000000..0062984ae --- /dev/null +++ b/doc/html/tags/idioms/page/1.html @@ -0,0 +1 @@ +/tags/idioms.html \ No newline at end of file diff --git a/doc/html/tags/lazy.html b/doc/html/tags/lazy.html new file mode 100644 index 000000000..38d13fb22 --- /dev/null +++ b/doc/html/tags/lazy.html @@ -0,0 +1,45 @@ + + +Lazy - Boost.Outcome documentation + + + + + +
    + + HomeNext
    + + + +
    + + +
    + + + + + +
    + + + + + + +

    Last revised: March 18, 2022 at 14:45:32 UTC

    +
    +
    +Prev + + HomeNext
    + diff --git a/doc/html/tags/lazy/page/1.html b/doc/html/tags/lazy/page/1.html new file mode 100644 index 000000000..9d11a0b72 --- /dev/null +++ b/doc/html/tags/lazy/page/1.html @@ -0,0 +1 @@ +/tags/lazy.html \ No newline at end of file diff --git a/doc/html/tags/make_error_code.html b/doc/html/tags/make_error_code.html new file mode 100644 index 000000000..061986054 --- /dev/null +++ b/doc/html/tags/make_error_code.html @@ -0,0 +1,45 @@ + + +Make_error_code - Boost.Outcome documentation + + + + + +
    + + HomeNext
    + + + +
    + + +
    + + + + + +
    + + + + + + +

    Last revised: February 08, 2019 at 22:18:08 UTC

    +
    +
    +Prev + + HomeNext
    + diff --git a/doc/html/tags/make_error_code/page/1.html b/doc/html/tags/make_error_code/page/1.html new file mode 100644 index 000000000..7fe4af9c3 --- /dev/null +++ b/doc/html/tags/make_error_code/page/1.html @@ -0,0 +1 @@ +/tags/make_error_code.html \ No newline at end of file diff --git a/doc/html/tags/namespace.html b/doc/html/tags/namespace.html new file mode 100644 index 000000000..41cc84110 --- /dev/null +++ b/doc/html/tags/namespace.html @@ -0,0 +1,47 @@ + + +Namespace - Boost.Outcome documentation + + + + + +
    + + HomeNext
    + + + +
    + + +
    + + + + + + + +
    + + + + + + +

    Last revised: February 23, 2021 at 17:37:27 UTC

    +
    +
    +Prev + + HomeNext
    + diff --git a/doc/html/tags/namespace/page/1.html b/doc/html/tags/namespace/page/1.html new file mode 100644 index 000000000..c2cccb183 --- /dev/null +++ b/doc/html/tags/namespace/page/1.html @@ -0,0 +1 @@ +/tags/namespace.html \ No newline at end of file diff --git a/doc/html/tags/networking-ts.html b/doc/html/tags/networking-ts.html new file mode 100644 index 000000000..569bf05b9 --- /dev/null +++ b/doc/html/tags/networking-ts.html @@ -0,0 +1,47 @@ + + +Networking Ts - Boost.Outcome documentation + + + + + +
    + + HomeNext
    + + + +
    + + +
    + + + + + + + +
    + + + + + + +

    Last revised: August 06, 2019 at 10:42:06 +0100

    +
    +
    +Prev + + HomeNext
    + diff --git a/doc/html/tags/networking-ts/page/1.html b/doc/html/tags/networking-ts/page/1.html new file mode 100644 index 000000000..b0360c076 --- /dev/null +++ b/doc/html/tags/networking-ts/page/1.html @@ -0,0 +1 @@ +/tags/networking-ts.html \ No newline at end of file diff --git a/doc/html/tags/nodiscard.html b/doc/html/tags/nodiscard.html new file mode 100644 index 000000000..5b76757ad --- /dev/null +++ b/doc/html/tags/nodiscard.html @@ -0,0 +1,45 @@ + + +Nodiscard - Boost.Outcome documentation + + + + + +
    + + HomeNext
    + + + +
    + + +
    + + + + + +
    + + + + + + +

    Last revised: March 22, 2019 at 15:01:40 -0700

    +
    +
    +Prev + + HomeNext
    + diff --git a/doc/html/tags/nodiscard/page/1.html b/doc/html/tags/nodiscard/page/1.html new file mode 100644 index 000000000..ef0fcde6d --- /dev/null +++ b/doc/html/tags/nodiscard/page/1.html @@ -0,0 +1 @@ +/tags/nodiscard.html \ No newline at end of file diff --git a/doc/html/tags/outcome.html b/doc/html/tags/outcome.html new file mode 100644 index 000000000..3c26dda87 --- /dev/null +++ b/doc/html/tags/outcome.html @@ -0,0 +1,47 @@ + + +Outcome - Boost.Outcome documentation + + + + + +
    + + HomeNext
    + + + +
    + + +
    + + + + + + + +
    + + + + + + +

    Last revised: March 19, 2019 at 22:57:48 +0100

    +
    +
    +Prev + + HomeNext
    + diff --git a/doc/html/tags/outcome/page/1.html b/doc/html/tags/outcome/page/1.html new file mode 100644 index 000000000..8c62cd620 --- /dev/null +++ b/doc/html/tags/outcome/page/1.html @@ -0,0 +1 @@ +/tags/outcome.html \ No newline at end of file diff --git a/doc/html/tags/page/1.html b/doc/html/tags/page/1.html new file mode 100644 index 000000000..19e25a090 --- /dev/null +++ b/doc/html/tags/page/1.html @@ -0,0 +1 @@ +/tags.html \ No newline at end of file diff --git a/doc/html/tags/page/2.html b/doc/html/tags/page/2.html new file mode 100644 index 000000000..ac3042872 --- /dev/null +++ b/doc/html/tags/page/2.html @@ -0,0 +1,72 @@ + + +Tags - Boost.Outcome documentation + + + + + +
    +Prev + + HomeNext
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + +

    Last revised: February 08, 2019 at 22:18:08 UTC

    +
    +
    +Prev + + HomeNext
    + diff --git a/doc/html/tags/page/3.html b/doc/html/tags/page/3.html new file mode 100644 index 000000000..52fc40610 --- /dev/null +++ b/doc/html/tags/page/3.html @@ -0,0 +1,68 @@ + + +Tags - Boost.Outcome documentation + + + + + +
    +Prev + + HomeNext
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + +

    Last revised: August 06, 2019 at 10:42:06 +0100

    +
    +
    +Prev + + HomeNext
    + diff --git a/doc/html/tags/payload.html b/doc/html/tags/payload.html new file mode 100644 index 000000000..3d7d9fdba --- /dev/null +++ b/doc/html/tags/payload.html @@ -0,0 +1,47 @@ + + +Payload - Boost.Outcome documentation + + + + + +
    + + HomeNext
    + + + +
    + + +
    + + + + + + + +
    + + + + + + +

    Last revised: February 08, 2019 at 22:18:08 UTC

    +
    +
    +Prev + + HomeNext
    + diff --git a/doc/html/tags/payload/page/1.html b/doc/html/tags/payload/page/1.html new file mode 100644 index 000000000..61e83d413 --- /dev/null +++ b/doc/html/tags/payload/page/1.html @@ -0,0 +1 @@ +/tags/payload.html \ No newline at end of file diff --git a/doc/html/tags/playpen.html b/doc/html/tags/playpen.html new file mode 100644 index 000000000..de5a20b73 --- /dev/null +++ b/doc/html/tags/playpen.html @@ -0,0 +1,45 @@ + + +Playpen - Boost.Outcome documentation + + + + + +
    + + HomeNext
    + + + +
    + + +
    + + + + + +
    + + + + + + +

    Last revised: December 15, 2020 at 12:22:39 UTC

    +
    +
    +Prev + + HomeNext
    + diff --git a/doc/html/tags/playpen/page/1.html b/doc/html/tags/playpen/page/1.html new file mode 100644 index 000000000..6087bec43 --- /dev/null +++ b/doc/html/tags/playpen/page/1.html @@ -0,0 +1 @@ +/tags/playpen.html \ No newline at end of file diff --git a/doc/html/tags/policies.html b/doc/html/tags/policies.html new file mode 100644 index 000000000..80f985e1d --- /dev/null +++ b/doc/html/tags/policies.html @@ -0,0 +1,45 @@ + + +Policies - Boost.Outcome documentation + + + + + +
    + + HomeNext
    + + + +
    + + +
    + + + + + +
    + + + + + + +

    Last revised: February 08, 2019 at 22:18:08 UTC

    +
    +
    +Prev + + HomeNext
    + diff --git a/doc/html/tags/policies/page/1.html b/doc/html/tags/policies/page/1.html new file mode 100644 index 000000000..30f3caa94 --- /dev/null +++ b/doc/html/tags/policies/page/1.html @@ -0,0 +1 @@ +/tags/policies.html \ No newline at end of file diff --git a/doc/html/tags/result.html b/doc/html/tags/result.html new file mode 100644 index 000000000..3ab4b46fa --- /dev/null +++ b/doc/html/tags/result.html @@ -0,0 +1,45 @@ + + +Result - Boost.Outcome documentation + + + + + +
    + + HomeNext
    + + + +
    + + +
    + + + + + +
    + + + + + + +

    Last revised: February 23, 2021 at 17:37:27 UTC

    +
    +
    +Prev + + HomeNext
    + diff --git a/doc/html/tags/result/page/1.html b/doc/html/tags/result/page/1.html new file mode 100644 index 000000000..50aafa911 --- /dev/null +++ b/doc/html/tags/result/page/1.html @@ -0,0 +1 @@ +/tags/result.html \ No newline at end of file diff --git a/doc/html/tags/try.html b/doc/html/tags/try.html new file mode 100644 index 000000000..76cfa6ac1 --- /dev/null +++ b/doc/html/tags/try.html @@ -0,0 +1,57 @@ + + +Try - Boost.Outcome documentation + + + + + +
    + + HomeNext
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + +
    + + + + + + +

    Last revised: February 23, 2021 at 17:37:27 UTC

    +
    +
    +Prev + + HomeNext
    + diff --git a/doc/html/tags/try/page/1.html b/doc/html/tags/try/page/1.html new file mode 100644 index 000000000..b5dfc0317 --- /dev/null +++ b/doc/html/tags/try/page/1.html @@ -0,0 +1 @@ +/tags/try.html \ No newline at end of file diff --git a/doc/html/tags/value-or-error.html b/doc/html/tags/value-or-error.html new file mode 100644 index 000000000..3796c46aa --- /dev/null +++ b/doc/html/tags/value-or-error.html @@ -0,0 +1,45 @@ + + +Value or Error - Boost.Outcome documentation + + + + + +
    + + HomeNext
    + + + +
    + + +
    + + + + + +
    + + + + + + +

    Last revised: December 15, 2020 at 12:22:39 UTC

    +
    +
    +Prev + + HomeNext
    + diff --git a/doc/html/tags/value-or-error/page/1.html b/doc/html/tags/value-or-error/page/1.html new file mode 100644 index 000000000..baaf7c2b7 --- /dev/null +++ b/doc/html/tags/value-or-error/page/1.html @@ -0,0 +1 @@ +/tags/value-or-error.html \ No newline at end of file diff --git a/doc/html/tags/value.html b/doc/html/tags/value.html new file mode 100644 index 000000000..5eb762da0 --- /dev/null +++ b/doc/html/tags/value.html @@ -0,0 +1,49 @@ + + +Value - Boost.Outcome documentation + + + + + +
    + + HomeNext
    + + + +
    + + +
    + + + + + + + + + +
    + + + + + + +

    Last revised: March 22, 2019 at 15:01:40 -0700

    +
    +
    +Prev + + HomeNext
    + diff --git a/doc/html/tags/value/page/1.html b/doc/html/tags/value/page/1.html new file mode 100644 index 000000000..f6d090db8 --- /dev/null +++ b/doc/html/tags/value/page/1.html @@ -0,0 +1 @@ +/tags/value.html \ No newline at end of file diff --git a/doc/html/tutorial.html b/doc/html/tutorial.html new file mode 100644 index 000000000..25151fbe5 --- /dev/null +++ b/doc/html/tutorial.html @@ -0,0 +1,54 @@ + + +Tutorial - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    + +

    Tutorial

    +
    1. + Essential +

      The absolute minimum that you need to know to get started with Outcome immediately.

      1. + Before we begin +

        Essential information before you begin the tutorial.

      2. + result<> +

        Gentle introduction to writing code with simple success-or-failure return types.

      3. + outcome<> +

        Success-or-failure return types where failure can take two forms, expected/handled failure and unexpected/abort failure.

      4. + No-value policies +

        Describes the concept of NoValuePolicy and how to use no-value policies.

      5. + Coroutines +

        Using Outcome in C++ Coroutines

      6. + Conventions +

        Why you should avoid custom E types in public APIs.

    2. + Advanced +

      If you have a bit more time, this covers all the time-saving ways you can customise and automate Outcome for various use cases, especially in larger codebases made up of multiple third party libraries.

      1. + Custom payloads +

        Success-or-failure return types where extra information in addition to the error code accompanies failure.

      2. + Result returning constructors +

        How to metaprogram construction of objects which use result to return failure instead of throwing a C++ exception.

      3. + Hooking events +

        Intercepting useful events such as initial construction, copies and moves so you can capture backtraces, fire debug breakpoints etc.

      4. + Interoperation +

        Interoperating with std::expected and other ValueOrError concept matching types.

    + + + + + + + + +

    Last revised: December 15, 2020 at 12:22:39 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/tutorial/advanced.html b/doc/html/tutorial/advanced.html new file mode 100644 index 000000000..61a3d5303 --- /dev/null +++ b/doc/html/tutorial/advanced.html @@ -0,0 +1,64 @@ + + +Advanced - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    + +

    Advanced

    +
    1. + Custom payloads +

      Success-or-failure return types where extra information in addition to the error code accompanies failure.

      1. + The Filesystem TS
      2. + Upgrading the Filesystem TS
      3. + Auto-throwing filesystem_error
    2. + Result returning constructors +

      How to metaprogram construction of objects which use result to return failure instead of throwing a C++ exception.

      1. + Two phase construction
      2. + A file handle
      3. + Phase 2 construction
      4. + Phase 3
      5. + construct
      6. + Alternatives
    3. + Hooking events +

      Intercepting useful events such as initial construction, copies and moves so you can capture backtraces, fire debug breakpoints etc.

      1. + Keeping state
      2. + ADL bridging
      3. + Hook result
      4. + Custom exception ptr
      5. + Hook outcome
    4. + Interoperation +

      Interoperating with std::expected and other ValueOrError concept matching types.

      1. + Incommensurate E types
      2. + value_or_error Concept
      3. + The HTTP library
      4. + The HTMLTidy library
      5. + The File I/O library
      6. + The Application
      7. + Mapping the HTTP library into the Application 1/2
      8. + Mapping the HTTP library into the Application 2/2
      9. + Mapping the File I/O library into the Application
      10. + Mapping the HTMLTidy library into the Application
      11. + In use
      12. + Conclusion
    + + + + + + + + +

    Last revised: February 08, 2019 at 22:18:08 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/tutorial/advanced/constructors.html b/doc/html/tutorial/advanced/constructors.html new file mode 100644 index 000000000..726209dc5 --- /dev/null +++ b/doc/html/tutorial/advanced/constructors.html @@ -0,0 +1,38 @@ + + +Result returning constructors - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    + +

    Result returning constructors

    +

    An oft-asked question during conference talks on Expected/Outcome is how to +exclusively use result to implement constructor failure. This is asked because +whilst almost every member function in a class can return a result, constructors +do not return values and thus cannot return a result. The implication is +that one cannot avoid throwing C++ exceptions to abort a construction.

    + +

    As with most things in C++, one can achieve zero-exception-throw object +construction using a lot of +extra typing of boilerplate, and a little bit of simple C++ metaprogramming. This section +shows you how to implement these for those who are absolutely adverse to ever throwing an exception, +or cannot because C++ exceptions have been globally disabled.

    + +

    The technique described here is not suitable for non-copyable and non-movable +types. There is also an assumption that moving your type is cheap.

    + + + +

    Last revised: June 24, 2019 at 21:48:18 +0100

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/tutorial/advanced/constructors/file_handle.html b/doc/html/tutorial/advanced/constructors/file_handle.html new file mode 100644 index 000000000..2bfc4961c --- /dev/null +++ b/doc/html/tutorial/advanced/constructors/file_handle.html @@ -0,0 +1,103 @@ + + +A file handle - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    A file handle

    +

    Borrowing from llfio::file_handle +which uses this design pattern1, here is a simplified file_handle implementation:

    + +
    class file_handle
    +{
    +  int _fd{-1};  // file descriptor
    +  struct stat _stat
    +  {
    +    0
    +  };  // stat of the fd at open
    +
    +  // Phase 1 private constexpr constructor
    +  constexpr file_handle() {}
    +
    +public:
    +  using path_type = filesystem::path;
    +
    +  //! The behaviour of the handle: does it read, read and write, or atomic append?
    +  enum class mode : unsigned char  // bit 0 set means writable
    +  {
    +    unchanged = 0,
    +    none = 2,        //!< No ability to read or write anything, but can synchronise (SYNCHRONIZE or 0)
    +    attr_read = 4,   //!< Ability to read attributes (FILE_READ_ATTRIBUTES|SYNCHRONIZE or O_RDONLY)
    +    attr_write = 5,  //!< Ability to read and write attributes (FILE_READ_ATTRIBUTES|FILE_WRITE_ATTRIBUTES|SYNCHRONIZE or O_RDONLY)
    +    read = 6,        //!< Ability to read (READ_CONTROL|FILE_READ_DATA|FILE_READ_ATTRIBUTES|FILE_READ_EA|SYNCHRONISE or O_RDONLY)
    +    write = 7,       //!< Ability to read and write (READ_CONTROL|FILE_READ_DATA|FILE_READ_ATTRIBUTES|FILE_READ_EA|FILE_WRITE_DATA|FILE_WRITE_ATTRIBUTES|FILE_WRITE_EA|FILE_APPEND_DATA|SYNCHRONISE or O_RDWR)
    +    append = 9       //!< All mainstream OSs and CIFS guarantee this is atomic with respect to all other appenders (FILE_APPEND_DATA|SYNCHRONISE or O_APPEND)
    +  };
    +
    +  // Moves but not copies permitted
    +  file_handle(const file_handle &) = delete;
    +  file_handle(file_handle &&o) noexcept : _fd(o._fd) { o._fd = -1; }
    +  file_handle &operator=(const file_handle &) = delete;
    +  file_handle &operator=(file_handle &&o) noexcept
    +  {
    +    this->~file_handle();
    +    new(this) file_handle(std::move(o));
    +    return *this;
    +  }
    +  // Destruction closes the handle
    +  ~file_handle()
    +  {
    +    if(_fd != -1)
    +    {
    +      if(-1 == ::close(_fd))
    +      {
    +        int e = errno;
    +        std::cerr << "FATAL: Closing the fd during destruction failed due to " << strerror(e) << std::endl;
    +        std::terminate();
    +      }
    +      _fd = -1;
    +    }
    +  }
    +
    +  // Phase 2 static member constructor function, which cannot throw
    +  static inline outcome::result<file_handle> file(path_type path, mode mode = mode::read) noexcept;
    +};
    +
    View this code on Github
    + + +

    Note the default member initialisers, these are particularly convenient for +implementing phase 1 of construction. Note also the constexpr constructor, +which thanks to the default member initialisers is otherwise empty.

    + +

    File handles are very expensive to copy as they involve a syscall to duplicate +the file descriptor, so we enable moves only.

    + +

    The destructor closes the file descriptor if it is not -1, and if the close +fails, seeing as there is nothing else we can do without leaking the file +descriptor, we fatal exit the process.

    + +

    Finally we declare the phase 2 constructor which is a static member function.

    +
    + +
    + +
      +
    1. LLFIO uses Outcome “in anger”, both in Standard and Experimental configurations. If you would like a real world user of Outcome to study the source code of, it can be studied at https://github.com/ned14/llfio/. + [return]
    2. +
    +
    + + +

    Last revised: February 08, 2019 at 22:18:08 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/tutorial/advanced/constructors/metaprogrammg1.html b/doc/html/tutorial/advanced/constructors/metaprogrammg1.html new file mode 100644 index 000000000..2253d0c10 --- /dev/null +++ b/doc/html/tutorial/advanced/constructors/metaprogrammg1.html @@ -0,0 +1,54 @@ + + +Phase 3 - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    Phase 3

    +

    We have built our first two phases of construction for file_handle, +and for some users they might be happy writing:

    + +
      outcome::result<file_handle> fh1 = file_handle::file("hello" /*, file_handle::mode::read */);
    +  if(!fh1)
    +  {
    +    std::cerr << "Opening file 'hello' failed with " << fh1.error().message() << std::endl;
    +  }
    +
    View this code on Github
    + + +

    … and be done with it.

    + +

    But wouldn’t it be nicer if we could instead write:

    + +
      outcome::result<file_handle> fh2 = make<file_handle>{"hello" /*, file_handle::mode::read */}();
    +  if(!fh2)
    +  {
    +    std::cerr << "Opening file 'hello' failed with " << fh2.error().message() << std::endl;
    +  }
    +
    View this code on Github
    + + +

    The eye is immediately drawn to the two-stage invocation pattern, so we are +constructing a type make<file_handle> using the arguments with which we wish +to invoke the file_handle constructor with, and then invoking the +call operator on that make<file_handle> instance to do the +actual construction.

    + +

    It may seem a bit clunky to use brace initialisation for parameters followed +by a “spurious” set of empty brackets, but we think that this is a better +approach than alternatives. We shall briefly cover those at the end of this section.

    + + +

    Last revised: February 08, 2019 at 22:18:08 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/tutorial/advanced/constructors/metaprogrammg2.html b/doc/html/tutorial/advanced/constructors/metaprogrammg2.html new file mode 100644 index 000000000..67829e2d6 --- /dev/null +++ b/doc/html/tutorial/advanced/constructors/metaprogrammg2.html @@ -0,0 +1,61 @@ + + +construct<T> - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    construct

    +

    First, we need a base definition for make<T>:

    + +
    template <class T> struct make
    +{
    +  outcome::result<T> operator()() const noexcept
    +  {                                            //
    +    static_assert(!std::is_same<T, T>::value,  //
    +                  "make<T>() was not specialised for the type T supplied");
    +  }
    +};
    +
    View this code on Github
    + + +

    This fails a static assert if the type is ever instantiated unspecialised.

    + +

    We then specialise for make<file_handle>:

    + +
    template <> struct make<file_handle>
    +{
    +  file_handle::path_type _path;
    +  file_handle::mode _mode{file_handle::mode::read};
    +  // Any other args, default initialised if necessary, follow here ...
    +
    +  outcome::result<file_handle> operator()() const noexcept  //
    +  {
    +    return file_handle::file(std::move(_path));
    +  }
    +};
    +
    View this code on Github
    + + +

    Because this is a struct, we can list initialise make, and use +default member initialisers to implement default arguments. This can get +you surprisingly far before you need to start writing custom constructors.

    + +

    But in more complex code, you will usually provide all the initialisation overloads that +you would for the constructors of your main type. You then implement a single phase 2 constructing +function which accepts make<YOURTYPE> as input, and construct solely from +that source.

    + + +

    Last revised: February 08, 2019 at 22:18:08 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/tutorial/advanced/constructors/metaprogrammg3.html b/doc/html/tutorial/advanced/constructors/metaprogrammg3.html new file mode 100644 index 000000000..107ad3f03 --- /dev/null +++ b/doc/html/tutorial/advanced/constructors/metaprogrammg3.html @@ -0,0 +1,56 @@ + + +Alternatives - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    Alternatives

    +

    No doubt many will dislike the two-stage invocation pattern i.e.

    +
    make<file_handle>{"hello"}();
    +
    +

    So let us examine the most obvious alternative: a templated free function make<T>.

    + +

    Due to the inability to partially specialise templated functions in C++, you +need to use tagged overloading e.g.

    +
    template<class... Args>
    +inline outcome::result<file_handle> make(std::in_place_type_t<file_handle>, Args&& ... args)
    +{
    +  return file_handle::file(std::forward<Args>(args)...);
    +}
    +...
    +// Now you must always write this:
    +make(std::in_place_type<file_handle>, "hello");
    +
    +

    Tagged overloading is fine for smaller projects, but for larger code bases:

    + +
      +
    1. It takes longer to type make(std::in_place_type<file_handle>, "hello"), +and is possibly less intuitive to write, +than it does make<file_handle>{"hello"}().
    2. +
    3. Compiler error messages are enormously clearer if you encode the permitted +overloads for construction into the make<file_handle> type rather than +letting a variadic free function fail to resolve an appropriate overload.
    4. +
    5. Resolving variadic free function overloads is not constant time for the compiler, +whereas resolving the type specialisation for make<file_handle> +is constant time. In other words, free functions are expensive on build +times, whereas fully specialised types are not.
    6. +
    7. It actually turns out to be quite useful when writing generic code +to pass around object constructing factory objects all of which have +no parameters for their call operator. It becomes, effectively, a +lazy construction mechanism.
    8. +
    + + +

    Last revised: February 08, 2019 at 22:18:08 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/tutorial/advanced/constructors/static-constructor.html b/doc/html/tutorial/advanced/constructors/static-constructor.html new file mode 100644 index 000000000..e012967af --- /dev/null +++ b/doc/html/tutorial/advanced/constructors/static-constructor.html @@ -0,0 +1,86 @@ + + +Phase 2 construction - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    Phase 2 construction

    +

    Its phase 2 constructor:

    + +
    // Phase 2 static member constructor function, which cannot throw
    +inline outcome::result<file_handle> file_handle::file(file_handle::path_type path, file_handle::mode mode) noexcept
    +{
    +  // Perform phase 1 of object construction
    +  file_handle ret;
    +
    +  // Perform phase 2 of object construction
    +  int flags = 0;
    +  switch(mode)
    +  {
    +  case mode::attr_read:
    +  case mode::read:
    +    flags = O_RDONLY;
    +    break;
    +  case mode::attr_write:
    +  case mode::write:
    +    flags = O_RDWR;
    +    break;
    +  case mode::append:
    +    flags = O_APPEND;
    +    break;
    +  default:
    +    return std::errc::invalid_argument;
    +  }
    +  ret._fd = ::open(path.u8string().c_str(), flags);
    +  if(-1 == ret._fd)
    +  {
    +    // Note that if we bail out here, ~file_handle() will correctly not call ::close()
    +    return {errno, std::system_category()};
    +  }
    +  if(-1 == ::fstat(ret._fd, &ret._stat))
    +  {
    +    // Note that if we bail out here, ~file_handle() will correctly call ::close()
    +    return {errno, std::system_category()};
    +  }
    +
    +  // Returning ret directly is an area full of compiler specific behaviour quirks,
    +  // so be explicit by wrapping into an initialiser list with embedded move.
    +  return {std::move(ret)};
    +}
    +
    View this code on Github
    + + +

    The static member function implementing phase 2 firstly calls phase 1 +which puts the object into a legally destructible state. We then +proceed to implement phase 2 of construction, filling in the various +parts as we go, reporting via result any failures.

    + +
    +
    note
    +

    Remember that operator new has a non-throwing form, new(std::nothrow).

    +
    +
    + + +

    For the final return, in theory we could just return ret and +depending on the C++ version currently in force, it might work +via move, or via copy, or it might refuse to compile. You can +of course type lots of boilerplate to be explicit, but this use +via initialiser list is a reasonable balance of explicitness +versus brevity, and it should generate minimum overhead code +irrespective of compiler, C++ version, or any other factor.

    + + +

    Last revised: February 08, 2019 at 22:18:08 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/tutorial/advanced/constructors/two-phase-init.html b/doc/html/tutorial/advanced/constructors/two-phase-init.html new file mode 100644 index 000000000..fa22ee2a4 --- /dev/null +++ b/doc/html/tutorial/advanced/constructors/two-phase-init.html @@ -0,0 +1,56 @@ + + +Two phase construction - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    Two phase construction

    +

    The first thing to do is to break your object’s construction into two phases:

    + +
      +
    1. Place the object into a state where it can be legally destructed +without doing any initialisation which could throw an exception (i.e. everything +done in phase 1 is constexpr). This phase usually involves initialising member +variables to various default values, most often using default member initialisers. +Most standard C++ library objects +and containers have constexpr constructors, and thus can be initialised +during phase 1. If you need to initialise a member variable without +a constexpr constructor, + std::optional<T> + is the usual workaround.

    2. + +
    3. Do the remainder of the construction, the parts which could fail. +Because phase 1 placed the object into a legally destructible state, +it is usually the case that one can bail out during phase 2 and the +destructor will clean things up correctly.

    4. +
    + +

    The phase 1 construction will be placed into a private constexpr +constructor so nobody external can call it. The phase 2 construction will be placed into a static +member initialisation function which returns a result with either +the successfully constructed object, or the cause of any failure to +construct the object.

    + +

    Finally, as a phase 3, +some simple metaprogramming will implement a make<T>{Args...}() +free function which will construct any object T by calling its +static initialisation function with Args... and returning the +result returned. This isn’t as nice as calling T(Args...) directly, +but it’s not too bad in practice. And more importantly, it lets you +write generic code which can construct any unknown object which +fails via returning result, completely avoiding C++ exception throws.

    + + +

    Last revised: February 08, 2019 at 22:18:08 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/tutorial/advanced/hooks.html b/doc/html/tutorial/advanced/hooks.html new file mode 100644 index 000000000..0de4d19d8 --- /dev/null +++ b/doc/html/tutorial/advanced/hooks.html @@ -0,0 +1,139 @@ + + +Hooking events - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    + +

    Hooking events

    +

    Outcome provides multiple methods for user code to intercept various lifecycle events which occur. +The deepest method is simply to inherit from basic_result or basic_outcome, and override member functions, +for which you will need to study the source code as that form of customisation is out of scope for this tutorial.

    + +

    Another option is to supply a custom NoValuePolicy +(see preceding section). +From Outcome v2.2 onwards, intercepting construction, copies and moves requires +a custom NoValuePolicy.

    + +

    Before Outcome v2.2, there was an ADL discovered event hook mechanism for intercepting +construction, copies and moves (it was found to be brittle, error prone and surprising +in empirical use, which is why it was replaced). The ADL discovered event hooks still +function in Outcome v2.2 and later if BOOST_OUTCOME_ENABLE_LEGACY_SUPPORT_FOR + +is set to less than 220 to enable emulation.

    + +

    You will note that the naming is simply one of hook_* => on_*, the parameters remain +identical. This eases porting code from Outcome v2.1 to v2.2, it’s usually just a case +of copy-pasting the ADL hook code into a custom NoValuePolicy.

    + +
    + +

    Policy set event hooks (Outcome v2.2 onwards):

    + + + +
    + +

    ADL discovered event hooks (before Outcome v2.2):

    + + + +
    + +

    One criticism often levelled against library-based exception throw alternatives is that they do +not provide as rich a set of facilities as C++ exception throws. This section shows +you how to configure Outcome, using the event hooks, to take a stack backtrace on +construction of an errored result<T, error_code>, +and if that result<T, error_code> should ever be converted into an outcome<T, error_code, std::exception_ptr>, +a custom std::exception_ptr will be just-in-time synthesised consisting of the std::system_error +for the error code, plus an expanded message string containing the stack backtrace of where +the error originally occurred.

    + +

    One can see the use case for such a configuration where low-level, deterministic, +fixed latency code is built with result, and it dovetails into higher-level +application code built with outcome where execution time guarantees are not +important, and thus where a malloc is okay. One effectively has constructed a +“lazy indeterminism”, or “just-in-time indeterminism” mechanism for handling +failure, but with all the rich information of throwing C++ exceptions.

    + + + +

    Last revised: September 16, 2020 at 11:58:04 +0100

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/tutorial/advanced/hooks/adl_bridging.html b/doc/html/tutorial/advanced/hooks/adl_bridging.html new file mode 100644 index 000000000..aca536a68 --- /dev/null +++ b/doc/html/tutorial/advanced/hooks/adl_bridging.html @@ -0,0 +1,64 @@ + + +ADL bridging - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    ADL bridging

    +
    +
    note
    +

    In Outcome v2.2 the ADL-based event hooks were replaced with policy-based event hooks (next page). +The code in this section is still valid in v2.2 onwards, it’s just that ADL is no longer used +to find the hooks.

    +
    +
    + + +

    In a previous section, we used the failure_info type to create +the ADL bridge into the namespace where the ADL discovered outcome_throw_as_system_error_with_payload() function was to be found.

    + +

    Here we do the same, but more directly by creating a thin clone of std::error_code +into the local namespace. This ensures that this namespace will be searched by the +compiler when discovering the event hooks (Outcome v2.1 and earlier only).

    + +
    namespace error_code_extended
    +{
    +  // Use the error_code type as the ADL bridge for the hooks by creating a type here
    +  // It can be any type that your localised result uses, including the value type but
    +  // by localising the error code type here you prevent nasty surprises later when the
    +  // value type you use doesn't trigger the ADL bridge.
    +  struct error_code : public std::error_code
    +  {
    +    // literally passthrough
    +    using std::error_code::error_code;
    +    error_code() = default;
    +    error_code(std::error_code ec)
    +        : std::error_code(ec)
    +    {
    +    }
    +  };
    +
    +  // Localise result and outcome to using the local error_code so this namespace gets looked up for the hooks
    +  template <class R> using result = BOOST_OUTCOME_V2_NAMESPACE::result<R, error_code>;
    +  template <class R> using outcome = BOOST_OUTCOME_V2_NAMESPACE::outcome<R, error_code /*, std::exception_ptr */>;
    +}
    +
    View this code on Github
    + + +

    For convenience, we template alias local copies of result and outcome in this +namespace bound to the ADL bridging error_code.

    + + +

    Last revised: December 15, 2020 at 12:22:39 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/tutorial/advanced/hooks/hook_outcome.html b/doc/html/tutorial/advanced/hooks/hook_outcome.html new file mode 100644 index 000000000..fee97948a --- /dev/null +++ b/doc/html/tutorial/advanced/hooks/hook_outcome.html @@ -0,0 +1,72 @@ + + +Hook outcome - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    Hook outcome

    +

    The final step is to add event hooks for the very specific case of +when our localised outcome is copy or move constructed from our localised result.

    + +

    You ought to be very careful that the noexcept-ness of these matches the noexcept-ness +of the types in the outcome. You may have noticed that poke_exception() creates +a std::string and appends to it. This can throw an exception. If the copy and/or +move constructors of T, EC and EP are noexcept, then so will be outcome’s +copy and/or move constructor. Thus if poke_exception() throws, instant program +termination would occur, which is bad.

    + +

    We avoid that problem in this case by wrapping poke_exception() in a try...catch +which throws away any exceptions thrown. For Outcome before v2.2, these specially +named free functions must be placed into a namespace which is ADL searched:

    + +
    namespace error_code_extended
    +{
    +  // Specialise the outcome copy and move conversion hook for when our localised result
    +  // is used as the source for copy construction our localised outcome
    +  template <class T, class U> inline void hook_outcome_copy_construction(outcome<T> *res, const result<U> & /*unused*/) noexcept
    +  {
    +    try
    +    {
    +      // when copy constructing from a result<T>, poke in an exception
    +      poke_exception(res);
    +    }
    +    catch(...)
    +    {
    +      // Do nothing
    +    }
    +  }
    +  template <class T, class U> inline void hook_outcome_move_construction(outcome<T> *res, result<U> && /*unused*/) noexcept
    +  {
    +    try
    +    {
    +      // when move constructing from a result<T>, poke in an exception
    +      poke_exception(res);
    +    }
    +    catch(...)
    +    {
    +      // Do nothing
    +    }
    +  }
    +}
    +
    View this code on Github
    + + +

    For Outcome v2.2 and later, these functions must be placed into a custom no value +policy with the names on_outcome_copy_construction() and on_outcome_move_construction() +respectively. As with before, the implementation of the functions is identical, just +the name and location has changed.

    + + +

    Last revised: December 15, 2020 at 12:22:39 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/tutorial/advanced/hooks/hook_result.html b/doc/html/tutorial/advanced/hooks/hook_result.html new file mode 100644 index 000000000..f7cee9621 --- /dev/null +++ b/doc/html/tutorial/advanced/hooks/hook_result.html @@ -0,0 +1,86 @@ + + +Hook result - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    Hook result

    +

    We now tell Outcome that for every instance of our localised result<T>, that +on failure construction only, we want custom code to be run which increments the current +slot in TLS storage and writes the current stack backtrace into it.

    + +

    For Outcome before v2.2, we must do this by inserting a specially named free function into +a namespace searched by ADL:

    + +
    namespace error_code_extended
    +{
    +  // Specialise the result construction hook for our localised result
    +  // We hook any non-copy, non-move, non-inplace construction, capturing a stack backtrace
    +  // if the result is errored.
    +  template <class T, class U> inline void hook_result_construction(result<T> *res, U && /*unused*/) noexcept
    +  {
    +    if(res->has_error())
    +    {
    +      // Grab the next extended info slot in the TLS
    +      extended_error_info &eei = mythreadlocaldata().next();
    +
    +      // Write the index just grabbed into the spare uint16_t
    +      BOOST_OUTCOME_V2_NAMESPACE::hooks::set_spare_storage(res, mythreadlocaldata().current - 1);
    +
    +      // Capture a backtrace into my claimed extended info slot in the TLS
    +      eei.items = ::backtrace(eei.backtrace.data(), eei.backtrace.size());
    +    }
    +  }
    +}
    +
    View this code on Github
    + + +

    For Outcome v2.2 and later, we must do this by using a custom no value policy which contains +a function named on_result_construction(). The function implementation is identical between +both mechanisms, just the name and placement of the function declaration differs.

    + +

    The only non-obvious part above is the call to void set_spare_storage(basic_result|basic_outcome *, uint16_t) noexcept +.

    + +

    Both result and outcome keep their internal state metadata in a uint32_t, +half of which is not used by Outcome. As it can be very useful to keep a small +unique number attached to any particular result or outcome instance, we +permit user code to set those sixteen bits to anything they feel like. +The corresponding function to retrieve those sixteen bits is uint16_t spare_storage(const basic_result|basic_outcome *) noexcept +.

    + +

    The state of the sixteen bits of spare storage are ignored during comparison operations.

    + +

    The sixteen bits of spare storage propagate during the following operations:

    + +
      +
    1. Copy and move construction between result’s.
    2. +
    3. Copy and move construction between outcome’s.
    4. +
    5. Copy and move construction from a result to an outcome.
    6. +
    7. Converting copy and move constructions for all the above.
    8. +
    9. Assignment for all of the above.
    10. +
    + +

    They are NOT propagated in these operations:

    + +
      +
    1. Any conversion or translation which goes through a failure_type or success_type.
    2. +
    3. Any conversion or translation which goes through a ValueOrError concept match.
    4. +
    5. Any unpacking or repacking of value/error/exception e.g. a manual repack of an +outcome into a result.
    6. +
    + + +

    Last revised: December 15, 2020 at 12:22:39 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/tutorial/advanced/hooks/keeping_state.html b/doc/html/tutorial/advanced/hooks/keeping_state.html new file mode 100644 index 000000000..52ec8a207 --- /dev/null +++ b/doc/html/tutorial/advanced/hooks/keeping_state.html @@ -0,0 +1,78 @@ + + +Keeping state - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    Keeping state

    +

    The first thing we are going to need is somewhere to store the stack backtrace. +We could take the easier route and simply store it into an allocated block and +keep the pointer as a custom payload in a result<T, std::pair<error_code, std::unique_ptr<stack_backtrace>>> +(see previous section on Custom payloads). But let us assume that we care so deeply about bounded execution times +that ever calling malloc is unacceptable.

    + +

    We therefore are going to need some completely static and trivially typed storage +perhaps kept per-thread to avoid the need to keep mutexes.

    + +
    /* Outcome's hook mechanism works vis ADL, so we will need a custom namespace
    +to ensure the hooks apply only to the types declared in this namespace only
    +*/
    +namespace error_code_extended
    +{
    +  // The extra error information we will keep
    +  struct extended_error_info
    +  {
    +    std::array<void *, 16> backtrace;  // The backtrace
    +    size_t items;                      // Items in backtrace array which are valid
    +  };
    +  struct mythreadlocaldata_t
    +  {
    +    // Keep 16 slots of extended error info as a ringbuffer
    +    extended_error_info slots[16];
    +    // The current oldest slot
    +    uint16_t current{0};
    +
    +    // Return the oldest slot
    +    extended_error_info &next() { return slots[(current++) % 16]; }
    +
    +    // Retrieve a previously stored slot, detecting if it is stale
    +    extended_error_info *get(uint16_t idx)
    +    {
    +      // If the idx is stale, return not found
    +      if(idx - current >= 16)
    +      {
    +        return nullptr;
    +      }
    +      return slots + (idx % 16);
    +    }
    +  };
    +
    +  // Meyers' singleton returning a thread local data structure for this thread
    +  inline mythreadlocaldata_t &mythreadlocaldata()
    +  {
    +    static thread_local mythreadlocaldata_t v;
    +    return v;
    +  }
    +}
    +
    View this code on Github
    + + +

    The extended error info is kept in a sixteen item long, thread local, ring buffer. We continuously +increment the current index pointer which is a 16 bit value which will wrap after +65,535. This lets us detect an attempt to access recycled storage, and thus return +item-not-found instead of the wrong extended error info.

    + + +

    Last revised: February 08, 2019 at 22:18:08 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/tutorial/advanced/hooks/poke_exception.html b/doc/html/tutorial/advanced/hooks/poke_exception.html new file mode 100644 index 000000000..98626a918 --- /dev/null +++ b/doc/html/tutorial/advanced/hooks/poke_exception.html @@ -0,0 +1,100 @@ + + +Custom exception ptr - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    Custom exception ptr

    +

    If you merely want result to capture stack backtraces without calling a memory allocator +and retaining any triviality of copy which is important for optimisation, +you already have everything you need.

    + +

    But let’s keep going by intercepting any +construction of our localised outcome from our localised result, retrieving any +stored backtrace and using it to synthesise an exception ptr with a message text +including the backtrace. Firstly let us look at the function which synthesises +the exception ptr:

    + +
    namespace error_code_extended
    +{
    +  // Synthesise a custom exception_ptr from the TLS slot and write it into the outcome
    +  template <class R> inline void poke_exception(outcome<R> *o)
    +  {
    +    if(o->has_error())
    +    {
    +      extended_error_info *eei = mythreadlocaldata().get(BOOST_OUTCOME_V2_NAMESPACE::hooks::spare_storage(o));
    +      if(eei != nullptr)
    +      {
    +        // Make a custom string for the exception
    +        std::string str(o->error().message());
    +        str.append(" [");
    +        struct unsymbols  // RAII cleaner for symbols
    +        {
    +          char **_{nullptr};
    +          ~unsymbols() { ::free(_); }
    +        } symbols{::backtrace_symbols(eei->backtrace.data(), eei->items)};
    +        if(symbols._ != nullptr)
    +        {
    +          for(size_t n = 0; n < eei->items; n++)
    +          {
    +            if(n > 0)
    +            {
    +              str.append("; ");
    +            }
    +            str.append(symbols._[n]);
    +          }
    +        }
    +        str.append("]");
    +
    +        // Override the payload/exception member in the outcome with our synthesised exception ptr
    +        BOOST_OUTCOME_V2_NAMESPACE::hooks::override_outcome_exception(o, std::make_exception_ptr(std::runtime_error(str)));
    +      }
    +    }
    +  }
    +}
    +
    View this code on Github
    + + +

    If the localised outcome being constructed is errored, try fetching the TLS slot +for the unique 16-bit value in its spare storage. If that is valid, symbolise the +stack backtrace into a string and make an exception ptr with a runtime error with +that string. Finally, override the payload/exception member in our just-copy-constructed +localised outcome with the new exception ptr.

    + +
    + +

    As the reference documentation for void override_outcome_exception(basic_outcome<T, EC, EP, NoValuePolicy> *, U &&) noexcept + +points out, you almost certainly never want to use this function if there is any +other alternative. It is worth explaining what is meant by this.

    + +

    In this section, we always synthesise an exception ptr from the stored state and +error code at the exact point of transition from result based APIs to outcome +based APIs. This is acceptable only because we know that our code enforces that +discipline.

    + +

    If one were designing a library facility, one could not assume such discipline in the +library user. One would probably be better off making the exception ptr synthesis +lazy via a custom no-value policy which generates the stacktrace-containing error +message only on demand e.g. .exception() observation, or a .value() observation +where no value is available.

    + +

    Such a design is however more indeterminate than the design presented in this section, +because the indeterminacy is less predictable than in this design. Ultimately which +strategy you adopt depends on how important absolute determinism is to your Outcome-based +application.

    + + +

    Last revised: December 15, 2020 at 12:22:39 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/tutorial/advanced/interop.html b/doc/html/tutorial/advanced/interop.html new file mode 100644 index 000000000..37bff7dc1 --- /dev/null +++ b/doc/html/tutorial/advanced/interop.html @@ -0,0 +1,55 @@ + + +Interoperation - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    + +

    Interoperation

    +

    This is the final section of the tutorial, and it is unavoidably quite lengthy +as we are going to tie together all of the material covered in the tutorial +so far into a single, unified, application of Outcome’s facilities.

    + +

    One thing which Outcome solves – and which alternatives do not – is how to +non-intrusively tie together multiple third party libraries, each using +Outcome – or some other T|E implementatation like + P0323 std::expected<T, E> + +– with custom incommensurate E types, or indeed arbitrary return +types which are “split” T|E return types. Solving +this well is the coup de grâce of Outcome against alternative approaches +to this problem domain, +including std::expected<T, E>. It is the major reason why you should +consider using Outcome over alternatives, including Expected.

    + +

    Firstly we shall explore some of the problems faced by the software +developer when T|E return type based code proliferates at scale, +where dozens of libraries may be using completely incompatible T|E return types.

    + +

    Secondly we shall introduce the ValueOrError concept support in Outcome, +which implements a subset of the proposed WG21 ValueOrError +concept framework.

    + +

    Finally, we shall then step through a worked example which mocks up a realistic +situation that the software developer may find themselves in: tying +together disparate third party libraries, whose source code cannot be +modified, into an application-wide, mixed-mode T|E and exception +throwing universal error handling system which is capable of +accurately representing the original failure, but also propagating it +in a way that the application can deal with universally.

    + + + +

    Last revised: February 08, 2019 at 22:18:08 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/tutorial/advanced/interop/app-go.html b/doc/html/tutorial/advanced/interop/app-go.html new file mode 100644 index 000000000..448e034ad --- /dev/null +++ b/doc/html/tutorial/advanced/interop/app-go.html @@ -0,0 +1,86 @@ + + +In use - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    In use

    +

    This is how you might now write application code using these three libraries:

    + +
    namespace app
    +{
    +  // A markup function to indicate when we are ValueOrError converting
    +  template <class T> inline outcome<typename T::value_type> ext(T &&v)
    +  {  //
    +    return outcome<typename T::value_type>(std::move(v));
    +  }
    +
    +  outcome<void> go()  // NOT noexcept, this can throw STL exceptions e.g. bad_alloc
    +  {
    +    // Note that explicit construction is required when converting between differing types
    +    // of outcome and result. This makes it explicit what you intend to do as conversion
    +    // may be a lot more expensive than moves.
    +
    +    // Try to GET this URL. If an unsuccessful HTTP status is returned, serialise a string
    +    // containing a description of the HTTP status code and the URL which failed, storing
    +    // that into a httplib_error exception type which is stored as an exception ptr. The
    +    // TRY operation below will return that exception ptr to be rethrown in the caller.
    +    // Otherwise the fetched data is returned in a std::string data.
    +    BOOST_OUTCOME_TRY(auto data, ext(httplib::get("http://www.nedproductions.biz/")));
    +    string_view data_view(data);
    +
    +    // HTML tidy the fetched data. If the C library fails due to an error corresponding to
    +    // a standard library exception type, throw that. Otherwise, synthesise an exception
    +    // ptr of type tidylib_error which stores the error code returned in an error code with
    +    // generic category (i.e. errno domain).
    +    // TRY operation below will return that exception ptr to be rethrown in the caller.
    +    // Otherwise the tidied data is returned into holdmem, with the string view updated to
    +    // point at the tidied data.
    +    BOOST_OUTCOME_TRY(auto holdmem, ext(tidy_html(data_view)));
    +
    +    // Write the tidied data to some file. If the write fails, synthesise a filesystem_error
    +    // exception ptr exactly as if one called filelib::write_file(data_view).value().
    +    BOOST_OUTCOME_TRY(auto written, ext(filelib::write_file(data_view)));
    +    return success();
    +  }
    +}  // namespace app
    +
    View this code on Github
    + + +

    The curiosity will be surely the ext() markup function, which needs +explaining. It was felt +important during Outcome’s design that value_or_error conversions never +be implicit, as they almost always represent a transition across an +ABI or semantic boundary. They are also usually non-trivial to implement +and compile, and it was felt important that the programmer ought to +always mark the semantic boundary transition at the point of every use, +as considerable amounts of code may execute.

    + +

    How the end user chooses to mark up their code is up to them, however +above we use a simple ext() function to mark up that the function +being called is external to the application. This ticks our box of +requiring the documentation, at the point of use, of every transition +in failure handling boundaries.

    + +

    Note that we are able to use TRY as normal throughout this function. +Everything “just works”.

    + +

    And most especially note that we never, at any stage, needed to modify +the source code of httplib, tidylib nor filelib, nor inject +custom things into their namespaces. This entire worked example was +achieved solely by app based customisation points, and via convert.

    + + +

    Last revised: December 15, 2020 at 12:22:39 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/tutorial/advanced/interop/app-map-filelib.html b/doc/html/tutorial/advanced/interop/app-map-filelib.html new file mode 100644 index 000000000..320f797ad --- /dev/null +++ b/doc/html/tutorial/advanced/interop/app-map-filelib.html @@ -0,0 +1,70 @@ + + +Mapping the File I/O library into the Application - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    Mapping the File I/O library into the Application

    +

    To handle the File I/O library, once again we turn to custom ValueOrError +converters:

    + +
    // Inject custom ValueOrError conversion
    +BOOST_OUTCOME_V2_NAMESPACE_BEGIN
    +namespace convert
    +{
    +  // Provide custom ValueOrError conversion from filelib::result<U>
    +  // into any app::outcome<T>
    +  template <class T, class U>  //
    +  struct value_or_error<app::outcome<T>, filelib::result<U>>
    +  {
    +    // True to indicate that this converter wants `result`/`outcome`
    +    // to NOT reject all other `result`
    +    static constexpr bool enable_result_inputs = true;
    +    // False to indicate that this converter wants `outcome` to NOT
    +    // reject all other `outcome`
    +    static constexpr bool enable_outcome_inputs = true;
    +
    +    template <class X,                                                                              //
    +              typename = std::enable_if_t<std::is_same<filelib::result<U>, std::decay_t<X>>::value  //
    +                                          && std::is_constructible<T, U>::value>>                   //
    +    constexpr app::outcome<T> operator()(X &&src)
    +    {
    +      // Forward any successful value
    +      if(src.has_value())
    +      {
    +        return {std::forward<X>(src).value()};
    +      }
    +
    +      // Synthesise a filesystem_error, exactly as if someone had
    +      // called src.value()
    +      auto &fi = src.error();
    +      BOOST_OUTCOME_V2_NAMESPACE::try_throw_std_exception_from_error(fi.ec);  // might throw
    +      return {std::make_exception_ptr(                                  //
    +      filelib::filesystem_error(fi.ec.message(), std::move(fi.path1), std::move(fi.path2), fi.ec))};
    +    }
    +  };
    +}  // namespace convert
    +BOOST_OUTCOME_V2_NAMESPACE_END
    +
    View this code on Github
    + + +

    Note that the conversion exactly duplicates the implementation of +throw_as_system_error_with_payload(failure_info fi) from +namespace filelib. In a production implementation, you probably +ought to call that function and catch the exception it throws +into a pointer, as that would be more long term maintainable.

    + + +

    Last revised: February 11, 2019 at 13:38:04 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/tutorial/advanced/interop/app-map-httplib1.html b/doc/html/tutorial/advanced/interop/app-map-httplib1.html new file mode 100644 index 000000000..b9ea91c01 --- /dev/null +++ b/doc/html/tutorial/advanced/interop/app-map-httplib1.html @@ -0,0 +1,97 @@ + + +Mapping the HTTP library into the Application <sup>1</sup>⁄<sub>2</sub> - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    Mapping the HTTP library into the Application 1/2

    +

    Firstly, remember that we are the application writer who has the problem of +integrating three third party libraries into our application’s Outcome-based +failure handling mechanism. We cannot modify those third party library +sources; we must be non-intrusive.

    + +

    We start by dealing with the HTTP library. We will integrate this +into our application by wrapping up httplib::failure into a custom +STL exception type. We then type erase it into an exception_ptr +instance. Please note that this code is exclusively defined in the app namespace:

    + +
    namespace app
    +{
    +  // Specialise an exception type for httplib errors
    +  struct httplib_error : std::runtime_error
    +  {
    +    // passthrough
    +    using std::runtime_error::runtime_error;
    +    httplib_error(httplib::failure _failure, std::string msg)
    +        : std::runtime_error(std::move(msg))
    +        , failure(std::move(_failure))
    +    {
    +    }
    +
    +    // the original failure
    +    httplib::failure failure;
    +  };
    +
    +  // Type erase httplib::result<U> into a httplib_error exception ptr
    +  template <class U>  //
    +  inline std::exception_ptr make_httplib_exception(const httplib::result<U> &src)
    +  {
    +    std::string str("httplib failed with error ");
    +    switch(src.error().status)
    +    {
    +    case httplib::status_code::success:
    +      str.append("success");
    +      break;
    +    case httplib::status_code::bad_request:
    +      str.append("bad request");
    +      break;
    +    case httplib::status_code::access_denied:
    +      str.append("access denied");
    +      break;
    +    case httplib::status_code::logon_failed:
    +      str.append("logon failed");
    +      break;
    +    case httplib::status_code::forbidden:
    +      str.append("forbidden");
    +      break;
    +    case httplib::status_code::not_found:
    +      str.append("not found");
    +      break;
    +    case httplib::status_code::internal_error:
    +      str.append("internal error");
    +      break;
    +    }
    +    str.append(" [url was ");
    +    str.append(src.error().url);
    +    str.append("]");
    +    return std::make_exception_ptr(httplib_error(src.error(), std::move(str)));
    +  }
    +}  // namespace app
    +
    View this code on Github
    + + +

    Most of the complexity in this code fragment is driven by the need to create +some sort of descriptive string for std::runtime_error +so its .what() returns a useful summary of the original failure. This +is the main purpose of the app::make_httplib_exception() function.

    + +

    (Note that if you have Reflection in your C++ compiler, it may be possible to script +the conversion of enum values to string representations)

    + +

    The only real thing to note about app::httplib_error is that it squirrels away +the original httplib::failure in case that is ever needed.

    + + +

    Last revised: February 11, 2019 at 13:38:04 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/tutorial/advanced/interop/app-map-httplib2.html b/doc/html/tutorial/advanced/interop/app-map-httplib2.html new file mode 100644 index 000000000..882d65e72 --- /dev/null +++ b/doc/html/tutorial/advanced/interop/app-map-httplib2.html @@ -0,0 +1,94 @@ + + +Mapping the HTTP library into the Application <sup>2</sup>⁄<sub>2</sub> - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    Mapping the HTTP library into the Application 2/2

    +

    If you remember the tutorial section on the value_or_error Concept, +this is an example of how to implement a custom value_or_error Concept converter +in Outcome:

    + +
    // Inject custom ValueOrError conversion
    +BOOST_OUTCOME_V2_NAMESPACE_BEGIN
    +namespace convert
    +{
    +  // Provide custom ValueOrError conversion from
    +  // httplib::result<U> into any app::outcome<T>
    +  template <class T, class U>  //
    +  struct value_or_error<app::outcome<T>, httplib::result<U>>
    +  {
    +    // False to indicate that this converter wants `result`/`outcome`
    +    // to NOT reject all other `result`
    +    static constexpr bool enable_result_inputs = true;
    +    // False to indicate that this converter wants `outcome` to NOT
    +    // reject all other `outcome`
    +    static constexpr bool enable_outcome_inputs = true;
    +
    +    template <class X,                                                                              //
    +              typename = std::enable_if_t<std::is_same<httplib::result<U>, std::decay_t<X>>::value  //
    +                                          && std::is_constructible<T, U>::value>>                   //
    +    constexpr app::outcome<T> operator()(X &&src)
    +    {
    +      // Forward any successful value, else synthesise an exception ptr
    +      return src.has_value() ?                              //
    +             app::outcome<T>{std::forward<X>(src).value()}  //
    +             :
    +             app::outcome<T>{app::make_httplib_exception(std::forward<X>(src))};
    +    }
    +  };
    +}  // namespace convert
    +BOOST_OUTCOME_V2_NAMESPACE_END
    +
    View this code on Github
    + + +

    The first thing that you should note is that these custom converters must be injected +directly into the BOOST_OUTCOME_V2_NAMESPACE::convert namespace, and they must partially +or completely specialise value_or_error<T, U> +. Here we specialise the +converter for value_or_error conversions from httplib::result<U> to app::outcome<T> +i.e. from our third party HTTP library’s error type into our application’s outcome +type (which is unique to our application, as we hard code an app-local error type).

    + +

    The second thing to note is that you need to set enable_result_inputs and enable_outcome_inputs +appropriately, otherwise result and outcome inputs will not be matched by this +converter1. In this converter, we really do wish to convert other result and +outcome inputs, so we mark these booleans as true.

    + +

    The third thing to note is the requirements on operator(). If the requirements are +not met, the value_or_error converting constructor in basic_result and basic_outcome +disables. Note the requirement that the decayed operator() input X matches +httplib::result<U>, and that T is constructible from U. This means that the +explicit basic_result(concepts::value_or_error<T, E> &&) + and explicit basic_outcome(concepts::value_or_error<T, E> &&) + +constructors are available if, and only if, the input type is a httplib::result<U>, +and the result’s value type is constructible from the input’s value type.

    + +

    If operator() is available, it naturally converts a httplib::result<U> into an +app::outcome<T> by either forwarding any success as-is, or calling app::make_httplib_exception() +to type erase the httplib::failure into an app::httplib_error.

    +
    + +
    + +
      +
    1. Here we refer to result and outcome as defined by this specific Outcome library. If result or outcome from another Outcome implementation is seen, those always must get parsed via the ValueOrError matching conversion framework. + [return]
    2. +
    +
    + + +

    Last revised: December 15, 2020 at 12:22:39 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/tutorial/advanced/interop/app-map-tidylib.html b/doc/html/tutorial/advanced/interop/app-map-tidylib.html new file mode 100644 index 000000000..afddc8334 --- /dev/null +++ b/doc/html/tutorial/advanced/interop/app-map-tidylib.html @@ -0,0 +1,66 @@ + + +Mapping the HTMLTidy library into the Application - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    Mapping the HTMLTidy library into the Application

    +

    Once again, we create a custom STL exception type to represent failure +from the HTMLTidy library. We also create an app namespace wrapper +for the C tidy_html() function which is more C++ friendly.

    + +
    namespace app
    +{
    +  // Specialise an exception type for tidylib errors
    +  struct tidylib_error : std::system_error
    +  {
    +    // passthrough
    +    using std::system_error::system_error;
    +    tidylib_error() = default;
    +    explicit tidylib_error(int c)
    +        : std::system_error(c, std::generic_category())
    +    {
    +    }
    +  };
    +
    +  // Create a C++ invoking wrapper for the tidylib C API, modifying data with the returned data,
    +  // returing a unique_ptr to release storage on scope exit.
    +  struct call_free
    +  {
    +    template <class T> void operator()(T *p) { ::free(p); }
    +  };
    +  inline outcome<std::unique_ptr<char, call_free>> tidy_html(string_view &data)
    +  {
    +    char *out = nullptr;
    +    size_t outlen = 0;
    +    int errcode = ::tidy_html(&out, &outlen, data.data(), data.size());
    +    if(errcode != 0)
    +    {
    +      // If the error code matches a standard STL exception, throw as that.
    +      BOOST_OUTCOME_V2_NAMESPACE::try_throw_std_exception_from_error(std::error_code(errcode, std::generic_category()));
    +      // Otherwise wrap the error code into a tidylib_error exception throw
    +      return std::make_exception_ptr(tidylib_error(errcode));
    +    }
    +    // Reset input view to tidied html
    +    data = string_view(out, outlen);
    +    // Return a unique ptr to release storage on scope exit
    +    return std::unique_ptr<char, call_free>(out);
    +  }
    +}  // namespace app
    +
    View this code on Github
    + + + +

    Last revised: February 08, 2019 at 22:18:08 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/tutorial/advanced/interop/app.html b/doc/html/tutorial/advanced/interop/app.html new file mode 100644 index 000000000..d218f0185 --- /dev/null +++ b/doc/html/tutorial/advanced/interop/app.html @@ -0,0 +1,67 @@ + + +The Application - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    The Application

    +

    The application is of course also based on Outcome, and like the HTTP library +is also of mixed-failure design in that failure can be returned via error code, +type erased exception_ptr or indeed a C++ exception throw.

    + +
    // This is the namespace of the application which is connecting together the httplib,
    +// filelib and tidylib libraries into a solution.
    +namespace app
    +{
    +  // Create an ADL bridge so copy/move hooks will be searched for in this namespace
    +  struct error_code : public std::error_code
    +  {
    +    // passthrough
    +    using std::error_code::error_code;
    +    error_code() = default;
    +    error_code(std::error_code ec)
    +        : std::error_code(ec)
    +    {
    +    }
    +  };
    +  // Localise an outcome implementation for this namespace
    +  template <class T>
    +  using outcome =  //
    +  BOOST_OUTCOME_V2_NAMESPACE::outcome<T, error_code /*, std::exception_ptr */>;
    +  using BOOST_OUTCOME_V2_NAMESPACE::success;
    +}  // namespace app
    +
    View this code on Github
    + + +

    Here we localise a passthrough error_code solely for the purpose of ADL bridging, otherwise +the localised outcome configured is the default one which comes with Outcome. +We covered this technique of “passthrough error_code” earlier in this tutorial.

    + +

    The way we are going to configure interop is as follows:

    + +
      +
    1. The application shall use error_code for anticipated failure and C++ +exception throws for unanticipated failure.
    2. +
    3. We shall choose the convention that app::outcome with exception ptr +solely and exclusively represents a type erased failure from a third party +library.
    4. +
    + +

    Thus if one calls .value() on an app::outcome, both anticipated failure +within the app and type erased failure from a third party library shall be +converted to a C++ exception throw.

    + + +

    Last revised: February 11, 2019 at 17:14:51 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/tutorial/advanced/interop/conclusion.html b/doc/html/tutorial/advanced/interop/conclusion.html new file mode 100644 index 000000000..53463a4a0 --- /dev/null +++ b/doc/html/tutorial/advanced/interop/conclusion.html @@ -0,0 +1,38 @@ + + +Conclusion - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    Conclusion

    +

    This worked example was in fact excessively complex: a quicker route +to achieving the same thing would be to add explicit converting constructors +to app::error_code for each of the third party library E types. +One then could have saved oneself with having to bother injecting +custom converters into the BOOST_OUTCOME_V2_NAMESPACE::convert namespace. +If you control your application’s E type, then that is probably a +better, and certainly simpler, approach.

    + +

    However there are occasions when you don’t have control over the +implementation of the destination E type e.g. in callbacks. Outcome’s value_or_error +infrastructure lets you inject custom interop code for any pair +of incommensurate third party E types, without needing to modify either’s +source code.

    + +

    This is without doubt a “power users” feature, but +one which will prove useful as T|E based C++ code proliferates.

    + + +

    Last revised: December 15, 2020 at 12:22:39 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/tutorial/advanced/interop/filelib.html b/doc/html/tutorial/advanced/interop/filelib.html new file mode 100644 index 000000000..be88dd259 --- /dev/null +++ b/doc/html/tutorial/advanced/interop/filelib.html @@ -0,0 +1,65 @@ + + +The File I/O library - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    The File I/O library

    +

    The File I/O library we shall be using is very similar to the one we saw earlier +in this tutorial:

    + +
    // You may remember this from the tutorial section on Custom Payloads
    +namespace filelib
    +{
    +  // Error code + paths related to a failure. Also causes ADL discovery
    +  // to check this namespace.
    +  struct failure_info
    +  {
    +    std::error_code ec;
    +    path path1{}, path2{};
    +  };
    +
    +  // Tell Outcome that failure_info is to be treated as a std::error_code
    +  inline const std::error_code &make_error_code(const failure_info &fi) { return fi.ec; }
    +
    +  // Tell Outcome that no-value observation should throw a custom exception
    +  inline void outcome_throw_as_system_error_with_payload(failure_info fi)
    +  {
    +    // If the error code is not filesystem related e.g. ENOMEM, throw that
    +    // as a standard STL exception.
    +    BOOST_OUTCOME_V2_NAMESPACE::try_throw_std_exception_from_error(fi.ec);
    +    // Throw the exact same filesystem_error exception which the throwing
    +    // copy_file() edition does.
    +    throw filesystem_error(fi.ec.message(), std::move(fi.path1), std::move(fi.path2), fi.ec);
    +  }
    +
    +  // Localise a result implementation specific to this namespace.
    +  template <class T> using result = BOOST_OUTCOME_V2_NAMESPACE::result<T, failure_info>;
    +
    +  // Writes a chunk of data to some file. Returns bytes written, or
    +  // failure_info. Never throws exceptions.
    +  result<size_t> write_file(string_view chunk) noexcept;
    +}  // namespace filelib
    +
    View this code on Github
    + + +

    This uses the advanced Outcome feature of programming the lazy synthesis of +custom C++ exception throws from a payload carrying E type called failure_info. +Like the HTTP library, it too template aliases a localised result implementation +into its namespace with ADL bridging so Outcome customisation points can be +discovered.

    + + +

    Last revised: February 08, 2019 at 22:18:08 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/tutorial/advanced/interop/httplib.html b/doc/html/tutorial/advanced/interop/httplib.html new file mode 100644 index 000000000..65a4c7c88 --- /dev/null +++ b/doc/html/tutorial/advanced/interop/httplib.html @@ -0,0 +1,73 @@ + + +The HTTP library - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    The HTTP library

    +

    Let us imagine a simple application: it fetches a HTTP page using a HTTP library, +sends it through HTML tidy via the htmltidy library, and then writes it to disc +using a filelib library. So three third party libraries, two using Outcome in +incompatible ways, and the third being a C library just for kicks.

    + +

    Let us imagine that the HTTP library has the following public interface:

    + +
    // This is some standalone library implementing high level HTTP
    +namespace httplib
    +{
    +  // These are the error code that this HTTP library can return
    +  enum class status_code
    +  {
    +    success = 0,  // not the HTTP success code of 200
    +
    +    // A subset of all HTTP status codes for brevity
    +    bad_request = 400,
    +    access_denied = 401,
    +    logon_failed = 402,
    +    forbidden = 403,
    +    not_found = 404,
    +    internal_error = 500
    +  };
    +  // This is the error type that this HTTP library can return
    +  struct failure
    +  {
    +    status_code status{status_code::success};
    +    std::string url{};  // The failing URL
    +  };
    +  // Localise a result implementation to this library, holding
    +  // the logic error of incorrect observation to mean program
    +  // termination.
    +  template <class T>
    +  using result =  //
    +  BOOST_OUTCOME_V2_NAMESPACE::result<T, failure, BOOST_OUTCOME_V2_NAMESPACE::policy::terminate>;
    +
    +  /* Performs a HTTP GET on the url, returning the body if successful,
    +  a failure with status_code if unsuccessful at the HTTP level, or a
    +  C++ exception throw if something catastrophic happened e.g. bad_alloc
    +  */
    +  result<std::string> get(std::string url);
    +}  // namespace httplib
    +
    View this code on Github
    + + +

    The HTTP library is a mixed-failure design. Likely failures (HTTP status codes) +are returned via httplib::failure, unlikely failures (e.g. out of memory) +are returned via throw of the usual STL exception types.

    + +

    The sole API we bother describing is an implementation of HTTP GET. It fetches +a URL, and either returns the contents or the failure reason why not.

    + + +

    Last revised: February 08, 2019 at 22:18:08 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/tutorial/advanced/interop/problem.html b/doc/html/tutorial/advanced/interop/problem.html new file mode 100644 index 000000000..11c709274 --- /dev/null +++ b/doc/html/tutorial/advanced/interop/problem.html @@ -0,0 +1,82 @@ + + +Incommensurate E types - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    Incommensurate E types

    +

    Back in the essential tutorial section on result, we studied a likely very common +initial choice of E type: a strongly typed enum. +We saw how by marking up strongly typed enums to tell the C++ standard library +what they are, they gain implicit convertibility into std::error_code, and we +then pointed out that you might as well now always set E = std::error_code, as that +comes with the enormous advantage that you can use the boilerplate saving +BOOST_OUTCOME_TRY macro when the E type is always the same.

    + +

    We thus strongly recommend to users that for any given piece of code, always +using the same E type across the codebase is very wise, except where you explicitly want +to prevent implicit propagation of failure up a call stack e.g. local failures in +some domain specific piece of code.

    + +

    However it is unreasonable to expect that any non-trivial codebase can make do +with E = std::error_code. This is why Outcome allows you to use custom E +types which carry payload in addition to an error code, yet +still have that custom type treated as if a std::error_code, including lazy custom exception +throw synthesis.

    + +

    All this is good, but if library A uses result<T, libraryA::failure_info>, +and library B uses result<T, libraryB::error_info> and so on, there becomes +a problem for the application writer who is bringing in these third party +dependencies and tying them together into an application. As a general rule, +each third party library author will not have built in explicit interoperation +support for unknown other third party libraries. The problem therefore lands +with the application writer.

    + +

    The application writer has one of three choices:

    + +
      +
    1. In the application, the form of result used is result<T, std::variant<E1, E2, ...>> +where E1, E2 … are the failure types for every third party library +in use in the application. This has the advantage of preserving the original +information exactly, but comes with a certain amount of use inconvenience +and maybe excessive coupling between high level layers and implementation detail.

    2. + +
    3. One can translate/map the third party’s failure type into the application’s +failure type at the point of the failure +exiting the third party library and entering the application. One might do +this, say, with a C preprocessor macro wrapping every invocation of the third +party API from the application. This approach may lose the original failure detail, +or mis-map under certain circumstances if the mapping between the two systems +is not one-one.

    4. + +
    5. One can type erase the third party’s failure type into some application +failure type, which can later be reconstituted if necessary. This is the cleanest +solution with the least coupling issues and no problems with mis-mapping, but +it almost certainly requires the use of malloc, which the previous two did not.

    6. +
    + +

    Things get even more complicated in the presence of callbacks. If in the +callback you supply to library A, you call library B, you may need to insert +switch statement maps or other mechanisms to convert library B’s failures into +something library A can understand, and then somehow extract that out – preferably +without loss of original information – into the application’s failure handling +mechanism if library A subsequently returns failure as well. This implies +transmitting state by which to track these interrelated pieces of failure data.

    + +

    Let us see what Outcome can do to help the application writer address some of these +issues, next.

    + + +

    Last revised: February 09, 2019 at 15:18:26 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/tutorial/advanced/interop/tidylib.html b/doc/html/tutorial/advanced/interop/tidylib.html new file mode 100644 index 000000000..a2ded6ef1 --- /dev/null +++ b/doc/html/tutorial/advanced/interop/tidylib.html @@ -0,0 +1,37 @@ + + +The HTMLTidy library - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    The HTMLTidy library

    +
    // There actually is a library for tidying HTML into XHTML called HTMLTidy
    +// See http://www.html-tidy.org/
    +// HTMLTidy is actually a great tool for dealing with 1990s-era tag soup
    +// HTML, I highly recommend it.
    +
    +// This isn't the API for Tidy, but let's assume it's a C library returning
    +// errno domained error codes. out must be freed with free() after use.
    +extern "C" int tidy_html(char **out, size_t *outlen, const char *in, size_t inlen);
    +
    View this code on Github
    + + +

    A C API may not initially appear to be a T|E based API, but if failure +returns some domained error code and causes no other effects, and success +returns some value, then it is effectively a “split” T|E API. The above +is an example of exactly that form of “split” T|E API.

    + + +

    Last revised: February 08, 2019 at 22:18:08 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/tutorial/advanced/interop/value-or-error.html b/doc/html/tutorial/advanced/interop/value-or-error.html new file mode 100644 index 000000000..4643dc061 --- /dev/null +++ b/doc/html/tutorial/advanced/interop/value-or-error.html @@ -0,0 +1,68 @@ + + +value_or_error Concept - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    value_or_error Concept

    + + +

    Something not really mentioned until now is how Outcome interoperates with the proposed + + P0323 std::expected<T, E> +, whose design lands in between unchecked<T, E = varies> + +and checked<T, E = varies> + (both of which are type aliases hard coding no-value +policies as previously covered in this tutorial).

    + +

    Expected and Outcome are isomorphic to one another in design intent, but interoperation +for code using Expected and Outcome ought to be seamless thanks to the proposed ValueOrError +concept framework, a subset of which Outcome implements.

    + +

    The explicit basic_result(concepts::value_or_error<T, E> &&) + and explicit basic_outcome(concepts::value_or_error<T, E> &&) + +constructors will explicitly construct from any type matching the concepts::value_or_error<T, E> + +concept, which includes std::expected<A, B>, if A is constructible to X, and B is +constructible to Y. The value_or_error concept in turn is true if and only if the input type has:

    + +
      +
    1. A .has_value() observer returning a bool.
    2. +
    3. .value() and .error() observers.
    4. +
    + +

    Implementation

    + +

    Outcome’s machinery for implementing concepts::value_or_error conversion is user extensible by injection +of specialisations of the value_or_error<T, U> + type into the BOOST_OUTCOME_V2_NAMESPACE::convert namespace.

    + +

    Outcome’s default convert::value_or_error<T, U> implementation explicitly +excludes Outcome result and outcome types from the default mechanism as +there is a major gotcha: the value_or_error matched type’s .value() is often +not callable in constexpr as it can throw, which makes this conversion mechanism +pretty much useless for constexpr code. Besides, outcome has a converting +constructor overload for result inputs which is constexpr capable.

    + +

    Note that if you do enable outcome inputs, a result will match an input +outcome, but silently dropping any exception state. This is probably undesirable.

    + +

    Examples of how to implement your own convert::value_or_error<T, U> converter +is demonstrated in the worked example, next.

    + + +

    Last revised: December 15, 2020 at 12:22:39 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/tutorial/advanced/payload.html b/doc/html/tutorial/advanced/payload.html new file mode 100644 index 000000000..83368e0ef --- /dev/null +++ b/doc/html/tutorial/advanced/payload.html @@ -0,0 +1,59 @@ + + +Custom payloads - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    + +

    Custom payloads

    +

    So far in this tutorial, type EC in result<T, EC> has always been a +std::error_code or boost::system::error_code. With NoValuePolicy +set to default_policy<T, EC, EP> +, EC needs +in fact to merely satisfy the trait +is_error_code_available<T> + +for EC to be treated as if an error_code. Outcome specialises that +trait for std::error_code and boost::system::error_code, +hence they “just work”.

    + +

    If no specialisation exists, trait::is_error_code_available<EC> is true +if there exists some ADL discovered free function make_error_code(EC).

    + +

    Thus, we can in fact use any custom EC type we like, including one carrying additional +information, or payload. This payload can carry anything you like, and you can tell +Outcome to do various things with that payload under various circumstances. For example:

    + +
      +
    1. If the user tries to observe an unsuccessful result, throw a custom exception +containing the cause of failure with accompanying context from the payload.
    2. +
    3. If the user ever constructs an outcome from a payload carrying result, +set the exception ptr in the constructed outcome to a custom exception +containing the cause of the failure with accompanying context from the payload.
    4. +
    5. Transmit a stack backtrace specifying the exact point at which failure occurred, +symbolising that backtrace into human readable text at the moment of conversion into human +readable text.
    6. +
    7. Upon a namespace-localised result from library A being copy/moved into a +namespace-localised result from C bindings library B, set the C errno if +the error code and category map onto the errno domain.
    8. +
    + +

    There are many, many other options of course. This tutorial can only cover a +reasonable subset. This section covers Example 1 above, throwing custom exceptions +with payload upon observation of an unsuccessful result.

    + + + +

    Last revised: February 08, 2019 at 22:18:08 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/tutorial/advanced/payload/copy_file.html b/doc/html/tutorial/advanced/payload/copy_file.html new file mode 100644 index 000000000..f7e07c005 --- /dev/null +++ b/doc/html/tutorial/advanced/payload/copy_file.html @@ -0,0 +1,59 @@ + + +The Filesystem TS - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    The Filesystem TS

    +

    Something which has long annoyed the purists in the C++ leadership is the problem of dual +overloads in error_code capable standard library APIs.

    + +

    Consider the +copy_file() +API from the Filesystem TS:

    + +
    namespace filesystem
    +{
    +  /*! Copies the file at path `from` to path `to`.
    +  \returns True if file was successfully copied.
    +  \throws On failure throws `filesystem_error(ec.message(), from, to, ec)` with
    +  `ec` being the error code reported by the operating system.
    +  */
    +  bool copy_file(const path &from, const path &to);
    +
    +  /*! Copies the file at path `from` to path `to`.
    +  \returns True if file was successfully copied. If false, `ec` is written with
    +  the error code reported by the operating system.
    +  \throws May throw an exception if there is some "catastrophic" failure
    +  e.g. failure to allocate memory.
    +  */
    +  bool copy_file(const path &from, const path &to, std::error_code &ec);
    +}
    +
    View this code on Github
    + + +

    Before Outcome, the common design pattern was to provide throwing and non-throwing overloads +of every API. As you can see above, the throwing API throws a filesystem::filesystem_error +exception type which carries additional information, specifically two paths. These paths may +refer to the files which were the source of any failure. However the non-throwing overload +does not provide this additional information, which can make it more annoying to use the +non-throwing overload sometimes.

    + +

    What if we could replace these two overloads of every API in the Filesystem TS with a single API, +and additionally have the non-throwing edition return the exact same additional information +as the throwing edition?

    + + +

    Last revised: February 08, 2019 at 22:18:08 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/tutorial/advanced/payload/copy_file2.html b/doc/html/tutorial/advanced/payload/copy_file2.html new file mode 100644 index 000000000..6af4df6f5 --- /dev/null +++ b/doc/html/tutorial/advanced/payload/copy_file2.html @@ -0,0 +1,62 @@ + + +Upgrading the Filesystem TS - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    Upgrading the Filesystem TS

    +

    An Outcome based solution to the dual overload problem is straightforward:

    + +
    namespace filesystem2
    +{
    +  // Error code + paths related to a failure. Also causes ADL discovery to check this namespace.
    +  struct failure_info
    +  {
    +    std::error_code ec;
    +    path path1, path2;
    +  };
    +
    +  // Tell Outcome that failure_info is to be treated as a std::error_code
    +  inline const std::error_code &make_error_code(const failure_info &fi) { return fi.ec; }
    +
    +  // Localise an outcome implementation specific to this namespace. Normally would just
    +  // be `result`, but for clarity we'll use `fs_result`.
    +  template <class T> using fs_result = outcome::result<T, failure_info>;
    +
    +  /*! Copies the file at path `from` to path `to`.
    +  \returns Successful if file was successfully copied, otherwise the error code reported
    +  by the operating system plus a payload of the paths involved.
    +  \throws Never throws.
    +  */
    +  fs_result<void> copy_file(const path &from, const path &to) noexcept;
    +}
    +
    View this code on Github
    + + +

    Starting at the bottom, there is now a single copy_file() function which returns a fs_result<void>. +As result is either successful or not, there is no longer any point in returning a boolean, so we +simply return void on success. On failure, as the template alias fs_result<T> above it shows, +we are returning a failure_info structure containing an error code and the same additional information +as filesystem_error provides.

    + +

    It is important to note that the fact that failure_info is defined in namespace filesystem2 is very +important. This is because Outcome uses Argument Dependent Lookup (ADL) +to find the make_error_code() +function, as well as other customisation point free functions. In other words, only the namespaces as +defined by ADL are searched when finding a free function telling us what to do for failure_info, +which includes the namespace failure_info is declared into.

    + + +

    Last revised: February 08, 2019 at 22:18:08 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/tutorial/advanced/payload/copy_file3.html b/doc/html/tutorial/advanced/payload/copy_file3.html new file mode 100644 index 000000000..cbb1a7382 --- /dev/null +++ b/doc/html/tutorial/advanced/payload/copy_file3.html @@ -0,0 +1,100 @@ + + +Auto-throwing filesystem_error - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    Auto-throwing filesystem_error

    +

    Something not mentioned at all until now (and properly described in the next +section, Default actions) is that Outcome can be +programmed take various actions when the user tries to observe .value() +when there is no value, and so on for the other possible state observations.

    + +

    Seeing as we are replacing the throwing overload of copy_file() in the +Filesystem TS with a result returning edition instead, it would make +sense if an attempt to observe the value of an unsuccessful fs_result +threw the exact same filesystem_error as the Filesystem TS does.

    + +

    Telling Outcome how to throw a filesystem_error with payload of the +failing paths is easy:

    + +
    namespace filesystem2
    +{
    +  // If we would like Outcome to do something other than the default action (see next
    +  // section), we can declare this ADL discovered free function to customise what
    +  // to do instead.
    +  //
    +  // Note that rvalue semantics are propagated internally by Outcome, so if the user
    +  // called .value() on a rvalued result, failure_info will be moved rather than
    +  // copied from the result. That means we can overload once with value semantics,
    +  // and not need to overload for lvalue and rvalue situations unless we really feel
    +  // we need to for some reason.
    +  inline void outcome_throw_as_system_error_with_payload(failure_info fi)
    +  {
    +    // If the error code is not filesystem related e.g. ENOMEM, throw that as a
    +    // standard STL exception.
    +    outcome::try_throw_std_exception_from_error(fi.ec);
    +    // Throw the exact same filesystem_error exception which the throwing copy_file()
    +    // edition does.
    +    throw filesystem_error(fi.ec.message(), std::move(fi.path1),  //
    +                           std::move(fi.path2), fi.ec);
    +  }
    +}
    +
    View this code on Github
    + + +

    Reference documentation for the above functions:

    + + + +

    Usage of our new “upgraded” Filesystem copy_file() might now be as follows:

    + +
      // Non-throwing use case
    +  auto o = filesystem2::copy_file("dontexist", "alsodontexist");
    +  if(!o)
    +  {
    +    std::cerr << "Copy file failed with error " << o.error().ec.message()                   //
    +              << " (path1 = " << o.error().path1 << ", path2 = " << o.error().path2 << ")"  //
    +              << std::endl;
    +  }
    +
    +  // Throwing use case
    +  try
    +  {
    +    // Try to observe the successful value, thus triggering default actions which invokes
    +    // our outcome_throw_as_system_error_with_payload() above which then throws filesystem_error
    +    // exactly like the Filesystem TS does for its throwing overload.
    +    filesystem2::copy_file("dontexist", "alsodontexist").value();
    +  }
    +  catch(const filesystem2::filesystem_error &e)
    +  {
    +    std::cerr << "Copy file failed with exception " << e.what()                 //
    +              << " (path1 = " << e.path1() << ", path2 = " << e.path2() << ")"  //
    +              << std::endl;
    +  }
    +  catch(const std::exception &e)
    +  {
    +    std::cerr << "Copy file failed with exception " << e.what()  //
    +              << std::endl;
    +  }
    +
    View this code on Github
    + + + +

    Last revised: February 08, 2019 at 22:18:08 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/tutorial/essential.html b/doc/html/tutorial/essential.html new file mode 100644 index 000000000..2feb8cb43 --- /dev/null +++ b/doc/html/tutorial/essential.html @@ -0,0 +1,53 @@ + + +Essential - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    + +

    Essential

    +
    1. + Before we begin +

      Essential information before you begin the tutorial.

    2. + result<> +

      Gentle introduction to writing code with simple success-or-failure return types.

      1. + Inspecting result
      2. + TRY operations
      3. + TRY is greedy
      4. + TRY avoiding copy/move
    3. + outcome<> +

      Success-or-failure return types where failure can take two forms, expected/handled failure and unexpected/abort failure.

      1. + Inspecting outcome
    4. + No-value policies +

      Describes the concept of NoValuePolicy and how to use no-value policies.

      1. + A custom no-value policy
      2. + Built-in policies
    5. + Coroutines +

      Using Outcome in C++ Coroutines

      1. + Coroutine TRY operation
      2. + Coroutine awaitables
      3. + Returning Outcome types from Coroutines
      4. + operator co_await as TRY operator
    6. + Conventions +

      Why you should avoid custom E types in public APIs.

    + + + + + + + + +

    Last revised: February 08, 2019 at 22:18:08 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/tutorial/essential/before.html b/doc/html/tutorial/essential/before.html new file mode 100644 index 000000000..2d4f24d27 --- /dev/null +++ b/doc/html/tutorial/essential/before.html @@ -0,0 +1,92 @@ + + +Before we begin - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    Before we begin

    + + +

    Outcome v2 namespace

    + +

    It is recommended that you refer to entities from this Outcome v2 via the following namespace alias:

    + +
    namespace outcome = BOOST_OUTCOME_V2_NAMESPACE;
    +
    View this code on Github
    + + +

    On standalone Outcome only, as patches and modifications are applied to this library, +namespaces get permuted in order to not to cause binary incompatibility. At some point +namespace outcome_v2 will be defined, and this will be the preferred namespace. +Until then BOOST_OUTCOME_V2_NAMESPACE denotes the most recently +updated version, getting closer to outcome_v2.

    + +

    On Boost.Outcome only, as Boost provides no binary compatibility across releases, +BOOST_OUTCOME_V2_NAMESPACE always expands into boost::outcome_v2.

    + +

    Online compilers

    + +

    If you’ve never used them before, you will find +Godbolt and Wandbox invaluable. +These let you play with C++ inside your web browser.

    + +

    Most of the source code snippets in Outcome have a link in their top right to +the original source code on github. You can copy and paste this source code into +Godbolt (if you wish to study the assembler generated) or Wandbox (if you +wish to run the program).

    + +

    Godbolt

    + +

    Godbolt is invaluable for visualising online the assembler generated for a +piece of C++, for all the major compilers and CPU architectures.

    + +

    Standalone Outcome is built into Godbolt! In the right hand pane toolbar, click the +libraries dropdown (currently third from the right, looks like a book), find +Outcome and choose the version you want.

    + +

    After this is selected, you can #include any of these editions of Outcome:

    + +
    +
    <outcome-basic.hpp>
    +
    An inclusion of basic_outcome.hpp + try.hpp which includes as few + system headers as possible in order to give an absolute minimum compile time + impact edition of Outcome. See https://github.com/ned14/stl-header-heft. +
    +
    <outcome-experimental.hpp>
    +
    An inclusion of experimental/status_outcome.hpp + try.hpp which + is the low compile time impact of the basic edition combined with + status_code from https://ned14.github.io/status-code/. If you are on an + embedded system where binary bloat must be absolutely avoided, and don't + mind the potentially unstable status_code, this is definitely the edition + for you. +
    +
    <outcome.hpp>
    +
    An inclusion of outcome.hpp which brings in all the specialisations + for the std STL types, plus iostreams support. If you don't know which + edition to use, you should use this one, it ought to "just work".
    +
    + +

    Here is the first tutorial topic’s source code loaded into Godbolt: https://godbolt.org/z/4of3c8

    + +

    Wandbox

    + +

    Wandbox lets you place a third party header into a separate tab. It also +comes with a recent Boost libraries. Either technique can be used to +explore Outcome.

    + +

    Here is the first tutorial topic’s source code loaded into Wandbox: https://wandbox.org/permlink/sJoeKHXSyCU5Avft

    + + +

    Last revised: December 15, 2020 at 12:22:39 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/tutorial/essential/conventions.html b/doc/html/tutorial/essential/conventions.html new file mode 100644 index 000000000..f277bbc15 --- /dev/null +++ b/doc/html/tutorial/essential/conventions.html @@ -0,0 +1,66 @@ + + +Conventions - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    + +

    Conventions

    + + +

    You now know everything you need to get started with using Outcome +immediately.

    + +

    The initial temptation for most beginners will be to use a bespoke +strongly typed enumeration on a case by case basis i.e. a “once off” +custom E type. This is usually due to experience in other languages +with sum types e.g. Rust, Haskell, Swift etc.

    + +

    However this is C++! Not Rust, not Swift, not Haskell! I must caution you to always avoid using +custom E types in public APIs. The reason is that every time +library A using custom E1 type must interface with library B +using custom E2 type, you must map between those E1 and E2 +types.

    + +

    This is information lossy, i.e. fidelity of failure gets lost +after multiple translations. It involves writing, and then +maintaining, a lot of annoying boilerplate. It leaks internal +implementation detail, and fails to separate concerns. And one +cannot use BOOST_OUTCOME_TRYV(expr)/BOOST_OUTCOME_TRY(expr) + +if there is no convertibility between E types.

    + +

    The C++ 11 standard library, and Boost, +specifically ships <system_error> for the purpose of wrapping up +individual custom E types into a generic framework, where disparate +custom E types can discover and interact with one another. +That ships with every C++ compiler.

    + +

    For all these reasons, this is why result and outcome default +the EC type to error code. You should leave that default alone +where possible.

    + +
    + +

    tl;dr;

    + +

    Please plug your library into std::error_code, +or equivalent, and do not expose +custom E types in ANY public API. result and outcome default +EC to an error code for good reason.

    + + + +

    Last revised: February 09, 2019 at 15:18:26 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/tutorial/essential/coroutines.html b/doc/html/tutorial/essential/coroutines.html new file mode 100644 index 000000000..eef394ea3 --- /dev/null +++ b/doc/html/tutorial/essential/coroutines.html @@ -0,0 +1,49 @@ + + +Coroutines - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    + +

    Coroutines

    +

    In v2.1.2 Outcome published official support for using +Outcome within C++ coroutines. This page documents that support.

    + +

    All standard C++ Coroutines have the following form:

    +
    // Coroutine functions MUST return an AWAITABLE type
    +AWAITABLE<int> function_name(Args ...)
    +{
    +  ... ordinary C++ ...
    +  if(!...)
    +  {
    +    co_return 5;  // CANNOT use ordinary 'return' from coroutines
    +  }
    +  ...
    +  // Possibly suspend this coroutine's execution until the
    +  // awaitable resumes execution of dependent code
    +  auto x = co_await expr_resulting_in_AWAITABLE;
    +  ...
    +}
    +
    +

    The type AWAITABLE<T> is any type which publishes the Coroutine protocol telling +C++ how to suspend and resume execution of a coroutine which returns a T. It is out of scope of +this page to document how to do this, however note that the eager<T, Executor = void> and lazy<T, Executor = void> +types below are completely generic awaitables suitable for use in ANY code. +They only behave differently if T, the type being returned by the awaitable, +is an Outcome type e.g. outcome::basic_result or outcome::basic_outcome.

    + + + +

    Last revised: March 18, 2022 at 14:45:32 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/tutorial/essential/coroutines/awaitables.html b/doc/html/tutorial/essential/coroutines/awaitables.html new file mode 100644 index 000000000..fb918014b --- /dev/null +++ b/doc/html/tutorial/essential/coroutines/awaitables.html @@ -0,0 +1,62 @@ + + +Coroutine awaitables - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    Coroutine awaitables

    +

    The second part of the support is provided by header <boost/outcome/coroutine_support.hpp> +(or <boost/outcome/experimental/coroutine_support.hpp> if you want Coroutine support for +Experimental Outcome). This adds into namespace BOOST_OUTCOME_V2_NAMESPACE::awaitables (or +BOOST_OUTCOME_V2_NAMESPACE::experimental::awaitables) these awaitable types suitable +for returning from a Coroutinised function:

    + +
      +
    • eager<T, Executor = void> + + +

      An eagerly evaluated Coroutine: invoking co_await upon a function returning one +of these immediately begins the execution of the function now. If the function never +suspends, the overhead is similar to calling an ordinary function.

    • + +
    • lazy<T, Executor = void> + + +

      A lazily evaluated Coroutine (often named task<T> in most C++ Coroutine +literature): invoking co_await upon a function returning one of these causes the +function to be immediately suspended as soon as execution begins. Only resuming +the execution of the coroutine proceeds execution.

    • + +
    • generator<T, Executor = void> + + +

      A lazily evaluated generator of values: the coroutine is resumed to generate +the next value, upon which it is suspended until the next iteration.

    • + +
    • atomic_eager<T, Executor = void>

      + +

      eager<T> does not employ thread synchronisation during resumption of dependent +coroutines which is fine if you do not traverse kernel threads during a +suspend-resume cycle. If you do however potentially traverse kernel threads +during suspend-resume, you ought to use atomic_eager<T> instead – this uses +atomics to synchronise the setting and checking of state to ensure correctness.

    • + +
    • atomic_lazy<T, Executor = void>

      + +

      Same for lazy<T> as atomic_eager<T> is for eager<T>.

    • +
    + + +

    Last revised: March 18, 2022 at 14:45:32 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/tutorial/essential/coroutines/co_await.html b/doc/html/tutorial/essential/coroutines/co_await.html new file mode 100644 index 000000000..c2896544a --- /dev/null +++ b/doc/html/tutorial/essential/coroutines/co_await.html @@ -0,0 +1,34 @@ + + +operator co_await as TRY operator - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    operator co_await as TRY operator

    +

    Many people have requested that operator co_await be overloaded to +behave as a TRY operator when supplied with an Outcome type.

    + +

    Outcome does not implement that extension, nor will we accept PRs +contributing support for this. We think you should use BOOST_OUTCOME_CO_TRY() +as this will lead to more maintainable and future proof code.

    + +

    However, we deliberately do not get in the way of you implementing +that overload yourself in your own Outcome-based code. Just be sure +that you document what you are doing loudly and clearly, and be +aware that future C++ standards may have a proper operator try +overload mechanism.

    + + +

    Last revised: April 07, 2020 at 10:22:38 +0100

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/tutorial/essential/coroutines/returning.html b/doc/html/tutorial/essential/coroutines/returning.html new file mode 100644 index 000000000..cfe5df238 --- /dev/null +++ b/doc/html/tutorial/essential/coroutines/returning.html @@ -0,0 +1,48 @@ + + +Returning Outcome types from Coroutines - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    Returning Outcome types from Coroutines

    +

    eager<T, Executor = void> and lazy<T, Executor = void> and their atomic editions are completely standard +awaitables with no special behaviours, except if T is a basic_result +or basic_outcome. In that situation, the following occurs:

    + +

    If the Coroutine throws a C++ exception which was not handled inside the Coroutine +body, Outcome’s awaitable types try to convert it into a form which your Result or +Outcome type being returned can transport. For example:

    + +
      +
    • If your Coroutine were returning a result<T, std::exception_ptr>, an +errored Result with a pointer to the exception thrown would be returned.

    • + +
    • If your Coroutine were returning a result<T, std::error_code>, the +exception ptr is passed to error_from_exception( +) to see +if it can be matched to an equivalent std::error_code. If it can, an +errored Result with the equivalent error code would be returned.

    • + +
    • If your Coroutine were returning an outcome<T, std::error_code, std::exception_ptr>, +an Errored Outcome is chosen preferentially to an Excepted Outcome.

    • + +
    • If your Coroutine were returning an experimental::status_result<T, system_code>, +because Experimental SG14 system_code can transport error codes or +exception ptrs (or indeed std::error_code’s), an errored Result +is returned.

    • +
    + + +

    Last revised: March 18, 2022 at 14:45:32 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/tutorial/essential/coroutines/try.html b/doc/html/tutorial/essential/coroutines/try.html new file mode 100644 index 000000000..00b716607 --- /dev/null +++ b/doc/html/tutorial/essential/coroutines/try.html @@ -0,0 +1,35 @@ + + +Coroutine TRY operation - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    Coroutine TRY operation

    +

    As one cannot call statement return from within a Coroutine, the very first part of Outcome’s +support for Coroutines is BOOST_OUTCOME_CO_TRYV(expr)/BOOST_OUTCOME_CO_TRY(expr) +, +which is literally the same as BOOST_OUTCOME_TRY() except that co_return is called +to return early instead of return.

    +
    eager<result<std::string>> to_string(int x)
    +{
    +  if(x >= 0)
    +  {
    +    BOOST_OUTCOME_CO_TRY(convert(x));
    +  }
    +  co_return "out of range";
    +}
    +
    + +

    Last revised: April 07, 2020 at 10:22:38 +0100

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/tutorial/essential/no-value.html b/doc/html/tutorial/essential/no-value.html new file mode 100644 index 000000000..64f0290b2 --- /dev/null +++ b/doc/html/tutorial/essential/no-value.html @@ -0,0 +1,90 @@ + + +No-value policies - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    + +

    No-value policies

    +

    In the previous section we have seen that it would be useful if calling member +function .value() on object of type outcome<T> that did not contain a value, +would cause an exception to be thrown according to some user-defined policy.

    + +

    Let us consider result<T> first. It is an alias to basic_result<T, E, NoValuePolicy> +, +where E is the type storing error information and defaulted to +std::error_code/boost::system::error_code, and NoValuePolicy +is a no-value policy defaulted to default_policy<T, EC, EP> +.

    + +

    The semantics of basic_result::value() are:

    + +
      +
    1. Calls NoValuePolicy::wide_value_check(*this).
    2. +
    3. Return a reference to the contained value. If no value is actually stored, +your program has entered undefined behaviour.
    4. +
    + +

    Thus, the semantics of function .value() depend on the no-value policy. The +default policy (policy::default_policy<T, EC, void>) for EC of type +std::error_code1 does the following:

    + +
      +
    • If r.has_value() == false throws exception std::system_error{r.error()},
    • +
    • otherwise no effect.
    • +
    + +
    +
    note
    +

    Class templates basic_result<T, E, NoValuePolicy> + and basic_outcome<T, EC, EP, NoValuePolicy>

    + +

    never use exceptions. Any exception-related logic is provided exclusively +through no-value policies.

    +
    +
    + + +

    When designing your own success-or-failure type using templates +basic_result<> or basic_outcome<> you have to decide what no-value policy +you want to use. Either create your own, or use one of the predefined policies.

    + +

    You can also use one of the two other predefined aliases for basic_result<>:

    + + +
    + +
    + +
      +
    1. Similar overloads exist for throwing boost::system::system_error when EC is boost::system::error_code. + [return]
    2. +
    +
    + + + +

    Last revised: February 08, 2019 at 22:18:08 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/tutorial/essential/no-value/builtin.html b/doc/html/tutorial/essential/no-value/builtin.html new file mode 100644 index 000000000..7421c43c0 --- /dev/null +++ b/doc/html/tutorial/essential/no-value/builtin.html @@ -0,0 +1,151 @@ + + +Built-in policies - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    Built-in policies

    +

    These are the predefined policies built into Outcome:

    + +
    + +

     

    + +all_narrow + + +

    If there is an observation of a value/error/exception which is not present, +the program is put into a hard undefined behaviour situation. The +compiler literally compiles no code for an invalid observation – the +CPU “runs off” into the unknown.

    + +

    As bad as this may sound, it generates the most optimal code, and such +hard UB is very tool-friendly for detection e.g. undefined behaviour +sanitiser, valgrind memcheck, etc.

    + +

    If you are considering choosing this policy, definitely read +static void _ub(Impl &&) + first.

    + +

    Note that unchecked<T, E = varies> + aliases a basic_result +with the all_narrow no-value policy.

    + +
    + +

     

    + +terminate + + +

    Observation of a missing value/error/exception causes a call to +std::terminate().

    + +

    Note that configuring EC = void or EP = void causes +default_policy + to choose terminate as the no-value policy.

    + +
    + +

     

    + +error_code_throw_as_system_error<T, EC, EP> + + +

    This policy assumes that EC has the interface of std::error_code, +and EP has the interface of std::exception_ptr. Upon missing value +observation:

    + +
      +
    • if an exception is stored through pointer of type EP it is rethrown;
    • +
    • otherwise, if an error of type EC is stored, it is converted to error_code +and then thrown as system_error.
    • +
    + +

    Upon missing error observation throws:

    + +
      +
    • bad_result_access("no error") from instances of basic_result<>.
    • +
    • bad_outcome_access("no error") from instances of basic_outcome<>.
    • +
    + +

    Upon missing exception observation throws bad_outcome_access("no exception").

    + +

    Overloads are provided for boost::system::error_code and boost::exception_ptr.

    + +

    Note that if is_error_code_available<T> + is true for EC, +and (if basic_outcome) is_exception_ptr_available<T> + +is true for EP, default_policy + chooses +error_code_throw_as_system_error<T, EC, EP> as the no-value policy.

    + +
    + +

     

    + +exception_ptr_rethrow<T, EC, EP> + + +

    This policy assumes that either EC or EP (unless void) has the interface of std::exception_ptr. Upon missing value observation:

    + +
      +
    • in instances of basic_result<>, rethrows exception pointed to by EC;
    • +
    • in instances of basic_outcome<>, if exception EP is present rethrows it, +otherwise rethrows EC.
    • +
    + +

    Upon missing error observation:

    + +
      +
    • in instances of basic_result<>, throws bad_result_access("no error") ;
    • +
    • in instances of basic_outcome<>, throws bad_outcome_access("no error").
    • +
    + +

    Upon missing exception observation throws bad_outcome_access("no exception").

    + +

    Overloads are provided for boost::exception_ptr.

    + +

    Note that if is_exception_ptr_available<T> + is true for EC, +or (if basic_outcome) is_exception_ptr_available<T> + +is true for EP, default_policy + chooses +exception_ptr_rethrow<T, EC, EP> as the no-value policy.

    + +
    + +

     

    + +throw_bad_result_access<EC> + + +

    Upon missing value observation throws bad_result_access_with<EC>(ec), +where ec is the value of the stored error. If error is not stored, +the behaviour is undefined.

    + +

    Upon missing error observation throws bad_result_access("no error").

    + +

    This policy can be used with basic_outcome<> instances, where it always +throws bad_outcome_access for all no-value/error/exception observations.

    + +

    Note that checked<T, E = varies> + aliases a basic_result +with the throw_bad_result_access<EC> no-value policy.

    + + +

    Last revised: February 09, 2019 at 15:18:26 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/tutorial/essential/no-value/custom.html b/doc/html/tutorial/essential/no-value/custom.html new file mode 100644 index 000000000..321c0c6ec --- /dev/null +++ b/doc/html/tutorial/essential/no-value/custom.html @@ -0,0 +1,60 @@ + + +A custom no-value policy - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    A custom no-value policy

    +

    If you want your basic_outcome<> or basic_result<> instances to call +std::abort() whenever .value() is called on an object that does not contain a value, or .error() is called on an object that does not contain an error, you will need to define your own no-value policy as follows:

    + +
    struct abort_policy : outcome::policy::base
    +{
    +  template <class Impl> static constexpr void wide_value_check(Impl &&self)
    +  {
    +    if(!base::_has_value(std::forward<Impl>(self)))
    +      std::abort();
    +  }
    +
    +  template <class Impl> static constexpr void wide_error_check(Impl &&self)
    +  {
    +    if(!base::_has_error(std::forward<Impl>(self)))
    +      std::abort();
    +  }
    +
    +  template <class Impl> static constexpr void wide_exception_check(Impl &&self)
    +  {
    +    if(!base::_has_exception(std::forward<Impl>(self)))
    +      std::abort();
    +  }
    +};
    +
    View this code on Github
    + + +

    All policies ought to inherit from base + in order to provide your policy implementation with +the internal policy API for accessing and manipulating result and outcome state.

    + +

    Once the policy is defined, you have to specify it when providing your own +basic_outcome specialization:

    + +
    template <typename T>
    +using strictOutcome =  //
    +outcome::basic_outcome<T, std::error_code, std::exception_ptr, abort_policy>;
    +
    View this code on Github
    + + + +

    Last revised: February 08, 2019 at 22:18:08 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/tutorial/essential/outcome.html b/doc/html/tutorial/essential/outcome.html new file mode 100644 index 000000000..939719f9e --- /dev/null +++ b/doc/html/tutorial/essential/outcome.html @@ -0,0 +1,85 @@ + + +outcome<> - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    + +

    outcome<>

    + + +

    Type outcome<T, EC = varies, EP = varies, NoValuePolicy = policy::default_policy<T, EC, EP>> + represents either a successfully computed value of type T, or one or two reasons for failure. Failure can be represented by EC, or EP, or both, although usually it will either be an EC or an EP. +Similarly to result, EC defaults to std::error_code/boost::system::error_code, and EP defaults to std::exception_ptr/boost::exception_ptr.

    + +

    The distinction is made into two types, EC and EP:

    + + + +

    It should be emphasised that this distinction is by convention only, but it will be confusing to your +users if you deviate significantly from this convention.

    + +
    + +

    Legacy codebases

    + +

    outcome is useful for transporting exceptions across layers of the program that were never designed with exception safety in mind.

    + +

    Consider a program consisting of three layers:

    + + +
    + +

    The highest-level layer, Layer3, uses exceptions for signalling failures. The middle layer, Layer2_old, +was not designed with exception safety in mind and functions need to return information about failures in return value. +But down in the implementation details, in Layer1, another library is used that again throws exceptions. The goal is +to be able to transfer an exception thrown in Layer1 through Layer2_old, which is not exception-safe, +and be able to rethrow it in Layer3.

    + +

    In Layer1 we have two functions from two libraries: one reports failures by throwing exceptions, the other by returning result<>:

    + +
    auto f() -> int;  // throws on failure
    +auto g() noexcept -> outcome::result<int>;
    +
    View this code on Github
    + + +

    In Layer2_old we cannot use exceptions, so its function h uses return type outcome<> to report failures. It is using functions f and g and reports their failures inside outcome<>:

    + +
    auto old::h() noexcept -> outcome::outcome<int>
    +{
    +  BOOST_OUTCOME_TRY(auto i, (g()));             // #1
    +    
    +  try {
    +    return i + f();
    +  }
    +  catch (...) {
    +    return std::current_exception(); // #2
    +  }
    +}
    +
    View this code on Github
    + + +

    #1. Operator TRY can forward failures encoded in result<T, EC> as outcome<T, EC, EP> without any loss in information. You can also use TRY to forward failure from one outcome<> to another.

    + +

    #2. You can store the current exception through std::exception_ptr inside outcome<T, EC, EP> without any loss in information + (provided that EP is std::exception_ptr).

    + + + +

    Last revised: March 19, 2019 at 22:57:48 +0100

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/tutorial/essential/outcome/inspecting.html b/doc/html/tutorial/essential/outcome/inspecting.html new file mode 100644 index 000000000..f8e743a33 --- /dev/null +++ b/doc/html/tutorial/essential/outcome/inspecting.html @@ -0,0 +1,49 @@ + + +Inspecting outcome<T, EC, EP> - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    Inspecting outcome

    +

    Continuing with the previous example, in Layer3 we have function z which again reports failures via exceptions. +It will call function h from Layer2_old which returns outcome<int> (which may store an int or a std::error_code or a std::exception_ptr). +The goal is to unpack it to either the successful return value int or to throw an appropriate exception: if we are storing an std::exception_ptr, just rethrow it. +If we are storing a std::error_code throw it as std::system_error, which is designed to store std::error_code’s:

    + +
    auto z() -> int // throws on failure
    +{
    +  if (outcome::outcome<int> o = old::h())
    +    return o.value();
    +  else if (o.has_exception())
    +    std::rethrow_exception(o.exception());
    +  else
    +    throw std::system_error{o.error()};
    +}
    +
    View this code on Github
    + + +

    Function has_exception() checks if it is EP (std::exception_ptr) that is stored, function exception() accesses it. Similarly, function error() accesses the EC (std::error_code) if it is stored. +outcome<> also has a function has_failure() to check if either EC or EP is being stored.

    + +

    It would seem obvious that the above pattern of ‘unpacking’ outcome<> +is so common that it ought to be implemented inside function .value(), +so function z could be written as:

    +
    return old::h().value();
    +
    +

    And this is exactly what the aforementioned no-value policy template argument is for, which is described in +the next section.

    + + +

    Last revised: June 19, 2020 at 15:42:26 +0100

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/tutorial/essential/outcome/layer_chart.gif b/doc/html/tutorial/essential/outcome/layer_chart.gif new file mode 100644 index 0000000000000000000000000000000000000000..54bd3fcc5e181adb8b2ec93503b5a768306b8521 GIT binary patch literal 2770 zcmeIxjW^T%AII^}ci-Kav6-79GK$>fKDFrLI};;y+*JG|?MH4(iAZ$geAjkKMUA-1 zg<4p-)M^+ibS4y)yIPBqR;m$7u1=&be&#Ru{Q=kGywCFwc%Ae1_48q@|8E%R2GamI zsjXk+wa9-_@S^ZV(Tfrmr7SwSh=25G4qt7d1vzR9Eh$i2sHmi5;lw2+bs{yfNK_|Q zTWGUb++C;ETvzv?S#6=+57ZW_=vG_kkV3I=Duv>ULNTpS%nzxlhK9Zj4NVUX&8yVD zs8rJ`)%+K==`UaAr`6{F_3r}z=K^Lwun+*gU^Q5v{s};w1LugwY>BXiN7S{6=#X4# zJxN{RU&5{~Yd^EpW$$1|b@{_{bW?l_v!SG$TC2i_%( zIxkMsd|1r_;7IhBmFV?rEQI;56u?t>93Bj zwg1q+M!e%n%)q7N#cMx5s821$Wb6%H5m|;X!qPS0!+Z?~!S}A2!z0=_99V&?3ALhX zVh!kY$KjEvoZR0%&Khs^B@mbF&6Xg;1cJ8v)_{w$6CK&4+i~-3h{KN)bIzUBCcTFs zJk~fHD4{Ga(E`5`p>wjZpy!Z0P=|{|m0xz4%hGl;j^}7vQt9bTWy=(eLdu?WRPy*3 z>olqv1W?RBN+|A+B!SL4W-M$BTCrd?f@ozp4vt$DJxktQ-UWL_X@ zbxaya&HUcOFxV%UXrSaN%YYY}km$9M-n*+oRllQ`k|(Eh9_W|6I|lwRZyiUbGv zpV^-WWSE9xScapNNE!*cO_L2;p2rf~XuM6y?E{fHPHdwC<3SIXr(h3u807{y`&eGy z7xc&`r0w8iS~JDTGQ$6Mz# z*1eyYev=vP-pfXpB+k6eR^`GvniI1Lk!RK=jt401y~lKTuj2weJet7&Q_kCCheKbA6(+f zUI4A(;57neSiArOFXdncZ6MefWtorAJ?eBGQC_kPF$e*eW~0zv&Tm>qeOByW%4B=ylp?R>tu@HY^bJ6v0HpK7ZW(sROQt3f z0G)9ZBC?qpmVrFaNIakjS88Rw^U}?k%rAY9l=~p)jG@KRS38z~)sqz}J2W?6`Ui=O z0O;4$IcElH@9M~lUHdn#IQbp<>N*(KMzb3RIU{K=+>O%Dg3usrNVz$lOJ4<`Hjr;Jz5#DsB zdxC#r)5$GTTm9zvznrUr?j}jg|BN2_w3_sE;FMn4N;~V%Tf!R)s=i$|J~pZfb7RB} ze7nlnZ?GAczg|C3#%-bv-r+03NBU-StE4gVmgS3(m1r0!7e#?!M$NO z_krk=rh)gq!?vTRv3HAVZ?Y=gZ70_98*fh8vt-3KU+)EpKH{v7l-e#I54LZ1(m#83 z5W_b$t_tND(M~-rf0uxsSfnG;mgMq@E`b1OgzC=V1a=*SexmKHXznq zXN^g&S(VI>ENFqTRKW75gHXE`O-l|S5kB3%@zNxVD?xD;zED#ON(#Qn^@#!gG)9od z_b9G`ZB}z>{@2WtfhULzI@2)>g=_#=N>@SJR8VTKS76>4W@ixjCX*`!*mMBdMsez6 zJ^WBo<(^X!_|q58k%z;qi-37YEvcjuv!+M3{z+djA%F^vwG|Ol3?$;L-7=U&hY2-h z(C1FnPxnfJkH3s;DFlRYWv_#_OOW)L(x_K}pIzfh)|*7_ziZ + +result<> - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    + +

    result<>

    +

    We will define a function that converts a std::string to an int. This function can fail for a number of reasons; +if it does we want to communicate the failure reason.

    + +
    outcome::result<int> convert(const std::string& str) noexcept;
    +
    View this code on Github
    + + +

    Template alias result<T, E = varies, NoValuePolicy = policy::default_policy<T, E, void>> + +has three template parameters, but the last two have default values. The first +(T) represents the type of the object returned from the function upon success. +The second (EC) is the type of object containing information about the reason +for failure when the function fails. A result object stores either a T or an +EC at any given moment, and is therefore conceptually similar to variant<T, EC>. +EC is defaulted to std::error_code in standalone Outcome, or to boost::system::error_code +in Boost.Outcome1. The third parameter (NoValuePolicy) is called a +no-value policy. We will cover it later.

    + +

    If both T and EC are trivially copyable, result<T, EC, NVP> is also trivially copyable. +Triviality, complexity and constexpr-ness of each operation (construction, copy construction, assignment, +destruction etc) is always the intersection of the corresponding operation in T and EC, +so for example if both T and EC are literal types, so will be result<T, EC, NVP>. +Additionally, if both T and EC have standard layout, result<T, EC, NVP> has standard layout; +thus if both T and EC are C-compatible, so will result<T, EC, NVP> be C-compatible.

    + +

    Now, we will define an enumeration describing different failure situations during conversion.

    + +
    enum class ConversionErrc
    +{
    +  Success     = 0, // 0 should not represent an error
    +  EmptyString = 1, // (for rationale, see tutorial on error codes)
    +  IllegalChar = 2,
    +  TooLong     = 3,
    +};
    +
    +// all boilerplate necessary to plug ConversionErrc
    +// into std::error_code framework
    +
    View this code on Github
    + + +

    Assume we have plugged it into std::error_code framework, as described in this section.

    + +

    One notable effect of such plugging is that ConversionErrc is now convertible to std::error_code. +Now we can implement function convert as follows:

    + +
    outcome::result<int> convert(const std::string& str) noexcept
    +{
    +  if (str.empty())
    +    return ConversionErrc::EmptyString;
    +
    +  if (!std::all_of(str.begin(), str.end(), ::isdigit))
    +    return ConversionErrc::IllegalChar;
    +
    +  if (str.length() > 9)
    +    return ConversionErrc::TooLong;
    +
    +  return atoi(str.c_str());
    +}
    +
    View this code on Github
    + + +

    result<T, EC> is convertible from any T2 convertible to T as well as any EC2 convertible to EC, +provided that there is no constructability possible in either direction between T and EC. If there is, +all implicit conversion is disabled, and you will need to use one of the tagged constructors:

    + +
    outcome::result<int> r {outcome::in_place_type<std::error_code>, ConversionErrc::EmptyString};
    +outcome::result<int> s {outcome::in_place_type<int>, 1};
    +
    View this code on Github
    + + +

    Or use helper functions:

    + +
    outcome::result<int> r = outcome::failure(ConversionErrc::EmptyString);
    +outcome::result<int> s = outcome::success(1);
    +
    View this code on Github
    + + +
    +
    note
    +

    The functions auto failure(T &&, …) + and auto success(T &&, …) + return special +types implicitly convertible to failed or successful result (and outcome).

    +
    +
    + +
    + +
    + +
      +
    1. You can mandate a choice using std_result<T> or boost_result<T>. + [return]
    2. +
    +
    + + + +

    Last revised: February 23, 2021 at 17:37:27 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/tutorial/essential/result/inspecting.html b/doc/html/tutorial/essential/result/inspecting.html new file mode 100644 index 000000000..aa747f6a4 --- /dev/null +++ b/doc/html/tutorial/essential/result/inspecting.html @@ -0,0 +1,74 @@ + + +Inspecting result<T, EC> - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    Inspecting result

    +

    Suppose we will be writing a function print_half that takes a std::string representing an integer and prints half the integer:

    + +
    outcome::result<void> print_half(const std::string& text);
    +
    View this code on Github
    + + +

    The type result<void> means that there is no value to be returned upon success, but that the operation might still fail, and we may be interested in inspecting the cause of the failure. The class template result<> is declared with the attribute [[nodiscard]], which means the compiler will warn you if you forget to inspect the returned object (in C++ 17 or later).

    + +

    The implementation will do the following: if the integral number can be represented by an int, we will convert to int and use its arithmetical operations. If the number is too large, we will fall back to using a custom BigInt implementation that needs to allocate memory. In the implementation we will use the function convert defined in the previous section.

    + +
    outcome::result<void> print_half(const std::string& text)
    +{
    +  if (outcome::result<int> r = convert(text))         // #1
    +  {
    +    std::cout << (r.value() / 2) << std::endl;        // #2
    +  }
    +  else
    +  {
    +    if (r.error() == ConversionErrc::TooLong)         // #3
    +    {
    +      BOOST_OUTCOME_TRY(auto i, BigInt::fromString(text));  // #4
    +      std::cout << i.half() << std::endl;
    +    }
    +    else
    +    {
    +      return r.as_failure();                          // #5
    +    }
    +  }
    +  return outcome::success();                          // #6
    +}
    +
    View this code on Github
    + + +

    #1. You test if result<> object represents a successful operation with contextual conversion to bool.

    + +

    #2. The function .value() extracts the successfully returned int.

    + +

    #3. The function .error() allows you to inspect the error sub-object, representing information about the reason for failure.

    + +

    #4. Macro BOOST_OUTCOME_TRY represents a control statement. It implies that the expression in the second argument returns a result<>. The function is defined as:

    + +
    /*static*/ outcome::result<BigInt> BigInt::fromString(const std::string& s)
    +
    View this code on Github
    + + +

    Our control statement means: if fromString returned failure, this same error information should be returned from print_half, even though the type of result<> is different. If fromString returned success, we create variable i of type BigInt with the value returned from fromString. If control goes to subsequent line, it means fromString succeeded and variable of type BigInt is in scope.

    + +

    #5. In the return statement we extract the error information and use it to initialize the return value from print_half. We could have written return r.error(); instead, + and it would have the same effect, but r.as_failure() will work when implicit construction from E has been disabled due to T and E having a constructibility relationship.

    + +

    #6. Function success() returns an object of type success<void> representing success. This is implicitly converted by +all result and outcome types into a successful return, default constructing any T if necessary.

    + + +

    Last revised: March 22, 2019 at 15:01:40 -0700

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/tutorial/essential/result/try.html b/doc/html/tutorial/essential/result/try.html new file mode 100644 index 000000000..3032822d4 --- /dev/null +++ b/doc/html/tutorial/essential/result/try.html @@ -0,0 +1,82 @@ + + +TRY operations - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    TRY operations

    + + +

    In the implementation of function print_half we have seen the usage of the macro BOOST_OUTCOME_TRYV(expr)/BOOST_OUTCOME_TRY(expr) +:

    +
    BOOST_OUTCOME_TRY (auto i, BigInt::fromString(text));
    +
    +

    The BOOST_OUTCOME_TRY macro uses C macro overloading to select between two implementations based on the number of +input parameters. If there is exactly one input parameter i.e. without the i, the control statement is +roughly equivalent to:

    +
    auto __result = BigInt::fromString(text);
    +if (!__result)
    +  return __result.as_failure();
    +
    +

    Where __result is a compile time generated unique name. This single argument form is equivalent to +BOOST_OUTCOME_TRYV(expr), incidentally.

    + +

    If there are between two and eight parameters, this control statement is roughly equivalent to:

    +
    auto __result = BigInt::fromString(text);
    +if (!__result)
    +  return __result.as_failure();
    +auto i = __result.value();
    +
    +

    So here i as the first C macro parameter is set to the value of any successful result.

    + +

    C macro overloads are provided for up to eight arguments. To prevent the +confounding of the C preprocessor by commas in template specifications causing more than +eight arguments appearing to the C preprocessor, you should consider wrapping the +second argument in brackets.

    + +

    If you are within a C++ Coroutine, you ought to use BOOST_OUTCOME_CO_TRYV(expr)/BOOST_OUTCOME_CO_TRY(expr) + +instead.

    + +
    + +

    Compiler-specific extension: BOOST_OUTCOME_TRYX

    + +
    +
    note
    +

    This macro makes use of a proprietary extension in GCC and clang, and is not +portable. The macro is not made available on unsupported compilers, +so you can test for its presence using #ifdef BOOST_OUTCOME_TRYX.

    +
    +
    + + +

    GCC and Clang provide an extension to C++ known as +statement expressions. +These make it possible to use a more convenient macro: BOOST_OUTCOME_TRYX, which is an expression. With the above macro, the above declaration of variable i can be rewritten to:

    +
    int i = BOOST_OUTCOME_TRYX (BigInt::fromString(text));
    +
    +

    This has an advantage that you can use it any place where you can put an expression, e.g., in “simple initialization”:

    +
    if (int i = BOOST_OUTCOME_TRYX(BigInt::fromString(text)))
    +  use_a_non_zero_int(i);
    +
    +

    or in as a subexpression of a bigger full expression:

    +
    int ans = BOOST_OUTCOME_TRYX(BigInt::fromString("1")) + BOOST_OUTCOME_TRYX(BigInt::fromString("2"));
    +
    +

    There is also an BOOST_OUTCOME_CO_TRYX(expr) + if you are inside a C++ Coroutine.

    + + +

    Last revised: February 12, 2021 at 20:25:43 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/tutorial/essential/result/try_greedy.html b/doc/html/tutorial/essential/result/try_greedy.html new file mode 100644 index 000000000..18f805709 --- /dev/null +++ b/doc/html/tutorial/essential/result/try_greedy.html @@ -0,0 +1,50 @@ + + +TRY is greedy - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    TRY is greedy

    +

    BOOST_OUTCOME_TRYV(expr)/BOOST_OUTCOME_TRY(expr) + has ‘greedier’ implicit conversion semantics than +basic_result<T, E, NoValuePolicy> +. For example, this code won’t compile:

    +
    outcome::result<int, std::error_code> test(outcome::result<int, std::errc> r)
    +{
    +    return r;  // you need to use explicit construction here
    +    // i.e. return outcome::result<int>(r);
    +}
    +
    +

    This is chosen because there is a non-trivial conversion between std::errc and std::error_code, +so even though that conversion is implicit for std::error_code, Outcome does not expose the +implicitness here in order to keep the implicit constructor count low (implicit constructors +add significantly to build times).

    + +

    The TRY operation is more greedy though:

    +
    outcome::result<int, std::error_code> test(outcome::result<int, std::errc> r)
    +{
    +    BOOST_OUTCOME_TRY(r);    // no explicit conversion needed
    +    return r.value();
    +}
    +
    +

    This is because result<int, std::error_code> will implicitly construct from anything which +either int or std::error_code will implicitly construct from. However, +result<int, std::error_code> will not implicitly construct from result<int, std::errc>.

    + +

    Thus bear this in mind during usage: TRY is greedier for implicit conversions than the Outcome +types themselves.

    + + +

    Last revised: February 03, 2020 at 12:05:24 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/tutorial/essential/result/try_ref.html b/doc/html/tutorial/essential/result/try_ref.html new file mode 100644 index 000000000..3fa0a0ec9 --- /dev/null +++ b/doc/html/tutorial/essential/result/try_ref.html @@ -0,0 +1,42 @@ + + +TRY avoiding copy/move - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    +

    TRY avoiding copy/move

    +

    BOOST_OUTCOME_TRYV(expr)/BOOST_OUTCOME_TRY(expr) + works by creating an internal uniquely +named variable which holds the value emitted by the expression. This implies that a copy +or move operation shall be performed on the object emitted (unless you are on C++ 17 or +later, which has guaranteed copy elision), which may be undesirable for your use case.

    + +

    You can tell BOOST_OUTCOME_TRY to use a reference rather than a value for the internal +uniquely named variable like this:

    +
    // This refers to a Result containing an immovable object
    +outcome::result<Immovable> &&res;
    +
    +// For when you do want to extract the value
    +// This creates an auto &&unique = res, followed by an
    +// auto &&v = std::move(unique).assume_value()
    +BOOST_OUTCOME_TRY((auto &&, v), res);
    +
    +

    If you don’t care about extracting the value:

    +
    // For when you don't want to extract the value
    +// This creates an auto &&unique = res
    +BOOST_OUTCOME_TRYV2(auto &&, res);
    +
    + +

    Last revised: February 12, 2021 at 20:25:43 UTC

    +
    +
    +Prev + Up + HomeNext
    + diff --git a/doc/html/videos.html b/doc/html/videos.html new file mode 100644 index 000000000..aed4550bc --- /dev/null +++ b/doc/html/videos.html @@ -0,0 +1,75 @@ + + +Videos - Boost.Outcome documentation + + + + + +
    +Prev + Up + HomeNext
    + +

    Videos

    + + +

    Outcome has been presented at some of the major C++ conferences as it has +evolved. As the older content is less relevant to Outcome today, this +list is given in reverse chronological order.

    + +
    + +

    Dublin C++ users group 2018 “Deterministic Disappointment”

    + +

    Literature review of the WG21 papers relating to deterministically handling failure, and using libraries such as Outcome to implement the same.

    + + +
    + +
    + + +
    + +
    + +

    Meeting C++ 2017 “Introduction to proposed std::expected<T, E>“

    + +

    Literature review of the several WG21 papers relating to std::expected.

    + + +
    + +
    + + +
    + +
    + +

    ACCU 2017 “Mongrel Monads, Dirty, dirty, dirty”

    + +

    Covers the history of error handling in C++, and how the LEWG Expected works.

    + +

    (Note that the Expected presented here no longer exists, it was substantially changed +after the Outcome v1 peer review. Furthermore the Outcome presented here no longer +exists, the peer review demanded a complete rebuild)

    + + +
    + +
    + + +
    + + + +

    Last revised: September 20, 2018 at 09:21:47 +0100

    +
    +
    +Prev + Up + HomeNext
    +