100.00% Lines (44/44)
100.00% Functions (3/3)
| TLA | Baseline | Branch | ||||||
|---|---|---|---|---|---|---|---|---|
| Line | Hits | Code | Line | Hits | Code | |||
| 1 | // | 1 | // | |||||
| 2 | // Copyright (c) 2019 Vinnie Falco (vinnie.falco@gmail.com) | 2 | // Copyright (c) 2019 Vinnie Falco (vinnie.falco@gmail.com) | |||||
| 3 | // | 3 | // | |||||
| 4 | // Distributed under the Boost Software License, Version 1.0. (See accompanying | 4 | // Distributed under the Boost Software License, Version 1.0. (See accompanying | |||||
| 5 | // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) | 5 | // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) | |||||
| 6 | // | 6 | // | |||||
| 7 | // Official repository: https://github.com/boostorg/json | 7 | // Official repository: https://github.com/boostorg/json | |||||
| 8 | // | 8 | // | |||||
| 9 | 9 | |||||||
| 10 | #ifndef BOOST_JSON_IMPL_VISIT_HPP | 10 | #ifndef BOOST_JSON_IMPL_VISIT_HPP | |||||
| 11 | #define BOOST_JSON_IMPL_VISIT_HPP | 11 | #define BOOST_JSON_IMPL_VISIT_HPP | |||||
| 12 | 12 | |||||||
| 13 | namespace boost { | 13 | namespace boost { | |||||
| 14 | namespace json { | 14 | namespace json { | |||||
| 15 | 15 | |||||||
| 16 | namespace detail { | 16 | namespace detail { | |||||
| 17 | 17 | |||||||
| 18 | extern | 18 | extern | |||||
| 19 | BOOST_JSON_DECL | 19 | BOOST_JSON_DECL | |||||
| 20 | std::nullptr_t stable_np; | 20 | std::nullptr_t stable_np; | |||||
| 21 | 21 | |||||||
| 22 | } // namespace detail | 22 | } // namespace detail | |||||
| 23 | 23 | |||||||
| 24 | template<class Visitor> | 24 | template<class Visitor> | |||||
| 25 | auto | 25 | auto | |||||
| HITCBC | 26 | 16 | visit( | 26 | 16 | visit( | ||
| 27 | Visitor&& v, | 27 | Visitor&& v, | |||||
| 28 | value& jv) -> decltype( | 28 | value& jv) -> decltype( | |||||
| 29 | static_cast<Visitor&&>(v)( std::declval<std::nullptr_t&>() ) ) | 29 | static_cast<Visitor&&>(v)( std::declval<std::nullptr_t&>() ) ) | |||||
| 30 | { | 30 | { | |||||
| HITCBC | 31 | 16 | switch(jv.kind()) | 31 | 16 | switch(jv.kind()) | ||
| 32 | { | 32 | { | |||||
| HITCBC | 33 | 2 | default: // unreachable()? | 33 | 2 | default: // unreachable()? | ||
| HITCBC | 34 | 2 | case kind::string: return static_cast<Visitor&&>(v)( jv.get_string() ); | 34 | 2 | case kind::string: return static_cast<Visitor&&>(v)( jv.get_string() ); | ||
| HITCBC | 35 | 2 | case kind::array: return static_cast<Visitor&&>(v)( jv.get_array() ); | 35 | 2 | case kind::array: return static_cast<Visitor&&>(v)( jv.get_array() ); | ||
| HITCBC | 36 | 2 | case kind::object: return static_cast<Visitor&&>(v)( jv.get_object() ); | 36 | 2 | case kind::object: return static_cast<Visitor&&>(v)( jv.get_object() ); | ||
| HITCBC | 37 | 2 | case kind::bool_: return static_cast<Visitor&&>(v)( jv.get_bool() ); | 37 | 2 | case kind::bool_: return static_cast<Visitor&&>(v)( jv.get_bool() ); | ||
| HITCBC | 38 | 2 | case kind::int64: return static_cast<Visitor&&>(v)( jv.get_int64() ); | 38 | 2 | case kind::int64: return static_cast<Visitor&&>(v)( jv.get_int64() ); | ||
| HITCBC | 39 | 2 | case kind::uint64: return static_cast<Visitor&&>(v)( jv.get_uint64() ); | 39 | 2 | case kind::uint64: return static_cast<Visitor&&>(v)( jv.get_uint64() ); | ||
| HITCBC | 40 | 2 | case kind::double_: return static_cast<Visitor&&>(v)( jv.get_double() ); | 40 | 2 | case kind::double_: return static_cast<Visitor&&>(v)( jv.get_double() ); | ||
| HITCBC | 41 | 2 | case kind::null: return static_cast<Visitor&&>(v)( detail::stable_np ) ; | 41 | 2 | case kind::null: return static_cast<Visitor&&>(v)( detail::stable_np ) ; | ||
| 42 | } | 42 | } | |||||
| 43 | } | 43 | } | |||||
| 44 | 44 | |||||||
| 45 | template<class Visitor> | 45 | template<class Visitor> | |||||
| 46 | auto | 46 | auto | |||||
| HITCBC | 47 | 264 | visit( | 47 | 264 | visit( | ||
| 48 | Visitor&& v, | 48 | Visitor&& v, | |||||
| 49 | value const& jv) -> decltype( | 49 | value const& jv) -> decltype( | |||||
| 50 | static_cast<Visitor&&>(v)( std::declval<std::nullptr_t const&>() ) ) | 50 | static_cast<Visitor&&>(v)( std::declval<std::nullptr_t const&>() ) ) | |||||
| 51 | { | 51 | { | |||||
| HITCBC | 52 | 264 | detail::scalar const& sc = detail::access::get_scalar(jv); | 52 | 264 | detail::scalar const& sc = detail::access::get_scalar(jv); | ||
| HITCBC | 53 | 264 | switch(jv.kind()) | 53 | 264 | switch(jv.kind()) | ||
| 54 | { | 54 | { | |||||
| HITCBC | 55 | 46 | default: // unreachable()? | 55 | 46 | default: // unreachable()? | ||
| HITCBC | 56 | 46 | case kind::string: return static_cast<Visitor&&>(v)( jv.get_string() ); | 56 | 46 | case kind::string: return static_cast<Visitor&&>(v)( jv.get_string() ); | ||
| HITCBC | 57 | 12 | case kind::array: return static_cast<Visitor&&>(v)( jv.get_array() ); | 57 | 12 | case kind::array: return static_cast<Visitor&&>(v)( jv.get_array() ); | ||
| HITCBC | 58 | 22 | case kind::object: return static_cast<Visitor&&>(v)( jv.get_object() ); | 58 | 22 | case kind::object: return static_cast<Visitor&&>(v)( jv.get_object() ); | ||
| 59 | // local variables work around a bug in older clangs | 59 | // local variables work around a bug in older clangs | |||||
| HITCBC | 60 | 30 | case kind::bool_: { | 60 | 30 | case kind::bool_: { | ||
| HITCBC | 61 | 30 | bool const& b = sc.b; | 61 | 30 | bool const& b = sc.b; | ||
| HITCBC | 62 | 30 | return static_cast<Visitor&&>(v)(b); | 62 | 30 | return static_cast<Visitor&&>(v)(b); | ||
| 63 | } | 63 | } | |||||
| HITCBC | 64 | 92 | case kind::int64: { | 64 | 92 | case kind::int64: { | ||
| HITCBC | 65 | 92 | std::int64_t const& i = sc.i; | 65 | 92 | std::int64_t const& i = sc.i; | ||
| HITCBC | 66 | 92 | return static_cast<Visitor&&>(v)(i); | 66 | 92 | return static_cast<Visitor&&>(v)(i); | ||
| 67 | } | 67 | } | |||||
| HITCBC | 68 | 18 | case kind::uint64: { | 68 | 18 | case kind::uint64: { | ||
| HITCBC | 69 | 18 | std::uint64_t const& u = sc.u; | 69 | 18 | std::uint64_t const& u = sc.u; | ||
| HITCBC | 70 | 18 | return static_cast<Visitor&&>(v)(u); | 70 | 18 | return static_cast<Visitor&&>(v)(u); | ||
| 71 | } | 71 | } | |||||
| HITCBC | 72 | 10 | case kind::double_: { | 72 | 10 | case kind::double_: { | ||
| HITCBC | 73 | 10 | double const& d = sc.d; | 73 | 10 | double const& d = sc.d; | ||
| HITCBC | 74 | 10 | return static_cast<Visitor&&>(v)(d); | 74 | 10 | return static_cast<Visitor&&>(v)(d); | ||
| 75 | } | 75 | } | |||||
| HITCBC | 76 | 34 | case kind::null: { | 76 | 34 | case kind::null: { | ||
| HITCBC | 77 | 34 | auto const& np = detail::stable_np; | 77 | 34 | auto const& np = detail::stable_np; | ||
| HITCBC | 78 | 34 | return static_cast<Visitor&&>(v)(np) ; | 78 | 34 | return static_cast<Visitor&&>(v)(np) ; | ||
| 79 | } | 79 | } | |||||
| 80 | } | 80 | } | |||||
| 81 | } | 81 | } | |||||
| 82 | 82 | |||||||
| 83 | 83 | |||||||
| 84 | template<class Visitor> | 84 | template<class Visitor> | |||||
| 85 | auto | 85 | auto | |||||
| HITCBC | 86 | 24 | visit( | 86 | 24 | visit( | ||
| 87 | Visitor&& v, | 87 | Visitor&& v, | |||||
| 88 | value&& jv) -> decltype( | 88 | value&& jv) -> decltype( | |||||
| 89 | static_cast<Visitor&&>(v)( std::declval<std::nullptr_t&&>() ) ) | 89 | static_cast<Visitor&&>(v)( std::declval<std::nullptr_t&&>() ) ) | |||||
| 90 | { | 90 | { | |||||
| HITCBC | 91 | 24 | switch(jv.kind()) | 91 | 24 | switch(jv.kind()) | ||
| 92 | { | 92 | { | |||||
| HITCBC | 93 | 3 | default: // unreachable()? | 93 | 3 | default: // unreachable()? | ||
| HITCBC | 94 | 3 | case kind::string: return static_cast<Visitor&&>(v)(std::move( jv.get_string() )); | 94 | 3 | case kind::string: return static_cast<Visitor&&>(v)(std::move( jv.get_string() )); | ||
| HITCBC | 95 | 3 | case kind::array: return static_cast<Visitor&&>(v)(std::move( jv.get_array() )); | 95 | 3 | case kind::array: return static_cast<Visitor&&>(v)(std::move( jv.get_array() )); | ||
| HITCBC | 96 | 3 | case kind::object: return static_cast<Visitor&&>(v)(std::move( jv.get_object() )); | 96 | 3 | case kind::object: return static_cast<Visitor&&>(v)(std::move( jv.get_object() )); | ||
| HITCBC | 97 | 3 | case kind::bool_: return static_cast<Visitor&&>(v)(std::move( detail::access::get_scalar(jv).b )); | 97 | 3 | case kind::bool_: return static_cast<Visitor&&>(v)(std::move( detail::access::get_scalar(jv).b )); | ||
| HITCBC | 98 | 3 | case kind::int64: return static_cast<Visitor&&>(v)(std::move( detail::access::get_scalar(jv).i )); | 98 | 3 | case kind::int64: return static_cast<Visitor&&>(v)(std::move( detail::access::get_scalar(jv).i )); | ||
| HITCBC | 99 | 3 | case kind::uint64: return static_cast<Visitor&&>(v)(std::move( detail::access::get_scalar(jv).u )); | 99 | 3 | case kind::uint64: return static_cast<Visitor&&>(v)(std::move( detail::access::get_scalar(jv).u )); | ||
| HITCBC | 100 | 3 | case kind::double_: return static_cast<Visitor&&>(v)(std::move( detail::access::get_scalar(jv).d )); | 100 | 3 | case kind::double_: return static_cast<Visitor&&>(v)(std::move( detail::access::get_scalar(jv).d )); | ||
| HITCBC | 101 | 3 | case kind::null: return static_cast<Visitor&&>(v)(std::move( detail::stable_np )) ; | 101 | 3 | case kind::null: return static_cast<Visitor&&>(v)(std::move( detail::stable_np )) ; | ||
| 102 | } | 102 | } | |||||
| 103 | } | 103 | } | |||||
| 104 | 104 | |||||||
| 105 | } // namespace json | 105 | } // namespace json | |||||
| 106 | } // namespace boost | 106 | } // namespace boost | |||||
| 107 | 107 | |||||||
| 108 | #endif | 108 | #endif | |||||