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