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  

16  

17  
template<class Visitor>
17  
template<class Visitor>
18  
auto
18  
auto
19  
visit(
19  
visit(
20  
    Visitor&& v,
20  
    Visitor&& v,
21  
    value& jv) -> decltype(
21  
    value& jv) -> decltype(
22  
        static_cast<Visitor&&>(v)( std::declval<std::nullptr_t&>() ) )
22  
        static_cast<Visitor&&>(v)( std::declval<std::nullptr_t&>() ) )
23  
{
23  
{
 
24 +
    auto& scalar = detail::access::get_scalar(jv);
24  
    switch(jv.kind())
25  
    switch(jv.kind())
25  
    {
26  
    {
26  
    default: // unreachable()?
27  
    default: // unreachable()?
27  
    case kind::string:  return static_cast<Visitor&&>(v)( jv.get_string() );
28  
    case kind::string:  return static_cast<Visitor&&>(v)( jv.get_string() );
28  
    case kind::array:   return static_cast<Visitor&&>(v)( jv.get_array() );
29  
    case kind::array:   return static_cast<Visitor&&>(v)( jv.get_array() );
29  
    case kind::object:  return static_cast<Visitor&&>(v)( jv.get_object() );
30  
    case kind::object:  return static_cast<Visitor&&>(v)( jv.get_object() );
30 -
    case kind::bool_:   return static_cast<Visitor&&>(v)( jv.get_bool() );
31 +
    case kind::bool_:   return static_cast<Visitor&&>(v)( scalar.b );
31 -
    case kind::int64:   return static_cast<Visitor&&>(v)( jv.get_int64() );
32 +
    case kind::int64:   return static_cast<Visitor&&>(v)( scalar.i );
32 -
    case kind::uint64:  return static_cast<Visitor&&>(v)( jv.get_uint64() );
33 +
    case kind::uint64:  return static_cast<Visitor&&>(v)( scalar.u );
33 -
    case kind::double_: return static_cast<Visitor&&>(v)( jv.get_double() );
34 +
    case kind::double_: return static_cast<Visitor&&>(v)( scalar.d );
34 -
    case kind::null: {
35 +
    case kind::null:    return static_cast<Visitor&&>(v)( scalar.n );
35 -
        auto np = nullptr;
 
36 -
        return static_cast<Visitor&&>(v)(np) ;
 
37 -
    }
 
38  
    }
36  
    }
39  
}
37  
}
40  

38  

41  
template<class Visitor>
39  
template<class Visitor>
42  
auto
40  
auto
43  
visit(
41  
visit(
44  
    Visitor&& v,
42  
    Visitor&& v,
45  
    value const& jv) -> decltype(
43  
    value const& jv) -> decltype(
46  
        static_cast<Visitor&&>(v)( std::declval<std::nullptr_t const&>() ) )
44  
        static_cast<Visitor&&>(v)( std::declval<std::nullptr_t const&>() ) )
47  
{
45  
{
 
46 +
    auto const& scalar = detail::access::get_scalar(jv);
48  
    switch(jv.kind())
47  
    switch(jv.kind())
49  
    {
48  
    {
50  
    default: // unreachable()?
49  
    default: // unreachable()?
51  
    case kind::string:  return static_cast<Visitor&&>(v)( jv.get_string() );
50  
    case kind::string:  return static_cast<Visitor&&>(v)( jv.get_string() );
52  
    case kind::array:   return static_cast<Visitor&&>(v)( jv.get_array() );
51  
    case kind::array:   return static_cast<Visitor&&>(v)( jv.get_array() );
53  
    case kind::object:  return static_cast<Visitor&&>(v)( jv.get_object() );
52  
    case kind::object:  return static_cast<Visitor&&>(v)( jv.get_object() );
54 -
    case kind::bool_:   return static_cast<Visitor&&>(v)( jv.get_bool() );
53 +
    case kind::bool_:   return static_cast<Visitor&&>(v)( scalar.b );
55 -
    case kind::int64:   return static_cast<Visitor&&>(v)( jv.get_int64() );
54 +
    case kind::int64:   return static_cast<Visitor&&>(v)( scalar.i );
56 -
    case kind::uint64:  return static_cast<Visitor&&>(v)( jv.get_uint64() );
55 +
    case kind::uint64:  return static_cast<Visitor&&>(v)( scalar.u );
57 -
    case kind::double_: return static_cast<Visitor&&>(v)( jv.get_double() );
56 +
    case kind::double_: return static_cast<Visitor&&>(v)( scalar.d );
58 -
    case kind::null: {
57 +
    case kind::null:    return static_cast<Visitor&&>(v)( scalar.n );
59 -
        auto const np = nullptr;
 
60 -
        return static_cast<Visitor&&>(v)(np) ;
 
61 -
    }
 
62  
    }
58  
    }
63  
}
59  
}
64  

60  

65  

61  

66  
template<class Visitor>
62  
template<class Visitor>
67  
auto
63  
auto
68  
visit(
64  
visit(
69  
    Visitor&& v,
65  
    Visitor&& v,
70  
    value&& jv) -> decltype(
66  
    value&& jv) -> decltype(
71  
        static_cast<Visitor&&>(v)( std::declval<std::nullptr_t&&>() ) )
67  
        static_cast<Visitor&&>(v)( std::declval<std::nullptr_t&&>() ) )
72  
{
68  
{
 
69 +
    auto& scalar = detail::access::get_scalar(jv);
73  
    switch(jv.kind())
70  
    switch(jv.kind())
74  
    {
71  
    {
75  
    default: // unreachable()?
72  
    default: // unreachable()?
76  
    case kind::string:  return static_cast<Visitor&&>(v)( std::move( jv.get_string() ) );
73  
    case kind::string:  return static_cast<Visitor&&>(v)( std::move( jv.get_string() ) );
77  
    case kind::array:   return static_cast<Visitor&&>(v)( std::move( jv.get_array() ) );
74  
    case kind::array:   return static_cast<Visitor&&>(v)( std::move( jv.get_array() ) );
78  
    case kind::object:  return static_cast<Visitor&&>(v)( std::move( jv.get_object() ) );
75  
    case kind::object:  return static_cast<Visitor&&>(v)( std::move( jv.get_object() ) );
79 -
    case kind::bool_:   return static_cast<Visitor&&>(v)( std::move( jv.get_bool() ) );
76 +
    case kind::bool_:   return static_cast<Visitor&&>(v)( std::move( scalar.b ) );
80 -
    case kind::int64:   return static_cast<Visitor&&>(v)( std::move( jv.get_int64() ) );
77 +
    case kind::int64:   return static_cast<Visitor&&>(v)( std::move( scalar.i ) );
81 -
    case kind::uint64:  return static_cast<Visitor&&>(v)( std::move( jv.get_uint64() ) );
78 +
    case kind::uint64:  return static_cast<Visitor&&>(v)( std::move( scalar.u ) );
82 -
    case kind::double_: return static_cast<Visitor&&>(v)( std::move( jv.get_double() ) );
79 +
    case kind::double_: return static_cast<Visitor&&>(v)( std::move( scalar.d ) );
83 -
    case kind::null:    return static_cast<Visitor&&>(v)( std::nullptr_t() ) ;
80 +
    case kind::null:    return static_cast<Visitor&&>(v)( std::move( scalar.n ) ) ;
84  
    }
81  
    }
85  
}
82  
}
86  

83  

87  
} // namespace json
84  
} // namespace json
88  
} // namespace boost
85  
} // namespace boost
89  

86  

90  
#endif
87  
#endif