100.00% Lines (43/43) 100.00% Functions (6/6)
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   // Copyright (c) 2020 Krystian Stasiowski (sdkrystian@gmail.com) 3   // Copyright (c) 2020 Krystian Stasiowski (sdkrystian@gmail.com)
4   // 4   //
5   // Distributed under the Boost Software License, Version 1.0. (See accompanying 5   // Distributed under the Boost Software License, Version 1.0. (See accompanying
6   // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 6   // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7   // 7   //
8   // Official repository: https://github.com/boostorg/json 8   // Official repository: https://github.com/boostorg/json
9   // 9   //
10   10  
11   #ifndef BOOST_JSON_IMPL_PARSE_INTO_HPP 11   #ifndef BOOST_JSON_IMPL_PARSE_INTO_HPP
12   #define BOOST_JSON_IMPL_PARSE_INTO_HPP 12   #define BOOST_JSON_IMPL_PARSE_INTO_HPP
13   13  
14   #include <boost/json/basic_parser_impl.hpp> 14   #include <boost/json/basic_parser_impl.hpp>
15   #include <boost/json/error.hpp> 15   #include <boost/json/error.hpp>
16   #include <istream> 16   #include <istream>
17   17  
18   namespace boost { 18   namespace boost {
19   namespace json { 19   namespace json {
20   20  
21   template<class V> 21   template<class V>
22   void 22   void
HITCBC 23   232 parse_into( 23   232 parse_into(
24   V& v, 24   V& v,
25   string_view sv, 25   string_view sv,
26   system::error_code& ec, 26   system::error_code& ec,
27   parse_options const& opt ) 27   parse_options const& opt )
28   { 28   {
HITCBC 29   232 parser_for<V> p( opt, &v ); 29   232 parser_for<V> p( opt, &v );
30   30  
HITCBC 31   232 std::size_t n = p.write_some( false, sv.data(), sv.size(), ec ); 31   232 std::size_t n = p.write_some( false, sv.data(), sv.size(), ec );
32   32  
HITCBC 33   232 if( !ec && n < sv.size() ) 33   232 if( !ec && n < sv.size() )
34   { 34   {
HITCBC 35   1 BOOST_JSON_FAIL( ec, error::extra_data ); 35   1 BOOST_JSON_FAIL( ec, error::extra_data );
36   } 36   }
HITCBC 37   232 } 37   232 }
38   38  
39   template<class V> 39   template<class V>
40   void 40   void
HITCBC 41   66 parse_into( 41   66 parse_into(
42   V& v, 42   V& v,
43   string_view sv, 43   string_view sv,
44   std::error_code& ec, 44   std::error_code& ec,
45   parse_options const& opt ) 45   parse_options const& opt )
46   { 46   {
HITCBC 47   66 system::error_code jec; 47   66 system::error_code jec;
HITCBC 48   66 parse_into(v, sv, jec, opt); 48   66 parse_into(v, sv, jec, opt);
HITCBC 49   66 ec = jec; 49   66 ec = jec;
HITCBC 50   66 } 50   66 }
51   51  
52   template<class V> 52   template<class V>
53   void 53   void
HITCBC 54   74 parse_into( 54   74 parse_into(
55   V& v, 55   V& v,
56   string_view sv, 56   string_view sv,
57   parse_options const& opt ) 57   parse_options const& opt )
58   { 58   {
HITCBC 59   74 system::error_code ec; 59   74 system::error_code ec;
HITCBC 60   74 parse_into(v, sv, ec, opt); 60   74 parse_into(v, sv, ec, opt);
HITCBC 61   74 if( ec.failed() ) 61   74 if( ec.failed() )
HITCBC 62   1 detail::throw_system_error( ec ); 62   1 detail::throw_system_error( ec );
HITCBC 63   73 } 63   73 }
64   64  
65   template<class V> 65   template<class V>
66   void 66   void
HITCBC 67   201 parse_into( 67   201 parse_into(
68   V& v, 68   V& v,
69   std::istream& is, 69   std::istream& is,
70   system::error_code& ec, 70   system::error_code& ec,
71   parse_options const& opt ) 71   parse_options const& opt )
72   { 72   {
HITCBC 73   201 parser_for<V> p( opt, &v ); 73   201 parser_for<V> p( opt, &v );
74   74  
75   char read_buffer[BOOST_JSON_STACK_BUFFER_SIZE]; 75   char read_buffer[BOOST_JSON_STACK_BUFFER_SIZE];
76   do 76   do
77   { 77   {
HITCBC 78   399 if( is.eof() ) 78   399 if( is.eof() )
79   { 79   {
HITCBC 80   198 p.write_some(false, nullptr, 0, ec); 80   198 p.write_some(false, nullptr, 0, ec);
HITCBC 81   198 break; 81   198 break;
82   } 82   }
83   83  
HITCBC 84   201 if( !is ) 84   201 if( !is )
85   { 85   {
HITCBC 86   1 BOOST_JSON_FAIL( ec, error::input_error ); 86   1 BOOST_JSON_FAIL( ec, error::input_error );
HITCBC 87   1 break; 87   1 break;
88   } 88   }
89   89  
HITCBC 90   200 is.read(read_buffer, sizeof(read_buffer)); 90   200 is.read(read_buffer, sizeof(read_buffer));
HITCBC 91   200 std::size_t const consumed = static_cast<std::size_t>( is.gcount() ); 91   200 std::size_t const consumed = static_cast<std::size_t>( is.gcount() );
92   92  
HITCBC 93   200 std::size_t const n = p.write_some( true, read_buffer, consumed, ec ); 93   200 std::size_t const n = p.write_some( true, read_buffer, consumed, ec );
HITCBC 94   200 if( !ec.failed() && n < consumed ) 94   200 if( !ec.failed() && n < consumed )
95   { 95   {
HITCBC 96   1 BOOST_JSON_FAIL( ec, error::extra_data ); 96   1 BOOST_JSON_FAIL( ec, error::extra_data );
97   } 97   }
98   } 98   }
HITCBC 99   200 while( !ec.failed() ); 99   200 while( !ec.failed() );
HITCBC 100   201 } 100   201 }
101   101  
102   template<class V> 102   template<class V>
103   void 103   void
HITCBC 104   66 parse_into( 104   66 parse_into(
105   V& v, 105   V& v,
106   std::istream& is, 106   std::istream& is,
107   std::error_code& ec, 107   std::error_code& ec,
108   parse_options const& opt ) 108   parse_options const& opt )
109   { 109   {
HITCBC 110   66 system::error_code jec; 110   66 system::error_code jec;
HITCBC 111   66 parse_into(v, is, jec, opt); 111   66 parse_into(v, is, jec, opt);
HITCBC 112   66 ec = jec; 112   66 ec = jec;
HITCBC 113   66 } 113   66 }
114   114  
115   template<class V> 115   template<class V>
116   void 116   void
HITCBC 117   67 parse_into( 117   67 parse_into(
118   V& v, 118   V& v,
119   std::istream& is, 119   std::istream& is,
120   parse_options const& opt ) 120   parse_options const& opt )
121   { 121   {
HITCBC 122   67 system::error_code ec; 122   67 system::error_code ec;
HITCBC 123   67 parse_into(v, is, ec, opt); 123   67 parse_into(v, is, ec, opt);
HITCBC 124   67 if( ec.failed() ) 124   67 if( ec.failed() )
HITCBC 125   1 detail::throw_system_error( ec ); 125   1 detail::throw_system_error( ec );
HITCBC 126   66 } 126   66 }
127   127  
128   } // namespace boost 128   } // namespace boost
129   } // namespace json 129   } // namespace json
130   130  
131   #endif 131   #endif