From e45f290486465d1f6b152710dec8f10e6769770a Mon Sep 17 00:00:00 2001 From: Dmitry Arkhipov Date: Mon, 25 May 2026 16:52:14 +0300 Subject: [PATCH 1/3] more explicit result checking is removed --- include/boost/json/impl/value.ipp | 21 +++++---------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/include/boost/json/impl/value.ipp b/include/boost/json/impl/value.ipp index 5d136dbe5..65fdbfb8b 100644 --- a/include/boost/json/impl/value.ipp +++ b/include/boost/json/impl/value.ipp @@ -528,37 +528,26 @@ value::try_as_null() const noexcept boost::system::result value::try_at(string_view key) noexcept { - auto r = try_as_object(); - if( !r ) - return r.error(); - return r.unsafe_value().try_at(key); + return try_as_object() & [key](object& jo) { return jo.try_at(key); }; } boost::system::result value::try_at(string_view key) const noexcept { - auto r = try_as_object(); - if( !r ) - return r.error(); - return r.unsafe_value().try_at(key); + return try_as_object() + & [key](object const& jo) { return jo.try_at(key); }; } boost::system::result value::try_at(std::size_t pos) noexcept { - auto r = try_as_array(); - if( !r ) - return r.error(); - return r.unsafe_value().try_at(pos); + return try_as_array() & [pos](array& ja) { return ja.try_at(pos); }; } boost::system::result value::try_at(std::size_t pos) const noexcept { - auto r = try_as_array(); - if( !r ) - return r.error(); - return r.unsafe_value().try_at(pos); + return try_as_array() & [pos](array const& ja) { return ja.try_at(pos); }; } object const& From bdcfc8f31de1055acd598033194a46c47fee4167 Mon Sep 17 00:00:00 2001 From: Dmitry Arkhipov Date: Mon, 25 May 2026 16:52:37 +0300 Subject: [PATCH 2/3] even more explicit result checking is removed --- include/boost/json/detail/value_to.hpp | 50 ++++++++++++-------------- 1 file changed, 23 insertions(+), 27 deletions(-) diff --git a/include/boost/json/detail/value_to.hpp b/include/boost/json/detail/value_to.hpp index 66c3858c7..e6035dce5 100644 --- a/include/boost/json/detail/value_to.hpp +++ b/include/boost/json/detail/value_to.hpp @@ -212,35 +212,31 @@ value_to_impl( value const& jv, Ctx const& ctx ) { - object const* obj = jv.if_object(); - if( !obj ) + return jv.try_as_object() & [&](object const& jo) + -> system::result { - system::error_code ec; - BOOST_JSON_FAIL(ec, error::not_object); - return {boost::system::in_place_error, ec}; - } - - T res; - error const e = detail::try_reserve( - res, obj->size(), reserve_implementation()); - if( e != error() ) - { - system::error_code ec; - BOOST_JSON_FAIL( ec, e ); - return {boost::system::in_place_error, ec}; - } + T res; + error const e = detail::try_reserve( + res, jo.size(), reserve_implementation()); + if( e != error() ) + { + system::error_code ec; + BOOST_JSON_FAIL( ec, e ); + return {boost::system::in_place_error, ec}; + } - auto ins = detail::inserter(res, inserter_implementation()); - for( key_value_pair const& kv: *obj ) - { - auto elem_res = try_value_to>( kv.value(), ctx ); - if( elem_res.has_error() ) - return {boost::system::in_place_error, elem_res.error()}; - *ins++ = value_type{ - key_type(kv.key()), - std::move(elem_res.unsafe_value())}; - } - return res; + auto ins = detail::inserter(res, inserter_implementation()); + for(key_value_pair const& kv: jo) + { + auto elem_res = try_value_to>( kv.value(), ctx ); + if( elem_res.has_error() ) + return {boost::system::in_place_error, elem_res.error()}; + *ins++ = value_type{ + key_type(kv.key()), + std::move(elem_res.unsafe_value())}; + } + return res; + }; } // all other containers From 1fdf9716c1152b9468ce5174d3f45b0c8b082432 Mon Sep 17 00:00:00 2001 From: Dmitry Arkhipov Date: Tue, 2 Jun 2026 18:08:39 +0300 Subject: [PATCH 3/3] temp --- include/boost/json/detail/value_to.hpp | 122 +++++++++++-------------- 1 file changed, 54 insertions(+), 68 deletions(-) diff --git a/include/boost/json/detail/value_to.hpp b/include/boost/json/detail/value_to.hpp index e6035dce5..b0e0f3794 100644 --- a/include/boost/json/detail/value_to.hpp +++ b/include/boost/json/detail/value_to.hpp @@ -38,37 +38,34 @@ using reserve_implementation = mp11::mp_cond< mp11::mp_true, mp11::mp_int<0>>; template -error -try_reserve( - T&, - std::size_t size, - mp11::mp_int<2>) +system::result +try_reserve(T& cnt, std::size_t size, mp11::mp_int<2>) + noexcept { constexpr std::size_t N = std::tuple_size>::value; if ( N != size ) - return error::size_mismatch; - return error(); + { + system::error_code ec; + BOOST_JSON_FAIL(ec, error::size_mismatch); + return {boost::system::in_place_error, ec}; + } + return cnt; } template -error -try_reserve( - T& cont, - std::size_t size, - mp11::mp_int<1>) +system::result +try_reserve(T& cnt, std::size_t size, mp11::mp_int<1>) { - cont.reserve(size); - return error(); + cnt.reserve(size); + return cnt; } template -error -try_reserve( - T&, - std::size_t, - mp11::mp_int<0>) +system::result +try_reserve(T& cnt, std::size_t, mp11::mp_int<0>) + noexcept { - return error(); + return cnt; } @@ -212,30 +209,27 @@ value_to_impl( value const& jv, Ctx const& ctx ) { + T res; return jv.try_as_object() & [&](object const& jo) - -> system::result { - T res; - error const e = detail::try_reserve( - res, jo.size(), reserve_implementation()); - if( e != error() ) - { - system::error_code ec; - BOOST_JSON_FAIL( ec, e ); - return {boost::system::in_place_error, ec}; - } - - auto ins = detail::inserter(res, inserter_implementation()); - for(key_value_pair const& kv: jo) - { - auto elem_res = try_value_to>( kv.value(), ctx ); - if( elem_res.has_error() ) - return {boost::system::in_place_error, elem_res.error()}; - *ins++ = value_type{ - key_type(kv.key()), - std::move(elem_res.unsafe_value())}; - } - return res; + return detail::try_reserve( + res, jo.size(), reserve_implementation()) + & [&](T& res) -> system::result + { + auto ins = detail::inserter(res, inserter_implementation()); + for(key_value_pair const& kv: jo) + { + auto elem_res = try_value_to>( + kv.value(), ctx); + if( elem_res.has_error() ) + return { + boost::system::in_place_error, elem_res.error()}; + *ins++ = value_type{ + key_type(kv.key()), + std::move( elem_res.unsafe_value() )}; + } + return std::move(res); + }; }; } @@ -248,33 +242,25 @@ value_to_impl( value const& jv, Ctx const& ctx ) { - array const* arr = jv.if_array(); - if( !arr ) + T res; + return jv.try_as_array() & [&](array const& ja) { - system::error_code ec; - BOOST_JSON_FAIL(ec, error::not_array); - return {boost::system::in_place_error, ec}; - } - - T result; - error const e = detail::try_reserve( - result, arr->size(), reserve_implementation()); - if( e != error() ) - { - system::error_code ec; - BOOST_JSON_FAIL( ec, e ); - return {boost::system::in_place_error, ec}; - } - - auto ins = detail::inserter(result, inserter_implementation()); - for( value const& val: *arr ) - { - auto elem_res = try_value_to>( val, ctx ); - if( elem_res.has_error() ) - return {boost::system::in_place_error, elem_res.error()}; - *ins++ = std::move(elem_res.unsafe_value()); - } - return result; + return detail::try_reserve( + res, ja.size(), reserve_implementation()) + & [&](T& res) -> system::result + { + auto ins = detail::inserter(res, inserter_implementation()); + for(value const& val: ja) + { + auto elem_res = try_value_to>(val, ctx); + if( elem_res.has_error() ) + return { + boost::system::in_place_error, elem_res.error()}; + *ins++ = std::move( elem_res.unsafe_value() ); + } + return std::move(res); + }; + }; } // tuple-like types