Line data 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 : 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 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
|