]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/boost/json/impl/parser.ipp
import quincy beta 17.1.0
[ceph.git] / ceph / src / boost / boost / json / impl / parser.ipp
1 //
2 // Copyright (c) 2019 Vinnie Falco (vinnie.falco@gmail.com)
3 //
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)
6 //
7 // Official repository: https://github.com/boostorg/json
8 //
9
10 #ifndef BOOST_JSON_IMPL_PARSER_IPP
11 #define BOOST_JSON_IMPL_PARSER_IPP
12
13 #include <boost/json/parser.hpp>
14 #include <boost/json/basic_parser_impl.hpp>
15 #include <boost/json/error.hpp>
16 #include <cstring>
17 #include <stdexcept>
18 #include <utility>
19
20 BOOST_JSON_NS_BEGIN
21
22 parser::
23 parser(
24 storage_ptr sp,
25 parse_options const& opt,
26 unsigned char* buffer,
27 std::size_t size) noexcept
28 : p_(
29 opt,
30 std::move(sp),
31 buffer,
32 size)
33 {
34 reset();
35 }
36
37 parser::
38 parser(
39 storage_ptr sp,
40 parse_options const& opt) noexcept
41 : p_(
42 opt,
43 std::move(sp),
44 nullptr,
45 0)
46 {
47 reset();
48 }
49
50 void
51 parser::
52 reset(storage_ptr sp) noexcept
53 {
54 p_.reset();
55 p_.handler().st.reset(sp);
56 }
57
58 std::size_t
59 parser::
60 write_some(
61 char const* data,
62 std::size_t size,
63 error_code& ec)
64 {
65 auto const n = p_.write_some(
66 false, data, size, ec);
67 BOOST_ASSERT(ec || p_.done());
68 return n;
69 }
70
71 std::size_t
72 parser::
73 write_some(
74 char const* data,
75 std::size_t size)
76 {
77 error_code ec;
78 auto const n = write_some(
79 data, size, ec);
80 if(ec)
81 detail::throw_system_error(ec,
82 BOOST_CURRENT_LOCATION);
83 return n;
84 }
85
86 std::size_t
87 parser::
88 write(
89 char const* data,
90 std::size_t size,
91 error_code& ec)
92 {
93 auto const n = write_some(
94 data, size, ec);
95 if(! ec && n < size)
96 {
97 ec = error::extra_data;
98 p_.fail(ec);
99 }
100 return n;
101 }
102
103 std::size_t
104 parser::
105 write(
106 char const* data,
107 std::size_t size)
108 {
109 error_code ec;
110 auto const n = write(
111 data, size, ec);
112 if(ec)
113 detail::throw_system_error(ec,
114 BOOST_CURRENT_LOCATION);
115 return n;
116 }
117
118 value
119 parser::
120 release()
121 {
122 if( ! p_.done())
123 {
124 // prevent undefined behavior
125 if(! p_.last_error())
126 p_.fail(error::incomplete);
127 detail::throw_system_error(
128 p_.last_error(),
129 BOOST_CURRENT_LOCATION);
130 }
131 return p_.handler().st.release();
132 }
133
134 BOOST_JSON_NS_END
135
136 #endif