100.00% Lines (59/59) 100.00% Functions (10/10)
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_PARSER_IPP 10   #ifndef BOOST_JSON_IMPL_PARSER_IPP
11   #define BOOST_JSON_IMPL_PARSER_IPP 11   #define BOOST_JSON_IMPL_PARSER_IPP
12   12  
13   #include <boost/json/parser.hpp> 13   #include <boost/json/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   2001508 parser:: 23   2001508 parser::
24   parser( 24   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   2001508 std::size_t size) noexcept 28   2001508 std::size_t size) noexcept
HITCBC 29   2001508 : p_( 29   2001508 : p_(
30   opt, 30   opt,
HITCBC 31   2001508 std::move(sp), 31   2001508 std::move(sp),
32   buffer, 32   buffer,
33   size) 33   size)
34   { 34   {
HITCBC 35   2001508 reset(); 35   2001508 reset();
HITCBC 36   2001508 } 36   2001508 }
37   37  
HITCBC 38   55 parser:: 38   55 parser::
39   parser( 39   parser(
40   storage_ptr sp, 40   storage_ptr sp,
HITCBC 41   55 parse_options const& opt) noexcept 41   55 parse_options const& opt) noexcept
HITCBC 42   55 : p_( 42   55 : p_(
43   opt, 43   opt,
HITCBC 44   55 std::move(sp), 44   55 std::move(sp),
HITCBC 45   110 nullptr, 45   110 nullptr,
HITCBC 46   55 0) 46   55 0)
47   { 47   {
HITCBC 48   55 reset(); 48   55 reset();
HITCBC 49   55 } 49   55 }
50   50  
51   void 51   void
HITCBC 52   4003070 parser:: 52   4003070 parser::
53   reset(storage_ptr sp) noexcept 53   reset(storage_ptr sp) noexcept
54   { 54   {
HITCBC 55   4003070 p_.reset(); 55   4003070 p_.reset();
HITCBC 56   4003070 p_.handler().st.reset(sp); 56   4003070 p_.handler().st.reset(sp);
HITCBC 57   4003070 } 57   4003070 }
58   58  
59   std::size_t 59   std::size_t
HITCBC 60   2001553 parser:: 60   2001553 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   2001553 auto const n = p_.write_some( 66   2001553 auto const n = p_.write_some(
67   false, data, size, ec); 67   false, data, size, ec);
HITCBC 68   2001552 BOOST_ASSERT(ec || p_.done()); 68   2001552 BOOST_ASSERT(ec || p_.done());
HITCBC 69   2001552 return n; 69   2001552 return n;
70   } 70   }
71   71  
72   std::size_t 72   std::size_t
HITCBC 73   6 parser:: 73   6 parser::
74   write_some( 74   write_some(
75   char const* data, 75   char const* data,
76   std::size_t size, 76   std::size_t size,
77   std::error_code& ec) 77   std::error_code& ec)
78   { 78   {
HITCBC 79   6 system::error_code jec; 79   6 system::error_code jec;
HITCBC 80   6 std::size_t const result = write_some(data, size, jec); 80   6 std::size_t const result = write_some(data, size, jec);
HITCBC 81   6 ec = jec; 81   6 ec = jec;
HITCBC 82   6 return result; 82   6 return result;
83   } 83   }
84   84  
85   std::size_t 85   std::size_t
HITCBC 86   8 parser:: 86   8 parser::
87   write_some( 87   write_some(
88   char const* data, 88   char const* data,
89   std::size_t size) 89   std::size_t size)
90   { 90   {
HITCBC 91   8 system::error_code ec; 91   8 system::error_code ec;
HITCBC 92   8 auto const n = write_some( 92   8 auto const n = write_some(
93   data, size, ec); 93   data, size, ec);
HITCBC 94   8 if(ec) 94   8 if(ec)
HITCBC 95   4 detail::throw_system_error( ec ); 95   4 detail::throw_system_error( ec );
HITCBC 96   4 return n; 96   4 return n;
97   } 97   }
98   98  
99   std::size_t 99   std::size_t
HITCBC 100   2001533 parser:: 100   2001533 parser::
101   write( 101   write(
102   char const* data, 102   char const* data,
103   std::size_t size, 103   std::size_t size,
104   system::error_code& ec) 104   system::error_code& ec)
105   { 105   {
HITCBC 106   2001533 auto const n = write_some( 106   2001533 auto const n = write_some(
107   data, size, ec); 107   data, size, ec);
HITCBC 108   2001532 if(! ec && n < size) 108   2001532 if(! ec && n < size)
109   { 109   {
HITCBC 110   8 BOOST_JSON_FAIL(ec, error::extra_data); 110   8 BOOST_JSON_FAIL(ec, error::extra_data);
HITCBC 111   8 p_.fail(ec); 111   8 p_.fail(ec);
112   } 112   }
HITCBC 113   2001532 return n; 113   2001532 return n;
114   } 114   }
115   115  
116   std::size_t 116   std::size_t
HITCBC 117   7 parser:: 117   7 parser::
118   write( 118   write(
119   char const* data, 119   char const* data,
120   std::size_t size, 120   std::size_t size,
121   std::error_code& ec) 121   std::error_code& ec)
122   { 122   {
HITCBC 123   7 system::error_code jec; 123   7 system::error_code jec;
HITCBC 124   7 std::size_t const result = write(data, size, jec); 124   7 std::size_t const result = write(data, size, jec);
HITCBC 125   7 ec = jec; 125   7 ec = jec;
HITCBC 126   7 return result; 126   7 return result;
127   } 127   }
128   128  
129   std::size_t 129   std::size_t
HITCBC 130   14 parser:: 130   14 parser::
131   write( 131   write(
132   char const* data, 132   char const* data,
133   std::size_t size) 133   std::size_t size)
134   { 134   {
HITCBC 135   14 system::error_code ec; 135   14 system::error_code ec;
HITCBC 136   14 auto const n = write( 136   14 auto const n = write(
137   data, size, ec); 137   data, size, ec);
HITCBC 138   14 if(ec) 138   14 if(ec)
HITCBC 139   8 detail::throw_system_error( ec ); 139   8 detail::throw_system_error( ec );
HITCBC 140   6 return n; 140   6 return n;
141   } 141   }
142   142  
143   value 143   value
HITCBC 144   2001495 parser:: 144   2001495 parser::
145   release() 145   release()
146   { 146   {
HITCBC 147   2001495 if( ! p_.done()) 147   2001495 if( ! p_.done())
148   { 148   {
149   // prevent undefined behavior 149   // prevent undefined behavior
HITCBC 150   4 if(! p_.last_error()) 150   4 if(! p_.last_error())
151   { 151   {
HITCBC 152   2 system::error_code ec; 152   2 system::error_code ec;
HITCBC 153   2 BOOST_JSON_FAIL(ec, error::incomplete); 153   2 BOOST_JSON_FAIL(ec, error::incomplete);
HITCBC 154   2 p_.fail(ec); 154   2 p_.fail(ec);
155   } 155   }
HITCBC 156   8 detail::throw_system_error( 156   8 detail::throw_system_error(
HITCBC 157   8 p_.last_error()); 157   8 p_.last_error());
158   } 158   }
HITCBC 159   2001491 return p_.handler().st.release(); 159   2001491 return p_.handler().st.release();
160   } 160   }
161   161  
162   } // namespace json 162   } // namespace json
163   } // namespace boost 163   } // namespace boost
164   164  
165   #endif 165   #endif