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,448 @@
|
|
|
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_JSON_CURSOR_HPP
|
|
8
|
+
#define JSONCONS_JSON_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/json_parser.hpp>
|
|
22
|
+
#include <jsoncons/staj_cursor.hpp>
|
|
23
|
+
#include <jsoncons/source.hpp>
|
|
24
|
+
#include <jsoncons/source_adaptor.hpp>
|
|
25
|
+
|
|
26
|
+
namespace jsoncons {
|
|
27
|
+
|
|
28
|
+
template<class CharT,class Source=jsoncons::stream_source<CharT>,class Allocator=std::allocator<char>>
|
|
29
|
+
class basic_json_cursor : public basic_staj_cursor<CharT>, private virtual ser_context
|
|
30
|
+
{
|
|
31
|
+
public:
|
|
32
|
+
using source_type = Source;
|
|
33
|
+
using char_type = CharT;
|
|
34
|
+
using allocator_type = Allocator;
|
|
35
|
+
using string_view_type = jsoncons::basic_string_view<CharT>;
|
|
36
|
+
private:
|
|
37
|
+
typedef typename std::allocator_traits<allocator_type>:: template rebind_alloc<CharT> char_allocator_type;
|
|
38
|
+
static constexpr size_t default_max_buffer_size = 16384;
|
|
39
|
+
|
|
40
|
+
json_source_adaptor<Source> source_;
|
|
41
|
+
basic_json_parser<CharT,Allocator> parser_;
|
|
42
|
+
basic_staj_visitor<CharT> cursor_visitor_;
|
|
43
|
+
bool done_;
|
|
44
|
+
|
|
45
|
+
// Noncopyable and nonmoveable
|
|
46
|
+
basic_json_cursor(const basic_json_cursor&) = delete;
|
|
47
|
+
basic_json_cursor& operator=(const basic_json_cursor&) = delete;
|
|
48
|
+
|
|
49
|
+
public:
|
|
50
|
+
|
|
51
|
+
// Constructors that throw parse exceptions
|
|
52
|
+
|
|
53
|
+
template <class Sourceable>
|
|
54
|
+
basic_json_cursor(Sourceable&& source,
|
|
55
|
+
const basic_json_decode_options<CharT>& options = basic_json_decode_options<CharT>(),
|
|
56
|
+
std::function<bool(json_errc,const ser_context&)> err_handler = default_json_parsing(),
|
|
57
|
+
const Allocator& alloc = Allocator(),
|
|
58
|
+
typename std::enable_if<!std::is_constructible<jsoncons::basic_string_view<CharT>,Sourceable>::value>::type* = 0)
|
|
59
|
+
: source_(std::forward<Sourceable>(source)),
|
|
60
|
+
parser_(options,err_handler,alloc),
|
|
61
|
+
cursor_visitor_(accept_all),
|
|
62
|
+
done_(false)
|
|
63
|
+
{
|
|
64
|
+
if (!done())
|
|
65
|
+
{
|
|
66
|
+
next();
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
template <class Sourceable>
|
|
71
|
+
basic_json_cursor(Sourceable&& source,
|
|
72
|
+
const basic_json_decode_options<CharT>& options = basic_json_decode_options<CharT>(),
|
|
73
|
+
std::function<bool(json_errc,const ser_context&)> err_handler = default_json_parsing(),
|
|
74
|
+
const Allocator& alloc = Allocator(),
|
|
75
|
+
typename std::enable_if<std::is_constructible<jsoncons::basic_string_view<CharT>,Sourceable>::value>::type* = 0)
|
|
76
|
+
: source_(),
|
|
77
|
+
parser_(options, err_handler, alloc),
|
|
78
|
+
cursor_visitor_(accept_all),
|
|
79
|
+
done_(false)
|
|
80
|
+
{
|
|
81
|
+
initialize_with_string_view(std::forward<Sourceable>(source));
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
// Constructors that set parse error codes
|
|
86
|
+
template <class Sourceable>
|
|
87
|
+
basic_json_cursor(Sourceable&& source,
|
|
88
|
+
std::error_code& ec)
|
|
89
|
+
: basic_json_cursor(std::allocator_arg, Allocator(),
|
|
90
|
+
std::forward<Sourceable>(source),
|
|
91
|
+
basic_json_decode_options<CharT>(),
|
|
92
|
+
default_json_parsing(),
|
|
93
|
+
ec)
|
|
94
|
+
{
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
template <class Sourceable>
|
|
98
|
+
basic_json_cursor(Sourceable&& source,
|
|
99
|
+
const basic_json_decode_options<CharT>& options,
|
|
100
|
+
std::error_code& ec)
|
|
101
|
+
: basic_json_cursor(std::allocator_arg, Allocator(),
|
|
102
|
+
std::forward<Sourceable>(source),
|
|
103
|
+
options,
|
|
104
|
+
default_json_parsing(),
|
|
105
|
+
ec)
|
|
106
|
+
{
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
template <class Sourceable>
|
|
110
|
+
basic_json_cursor(Sourceable&& source,
|
|
111
|
+
const basic_json_decode_options<CharT>& options,
|
|
112
|
+
std::function<bool(json_errc,const ser_context&)> err_handler,
|
|
113
|
+
std::error_code& ec)
|
|
114
|
+
: basic_json_cursor(std::allocator_arg, Allocator(),
|
|
115
|
+
std::forward<Sourceable>(source),
|
|
116
|
+
options,
|
|
117
|
+
err_handler,
|
|
118
|
+
ec)
|
|
119
|
+
{
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
template <class Sourceable>
|
|
123
|
+
basic_json_cursor(std::allocator_arg_t, const Allocator& alloc,
|
|
124
|
+
Sourceable&& source,
|
|
125
|
+
const basic_json_decode_options<CharT>& options,
|
|
126
|
+
std::function<bool(json_errc,const ser_context&)> err_handler,
|
|
127
|
+
std::error_code& ec,
|
|
128
|
+
typename std::enable_if<!std::is_constructible<jsoncons::basic_string_view<CharT>,Sourceable>::value>::type* = 0)
|
|
129
|
+
: source_(std::forward<Sourceable>(source)),
|
|
130
|
+
parser_(options,err_handler,alloc),
|
|
131
|
+
cursor_visitor_(accept_all),
|
|
132
|
+
done_(false)
|
|
133
|
+
{
|
|
134
|
+
if (!done())
|
|
135
|
+
{
|
|
136
|
+
next(ec);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
template <class Sourceable>
|
|
141
|
+
basic_json_cursor(std::allocator_arg_t, const Allocator& alloc,
|
|
142
|
+
Sourceable&& source,
|
|
143
|
+
const basic_json_decode_options<CharT>& options,
|
|
144
|
+
std::function<bool(json_errc,const ser_context&)> err_handler,
|
|
145
|
+
std::error_code& ec,
|
|
146
|
+
typename std::enable_if<std::is_constructible<jsoncons::basic_string_view<CharT>,Sourceable>::value>::type* = 0)
|
|
147
|
+
: source_(),
|
|
148
|
+
parser_(options, err_handler, alloc),
|
|
149
|
+
cursor_visitor_(accept_all),
|
|
150
|
+
done_(false)
|
|
151
|
+
{
|
|
152
|
+
initialize_with_string_view(std::forward<Sourceable>(source), ec);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
void reset()
|
|
156
|
+
{
|
|
157
|
+
parser_.reset();
|
|
158
|
+
cursor_visitor_.reset();
|
|
159
|
+
done_ = false;
|
|
160
|
+
if (!done())
|
|
161
|
+
{
|
|
162
|
+
next();
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
template <class Sourceable>
|
|
167
|
+
typename std::enable_if<!std::is_constructible<jsoncons::basic_string_view<CharT>,Sourceable>::value>::type
|
|
168
|
+
reset(Sourceable&& source)
|
|
169
|
+
{
|
|
170
|
+
source_ = std::forward<Sourceable>(source);
|
|
171
|
+
parser_.reinitialize();
|
|
172
|
+
cursor_visitor_.reset();
|
|
173
|
+
done_ = false;
|
|
174
|
+
if (!done())
|
|
175
|
+
{
|
|
176
|
+
next();
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
template <class Sourceable>
|
|
181
|
+
typename std::enable_if<std::is_constructible<jsoncons::basic_string_view<CharT>,Sourceable>::value>::type
|
|
182
|
+
reset(Sourceable&& source)
|
|
183
|
+
{
|
|
184
|
+
source_ = {};
|
|
185
|
+
parser_.reinitialize();
|
|
186
|
+
cursor_visitor_.reset();
|
|
187
|
+
done_ = false;
|
|
188
|
+
initialize_with_string_view(std::forward<Sourceable>(source));
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
void reset(std::error_code& ec)
|
|
192
|
+
{
|
|
193
|
+
parser_.reset();
|
|
194
|
+
cursor_visitor_.reset();
|
|
195
|
+
done_ = false;
|
|
196
|
+
if (!done())
|
|
197
|
+
{
|
|
198
|
+
next(ec);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
template <class Sourceable>
|
|
203
|
+
typename std::enable_if<!std::is_constructible<jsoncons::basic_string_view<CharT>,Sourceable>::value>::type
|
|
204
|
+
reset(Sourceable&& source, std::error_code& ec)
|
|
205
|
+
{
|
|
206
|
+
source_ = std::forward<Sourceable>(source);
|
|
207
|
+
parser_.reinitialize();
|
|
208
|
+
cursor_visitor_.reset();
|
|
209
|
+
done_ = false;
|
|
210
|
+
if (!done())
|
|
211
|
+
{
|
|
212
|
+
next(ec);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
template <class Sourceable>
|
|
217
|
+
typename std::enable_if<std::is_constructible<jsoncons::basic_string_view<CharT>,Sourceable>::value>::type
|
|
218
|
+
reset(Sourceable&& source, std::error_code& ec)
|
|
219
|
+
{
|
|
220
|
+
source_ = {};
|
|
221
|
+
parser_.reinitialize();
|
|
222
|
+
done_ = false;
|
|
223
|
+
initialize_with_string_view(std::forward<Sourceable>(source), ec);
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
bool done() const override
|
|
227
|
+
{
|
|
228
|
+
return parser_.done() || done_;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
const basic_staj_event<CharT>& current() const override
|
|
232
|
+
{
|
|
233
|
+
return cursor_visitor_.event();
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
void read_to(basic_json_visitor<CharT>& visitor) override
|
|
237
|
+
{
|
|
238
|
+
std::error_code ec;
|
|
239
|
+
read_to(visitor, ec);
|
|
240
|
+
if (ec)
|
|
241
|
+
{
|
|
242
|
+
JSONCONS_THROW(ser_error(ec,parser_.line(),parser_.column()));
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
void read_to(basic_json_visitor<CharT>& visitor,
|
|
247
|
+
std::error_code& ec) override
|
|
248
|
+
{
|
|
249
|
+
if (send_json_event(cursor_visitor_.event(), visitor, *this, ec))
|
|
250
|
+
{
|
|
251
|
+
read_next(visitor, ec);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
void next() override
|
|
256
|
+
{
|
|
257
|
+
std::error_code ec;
|
|
258
|
+
next(ec);
|
|
259
|
+
if (ec)
|
|
260
|
+
{
|
|
261
|
+
JSONCONS_THROW(ser_error(ec,parser_.line(),parser_.column()));
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
void next(std::error_code& ec) override
|
|
266
|
+
{
|
|
267
|
+
read_next(ec);
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
void check_done()
|
|
271
|
+
{
|
|
272
|
+
std::error_code ec;
|
|
273
|
+
check_done(ec);
|
|
274
|
+
if (ec)
|
|
275
|
+
{
|
|
276
|
+
JSONCONS_THROW(ser_error(ec,parser_.line(),parser_.column()));
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
const ser_context& context() const override
|
|
281
|
+
{
|
|
282
|
+
return *this;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
void check_done(std::error_code& ec)
|
|
286
|
+
{
|
|
287
|
+
if (source_.is_error())
|
|
288
|
+
{
|
|
289
|
+
ec = json_errc::source_error;
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
if (source_.eof())
|
|
293
|
+
{
|
|
294
|
+
parser_.check_done(ec);
|
|
295
|
+
if (ec) return;
|
|
296
|
+
}
|
|
297
|
+
else
|
|
298
|
+
{
|
|
299
|
+
do
|
|
300
|
+
{
|
|
301
|
+
if (parser_.source_exhausted())
|
|
302
|
+
{
|
|
303
|
+
auto s = source_.read_buffer(ec);
|
|
304
|
+
if (ec) return;
|
|
305
|
+
if (s.size() > 0)
|
|
306
|
+
{
|
|
307
|
+
parser_.update(s.data(),s.size());
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
if (!parser_.source_exhausted())
|
|
311
|
+
{
|
|
312
|
+
parser_.check_done(ec);
|
|
313
|
+
if (ec) return;
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
while (!eof());
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
bool eof() const
|
|
321
|
+
{
|
|
322
|
+
return parser_.source_exhausted() && source_.eof();
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
std::size_t line() const override
|
|
326
|
+
{
|
|
327
|
+
return parser_.line();
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
std::size_t column() const override
|
|
331
|
+
{
|
|
332
|
+
return parser_.column();
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
friend
|
|
336
|
+
basic_staj_filter_view<CharT> operator|(basic_json_cursor& cursor,
|
|
337
|
+
std::function<bool(const basic_staj_event<CharT>&, const ser_context&)> pred)
|
|
338
|
+
{
|
|
339
|
+
return basic_staj_filter_view<CharT>(cursor, pred);
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
private:
|
|
343
|
+
|
|
344
|
+
static bool accept_all(const basic_staj_event<CharT>&, const ser_context&)
|
|
345
|
+
{
|
|
346
|
+
return true;
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
void initialize_with_string_view(string_view_type sv)
|
|
350
|
+
{
|
|
351
|
+
auto r = unicode_traits::detect_json_encoding(sv.data(), sv.size());
|
|
352
|
+
if (!(r.encoding == unicode_traits::encoding_kind::utf8 || r.encoding == unicode_traits::encoding_kind::undetected))
|
|
353
|
+
{
|
|
354
|
+
JSONCONS_THROW(ser_error(json_errc::illegal_unicode_character,parser_.line(),parser_.column()));
|
|
355
|
+
}
|
|
356
|
+
std::size_t offset = (r.ptr - sv.data());
|
|
357
|
+
parser_.update(sv.data()+offset,sv.size()-offset);
|
|
358
|
+
if (!done())
|
|
359
|
+
{
|
|
360
|
+
next();
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
void initialize_with_string_view(string_view_type sv, std::error_code& ec)
|
|
365
|
+
{
|
|
366
|
+
auto r = unicode_traits::detect_json_encoding(sv.data(), sv.size());
|
|
367
|
+
if (!(r.encoding == unicode_traits::encoding_kind::utf8 || r.encoding == unicode_traits::encoding_kind::undetected))
|
|
368
|
+
{
|
|
369
|
+
ec = json_errc::illegal_unicode_character;
|
|
370
|
+
return;
|
|
371
|
+
}
|
|
372
|
+
std::size_t offset = (r.ptr - sv.data());
|
|
373
|
+
parser_.update(sv.data()+offset,sv.size()-offset);
|
|
374
|
+
if (!done())
|
|
375
|
+
{
|
|
376
|
+
next(ec);
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
void read_next(std::error_code& ec)
|
|
381
|
+
{
|
|
382
|
+
read_next(cursor_visitor_, ec);
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
void read_next(basic_json_visitor<CharT>& visitor, std::error_code& ec)
|
|
386
|
+
{
|
|
387
|
+
parser_.restart();
|
|
388
|
+
while (!parser_.stopped())
|
|
389
|
+
{
|
|
390
|
+
if (parser_.source_exhausted())
|
|
391
|
+
{
|
|
392
|
+
auto s = source_.read_buffer(ec);
|
|
393
|
+
if (ec) return;
|
|
394
|
+
if (s.size() > 0)
|
|
395
|
+
{
|
|
396
|
+
parser_.update(s.data(),s.size());
|
|
397
|
+
if (ec) return;
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
bool eof = parser_.source_exhausted() && source_.eof();
|
|
401
|
+
parser_.parse_some(visitor, ec);
|
|
402
|
+
if (ec) return;
|
|
403
|
+
if (eof)
|
|
404
|
+
{
|
|
405
|
+
if (parser_.enter())
|
|
406
|
+
{
|
|
407
|
+
done_ = true;
|
|
408
|
+
break;
|
|
409
|
+
}
|
|
410
|
+
else if (!parser_.accept())
|
|
411
|
+
{
|
|
412
|
+
ec = json_errc::unexpected_eof;
|
|
413
|
+
return;
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
};
|
|
419
|
+
|
|
420
|
+
using json_stream_cursor = basic_json_cursor<char,jsoncons::stream_source<char>>;
|
|
421
|
+
using json_string_cursor = basic_json_cursor<char,jsoncons::string_source<char>>;
|
|
422
|
+
using wjson_stream_cursor = basic_json_cursor<wchar_t,jsoncons::stream_source<wchar_t>>;
|
|
423
|
+
using wjson_string_cursor = basic_json_cursor<wchar_t,jsoncons::string_source<wchar_t>>;
|
|
424
|
+
|
|
425
|
+
using json_cursor = basic_json_cursor<char>;
|
|
426
|
+
using wjson_cursor = basic_json_cursor<wchar_t>;
|
|
427
|
+
|
|
428
|
+
#if !defined(JSONCONS_NO_DEPRECATED)
|
|
429
|
+
template<class CharT,class Source,class Allocator=std::allocator<CharT>>
|
|
430
|
+
using basic_json_pull_reader = basic_json_cursor<CharT,Source,Allocator>;
|
|
431
|
+
|
|
432
|
+
JSONCONS_DEPRECATED_MSG("Instead, use json_cursor") typedef json_cursor json_pull_reader;
|
|
433
|
+
JSONCONS_DEPRECATED_MSG("Instead, use wjson_cursor") typedef wjson_cursor wjson_pull_reader;
|
|
434
|
+
|
|
435
|
+
template<class CharT,class Source,class Allocator=std::allocator<CharT>>
|
|
436
|
+
using basic_json_stream_reader = basic_json_cursor<CharT,Source,Allocator>;
|
|
437
|
+
|
|
438
|
+
template<class CharT,class Source,class Allocator=std::allocator<CharT>>
|
|
439
|
+
using basic_json_staj_cursor = basic_json_cursor<CharT,Source,Allocator>;
|
|
440
|
+
|
|
441
|
+
JSONCONS_DEPRECATED_MSG("Instead, use json_cursor") typedef json_cursor json_staj_cursor;
|
|
442
|
+
JSONCONS_DEPRECATED_MSG("Instead, use wjson_cursor") typedef wjson_cursor wjson_staj_cursor;
|
|
443
|
+
#endif
|
|
444
|
+
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
#endif
|
|
448
|
+
|