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,731 @@
1
+ // Copyright 2015 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_READER_HPP
8
+ #define JSONCONS_JSON_READER_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 <utility> // std::move
17
+ #include <jsoncons/source.hpp>
18
+ #include <jsoncons/json_exception.hpp>
19
+ #include <jsoncons/json_visitor.hpp>
20
+ #include <jsoncons/json_parser.hpp>
21
+ #include <jsoncons/source_adaptor.hpp>
22
+
23
+ namespace jsoncons {
24
+
25
+ // utf8_other_json_input_adapter
26
+
27
+ template <class CharT>
28
+ class json_utf8_to_other_visitor_adaptor : public json_visitor
29
+ {
30
+ public:
31
+ using json_visitor::string_view_type;
32
+ private:
33
+ basic_default_json_visitor<CharT> default_visitor_;
34
+ basic_json_visitor<CharT>& other_visitor_;
35
+ //std::function<bool(json_errc,const ser_context&)> err_handler_;
36
+
37
+ // noncopyable and nonmoveable
38
+ json_utf8_to_other_visitor_adaptor(const json_utf8_to_other_visitor_adaptor<CharT>&) = delete;
39
+ json_utf8_to_other_visitor_adaptor<CharT>& operator=(const json_utf8_to_other_visitor_adaptor<CharT>&) = delete;
40
+
41
+ public:
42
+ json_utf8_to_other_visitor_adaptor()
43
+ : other_visitor_(default_visitor_)
44
+ {
45
+ }
46
+
47
+ json_utf8_to_other_visitor_adaptor(basic_json_visitor<CharT>& other_visitor/*,
48
+ std::function<bool(json_errc,const ser_context&)> err_handler*/)
49
+ : other_visitor_(other_visitor)/*,
50
+ err_handler_(err_handler)*/
51
+ {
52
+ }
53
+
54
+ private:
55
+
56
+ void visit_flush() override
57
+ {
58
+ other_visitor_.flush();
59
+ }
60
+
61
+ bool visit_begin_object(semantic_tag tag, const ser_context& context, std::error_code& ec) override
62
+ {
63
+ return other_visitor_.begin_object(tag, context, ec);
64
+ }
65
+
66
+ bool visit_end_object(const ser_context& context, std::error_code& ec) override
67
+ {
68
+ return other_visitor_.end_object(context, ec);
69
+ }
70
+
71
+ bool visit_begin_array(semantic_tag tag, const ser_context& context, std::error_code& ec) override
72
+ {
73
+ return other_visitor_.begin_array(tag, context, ec);
74
+ }
75
+
76
+ bool visit_end_array(const ser_context& context, std::error_code& ec) override
77
+ {
78
+ return other_visitor_.end_array(context, ec);
79
+ }
80
+
81
+ bool visit_key(const string_view_type& name, const ser_context& context, std::error_code& ec) override
82
+ {
83
+ std::basic_string<CharT> target;
84
+ auto result = unicode_traits::convert(
85
+ name.data(), name.size(), target,
86
+ unicode_traits::conv_flags::strict);
87
+ if (result.ec != unicode_traits::conv_errc())
88
+ {
89
+ JSONCONS_THROW(ser_error(result.ec,context.line(),context.column()));
90
+ }
91
+ return other_visitor_.key(target, context, ec);
92
+ }
93
+
94
+ bool visit_string(const string_view_type& value, semantic_tag tag, const ser_context& context, std::error_code& ec) override
95
+ {
96
+ std::basic_string<CharT> target;
97
+ auto result = unicode_traits::convert(
98
+ value.data(), value.size(), target,
99
+ unicode_traits::conv_flags::strict);
100
+ if (result.ec != unicode_traits::conv_errc())
101
+ {
102
+ ec = result.ec;
103
+ return false;
104
+ }
105
+ return other_visitor_.string_value(target, tag, context, ec);
106
+ }
107
+
108
+ bool visit_int64(int64_t value,
109
+ semantic_tag tag,
110
+ const ser_context& context,
111
+ std::error_code& ec) override
112
+ {
113
+ return other_visitor_.int64_value(value, tag, context, ec);
114
+ }
115
+
116
+ bool visit_uint64(uint64_t value,
117
+ semantic_tag tag,
118
+ const ser_context& context,
119
+ std::error_code& ec) override
120
+ {
121
+ return other_visitor_.uint64_value(value, tag, context, ec);
122
+ }
123
+
124
+ bool visit_half(uint16_t value,
125
+ semantic_tag tag,
126
+ const ser_context& context,
127
+ std::error_code& ec) override
128
+ {
129
+ return other_visitor_.half_value(value, tag, context, ec);
130
+ }
131
+
132
+ bool visit_double(double value,
133
+ semantic_tag tag,
134
+ const ser_context& context,
135
+ std::error_code& ec) override
136
+ {
137
+ return other_visitor_.double_value(value, tag, context, ec);
138
+ }
139
+
140
+ bool visit_bool(bool value, semantic_tag tag, const ser_context& context, std::error_code& ec) override
141
+ {
142
+ return other_visitor_.bool_value(value, tag, context, ec);
143
+ }
144
+
145
+ bool visit_null(semantic_tag tag, const ser_context& context, std::error_code& ec) override
146
+ {
147
+ return other_visitor_.null_value(tag, context, ec);
148
+ }
149
+ };
150
+
151
+ template<class CharT,class Source=jsoncons::stream_source<CharT>,class Allocator=std::allocator<char>>
152
+ class basic_json_reader
153
+ {
154
+ public:
155
+ using char_type = CharT;
156
+ using source_type = Source;
157
+ using string_view_type = jsoncons::basic_string_view<CharT>;
158
+ private:
159
+ typedef typename std::allocator_traits<Allocator>:: template rebind_alloc<CharT> char_allocator_type;
160
+
161
+ static constexpr size_t default_max_buffer_size = 16384;
162
+
163
+ json_source_adaptor<Source> source_;
164
+ basic_default_json_visitor<CharT> default_visitor_;
165
+ basic_json_visitor<CharT>& visitor_;
166
+ basic_json_parser<CharT,Allocator> parser_;
167
+
168
+ // Noncopyable and nonmoveable
169
+ basic_json_reader(const basic_json_reader&) = delete;
170
+ basic_json_reader& operator=(const basic_json_reader&) = delete;
171
+
172
+ public:
173
+ template <class Sourceable>
174
+ explicit basic_json_reader(Sourceable&& source, const Allocator& alloc = Allocator())
175
+ : basic_json_reader(std::forward<Sourceable>(source),
176
+ default_visitor_,
177
+ basic_json_decode_options<CharT>(),
178
+ default_json_parsing(),
179
+ alloc)
180
+ {
181
+ }
182
+
183
+ template <class Sourceable>
184
+ basic_json_reader(Sourceable&& source,
185
+ const basic_json_decode_options<CharT>& options,
186
+ const Allocator& alloc = Allocator())
187
+ : basic_json_reader(std::forward<Sourceable>(source),
188
+ default_visitor_,
189
+ options,
190
+ default_json_parsing(),
191
+ alloc)
192
+ {
193
+ }
194
+
195
+ template <class Sourceable>
196
+ basic_json_reader(Sourceable&& source,
197
+ std::function<bool(json_errc,const ser_context&)> err_handler,
198
+ const Allocator& alloc = Allocator())
199
+ : basic_json_reader(std::forward<Sourceable>(source),
200
+ default_visitor_,
201
+ basic_json_decode_options<CharT>(),
202
+ err_handler,
203
+ alloc)
204
+ {
205
+ }
206
+
207
+ template <class Sourceable>
208
+ basic_json_reader(Sourceable&& source,
209
+ const basic_json_decode_options<CharT>& options,
210
+ std::function<bool(json_errc,const ser_context&)> err_handler,
211
+ const Allocator& alloc = Allocator())
212
+ : basic_json_reader(std::forward<Sourceable>(source),
213
+ default_visitor_,
214
+ options,
215
+ err_handler,
216
+ alloc)
217
+ {
218
+ }
219
+
220
+ template <class Sourceable>
221
+ basic_json_reader(Sourceable&& source,
222
+ basic_json_visitor<CharT>& visitor,
223
+ const Allocator& alloc = Allocator())
224
+ : basic_json_reader(std::forward<Sourceable>(source),
225
+ visitor,
226
+ basic_json_decode_options<CharT>(),
227
+ default_json_parsing(),
228
+ alloc)
229
+ {
230
+ }
231
+
232
+ template <class Sourceable>
233
+ basic_json_reader(Sourceable&& source,
234
+ basic_json_visitor<CharT>& visitor,
235
+ const basic_json_decode_options<CharT>& options,
236
+ const Allocator& alloc = Allocator())
237
+ : basic_json_reader(std::forward<Sourceable>(source),
238
+ visitor,
239
+ options,
240
+ default_json_parsing(),
241
+ alloc)
242
+ {
243
+ }
244
+
245
+ template <class Sourceable>
246
+ basic_json_reader(Sourceable&& source,
247
+ basic_json_visitor<CharT>& visitor,
248
+ std::function<bool(json_errc,const ser_context&)> err_handler,
249
+ const Allocator& alloc = Allocator())
250
+ : basic_json_reader(std::forward<Sourceable>(source),
251
+ visitor,
252
+ basic_json_decode_options<CharT>(),
253
+ err_handler,
254
+ alloc)
255
+ {
256
+ }
257
+
258
+ template <class Sourceable>
259
+ basic_json_reader(Sourceable&& source,
260
+ basic_json_visitor<CharT>& visitor,
261
+ const basic_json_decode_options<CharT>& options,
262
+ std::function<bool(json_errc,const ser_context&)> err_handler,
263
+ const Allocator& alloc = Allocator())
264
+ : source_(std::forward<Sourceable>(source)),
265
+ visitor_(visitor),
266
+ parser_(options,err_handler,alloc)
267
+ {
268
+ }
269
+
270
+ #if !defined(JSONCONS_NO_DEPRECATED)
271
+ JSONCONS_DEPRECATED_MSG("Instead, use max_nesting_depth() on options")
272
+ int max_nesting_depth() const
273
+ {
274
+ return parser_.max_nesting_depth();
275
+ }
276
+
277
+ JSONCONS_DEPRECATED_MSG("Instead, use max_nesting_depth(int) on options")
278
+ void max_nesting_depth(int depth)
279
+ {
280
+ parser_.max_nesting_depth(depth);
281
+ }
282
+ #endif
283
+ void read_next()
284
+ {
285
+ std::error_code ec;
286
+ read_next(ec);
287
+ if (ec)
288
+ {
289
+ JSONCONS_THROW(ser_error(ec,parser_.line(),parser_.column()));
290
+ }
291
+ }
292
+
293
+ void read_next(std::error_code& ec)
294
+ {
295
+ if (source_.is_error())
296
+ {
297
+ ec = json_errc::source_error;
298
+ return;
299
+ }
300
+ parser_.reset();
301
+ while (!parser_.stopped())
302
+ {
303
+ if (parser_.source_exhausted())
304
+ {
305
+ auto s = source_.read_buffer(ec);
306
+ if (ec) return;
307
+ if (s.size() > 0)
308
+ {
309
+ parser_.update(s.data(),s.size());
310
+ }
311
+ }
312
+ bool eof = parser_.source_exhausted();
313
+ parser_.parse_some(visitor_, ec);
314
+ if (ec) return;
315
+ if (eof)
316
+ {
317
+ if (parser_.enter())
318
+ {
319
+ break;
320
+ }
321
+ else if (!parser_.accept())
322
+ {
323
+ ec = json_errc::unexpected_eof;
324
+ return;
325
+ }
326
+ }
327
+ }
328
+
329
+ while (!source_.eof())
330
+ {
331
+ parser_.skip_whitespace();
332
+ if (parser_.source_exhausted())
333
+ {
334
+ auto s = source_.read_buffer(ec);
335
+ if (ec) return;
336
+ if (s.size() > 0)
337
+ {
338
+ parser_.update(s.data(),s.size());
339
+ }
340
+ }
341
+ else
342
+ {
343
+ break;
344
+ }
345
+ }
346
+ }
347
+
348
+ void check_done()
349
+ {
350
+ std::error_code ec;
351
+ check_done(ec);
352
+ if (ec)
353
+ {
354
+ JSONCONS_THROW(ser_error(ec,parser_.line(),parser_.column()));
355
+ }
356
+ }
357
+
358
+ std::size_t line() const
359
+ {
360
+ return parser_.line();
361
+ }
362
+
363
+ std::size_t column() const
364
+ {
365
+ return parser_.column();
366
+ }
367
+
368
+ void check_done(std::error_code& ec)
369
+ {
370
+ if (source_.is_error())
371
+ {
372
+ ec = json_errc::source_error;
373
+ return;
374
+ }
375
+ if (source_.eof())
376
+ {
377
+ parser_.check_done(ec);
378
+ if (ec) return;
379
+ }
380
+ else
381
+ {
382
+ do
383
+ {
384
+ if (parser_.source_exhausted())
385
+ {
386
+ auto s = source_.read_buffer(ec);
387
+ if (ec) return;
388
+ if (s.size() > 0)
389
+ {
390
+ parser_.update(s.data(),s.size());
391
+ }
392
+ }
393
+ if (!parser_.source_exhausted())
394
+ {
395
+ parser_.check_done(ec);
396
+ if (ec) return;
397
+ }
398
+ }
399
+ while (!eof());
400
+ }
401
+ }
402
+
403
+ bool eof() const
404
+ {
405
+ return parser_.source_exhausted() && source_.eof();
406
+ }
407
+
408
+ void read()
409
+ {
410
+ read_next();
411
+ check_done();
412
+ }
413
+
414
+ void read(std::error_code& ec)
415
+ {
416
+ read_next(ec);
417
+ if (!ec)
418
+ {
419
+ check_done(ec);
420
+ }
421
+ }
422
+ };
423
+
424
+ template<class CharT,class Source=jsoncons::stream_source<CharT>,class Allocator=std::allocator<char>>
425
+ class legacy_basic_json_reader
426
+ {
427
+ public:
428
+ using char_type = CharT;
429
+ using source_type = Source;
430
+ using string_view_type = jsoncons::basic_string_view<CharT>;
431
+ private:
432
+ typedef typename std::allocator_traits<Allocator>:: template rebind_alloc<CharT> char_allocator_type;
433
+
434
+ static constexpr size_t default_max_buffer_size = 16384;
435
+
436
+ json_source_adaptor<Source> source_;
437
+ basic_default_json_visitor<CharT> default_visitor_;
438
+ basic_json_visitor<CharT>& visitor_;
439
+ basic_json_parser<CharT,Allocator> parser_;
440
+
441
+ // Noncopyable and nonmoveable
442
+ legacy_basic_json_reader(const legacy_basic_json_reader&) = delete;
443
+ legacy_basic_json_reader& operator=(const legacy_basic_json_reader&) = delete;
444
+
445
+ public:
446
+ template <class Sourceable>
447
+ explicit legacy_basic_json_reader(Sourceable&& source, const Allocator& alloc = Allocator())
448
+ : legacy_basic_json_reader(std::forward<Sourceable>(source),
449
+ default_visitor_,
450
+ basic_json_decode_options<CharT>(),
451
+ default_json_parsing(),
452
+ alloc)
453
+ {
454
+ }
455
+
456
+ template <class Sourceable>
457
+ legacy_basic_json_reader(Sourceable&& source,
458
+ const basic_json_decode_options<CharT>& options,
459
+ const Allocator& alloc = Allocator())
460
+ : legacy_basic_json_reader(std::forward<Sourceable>(source),
461
+ default_visitor_,
462
+ options,
463
+ default_json_parsing(),
464
+ alloc)
465
+ {
466
+ }
467
+
468
+ template <class Sourceable>
469
+ legacy_basic_json_reader(Sourceable&& source,
470
+ std::function<bool(json_errc,const ser_context&)> err_handler,
471
+ const Allocator& alloc = Allocator())
472
+ : legacy_basic_json_reader(std::forward<Sourceable>(source),
473
+ default_visitor_,
474
+ basic_json_decode_options<CharT>(),
475
+ err_handler,
476
+ alloc)
477
+ {
478
+ }
479
+
480
+ template <class Sourceable>
481
+ legacy_basic_json_reader(Sourceable&& source,
482
+ const basic_json_decode_options<CharT>& options,
483
+ std::function<bool(json_errc,const ser_context&)> err_handler,
484
+ const Allocator& alloc = Allocator())
485
+ : legacy_basic_json_reader(std::forward<Sourceable>(source),
486
+ default_visitor_,
487
+ options,
488
+ err_handler,
489
+ alloc)
490
+ {
491
+ }
492
+
493
+ template <class Sourceable>
494
+ legacy_basic_json_reader(Sourceable&& source,
495
+ basic_json_visitor<CharT>& visitor,
496
+ const Allocator& alloc = Allocator())
497
+ : legacy_basic_json_reader(std::forward<Sourceable>(source),
498
+ visitor,
499
+ basic_json_decode_options<CharT>(),
500
+ default_json_parsing(),
501
+ alloc)
502
+ {
503
+ }
504
+
505
+ template <class Sourceable>
506
+ legacy_basic_json_reader(Sourceable&& source,
507
+ basic_json_visitor<CharT>& visitor,
508
+ const basic_json_decode_options<CharT>& options,
509
+ const Allocator& alloc = Allocator())
510
+ : legacy_basic_json_reader(std::forward<Sourceable>(source),
511
+ visitor,
512
+ options,
513
+ default_json_parsing(),
514
+ alloc)
515
+ {
516
+ }
517
+
518
+ template <class Sourceable>
519
+ legacy_basic_json_reader(Sourceable&& source,
520
+ basic_json_visitor<CharT>& visitor,
521
+ std::function<bool(json_errc,const ser_context&)> err_handler,
522
+ const Allocator& alloc = Allocator())
523
+ : legacy_basic_json_reader(std::forward<Sourceable>(source),
524
+ visitor,
525
+ basic_json_decode_options<CharT>(),
526
+ err_handler,
527
+ alloc)
528
+ {
529
+ }
530
+
531
+ template <class Sourceable>
532
+ legacy_basic_json_reader(Sourceable&& source,
533
+ basic_json_visitor<CharT>& visitor,
534
+ const basic_json_decode_options<CharT>& options,
535
+ std::function<bool(json_errc,const ser_context&)> err_handler,
536
+ const Allocator& alloc = Allocator(),
537
+ typename std::enable_if<!std::is_constructible<jsoncons::basic_string_view<CharT>,Sourceable>::value>::type* = 0)
538
+ : source_(std::forward<Sourceable>(source)),
539
+ visitor_(visitor),
540
+ parser_(options,err_handler,alloc)
541
+ {
542
+ }
543
+
544
+ template <class Sourceable>
545
+ legacy_basic_json_reader(Sourceable&& source,
546
+ basic_json_visitor<CharT>& visitor,
547
+ const basic_json_decode_options<CharT>& options,
548
+ std::function<bool(json_errc,const ser_context&)> err_handler,
549
+ const Allocator& alloc = Allocator(),
550
+ typename std::enable_if<std::is_constructible<jsoncons::basic_string_view<CharT>,Sourceable>::value>::type* = 0)
551
+ : source_(),
552
+ visitor_(visitor),
553
+ parser_(options,err_handler,alloc)
554
+ {
555
+ jsoncons::basic_string_view<CharT> sv(std::forward<Sourceable>(source));
556
+
557
+ auto r = unicode_traits::detect_json_encoding(sv.data(), sv.size());
558
+ if (!(r.encoding == unicode_traits::encoding_kind::utf8 || r.encoding == unicode_traits::encoding_kind::undetected))
559
+ {
560
+ JSONCONS_THROW(ser_error(json_errc::illegal_unicode_character,parser_.line(),parser_.column()));
561
+ }
562
+ std::size_t offset = (r.ptr - sv.data());
563
+ parser_.update(sv.data()+offset,sv.size()-offset);
564
+ }
565
+
566
+ #if !defined(JSONCONS_NO_DEPRECATED)
567
+ JSONCONS_DEPRECATED_MSG("Instead, use max_nesting_depth() on options")
568
+ int max_nesting_depth() const
569
+ {
570
+ return parser_.max_nesting_depth();
571
+ }
572
+
573
+ JSONCONS_DEPRECATED_MSG("Instead, use max_nesting_depth(int) on options")
574
+ void max_nesting_depth(int depth)
575
+ {
576
+ parser_.max_nesting_depth(depth);
577
+ }
578
+ #endif
579
+ void read_next()
580
+ {
581
+ std::error_code ec;
582
+ read_next(ec);
583
+ if (ec)
584
+ {
585
+ JSONCONS_THROW(ser_error(ec,parser_.line(),parser_.column()));
586
+ }
587
+ }
588
+
589
+ void read_next(std::error_code& ec)
590
+ {
591
+ if (source_.is_error())
592
+ {
593
+ ec = json_errc::source_error;
594
+ return;
595
+ }
596
+ parser_.reset();
597
+ while (!parser_.stopped())
598
+ {
599
+ if (parser_.source_exhausted())
600
+ {
601
+ auto s = source_.read_buffer(ec);
602
+ if (ec) return;
603
+ if (s.size() > 0)
604
+ {
605
+ parser_.update(s.data(),s.size());
606
+ }
607
+ }
608
+ bool eof = parser_.source_exhausted();
609
+ parser_.parse_some(visitor_, ec);
610
+ if (ec) return;
611
+ if (eof)
612
+ {
613
+ if (parser_.enter())
614
+ {
615
+ break;
616
+ }
617
+ else if (!parser_.accept())
618
+ {
619
+ ec = json_errc::unexpected_eof;
620
+ return;
621
+ }
622
+ }
623
+ }
624
+
625
+ while (!source_.eof())
626
+ {
627
+ parser_.skip_whitespace();
628
+ if (parser_.source_exhausted())
629
+ {
630
+ auto s = source_.read_buffer(ec);
631
+ if (ec) return;
632
+ if (s.size() > 0)
633
+ {
634
+ parser_.update(s.data(),s.size());
635
+ }
636
+ }
637
+ else
638
+ {
639
+ break;
640
+ }
641
+ }
642
+ }
643
+
644
+ void check_done()
645
+ {
646
+ std::error_code ec;
647
+ check_done(ec);
648
+ if (ec)
649
+ {
650
+ JSONCONS_THROW(ser_error(ec,parser_.line(),parser_.column()));
651
+ }
652
+ }
653
+
654
+ std::size_t line() const
655
+ {
656
+ return parser_.line();
657
+ }
658
+
659
+ std::size_t column() const
660
+ {
661
+ return parser_.column();
662
+ }
663
+
664
+ void check_done(std::error_code& ec)
665
+ {
666
+ if (source_.is_error())
667
+ {
668
+ ec = json_errc::source_error;
669
+ return;
670
+ }
671
+ if (source_.eof())
672
+ {
673
+ parser_.check_done(ec);
674
+ if (ec) return;
675
+ }
676
+ else
677
+ {
678
+ do
679
+ {
680
+ if (parser_.source_exhausted())
681
+ {
682
+ auto s = source_.read_buffer(ec);
683
+ if (ec) return;
684
+ if (s.size() > 0)
685
+ {
686
+ parser_.update(s.data(),s.size());
687
+ }
688
+ }
689
+ if (!parser_.source_exhausted())
690
+ {
691
+ parser_.check_done(ec);
692
+ if (ec) return;
693
+ }
694
+ }
695
+ while (!eof());
696
+ }
697
+ }
698
+
699
+ bool eof() const
700
+ {
701
+ return parser_.source_exhausted() && source_.eof();
702
+ }
703
+
704
+ void read()
705
+ {
706
+ read_next();
707
+ check_done();
708
+ }
709
+
710
+ void read(std::error_code& ec)
711
+ {
712
+ read_next(ec);
713
+ if (!ec)
714
+ {
715
+ check_done(ec);
716
+ }
717
+ }
718
+ };
719
+
720
+ #if !defined(JSONCONS_NO_DEPRECATED)
721
+ using json_reader = legacy_basic_json_reader<char>;
722
+ using wjson_reader = legacy_basic_json_reader<wchar_t>;
723
+ #endif
724
+ using json_string_reader = basic_json_reader<char,string_source<char>>;
725
+ using wjson_string_reader = basic_json_reader<wchar_t,string_source<wchar_t>>;
726
+ using json_stream_reader = basic_json_reader<char,stream_source<char>>;
727
+ using wjson_stream_reader = basic_json_reader<wchar_t,stream_source<wchar_t>>;
728
+ }
729
+
730
+ #endif
731
+