impl/visit.hpp

100.0% Lines (36/36) 100.0% Functions (17/17) 100.0% Branches (16/16)
impl/visit.hpp
Line Branch Hits Source Code
1 //
2 // Copyright (c) 2019 Vinnie Falco (vinnie.falco@gmail.com)
3 //
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)
6 //
7 // Official repository: https://github.com/boostorg/json
8 //
9
10 #ifndef BOOST_JSON_IMPL_VISIT_HPP
11 #define BOOST_JSON_IMPL_VISIT_HPP
12
13 namespace boost {
14 namespace json {
15
16
17 template<class Visitor>
18 auto
19 8 visit(
20 Visitor&& v,
21 value& jv) -> decltype(
22 static_cast<Visitor&&>(v)( std::declval<std::nullptr_t&>() ) )
23 {
24 8 auto& scalar = detail::access::get_scalar(jv);
25
8/8
✓ Branch 1 taken 1 time.
✓ Branch 2 taken 1 time.
✓ Branch 3 taken 1 time.
✓ Branch 4 taken 1 time.
✓ Branch 5 taken 1 time.
✓ Branch 6 taken 1 time.
✓ Branch 7 taken 1 time.
✓ Branch 8 taken 1 time.
8 switch(jv.kind())
26 {
27 1 default: // unreachable()?
28 1 case kind::string: return static_cast<Visitor&&>(v)( jv.get_string() );
29 1 case kind::array: return static_cast<Visitor&&>(v)( jv.get_array() );
30 1 case kind::object: return static_cast<Visitor&&>(v)( jv.get_object() );
31 1 case kind::bool_: return static_cast<Visitor&&>(v)( scalar.b );
32 1 case kind::int64: return static_cast<Visitor&&>(v)( scalar.i );
33 1 case kind::uint64: return static_cast<Visitor&&>(v)( scalar.u );
34 1 case kind::double_: return static_cast<Visitor&&>(v)( scalar.d );
35 1 case kind::null: return static_cast<Visitor&&>(v)( scalar.n );
36 }
37 }
38
39 template<class Visitor>
40 auto
41 256 visit(
42 Visitor&& v,
43 value const& jv) -> decltype(
44 static_cast<Visitor&&>(v)( std::declval<std::nullptr_t const&>() ) )
45 {
46 256 auto const& scalar = detail::access::get_scalar(jv);
47
8/8
✓ Branch 1 taken 45 times.
✓ Branch 2 taken 11 times.
✓ Branch 3 taken 21 times.
✓ Branch 4 taken 29 times.
✓ Branch 5 taken 91 times.
✓ Branch 6 taken 17 times.
✓ Branch 7 taken 9 times.
✓ Branch 8 taken 33 times.
256 switch(jv.kind())
48 {
49 45 default: // unreachable()?
50 45 case kind::string: return static_cast<Visitor&&>(v)( jv.get_string() );
51 11 case kind::array: return static_cast<Visitor&&>(v)( jv.get_array() );
52 21 case kind::object: return static_cast<Visitor&&>(v)( jv.get_object() );
53 29 case kind::bool_: return static_cast<Visitor&&>(v)( scalar.b );
54 91 case kind::int64: return static_cast<Visitor&&>(v)( scalar.i );
55 17 case kind::uint64: return static_cast<Visitor&&>(v)( scalar.u );
56 9 case kind::double_: return static_cast<Visitor&&>(v)( scalar.d );
57 33 case kind::null: return static_cast<Visitor&&>(v)( scalar.n );
58 }
59 }
60
61
62 template<class Visitor>
63 auto
64 16 visit(
65 Visitor&& v,
66 value&& jv) -> decltype(
67 static_cast<Visitor&&>(v)( std::declval<std::nullptr_t&&>() ) )
68 {
69 16 auto& scalar = detail::access::get_scalar(jv);
70 16 switch(jv.kind())
71 {
72 2 default: // unreachable()?
73 2 case kind::string: return static_cast<Visitor&&>(v)( std::move( jv.get_string() ) );
74 2 case kind::array: return static_cast<Visitor&&>(v)( std::move( jv.get_array() ) );
75 2 case kind::object: return static_cast<Visitor&&>(v)( std::move( jv.get_object() ) );
76 2 case kind::bool_: return static_cast<Visitor&&>(v)( std::move( scalar.b ) );
77 2 case kind::int64: return static_cast<Visitor&&>(v)( std::move( scalar.i ) );
78 2 case kind::uint64: return static_cast<Visitor&&>(v)( std::move( scalar.u ) );
79 2 case kind::double_: return static_cast<Visitor&&>(v)( std::move( scalar.d ) );
80 2 case kind::null: return static_cast<Visitor&&>(v)( std::move( scalar.n ) ) ;
81 }
82 }
83
84 } // namespace json
85 } // namespace boost
86
87 #endif
88