100.00% Lines (67/67) 100.00% Functions (13/13)
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_STREAM_PARSER_IPP 10   #ifndef BOOST_JSON_IMPL_STREAM_PARSER_IPP
11   #define BOOST_JSON_IMPL_STREAM_PARSER_IPP 11   #define BOOST_JSON_IMPL_STREAM_PARSER_IPP
12   12  
13   #include <boost/json/stream_parser.hpp> 13   #include <boost/json/stream_parser.hpp>
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 <cstring> 16   #include <cstring>
17   #include <stdexcept> 17   #include <stdexcept>
18   #include <utility> 18   #include <utility>
19   19  
20   namespace boost { 20   namespace boost {
21   namespace json { 21   namespace json {
22   22  
HITCBC 23   22 stream_parser:: 23   22 stream_parser::
24   stream_parser( 24   stream_parser(
25   storage_ptr sp, 25   storage_ptr sp,
26   parse_options const& opt, 26   parse_options const& opt,
27   unsigned char* buffer, 27   unsigned char* buffer,
HITCBC 28   22 std::size_t size) noexcept 28   22 std::size_t size) noexcept
HITCBC 29   22 : p_( 29   22 : p_(
30   opt, 30   opt,
HITCBC 31   22 std::move(sp), 31   22 std::move(sp),
32   buffer, 32   buffer,
33   size) 33   size)
34   { 34   {
HITCBC 35   22 reset(); 35   22 reset();
HITCBC 36   22 } 36   22 }
37   37  
HITCBC 38   75304 stream_parser:: 38   75304 stream_parser::
39   stream_parser( 39   stream_parser(
40   storage_ptr sp, 40   storage_ptr sp,
HITCBC 41   75304 parse_options const& opt) noexcept 41   75304 parse_options const& opt) noexcept
HITCBC 42   75304 : p_( 42   75304 : p_(
43   opt, 43   opt,
HITCBC 44   75304 std::move(sp), 44   75304 std::move(sp),
HITCBC 45   150608 nullptr, 45   150608 nullptr,
HITCBC 46   75304 0) 46   75304 0)
47   { 47   {
HITCBC 48   75304 reset(); 48   75304 reset();
HITCBC 49   75304 } 49   75304 }
50   50  
51   void 51   void
HITCBC 52   150055 stream_parser:: 52   150055 stream_parser::
53   reset(storage_ptr sp) noexcept 53   reset(storage_ptr sp) noexcept
54   { 54   {
HITCBC 55   150055 p_.reset(); 55   150055 p_.reset();
HITCBC 56   150055 p_.handler().st.reset(sp); 56   150055 p_.handler().st.reset(sp);
HITCBC 57   150055 } 57   150055 }
58   58  
59   std::size_t 59   std::size_t
HITCBC 60   130421 stream_parser:: 60   130421 stream_parser::
61   write_some( 61   write_some(
62   char const* data, 62   char const* data,
63   std::size_t size, 63   std::size_t size,
64   system::error_code& ec) 64   system::error_code& ec)
65   { 65   {
HITCBC 66   130421 return p_.write_some( 66   130421 return p_.write_some(
HITCBC 67   130280 true, data, size, ec); 67   130280 true, data, size, ec);
68   } 68   }
69   69  
70   std::size_t 70   std::size_t
HITCBC 71   2 stream_parser:: 71   2 stream_parser::
72   write_some( 72   write_some(
73   char const* data, 73   char const* data,
74   std::size_t size, 74   std::size_t size,
75   std::error_code& ec) 75   std::error_code& ec)
76   { 76   {
HITCBC 77   2 system::error_code jec; 77   2 system::error_code jec;
HITCBC 78   2 std::size_t const result = write_some(data, size, jec); 78   2 std::size_t const result = write_some(data, size, jec);
HITCBC 79   2 ec = jec; 79   2 ec = jec;
HITCBC 80   2 return result; 80   2 return result;
81   } 81   }
82   82  
83   std::size_t 83   std::size_t
HITCBC 84   6 stream_parser:: 84   6 stream_parser::
85   write_some( 85   write_some(
86   char const* data, 86   char const* data,
87   std::size_t size) 87   std::size_t size)
88   { 88   {
HITCBC 89   6 system::error_code ec; 89   6 system::error_code ec;
HITCBC 90   6 auto const n = write_some( 90   6 auto const n = write_some(
91   data, size, ec); 91   data, size, ec);
HITCBC 92   6 if(ec) 92   6 if(ec)
HITCBC 93   1 detail::throw_system_error( ec ); 93   1 detail::throw_system_error( ec );
HITCBC 94   5 return n; 94   5 return n;
95   } 95   }
96   96  
97   std::size_t 97   std::size_t
HITCBC 98   130392 stream_parser:: 98   130392 stream_parser::
99   write( 99   write(
100   char const* data, 100   char const* data,
101   std::size_t size, 101   std::size_t size,
102   system::error_code& ec) 102   system::error_code& ec)
103   { 103   {
HITCBC 104   130392 auto const n = write_some( 104   130392 auto const n = write_some(
105   data, size, ec); 105   data, size, ec);
HITCBC 106   130251 if(! ec && n < size) 106   130251 if(! ec && n < size)
107   { 107   {
HITCBC 108   6 BOOST_JSON_FAIL(ec, error::extra_data); 108   6 BOOST_JSON_FAIL(ec, error::extra_data);
HITCBC 109   6 p_.fail(ec); 109   6 p_.fail(ec);
110   } 110   }
HITCBC 111   130251 return n; 111   130251 return n;
112   } 112   }
113   113  
114   std::size_t 114   std::size_t
HITCBC 115   2 stream_parser:: 115   2 stream_parser::
116   write( 116   write(
117   char const* data, 117   char const* data,
118   std::size_t size, 118   std::size_t size,
119   std::error_code& ec) 119   std::error_code& ec)
120   { 120   {
HITCBC 121   2 system::error_code jec; 121   2 system::error_code jec;
HITCBC 122   2 std::size_t const result = write(data, size, jec); 122   2 std::size_t const result = write(data, size, jec);
HITCBC 123   2 ec = jec; 123   2 ec = jec;
HITCBC 124   2 return result; 124   2 return result;
125   } 125   }
126   126  
127   std::size_t 127   std::size_t
HITCBC 128   11 stream_parser:: 128   11 stream_parser::
129   write( 129   write(
130   char const* data, 130   char const* data,
131   std::size_t size) 131   std::size_t size)
132   { 132   {
HITCBC 133   11 system::error_code ec; 133   11 system::error_code ec;
HITCBC 134   11 auto const n = write( 134   11 auto const n = write(
135   data, size, ec); 135   data, size, ec);
HITCBC 136   11 if(ec) 136   11 if(ec)
HITCBC 137   1 detail::throw_system_error( ec ); 137   1 detail::throw_system_error( ec );
HITCBC 138   10 return n; 138   10 return n;
139   } 139   }
140   140  
141   void 141   void
HITCBC 142   75152 stream_parser:: 142   75152 stream_parser::
143   finish(system::error_code& ec) 143   finish(system::error_code& ec)
144   { 144   {
HITCBC 145   75152 p_.write_some(false, nullptr, 0, ec); 145   75152 p_.write_some(false, nullptr, 0, ec);
HITCBC 146   75152 } 146   75152 }
147   147  
148   void 148   void
HITCBC 149   8 stream_parser:: 149   8 stream_parser::
150   finish() 150   finish()
151   { 151   {
HITCBC 152   8 system::error_code ec; 152   8 system::error_code ec;
HITCBC 153   8 finish(ec); 153   8 finish(ec);
HITCBC 154   8 if(ec) 154   8 if(ec)
HITCBC 155   6 detail::throw_system_error( ec ); 155   6 detail::throw_system_error( ec );
HITCBC 156   2 } 156   2 }
157   157  
158   void 158   void
HITCBC 159   2 stream_parser:: 159   2 stream_parser::
160   finish(std::error_code& ec) 160   finish(std::error_code& ec)
161   { 161   {
HITCBC 162   2 system::error_code jec; 162   2 system::error_code jec;
HITCBC 163   2 finish(jec); 163   2 finish(jec);
HITCBC 164   2 ec = jec; 164   2 ec = jec;
HITCBC 165   2 } 165   2 }
166   166  
167   value 167   value
HITCBC 168   75151 stream_parser:: 168   75151 stream_parser::
169   release() 169   release()
170   { 170   {
HITCBC 171   75151 if(! p_.done()) 171   75151 if(! p_.done())
172   { 172   {
173   // prevent undefined behavior 173   // prevent undefined behavior
HITCBC 174   4 finish(); 174   4 finish();
175   } 175   }
HITCBC 176   75148 return p_.handler().st.release(); 176   75148 return p_.handler().st.release();
177   } 177   }
178   178  
179   } // namespace json 179   } // namespace json
180   } // namespace boost 180   } // namespace boost
181   181  
182   #endif 182   #endif