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 : switch(jv.kind())
25 : {
26 1 : default: // unreachable()?
27 1 : case kind::string: return static_cast<Visitor&&>(v)( jv.get_string() );
28 1 : case kind::array: return static_cast<Visitor&&>(v)( jv.get_array() );
29 1 : case kind::object: return static_cast<Visitor&&>(v)( jv.get_object() );
30 1 : case kind::bool_: return static_cast<Visitor&&>(v)( jv.get_bool() );
31 1 : case kind::int64: return static_cast<Visitor&&>(v)( jv.get_int64() );
32 1 : case kind::uint64: return static_cast<Visitor&&>(v)( jv.get_uint64() );
33 1 : case kind::double_: return static_cast<Visitor&&>(v)( jv.get_double() );
34 1 : case kind::null: {
35 1 : auto np = nullptr;
36 1 : return static_cast<Visitor&&>(v)(np) ;
37 : }
38 : }
39 : }
40 :
41 : template<class Visitor>
42 : auto
43 256 : visit(
44 : Visitor&& v,
45 : value const& jv) -> decltype(
46 : static_cast<Visitor&&>(v)( std::declval<std::nullptr_t const&>() ) )
47 : {
48 256 : switch(jv.kind())
49 : {
50 45 : default: // unreachable()?
51 45 : case kind::string: return static_cast<Visitor&&>(v)( jv.get_string() );
52 11 : case kind::array: return static_cast<Visitor&&>(v)( jv.get_array() );
53 21 : case kind::object: return static_cast<Visitor&&>(v)( jv.get_object() );
54 29 : case kind::bool_: return static_cast<Visitor&&>(v)( jv.get_bool() );
55 91 : case kind::int64: return static_cast<Visitor&&>(v)( jv.get_int64() );
56 17 : case kind::uint64: return static_cast<Visitor&&>(v)( jv.get_uint64() );
57 9 : case kind::double_: return static_cast<Visitor&&>(v)( jv.get_double() );
58 33 : case kind::null: {
59 33 : auto const np = nullptr;
60 33 : return static_cast<Visitor&&>(v)(np) ;
61 : }
62 : }
63 : }
64 :
65 :
66 : template<class Visitor>
67 : auto
68 16 : visit(
69 : Visitor&& v,
70 : value&& jv) -> decltype(
71 : static_cast<Visitor&&>(v)( std::declval<std::nullptr_t&&>() ) )
72 : {
73 16 : switch(jv.kind())
74 : {
75 2 : default: // unreachable()?
76 2 : case kind::string: return static_cast<Visitor&&>(v)( std::move( jv.get_string() ) );
77 2 : case kind::array: return static_cast<Visitor&&>(v)( std::move( jv.get_array() ) );
78 2 : case kind::object: return static_cast<Visitor&&>(v)( std::move( jv.get_object() ) );
79 2 : case kind::bool_: return static_cast<Visitor&&>(v)( std::move( jv.get_bool() ) );
80 2 : case kind::int64: return static_cast<Visitor&&>(v)( std::move( jv.get_int64() ) );
81 2 : case kind::uint64: return static_cast<Visitor&&>(v)( std::move( jv.get_uint64() ) );
82 2 : case kind::double_: return static_cast<Visitor&&>(v)( std::move( jv.get_double() ) );
83 2 : case kind::null: return static_cast<Visitor&&>(v)( std::nullptr_t() ) ;
84 : }
85 : }
86 :
87 : } // namespace json
88 : } // namespace boost
89 :
90 : #endif
|