jsoncons 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/ext/jsoncons/extconf.rb +43 -0
- data/ext/jsoncons/jsoncons.cpp +161 -0
- data/ext/jsoncons/jsoncons.h +10 -0
- data/jsoncons.gemspec +44 -0
- data/lib/jsoncons/jsoncons/examples/input/address-book.json +13 -0
- data/lib/jsoncons/jsoncons/examples/input/books.json +28 -0
- data/lib/jsoncons/jsoncons/examples/input/countries.json +7 -0
- data/lib/jsoncons/jsoncons/examples/input/employees.json +30 -0
- data/lib/jsoncons/jsoncons/examples/input/jsonschema/name.json +15 -0
- data/lib/jsoncons/jsoncons/examples/input/multiple-json-objects.json +3 -0
- data/lib/jsoncons/jsoncons/examples/input/sales.csv +6 -0
- data/lib/jsoncons/jsoncons/examples/input/store.json +28 -0
- data/lib/jsoncons/jsoncons/examples/input/tasks.csv +6 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/allocator_holder.hpp +38 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/basic_json.hpp +5905 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/bigint.hpp +1611 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/byte_string.hpp +820 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/config/binary_config.hpp +226 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/config/compiler_support.hpp +375 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/config/jsoncons_config.hpp +309 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/config/version.hpp +40 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/conv_error.hpp +218 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/decode_json.hpp +209 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/decode_traits.hpp +651 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/detail/endian.hpp +44 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/detail/grisu3.hpp +312 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/detail/optional.hpp +483 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/detail/parse_number.hpp +1133 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/detail/span.hpp +188 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/detail/string_view.hpp +537 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/detail/string_wrapper.hpp +370 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/detail/write_number.hpp +567 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/encode_json.hpp +315 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/encode_traits.hpp +378 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/json.hpp +18 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/json_array.hpp +324 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/json_content_handler.hpp +12 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/json_cursor.hpp +448 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/json_decoder.hpp +420 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/json_encoder.hpp +1587 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/json_error.hpp +156 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/json_exception.hpp +241 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/json_filter.hpp +653 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/json_fwd.hpp +23 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/json_object.hpp +1772 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/json_options.hpp +862 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/json_parser.hpp +2900 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/json_reader.hpp +731 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/json_traits_macros.hpp +1072 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/json_traits_macros_deprecated.hpp +144 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/json_type.hpp +206 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/json_type_traits.hpp +1830 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/json_visitor.hpp +1560 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/json_visitor2.hpp +2079 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/pretty_print.hpp +89 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/ser_context.hpp +62 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/sink.hpp +289 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/source.hpp +777 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/source_adaptor.hpp +148 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/staj2_cursor.hpp +1189 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/staj_cursor.hpp +1254 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/staj_iterator.hpp +449 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/tag_type.hpp +245 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/text_source_adaptor.hpp +144 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/traits_extension.hpp +884 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/typed_array_view.hpp +250 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/unicode_traits.hpp +1330 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/uri.hpp +635 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/value_converter.hpp +340 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson.hpp +23 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_cursor.hpp +320 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_decimal128.hpp +865 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_encoder.hpp +585 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_error.hpp +103 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_oid.hpp +245 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_options.hpp +75 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_parser.hpp +645 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_reader.hpp +92 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_type.hpp +44 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/decode_bson.hpp +201 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/encode_bson.hpp +144 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor.hpp +26 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor_cursor.hpp +351 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor_cursor2.hpp +265 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor_detail.hpp +93 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor_encoder.hpp +1766 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor_error.hpp +105 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor_options.hpp +113 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor_parser.hpp +1942 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor_reader.hpp +116 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/decode_cbor.hpp +203 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/encode_cbor.hpp +151 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/csv.hpp +17 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/csv_cursor.hpp +358 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/csv_encoder.hpp +954 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/csv_error.hpp +85 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/csv_options.hpp +973 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/csv_parser.hpp +2099 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/csv_reader.hpp +348 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/csv_serializer.hpp +12 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/decode_csv.hpp +208 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/encode_csv.hpp +122 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jmespath/jmespath.hpp +5215 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jmespath/jmespath_error.hpp +215 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpatch/jsonpatch.hpp +579 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpatch/jsonpatch_error.hpp +121 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpath/expression.hpp +3329 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpath/flatten.hpp +432 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpath/json_location.hpp +445 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpath/json_query.hpp +115 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpath/jsonpath.hpp +13 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpath/jsonpath_error.hpp +240 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpath/jsonpath_expression.hpp +2612 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpath/jsonpath_selector.hpp +1322 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpointer/jsonpointer.hpp +1577 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpointer/jsonpointer_error.hpp +119 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/format_validator.hpp +968 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/json_validator.hpp +120 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/jsonschema.hpp +13 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/jsonschema_error.hpp +105 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/jsonschema_version.hpp +18 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/keyword_validator.hpp +1745 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/keyword_validator_factory.hpp +556 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/schema_draft7.hpp +198 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/schema_location.hpp +200 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/schema_version.hpp +35 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/subschema.hpp +144 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/mergepatch/mergepatch.hpp +103 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/decode_msgpack.hpp +202 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/encode_msgpack.hpp +142 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack.hpp +24 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack_cursor.hpp +343 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack_cursor2.hpp +259 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack_encoder.hpp +753 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack_error.hpp +94 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack_options.hpp +74 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack_parser.hpp +748 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack_reader.hpp +116 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack_type.hpp +63 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/decode_ubjson.hpp +201 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/encode_ubjson.hpp +142 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/ubjson.hpp +23 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/ubjson_cursor.hpp +307 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/ubjson_encoder.hpp +502 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/ubjson_error.hpp +100 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/ubjson_options.hpp +87 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/ubjson_parser.hpp +880 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/ubjson_reader.hpp +92 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/ubjson_type.hpp +43 -0
- data/lib/jsoncons/version.rb +5 -0
- data/lib/jsoncons.rb +33 -0
- data/test/jsoncons_test.rb +108 -0
- data/test/test_helper.rb +7 -0
- metadata +268 -0
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
// Copyright 2018 Daniel Parker
|
|
2
|
+
// Distributed under the Boost license, Version 1.0.
|
|
3
|
+
// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
|
4
|
+
|
|
5
|
+
// See https://github.com/danielaparker/jsoncons for latest version
|
|
6
|
+
|
|
7
|
+
#ifndef JSONCONS_MSGPACK_MSGPACK_CURSOR_HPP
|
|
8
|
+
#define JSONCONS_MSGPACK_MSGPACK_CURSOR_HPP
|
|
9
|
+
|
|
10
|
+
#include <memory> // std::allocator
|
|
11
|
+
#include <string>
|
|
12
|
+
#include <vector>
|
|
13
|
+
#include <stdexcept>
|
|
14
|
+
#include <system_error>
|
|
15
|
+
#include <ios>
|
|
16
|
+
#include <istream> // std::basic_istream
|
|
17
|
+
#include <jsoncons/byte_string.hpp>
|
|
18
|
+
#include <jsoncons/config/jsoncons_config.hpp>
|
|
19
|
+
#include <jsoncons/json_visitor.hpp>
|
|
20
|
+
#include <jsoncons/json_exception.hpp>
|
|
21
|
+
#include <jsoncons/staj_cursor.hpp>
|
|
22
|
+
#include <jsoncons/source.hpp>
|
|
23
|
+
#include <jsoncons_ext/msgpack/msgpack_parser.hpp>
|
|
24
|
+
|
|
25
|
+
namespace jsoncons {
|
|
26
|
+
namespace msgpack {
|
|
27
|
+
|
|
28
|
+
template<class Source=jsoncons::binary_stream_source,class Allocator=std::allocator<char>>
|
|
29
|
+
class basic_msgpack_cursor : public basic_staj_cursor<char>, private virtual ser_context
|
|
30
|
+
{
|
|
31
|
+
public:
|
|
32
|
+
using source_type = Source;
|
|
33
|
+
using char_type = char;
|
|
34
|
+
using allocator_type = Allocator;
|
|
35
|
+
private:
|
|
36
|
+
basic_msgpack_parser<Source,Allocator> parser_;
|
|
37
|
+
basic_staj_visitor<char_type> cursor_visitor_;
|
|
38
|
+
basic_json_visitor2_to_visitor_adaptor<char_type,Allocator> cursor_handler_adaptor_;
|
|
39
|
+
bool eof_;
|
|
40
|
+
|
|
41
|
+
// Noncopyable and nonmoveable
|
|
42
|
+
basic_msgpack_cursor(const basic_msgpack_cursor&) = delete;
|
|
43
|
+
basic_msgpack_cursor& operator=(const basic_msgpack_cursor&) = delete;
|
|
44
|
+
|
|
45
|
+
public:
|
|
46
|
+
using string_view_type = string_view;
|
|
47
|
+
|
|
48
|
+
template <class Sourceable>
|
|
49
|
+
basic_msgpack_cursor(Sourceable&& source,
|
|
50
|
+
const msgpack_decode_options& options = msgpack_decode_options(),
|
|
51
|
+
const Allocator& alloc = Allocator())
|
|
52
|
+
: parser_(std::forward<Sourceable>(source), options, alloc),
|
|
53
|
+
cursor_visitor_(accept_all),
|
|
54
|
+
cursor_handler_adaptor_(cursor_visitor_, alloc),
|
|
55
|
+
eof_(false)
|
|
56
|
+
{
|
|
57
|
+
if (!done())
|
|
58
|
+
{
|
|
59
|
+
next();
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// Constructors that set parse error codes
|
|
64
|
+
|
|
65
|
+
template <class Sourceable>
|
|
66
|
+
basic_msgpack_cursor(Sourceable&& source,
|
|
67
|
+
std::error_code& ec)
|
|
68
|
+
: basic_msgpack_cursor(std::allocator_arg, Allocator(),
|
|
69
|
+
std::forward<Sourceable>(source),
|
|
70
|
+
msgpack_decode_options(),
|
|
71
|
+
ec)
|
|
72
|
+
{
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
template <class Sourceable>
|
|
76
|
+
basic_msgpack_cursor(Sourceable&& source,
|
|
77
|
+
const msgpack_decode_options& options,
|
|
78
|
+
std::error_code& ec)
|
|
79
|
+
: basic_msgpack_cursor(std::allocator_arg, Allocator(),
|
|
80
|
+
std::forward<Sourceable>(source),
|
|
81
|
+
options,
|
|
82
|
+
ec)
|
|
83
|
+
{
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
template <class Sourceable>
|
|
87
|
+
basic_msgpack_cursor(std::allocator_arg_t, const Allocator& alloc,
|
|
88
|
+
Sourceable&& source,
|
|
89
|
+
const msgpack_decode_options& options,
|
|
90
|
+
std::error_code& ec)
|
|
91
|
+
: parser_(std::forward<Sourceable>(source), options, alloc),
|
|
92
|
+
cursor_visitor_(accept_all),
|
|
93
|
+
cursor_handler_adaptor_(cursor_visitor_, alloc),
|
|
94
|
+
eof_(false)
|
|
95
|
+
{
|
|
96
|
+
if (!done())
|
|
97
|
+
{
|
|
98
|
+
next(ec);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
void reset()
|
|
103
|
+
{
|
|
104
|
+
parser_.reset();
|
|
105
|
+
cursor_visitor_.reset();
|
|
106
|
+
cursor_handler_adaptor_.reset();
|
|
107
|
+
eof_ = false;
|
|
108
|
+
if (!done())
|
|
109
|
+
{
|
|
110
|
+
next();
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
template <class Sourceable>
|
|
115
|
+
void reset(Sourceable&& source)
|
|
116
|
+
{
|
|
117
|
+
parser_.reset(std::forward<Sourceable>(source));
|
|
118
|
+
cursor_visitor_.reset();
|
|
119
|
+
cursor_handler_adaptor_.reset();
|
|
120
|
+
eof_ = false;
|
|
121
|
+
if (!done())
|
|
122
|
+
{
|
|
123
|
+
next();
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
void reset(std::error_code& ec)
|
|
128
|
+
{
|
|
129
|
+
parser_.reset();
|
|
130
|
+
cursor_visitor_.reset();
|
|
131
|
+
cursor_handler_adaptor_.reset();
|
|
132
|
+
eof_ = false;
|
|
133
|
+
if (!done())
|
|
134
|
+
{
|
|
135
|
+
next(ec);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
template <class Sourceable>
|
|
140
|
+
void reset(Sourceable&& source, std::error_code& ec)
|
|
141
|
+
{
|
|
142
|
+
parser_.reset(std::forward<Sourceable>(source));
|
|
143
|
+
cursor_visitor_.reset();
|
|
144
|
+
cursor_handler_adaptor_.reset();
|
|
145
|
+
eof_ = false;
|
|
146
|
+
if (!done())
|
|
147
|
+
{
|
|
148
|
+
next(ec);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
bool done() const override
|
|
153
|
+
{
|
|
154
|
+
return parser_.done();
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
const staj_event& current() const override
|
|
158
|
+
{
|
|
159
|
+
return cursor_visitor_.event();
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
void read_to(basic_json_visitor<char_type>& visitor) override
|
|
163
|
+
{
|
|
164
|
+
std::error_code ec;
|
|
165
|
+
read_to(visitor, ec);
|
|
166
|
+
if (ec)
|
|
167
|
+
{
|
|
168
|
+
JSONCONS_THROW(ser_error(ec,parser_.line(),parser_.column()));
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
void read_to(basic_json_visitor<char_type>& visitor,
|
|
173
|
+
std::error_code& ec) override
|
|
174
|
+
{
|
|
175
|
+
if (cursor_visitor_.dump(visitor, *this, ec))
|
|
176
|
+
{
|
|
177
|
+
read_next(visitor, ec);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
void next() override
|
|
182
|
+
{
|
|
183
|
+
std::error_code ec;
|
|
184
|
+
next(ec);
|
|
185
|
+
if (ec)
|
|
186
|
+
{
|
|
187
|
+
JSONCONS_THROW(ser_error(ec,parser_.line(),parser_.column()));
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
void next(std::error_code& ec) override
|
|
192
|
+
{
|
|
193
|
+
read_next(ec);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
const ser_context& context() const override
|
|
197
|
+
{
|
|
198
|
+
return *this;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
bool eof() const
|
|
202
|
+
{
|
|
203
|
+
return eof_;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
std::size_t line() const override
|
|
207
|
+
{
|
|
208
|
+
return parser_.line();
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
std::size_t column() const override
|
|
212
|
+
{
|
|
213
|
+
return parser_.column();
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
friend
|
|
217
|
+
staj_filter_view operator|(basic_msgpack_cursor& cursor,
|
|
218
|
+
std::function<bool(const staj_event&, const ser_context&)> pred)
|
|
219
|
+
{
|
|
220
|
+
return staj_filter_view(cursor, pred);
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
#if !defined(JSONCONS_NO_DEPRECATED)
|
|
224
|
+
|
|
225
|
+
template <class Sourceable>
|
|
226
|
+
JSONCONS_DEPRECATED_MSG("Instead, use pipe syntax for filter")
|
|
227
|
+
basic_msgpack_cursor(Sourceable&& source,
|
|
228
|
+
std::function<bool(const staj_event&, const ser_context&)> filter,
|
|
229
|
+
const msgpack_decode_options& options = msgpack_decode_options(),
|
|
230
|
+
const Allocator& alloc = Allocator())
|
|
231
|
+
: parser_(std::forward<Sourceable>(source), options, alloc),
|
|
232
|
+
cursor_visitor_(filter),
|
|
233
|
+
cursor_handler_adaptor_(cursor_visitor_, alloc),
|
|
234
|
+
eof_(false)
|
|
235
|
+
{
|
|
236
|
+
if (!done())
|
|
237
|
+
{
|
|
238
|
+
next();
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
template <class Sourceable>
|
|
243
|
+
JSONCONS_DEPRECATED_MSG("Instead, use pipe syntax for filter")
|
|
244
|
+
basic_msgpack_cursor(Sourceable&& source,
|
|
245
|
+
std::function<bool(const staj_event&, const ser_context&)> filter,
|
|
246
|
+
std::error_code& ec)
|
|
247
|
+
: basic_msgpack_cursor(std::allocator_arg, Allocator(),
|
|
248
|
+
std::forward<Sourceable>(source), filter, ec)
|
|
249
|
+
{
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
template <class Sourceable>
|
|
253
|
+
JSONCONS_DEPRECATED_MSG("Instead, use pipe syntax for filter")
|
|
254
|
+
basic_msgpack_cursor(std::allocator_arg_t, const Allocator& alloc,
|
|
255
|
+
Sourceable&& source,
|
|
256
|
+
std::function<bool(const staj_event&, const ser_context&)> filter,
|
|
257
|
+
std::error_code& ec)
|
|
258
|
+
: parser_(std::forward<Sourceable>(source), alloc),
|
|
259
|
+
cursor_visitor_(filter),
|
|
260
|
+
cursor_handler_adaptor_(cursor_visitor_, alloc),
|
|
261
|
+
eof_(false)
|
|
262
|
+
{
|
|
263
|
+
if (!done())
|
|
264
|
+
{
|
|
265
|
+
next(ec);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
JSONCONS_DEPRECATED_MSG("Instead, use read_to(basic_json_visitor<char_type>&)")
|
|
270
|
+
void read(basic_json_visitor<char_type>& visitor)
|
|
271
|
+
{
|
|
272
|
+
read_to(visitor);
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
JSONCONS_DEPRECATED_MSG("Instead, use read_to(basic_json_visitor<char_type>&, std::error_code&)")
|
|
276
|
+
void read(basic_json_visitor<char_type>& visitor,
|
|
277
|
+
std::error_code& ec)
|
|
278
|
+
{
|
|
279
|
+
read_to(visitor, ec);
|
|
280
|
+
}
|
|
281
|
+
#endif
|
|
282
|
+
private:
|
|
283
|
+
static bool accept_all(const staj_event&, const ser_context&)
|
|
284
|
+
{
|
|
285
|
+
return true;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
void read_next(std::error_code& ec)
|
|
289
|
+
{
|
|
290
|
+
if (cursor_visitor_.in_available())
|
|
291
|
+
{
|
|
292
|
+
cursor_visitor_.send_available(ec);
|
|
293
|
+
}
|
|
294
|
+
else
|
|
295
|
+
{
|
|
296
|
+
parser_.restart();
|
|
297
|
+
while (!parser_.stopped())
|
|
298
|
+
{
|
|
299
|
+
parser_.parse(cursor_handler_adaptor_, ec);
|
|
300
|
+
if (ec) return;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
void read_next(basic_json_visitor<char_type>& visitor, std::error_code& ec)
|
|
306
|
+
{
|
|
307
|
+
{
|
|
308
|
+
struct resource_wrapper
|
|
309
|
+
{
|
|
310
|
+
basic_json_visitor2_to_visitor_adaptor<char_type,Allocator>& adaptor;
|
|
311
|
+
basic_json_visitor<char_type>& original;
|
|
312
|
+
|
|
313
|
+
resource_wrapper(basic_json_visitor2_to_visitor_adaptor<char_type,Allocator>& adaptor,
|
|
314
|
+
basic_json_visitor<char_type>& visitor)
|
|
315
|
+
: adaptor(adaptor), original(adaptor.destination())
|
|
316
|
+
{
|
|
317
|
+
adaptor.destination(visitor);
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
~resource_wrapper()
|
|
321
|
+
{
|
|
322
|
+
adaptor.destination(original);
|
|
323
|
+
}
|
|
324
|
+
} wrapper(cursor_handler_adaptor_, visitor);
|
|
325
|
+
|
|
326
|
+
parser_.restart();
|
|
327
|
+
while (!parser_.stopped())
|
|
328
|
+
{
|
|
329
|
+
parser_.parse(cursor_handler_adaptor_, ec);
|
|
330
|
+
if (ec) return;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
};
|
|
335
|
+
|
|
336
|
+
using msgpack_stream_cursor = basic_msgpack_cursor<jsoncons::binary_stream_source>;
|
|
337
|
+
using msgpack_bytes_cursor = basic_msgpack_cursor<jsoncons::bytes_source>;
|
|
338
|
+
|
|
339
|
+
} // namespace msgpack
|
|
340
|
+
} // namespace jsoncons
|
|
341
|
+
|
|
342
|
+
#endif
|
|
343
|
+
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
// Copyright 2018 Daniel Parker
|
|
2
|
+
// Distributed under the Boost license, Version 1.0.
|
|
3
|
+
// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
|
4
|
+
|
|
5
|
+
// See https://github.com/danielaparker/jsoncons for latest version
|
|
6
|
+
|
|
7
|
+
#ifndef JSONCONS_MSGPACK_MSGPACK_CURSOR2_HPP
|
|
8
|
+
#define JSONCONS_MSGPACK_MSGPACK_CURSOR2_HPP
|
|
9
|
+
|
|
10
|
+
#include <memory> // std::allocator
|
|
11
|
+
#include <string>
|
|
12
|
+
#include <vector>
|
|
13
|
+
#include <stdexcept>
|
|
14
|
+
#include <system_error>
|
|
15
|
+
#include <ios>
|
|
16
|
+
#include <istream> // std::basic_istream
|
|
17
|
+
#include <jsoncons/byte_string.hpp>
|
|
18
|
+
#include <jsoncons/config/jsoncons_config.hpp>
|
|
19
|
+
#include <jsoncons/json_visitor2.hpp>
|
|
20
|
+
#include <jsoncons/json_exception.hpp>
|
|
21
|
+
#include <jsoncons/staj2_cursor.hpp>
|
|
22
|
+
#include <jsoncons/source.hpp>
|
|
23
|
+
#include <jsoncons_ext/msgpack/msgpack_parser.hpp>
|
|
24
|
+
|
|
25
|
+
namespace jsoncons {
|
|
26
|
+
namespace msgpack {
|
|
27
|
+
|
|
28
|
+
template<class Source=jsoncons::binary_stream_source,class Allocator=std::allocator<char>>
|
|
29
|
+
class basic_msgpack_cursor2 : public basic_staj2_cursor<char>, private virtual ser_context
|
|
30
|
+
{
|
|
31
|
+
public:
|
|
32
|
+
using source_type = Source;
|
|
33
|
+
using char_type = char;
|
|
34
|
+
using allocator_type = Allocator;
|
|
35
|
+
private:
|
|
36
|
+
basic_msgpack_parser<Source,Allocator> parser_;
|
|
37
|
+
basic_staj2_visitor<char_type> cursor_visitor_;
|
|
38
|
+
bool eof_;
|
|
39
|
+
|
|
40
|
+
// Noncopyable and nonmoveable
|
|
41
|
+
basic_msgpack_cursor2(const basic_msgpack_cursor2&) = delete;
|
|
42
|
+
basic_msgpack_cursor2& operator=(const basic_msgpack_cursor2&) = delete;
|
|
43
|
+
|
|
44
|
+
public:
|
|
45
|
+
using string_view_type = string_view;
|
|
46
|
+
|
|
47
|
+
template <class Sourceable>
|
|
48
|
+
basic_msgpack_cursor2(Sourceable&& source,
|
|
49
|
+
const msgpack_decode_options& options = msgpack_decode_options(),
|
|
50
|
+
const Allocator& alloc = Allocator())
|
|
51
|
+
: parser_(std::forward<Sourceable>(source), options, alloc),
|
|
52
|
+
cursor_visitor_(accept_all),
|
|
53
|
+
eof_(false)
|
|
54
|
+
{
|
|
55
|
+
if (!done())
|
|
56
|
+
{
|
|
57
|
+
next();
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Constructors that set parse error codes
|
|
62
|
+
|
|
63
|
+
template <class Sourceable>
|
|
64
|
+
basic_msgpack_cursor2(Sourceable&& source,
|
|
65
|
+
std::error_code& ec)
|
|
66
|
+
: basic_msgpack_cursor2(std::allocator_arg, Allocator(),
|
|
67
|
+
std::forward<Sourceable>(source),
|
|
68
|
+
msgpack_decode_options(),
|
|
69
|
+
ec)
|
|
70
|
+
{
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
template <class Sourceable>
|
|
74
|
+
basic_msgpack_cursor2(Sourceable&& source,
|
|
75
|
+
const msgpack_decode_options& options,
|
|
76
|
+
std::error_code& ec)
|
|
77
|
+
: basic_msgpack_cursor2(std::allocator_arg, Allocator(),
|
|
78
|
+
std::forward<Sourceable>(source),
|
|
79
|
+
options,
|
|
80
|
+
ec)
|
|
81
|
+
{
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
template <class Sourceable>
|
|
85
|
+
basic_msgpack_cursor2(std::allocator_arg_t, const Allocator& alloc,
|
|
86
|
+
Sourceable&& source,
|
|
87
|
+
const msgpack_decode_options& options,
|
|
88
|
+
std::error_code& ec)
|
|
89
|
+
: parser_(std::forward<Sourceable>(source), options, alloc),
|
|
90
|
+
cursor_visitor_(accept_all),
|
|
91
|
+
eof_(false)
|
|
92
|
+
{
|
|
93
|
+
if (!done())
|
|
94
|
+
{
|
|
95
|
+
next(ec);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
void reset()
|
|
100
|
+
{
|
|
101
|
+
parser_.reset();
|
|
102
|
+
cursor_visitor_.reset();
|
|
103
|
+
eof_ = false;
|
|
104
|
+
if (!done())
|
|
105
|
+
{
|
|
106
|
+
next();
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
template <class Sourceable>
|
|
111
|
+
void reset(Sourceable&& source)
|
|
112
|
+
{
|
|
113
|
+
parser_.reset(std::forward<Sourceable>(source));
|
|
114
|
+
cursor_visitor_.reset();
|
|
115
|
+
eof_ = false;
|
|
116
|
+
if (!done())
|
|
117
|
+
{
|
|
118
|
+
next();
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
void reset(std::error_code& ec)
|
|
123
|
+
{
|
|
124
|
+
parser_.reset();
|
|
125
|
+
cursor_visitor_.reset();
|
|
126
|
+
eof_ = false;
|
|
127
|
+
if (!done())
|
|
128
|
+
{
|
|
129
|
+
next(ec);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
template <class Sourceable>
|
|
134
|
+
void reset(Sourceable&& source, std::error_code& ec)
|
|
135
|
+
{
|
|
136
|
+
parser_.reset(std::forward<Sourceable>(source));
|
|
137
|
+
cursor_visitor_.reset();
|
|
138
|
+
eof_ = false;
|
|
139
|
+
if (!done())
|
|
140
|
+
{
|
|
141
|
+
next(ec);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
bool done() const override
|
|
146
|
+
{
|
|
147
|
+
return parser_.done();
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
const staj2_event& current() const override
|
|
151
|
+
{
|
|
152
|
+
return cursor_visitor_.event();
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
void read_to(basic_json_visitor2<char_type>& visitor) override
|
|
156
|
+
{
|
|
157
|
+
std::error_code ec;
|
|
158
|
+
read_to(visitor, ec);
|
|
159
|
+
if (ec)
|
|
160
|
+
{
|
|
161
|
+
JSONCONS_THROW(ser_error(ec,parser_.line(),parser_.column()));
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
void read_to(basic_json_visitor2<char_type>& visitor,
|
|
166
|
+
std::error_code& ec) override
|
|
167
|
+
{
|
|
168
|
+
if (cursor_visitor_.dump(visitor, *this, ec))
|
|
169
|
+
{
|
|
170
|
+
read_next(visitor, ec);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
void next() override
|
|
175
|
+
{
|
|
176
|
+
std::error_code ec;
|
|
177
|
+
next(ec);
|
|
178
|
+
if (ec)
|
|
179
|
+
{
|
|
180
|
+
JSONCONS_THROW(ser_error(ec,parser_.line(),parser_.column()));
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
void next(std::error_code& ec) override
|
|
185
|
+
{
|
|
186
|
+
read_next(ec);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
const ser_context& context() const override
|
|
190
|
+
{
|
|
191
|
+
return *this;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
bool eof() const
|
|
195
|
+
{
|
|
196
|
+
return eof_;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
std::size_t line() const override
|
|
200
|
+
{
|
|
201
|
+
return parser_.line();
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
std::size_t column() const override
|
|
205
|
+
{
|
|
206
|
+
return parser_.column();
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
friend
|
|
210
|
+
staj2_filter_view operator|(basic_msgpack_cursor2& cursor,
|
|
211
|
+
std::function<bool(const staj2_event&, const ser_context&)> pred)
|
|
212
|
+
{
|
|
213
|
+
return staj2_filter_view(cursor, pred);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
private:
|
|
217
|
+
static bool accept_all(const staj2_event&, const ser_context&)
|
|
218
|
+
{
|
|
219
|
+
return true;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
void read_next(std::error_code& ec)
|
|
223
|
+
{
|
|
224
|
+
if (cursor_visitor_.in_available())
|
|
225
|
+
{
|
|
226
|
+
cursor_visitor_.send_available(ec);
|
|
227
|
+
}
|
|
228
|
+
else
|
|
229
|
+
{
|
|
230
|
+
parser_.restart();
|
|
231
|
+
while (!parser_.stopped())
|
|
232
|
+
{
|
|
233
|
+
parser_.parse(cursor_visitor_, ec);
|
|
234
|
+
if (ec) return;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
void read_next(basic_json_visitor2<char_type>& visitor, std::error_code& ec)
|
|
240
|
+
{
|
|
241
|
+
{
|
|
242
|
+
parser_.restart();
|
|
243
|
+
while (!parser_.stopped())
|
|
244
|
+
{
|
|
245
|
+
parser_.parse(visitor, ec);
|
|
246
|
+
if (ec) return;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
};
|
|
251
|
+
|
|
252
|
+
using msgpack_stream_cursor2 = basic_msgpack_cursor2<jsoncons::binary_stream_source>;
|
|
253
|
+
using msgpack_bytes_cursor2 = basic_msgpack_cursor2<jsoncons::bytes_source>;
|
|
254
|
+
|
|
255
|
+
} // namespace msgpack
|
|
256
|
+
} // namespace jsoncons
|
|
257
|
+
|
|
258
|
+
#endif
|
|
259
|
+
|