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.
Files changed (155) hide show
  1. checksums.yaml +7 -0
  2. data/ext/jsoncons/extconf.rb +43 -0
  3. data/ext/jsoncons/jsoncons.cpp +161 -0
  4. data/ext/jsoncons/jsoncons.h +10 -0
  5. data/jsoncons.gemspec +44 -0
  6. data/lib/jsoncons/jsoncons/examples/input/address-book.json +13 -0
  7. data/lib/jsoncons/jsoncons/examples/input/books.json +28 -0
  8. data/lib/jsoncons/jsoncons/examples/input/countries.json +7 -0
  9. data/lib/jsoncons/jsoncons/examples/input/employees.json +30 -0
  10. data/lib/jsoncons/jsoncons/examples/input/jsonschema/name.json +15 -0
  11. data/lib/jsoncons/jsoncons/examples/input/multiple-json-objects.json +3 -0
  12. data/lib/jsoncons/jsoncons/examples/input/sales.csv +6 -0
  13. data/lib/jsoncons/jsoncons/examples/input/store.json +28 -0
  14. data/lib/jsoncons/jsoncons/examples/input/tasks.csv +6 -0
  15. data/lib/jsoncons/jsoncons/include/jsoncons/allocator_holder.hpp +38 -0
  16. data/lib/jsoncons/jsoncons/include/jsoncons/basic_json.hpp +5905 -0
  17. data/lib/jsoncons/jsoncons/include/jsoncons/bigint.hpp +1611 -0
  18. data/lib/jsoncons/jsoncons/include/jsoncons/byte_string.hpp +820 -0
  19. data/lib/jsoncons/jsoncons/include/jsoncons/config/binary_config.hpp +226 -0
  20. data/lib/jsoncons/jsoncons/include/jsoncons/config/compiler_support.hpp +375 -0
  21. data/lib/jsoncons/jsoncons/include/jsoncons/config/jsoncons_config.hpp +309 -0
  22. data/lib/jsoncons/jsoncons/include/jsoncons/config/version.hpp +40 -0
  23. data/lib/jsoncons/jsoncons/include/jsoncons/conv_error.hpp +218 -0
  24. data/lib/jsoncons/jsoncons/include/jsoncons/decode_json.hpp +209 -0
  25. data/lib/jsoncons/jsoncons/include/jsoncons/decode_traits.hpp +651 -0
  26. data/lib/jsoncons/jsoncons/include/jsoncons/detail/endian.hpp +44 -0
  27. data/lib/jsoncons/jsoncons/include/jsoncons/detail/grisu3.hpp +312 -0
  28. data/lib/jsoncons/jsoncons/include/jsoncons/detail/optional.hpp +483 -0
  29. data/lib/jsoncons/jsoncons/include/jsoncons/detail/parse_number.hpp +1133 -0
  30. data/lib/jsoncons/jsoncons/include/jsoncons/detail/span.hpp +188 -0
  31. data/lib/jsoncons/jsoncons/include/jsoncons/detail/string_view.hpp +537 -0
  32. data/lib/jsoncons/jsoncons/include/jsoncons/detail/string_wrapper.hpp +370 -0
  33. data/lib/jsoncons/jsoncons/include/jsoncons/detail/write_number.hpp +567 -0
  34. data/lib/jsoncons/jsoncons/include/jsoncons/encode_json.hpp +315 -0
  35. data/lib/jsoncons/jsoncons/include/jsoncons/encode_traits.hpp +378 -0
  36. data/lib/jsoncons/jsoncons/include/jsoncons/json.hpp +18 -0
  37. data/lib/jsoncons/jsoncons/include/jsoncons/json_array.hpp +324 -0
  38. data/lib/jsoncons/jsoncons/include/jsoncons/json_content_handler.hpp +12 -0
  39. data/lib/jsoncons/jsoncons/include/jsoncons/json_cursor.hpp +448 -0
  40. data/lib/jsoncons/jsoncons/include/jsoncons/json_decoder.hpp +420 -0
  41. data/lib/jsoncons/jsoncons/include/jsoncons/json_encoder.hpp +1587 -0
  42. data/lib/jsoncons/jsoncons/include/jsoncons/json_error.hpp +156 -0
  43. data/lib/jsoncons/jsoncons/include/jsoncons/json_exception.hpp +241 -0
  44. data/lib/jsoncons/jsoncons/include/jsoncons/json_filter.hpp +653 -0
  45. data/lib/jsoncons/jsoncons/include/jsoncons/json_fwd.hpp +23 -0
  46. data/lib/jsoncons/jsoncons/include/jsoncons/json_object.hpp +1772 -0
  47. data/lib/jsoncons/jsoncons/include/jsoncons/json_options.hpp +862 -0
  48. data/lib/jsoncons/jsoncons/include/jsoncons/json_parser.hpp +2900 -0
  49. data/lib/jsoncons/jsoncons/include/jsoncons/json_reader.hpp +731 -0
  50. data/lib/jsoncons/jsoncons/include/jsoncons/json_traits_macros.hpp +1072 -0
  51. data/lib/jsoncons/jsoncons/include/jsoncons/json_traits_macros_deprecated.hpp +144 -0
  52. data/lib/jsoncons/jsoncons/include/jsoncons/json_type.hpp +206 -0
  53. data/lib/jsoncons/jsoncons/include/jsoncons/json_type_traits.hpp +1830 -0
  54. data/lib/jsoncons/jsoncons/include/jsoncons/json_visitor.hpp +1560 -0
  55. data/lib/jsoncons/jsoncons/include/jsoncons/json_visitor2.hpp +2079 -0
  56. data/lib/jsoncons/jsoncons/include/jsoncons/pretty_print.hpp +89 -0
  57. data/lib/jsoncons/jsoncons/include/jsoncons/ser_context.hpp +62 -0
  58. data/lib/jsoncons/jsoncons/include/jsoncons/sink.hpp +289 -0
  59. data/lib/jsoncons/jsoncons/include/jsoncons/source.hpp +777 -0
  60. data/lib/jsoncons/jsoncons/include/jsoncons/source_adaptor.hpp +148 -0
  61. data/lib/jsoncons/jsoncons/include/jsoncons/staj2_cursor.hpp +1189 -0
  62. data/lib/jsoncons/jsoncons/include/jsoncons/staj_cursor.hpp +1254 -0
  63. data/lib/jsoncons/jsoncons/include/jsoncons/staj_iterator.hpp +449 -0
  64. data/lib/jsoncons/jsoncons/include/jsoncons/tag_type.hpp +245 -0
  65. data/lib/jsoncons/jsoncons/include/jsoncons/text_source_adaptor.hpp +144 -0
  66. data/lib/jsoncons/jsoncons/include/jsoncons/traits_extension.hpp +884 -0
  67. data/lib/jsoncons/jsoncons/include/jsoncons/typed_array_view.hpp +250 -0
  68. data/lib/jsoncons/jsoncons/include/jsoncons/unicode_traits.hpp +1330 -0
  69. data/lib/jsoncons/jsoncons/include/jsoncons/uri.hpp +635 -0
  70. data/lib/jsoncons/jsoncons/include/jsoncons/value_converter.hpp +340 -0
  71. data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson.hpp +23 -0
  72. data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_cursor.hpp +320 -0
  73. data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_decimal128.hpp +865 -0
  74. data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_encoder.hpp +585 -0
  75. data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_error.hpp +103 -0
  76. data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_oid.hpp +245 -0
  77. data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_options.hpp +75 -0
  78. data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_parser.hpp +645 -0
  79. data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_reader.hpp +92 -0
  80. data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_type.hpp +44 -0
  81. data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/decode_bson.hpp +201 -0
  82. data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/encode_bson.hpp +144 -0
  83. data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor.hpp +26 -0
  84. data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor_cursor.hpp +351 -0
  85. data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor_cursor2.hpp +265 -0
  86. data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor_detail.hpp +93 -0
  87. data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor_encoder.hpp +1766 -0
  88. data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor_error.hpp +105 -0
  89. data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor_options.hpp +113 -0
  90. data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor_parser.hpp +1942 -0
  91. data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor_reader.hpp +116 -0
  92. data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/decode_cbor.hpp +203 -0
  93. data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/encode_cbor.hpp +151 -0
  94. data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/csv.hpp +17 -0
  95. data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/csv_cursor.hpp +358 -0
  96. data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/csv_encoder.hpp +954 -0
  97. data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/csv_error.hpp +85 -0
  98. data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/csv_options.hpp +973 -0
  99. data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/csv_parser.hpp +2099 -0
  100. data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/csv_reader.hpp +348 -0
  101. data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/csv_serializer.hpp +12 -0
  102. data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/decode_csv.hpp +208 -0
  103. data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/encode_csv.hpp +122 -0
  104. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jmespath/jmespath.hpp +5215 -0
  105. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jmespath/jmespath_error.hpp +215 -0
  106. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpatch/jsonpatch.hpp +579 -0
  107. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpatch/jsonpatch_error.hpp +121 -0
  108. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpath/expression.hpp +3329 -0
  109. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpath/flatten.hpp +432 -0
  110. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpath/json_location.hpp +445 -0
  111. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpath/json_query.hpp +115 -0
  112. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpath/jsonpath.hpp +13 -0
  113. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpath/jsonpath_error.hpp +240 -0
  114. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpath/jsonpath_expression.hpp +2612 -0
  115. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpath/jsonpath_selector.hpp +1322 -0
  116. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpointer/jsonpointer.hpp +1577 -0
  117. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpointer/jsonpointer_error.hpp +119 -0
  118. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/format_validator.hpp +968 -0
  119. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/json_validator.hpp +120 -0
  120. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/jsonschema.hpp +13 -0
  121. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/jsonschema_error.hpp +105 -0
  122. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/jsonschema_version.hpp +18 -0
  123. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/keyword_validator.hpp +1745 -0
  124. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/keyword_validator_factory.hpp +556 -0
  125. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/schema_draft7.hpp +198 -0
  126. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/schema_location.hpp +200 -0
  127. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/schema_version.hpp +35 -0
  128. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/subschema.hpp +144 -0
  129. data/lib/jsoncons/jsoncons/include/jsoncons_ext/mergepatch/mergepatch.hpp +103 -0
  130. data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/decode_msgpack.hpp +202 -0
  131. data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/encode_msgpack.hpp +142 -0
  132. data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack.hpp +24 -0
  133. data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack_cursor.hpp +343 -0
  134. data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack_cursor2.hpp +259 -0
  135. data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack_encoder.hpp +753 -0
  136. data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack_error.hpp +94 -0
  137. data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack_options.hpp +74 -0
  138. data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack_parser.hpp +748 -0
  139. data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack_reader.hpp +116 -0
  140. data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack_type.hpp +63 -0
  141. data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/decode_ubjson.hpp +201 -0
  142. data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/encode_ubjson.hpp +142 -0
  143. data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/ubjson.hpp +23 -0
  144. data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/ubjson_cursor.hpp +307 -0
  145. data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/ubjson_encoder.hpp +502 -0
  146. data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/ubjson_error.hpp +100 -0
  147. data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/ubjson_options.hpp +87 -0
  148. data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/ubjson_parser.hpp +880 -0
  149. data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/ubjson_reader.hpp +92 -0
  150. data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/ubjson_type.hpp +43 -0
  151. data/lib/jsoncons/version.rb +5 -0
  152. data/lib/jsoncons.rb +33 -0
  153. data/test/jsoncons_test.rb +108 -0
  154. data/test/test_helper.rb +7 -0
  155. 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
+