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,748 @@
1
+ // Copyright 2017 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_PARSER_HPP
8
+ #define JSONCONS_MSGPACK_MSGPACK_PARSER_HPP
9
+
10
+ #include <string>
11
+ #include <vector>
12
+ #include <memory>
13
+ #include <utility> // std::move
14
+ #include <jsoncons/json.hpp>
15
+ #include <jsoncons/source.hpp>
16
+ #include <jsoncons/bigint.hpp>
17
+ #include <jsoncons/json_visitor.hpp>
18
+ #include <jsoncons/config/jsoncons_config.hpp>
19
+ #include <jsoncons_ext/msgpack/msgpack_type.hpp>
20
+ #include <jsoncons_ext/msgpack/msgpack_error.hpp>
21
+ #include <jsoncons_ext/msgpack/msgpack_options.hpp>
22
+ #include <jsoncons/json_visitor2.hpp>
23
+
24
+ namespace jsoncons { namespace msgpack {
25
+
26
+ enum class parse_mode {root,accept,array,map_key,map_value};
27
+
28
+ struct parse_state
29
+ {
30
+ parse_mode mode;
31
+ std::size_t length;
32
+ std::size_t index;
33
+
34
+ parse_state(parse_mode mode, std::size_t length) noexcept
35
+ : mode(mode), length(length), index(0)
36
+ {
37
+ }
38
+
39
+ parse_state(const parse_state&) = default;
40
+ parse_state(parse_state&&) = default;
41
+ };
42
+
43
+ template <class Source,class Allocator=std::allocator<char>>
44
+ class basic_msgpack_parser : public ser_context
45
+ {
46
+ using char_type = char;
47
+ using char_traits_type = std::char_traits<char>;
48
+ using temp_allocator_type = Allocator;
49
+ using char_allocator_type = typename std::allocator_traits<temp_allocator_type>:: template rebind_alloc<char_type>;
50
+ using byte_allocator_type = typename std::allocator_traits<temp_allocator_type>:: template rebind_alloc<uint8_t>;
51
+ using int64_allocator_type = typename std::allocator_traits<temp_allocator_type>:: template rebind_alloc<int64_t>;
52
+ using parse_state_allocator_type = typename std::allocator_traits<temp_allocator_type>:: template rebind_alloc<parse_state>;
53
+
54
+ static constexpr int64_t nanos_in_second = 1000000000;
55
+
56
+ Source source_;
57
+ msgpack_decode_options options_;
58
+ bool more_;
59
+ bool done_;
60
+ std::basic_string<char,std::char_traits<char>,char_allocator_type> text_buffer_;
61
+ std::vector<uint8_t,byte_allocator_type> bytes_buffer_;
62
+ std::vector<parse_state,parse_state_allocator_type> state_stack_;
63
+ int nesting_depth_;
64
+
65
+ public:
66
+ template <class Sourceable>
67
+ basic_msgpack_parser(Sourceable&& source,
68
+ const msgpack_decode_options& options = msgpack_decode_options(),
69
+ const Allocator alloc = Allocator())
70
+ : source_(std::forward<Sourceable>(source)),
71
+ options_(options),
72
+ more_(true),
73
+ done_(false),
74
+ text_buffer_(alloc),
75
+ bytes_buffer_(alloc),
76
+ state_stack_(alloc),
77
+ nesting_depth_(0)
78
+ {
79
+ state_stack_.emplace_back(parse_mode::root,0);
80
+ }
81
+
82
+ void restart()
83
+ {
84
+ more_ = true;
85
+ }
86
+
87
+ void reset()
88
+ {
89
+ more_ = true;
90
+ done_ = false;
91
+ text_buffer_.clear();
92
+ bytes_buffer_.clear();
93
+ state_stack_.clear();
94
+ state_stack_.emplace_back(parse_mode::root,0);
95
+ nesting_depth_ = 0;
96
+ }
97
+
98
+ template <class Sourceable>
99
+ void reset(Sourceable&& source)
100
+ {
101
+ source_ = std::forward<Sourceable>(source);
102
+ reset();
103
+ }
104
+
105
+ bool done() const
106
+ {
107
+ return done_;
108
+ }
109
+
110
+ bool stopped() const
111
+ {
112
+ return !more_;
113
+ }
114
+
115
+ std::size_t line() const override
116
+ {
117
+ return 0;
118
+ }
119
+
120
+ std::size_t column() const override
121
+ {
122
+ return source_.position();
123
+ }
124
+
125
+ void parse(json_visitor2& visitor, std::error_code& ec)
126
+ {
127
+ while (!done_ && more_)
128
+ {
129
+ switch (state_stack_.back().mode)
130
+ {
131
+ case parse_mode::array:
132
+ {
133
+ if (state_stack_.back().index < state_stack_.back().length)
134
+ {
135
+ ++state_stack_.back().index;
136
+ read_item(visitor, ec);
137
+ if (ec)
138
+ {
139
+ return;
140
+ }
141
+ }
142
+ else
143
+ {
144
+ end_array(visitor, ec);
145
+ }
146
+ break;
147
+ }
148
+ case parse_mode::map_key:
149
+ {
150
+ if (state_stack_.back().index < state_stack_.back().length)
151
+ {
152
+ ++state_stack_.back().index;
153
+ state_stack_.back().mode = parse_mode::map_value;
154
+ read_item(visitor, ec);
155
+ if (ec)
156
+ {
157
+ return;
158
+ }
159
+ }
160
+ else
161
+ {
162
+ end_object(visitor, ec);
163
+ }
164
+ break;
165
+ }
166
+ case parse_mode::map_value:
167
+ {
168
+ state_stack_.back().mode = parse_mode::map_key;
169
+ read_item(visitor, ec);
170
+ if (ec)
171
+ {
172
+ return;
173
+ }
174
+ break;
175
+ }
176
+ case parse_mode::root:
177
+ {
178
+ state_stack_.back().mode = parse_mode::accept;
179
+ read_item(visitor, ec);
180
+ if (ec)
181
+ {
182
+ return;
183
+ }
184
+ break;
185
+ }
186
+ case parse_mode::accept:
187
+ {
188
+ JSONCONS_ASSERT(state_stack_.size() == 1);
189
+ state_stack_.clear();
190
+ more_ = false;
191
+ done_ = true;
192
+ visitor.flush();
193
+ break;
194
+ }
195
+ }
196
+ }
197
+ }
198
+ private:
199
+
200
+ void read_item(json_visitor2& visitor, std::error_code& ec)
201
+ {
202
+ if (source_.is_error())
203
+ {
204
+ ec = msgpack_errc::source_error;
205
+ more_ = false;
206
+ return;
207
+ }
208
+
209
+ uint8_t type;
210
+ if (source_.read(&type, 1) == 0)
211
+ {
212
+ ec = msgpack_errc::unexpected_eof;
213
+ more_ = false;
214
+ return;
215
+ }
216
+
217
+ if (type <= 0xbf)
218
+ {
219
+ if (type <= 0x7f)
220
+ {
221
+ // positive fixint
222
+ more_ = visitor.uint64_value(type, semantic_tag::none, *this, ec);
223
+ }
224
+ else if (type <= 0x8f)
225
+ {
226
+ begin_object(visitor,type,ec); // fixmap
227
+ }
228
+ else if (type <= 0x9f)
229
+ {
230
+ begin_array(visitor,type,ec); // fixarray
231
+ }
232
+ else
233
+ {
234
+ // fixstr
235
+ const size_t len = type & 0x1f;
236
+
237
+ text_buffer_.clear();
238
+
239
+ if (source_reader<Source>::read(source_,text_buffer_,len) != static_cast<std::size_t>(len))
240
+ {
241
+ ec = msgpack_errc::unexpected_eof;
242
+ more_ = false;
243
+ return;
244
+ }
245
+
246
+ auto result = unicode_traits::validate(text_buffer_.data(),text_buffer_.size());
247
+ if (result.ec != unicode_traits::conv_errc())
248
+ {
249
+ ec = msgpack_errc::invalid_utf8_text_string;
250
+ more_ = false;
251
+ return;
252
+ }
253
+ more_ = visitor.string_value(jsoncons::basic_string_view<char>(text_buffer_.data(),text_buffer_.length()), semantic_tag::none, *this, ec);
254
+ }
255
+ }
256
+ else if (type >= 0xe0)
257
+ {
258
+ // negative fixint
259
+ more_ = visitor.int64_value(static_cast<int8_t>(type), semantic_tag::none, *this, ec);
260
+ }
261
+ else
262
+ {
263
+ switch (type)
264
+ {
265
+ case jsoncons::msgpack::msgpack_type::nil_type:
266
+ {
267
+ more_ = visitor.null_value(semantic_tag::none, *this, ec);
268
+ break;
269
+ }
270
+ case jsoncons::msgpack::msgpack_type::true_type:
271
+ {
272
+ more_ = visitor.bool_value(true, semantic_tag::none, *this, ec);
273
+ break;
274
+ }
275
+ case jsoncons::msgpack::msgpack_type::false_type:
276
+ {
277
+ more_ = visitor.bool_value(false, semantic_tag::none, *this, ec);
278
+ break;
279
+ }
280
+ case jsoncons::msgpack::msgpack_type::float32_type:
281
+ {
282
+ uint8_t buf[sizeof(float)];
283
+ if (source_.read(buf, sizeof(float)) != sizeof(float))
284
+ {
285
+ ec = msgpack_errc::unexpected_eof;
286
+ more_ = false;
287
+ return;
288
+ }
289
+ float val = binary::big_to_native<float>(buf, sizeof(buf));
290
+ more_ = visitor.double_value(val, semantic_tag::none, *this, ec);
291
+ break;
292
+ }
293
+
294
+ case jsoncons::msgpack::msgpack_type::float64_type:
295
+ {
296
+ uint8_t buf[sizeof(double)];
297
+ if (source_.read(buf, sizeof(double)) != sizeof(double))
298
+ {
299
+ ec = msgpack_errc::unexpected_eof;
300
+ more_ = false;
301
+ return;
302
+ }
303
+ double val = binary::big_to_native<double>(buf, sizeof(buf));
304
+ more_ = visitor.double_value(val, semantic_tag::none, *this, ec);
305
+ break;
306
+ }
307
+
308
+ case jsoncons::msgpack::msgpack_type::uint8_type:
309
+ {
310
+ uint8_t b;
311
+ if (source_.read(&b, 1) == 0)
312
+ {
313
+ ec = msgpack_errc::unexpected_eof;
314
+ more_ = false;
315
+ return;
316
+ }
317
+ more_ = visitor.uint64_value(b, semantic_tag::none, *this, ec);
318
+ break;
319
+ }
320
+
321
+ case jsoncons::msgpack::msgpack_type::uint16_type:
322
+ {
323
+ uint8_t buf[sizeof(uint16_t)];
324
+ if (source_.read(buf, sizeof(uint16_t)) !=sizeof(uint16_t))
325
+ {
326
+ ec = msgpack_errc::unexpected_eof;
327
+ more_ = false;
328
+ return;
329
+ }
330
+ uint16_t val = binary::big_to_native<uint16_t>(buf, sizeof(buf));
331
+ more_ = visitor.uint64_value(val, semantic_tag::none, *this, ec);
332
+ break;
333
+ }
334
+
335
+ case jsoncons::msgpack::msgpack_type::uint32_type:
336
+ {
337
+ uint8_t buf[sizeof(uint32_t)];
338
+ if (source_.read(buf, sizeof(uint32_t)) != sizeof(uint32_t))
339
+ {
340
+ ec = msgpack_errc::unexpected_eof;
341
+ more_ = false;
342
+ return;
343
+ }
344
+ uint32_t val = binary::big_to_native<uint32_t>(buf, sizeof(buf));
345
+ more_ = visitor.uint64_value(val, semantic_tag::none, *this, ec);
346
+ break;
347
+ }
348
+
349
+ case jsoncons::msgpack::msgpack_type::uint64_type:
350
+ {
351
+ uint8_t buf[sizeof(uint64_t)];
352
+ if (source_.read(buf, sizeof(uint64_t)) != sizeof(uint64_t))
353
+ {
354
+ ec = msgpack_errc::unexpected_eof;
355
+ more_ = false;
356
+ return;
357
+ }
358
+ uint64_t val = binary::big_to_native<uint64_t>(buf, sizeof(buf));
359
+ more_ = visitor.uint64_value(val, semantic_tag::none, *this, ec);
360
+ break;
361
+ }
362
+
363
+ case jsoncons::msgpack::msgpack_type::int8_type:
364
+ {
365
+ uint8_t buf[sizeof(int8_t)];
366
+ if (source_.read(buf, sizeof(int8_t)) != sizeof(int8_t))
367
+ {
368
+ ec = msgpack_errc::unexpected_eof;
369
+ more_ = false;
370
+ return;
371
+ }
372
+ int8_t val = binary::big_to_native<int8_t>(buf, sizeof(buf));
373
+ more_ = visitor.int64_value(val, semantic_tag::none, *this, ec);
374
+ break;
375
+ }
376
+
377
+ case jsoncons::msgpack::msgpack_type::int16_type:
378
+ {
379
+ uint8_t buf[sizeof(int16_t)];
380
+ if (source_.read(buf, sizeof(int16_t)) != sizeof(int16_t))
381
+ {
382
+ ec = msgpack_errc::unexpected_eof;
383
+ more_ = false;
384
+ return;
385
+ }
386
+ int16_t val = binary::big_to_native<int16_t>(buf, sizeof(buf));
387
+ more_ = visitor.int64_value(val, semantic_tag::none, *this, ec);
388
+ break;
389
+ }
390
+
391
+ case jsoncons::msgpack::msgpack_type::int32_type:
392
+ {
393
+ uint8_t buf[sizeof(int32_t)];
394
+ if (source_.read(buf, sizeof(int32_t)) != sizeof(int32_t))
395
+ {
396
+ ec = msgpack_errc::unexpected_eof;
397
+ more_ = false;
398
+ return;
399
+ }
400
+ int32_t val = binary::big_to_native<int32_t>(buf, sizeof(buf));
401
+ more_ = visitor.int64_value(val, semantic_tag::none, *this, ec);
402
+ break;
403
+ }
404
+
405
+ case jsoncons::msgpack::msgpack_type::int64_type:
406
+ {
407
+ uint8_t buf[sizeof(int64_t)];
408
+ if (source_.read(buf, sizeof(int64_t)) != sizeof(int64_t))
409
+ {
410
+ ec = msgpack_errc::unexpected_eof;
411
+ more_ = false;
412
+ return;
413
+ }
414
+ int64_t val = binary::big_to_native<int64_t>(buf, sizeof(buf));
415
+ more_ = visitor.int64_value(val, semantic_tag::none, *this, ec);
416
+ break;
417
+ }
418
+
419
+ case jsoncons::msgpack::msgpack_type::str8_type:
420
+ case jsoncons::msgpack::msgpack_type::str16_type:
421
+ case jsoncons::msgpack::msgpack_type::str32_type:
422
+ {
423
+ std::size_t len = get_size(type, ec);
424
+ if (!more_)
425
+ {
426
+ return;
427
+ }
428
+
429
+ text_buffer_.clear();
430
+ if (source_reader<Source>::read(source_,text_buffer_,len) != static_cast<std::size_t>(len))
431
+ {
432
+ ec = msgpack_errc::unexpected_eof;
433
+ more_ = false;
434
+ return;
435
+ }
436
+
437
+ auto result = unicode_traits::validate(text_buffer_.data(),text_buffer_.size());
438
+ if (result.ec != unicode_traits::conv_errc())
439
+ {
440
+ ec = msgpack_errc::invalid_utf8_text_string;
441
+ more_ = false;
442
+ return;
443
+ }
444
+ more_ = visitor.string_value(jsoncons::basic_string_view<char>(text_buffer_.data(),text_buffer_.length()), semantic_tag::none, *this, ec);
445
+ break;
446
+ }
447
+
448
+ case jsoncons::msgpack::msgpack_type::bin8_type:
449
+ case jsoncons::msgpack::msgpack_type::bin16_type:
450
+ case jsoncons::msgpack::msgpack_type::bin32_type:
451
+ {
452
+ std::size_t len = get_size(type,ec);
453
+ if (!more_)
454
+ {
455
+ return;
456
+ }
457
+ bytes_buffer_.clear();
458
+ if (source_reader<Source>::read(source_,bytes_buffer_,len) != static_cast<std::size_t>(len))
459
+ {
460
+ ec = msgpack_errc::unexpected_eof;
461
+ more_ = false;
462
+ return;
463
+ }
464
+
465
+ more_ = visitor.byte_string_value(byte_string_view(bytes_buffer_.data(),bytes_buffer_.size()),
466
+ semantic_tag::none,
467
+ *this,
468
+ ec);
469
+ break;
470
+ }
471
+ case jsoncons::msgpack::msgpack_type::fixext1_type:
472
+ case jsoncons::msgpack::msgpack_type::fixext2_type:
473
+ case jsoncons::msgpack::msgpack_type::fixext4_type:
474
+ case jsoncons::msgpack::msgpack_type::fixext8_type:
475
+ case jsoncons::msgpack::msgpack_type::fixext16_type:
476
+ case jsoncons::msgpack::msgpack_type::ext8_type:
477
+ case jsoncons::msgpack::msgpack_type::ext16_type:
478
+ case jsoncons::msgpack::msgpack_type::ext32_type:
479
+ {
480
+ std::size_t len = get_size(type,ec);
481
+ if (!more_)
482
+ {
483
+ return;
484
+ }
485
+
486
+ // type
487
+ uint8_t buf[sizeof(int8_t)];
488
+ if (source_.read(buf, sizeof(int8_t)) != sizeof(int8_t))
489
+ {
490
+ ec = msgpack_errc::unexpected_eof;
491
+ more_ = false;
492
+ return;
493
+ }
494
+
495
+ int8_t ext_type = binary::big_to_native<int8_t>(buf, sizeof(buf));
496
+
497
+ bool is_timestamp = false;
498
+ if (ext_type == -1)
499
+ {
500
+ is_timestamp = true;;
501
+ }
502
+
503
+ // payload
504
+ if (is_timestamp && len == 4)
505
+ {
506
+ uint8_t buf32[sizeof(uint32_t)];
507
+ if (source_.read(buf32, sizeof(uint32_t)) != sizeof(uint32_t))
508
+ {
509
+ ec = msgpack_errc::unexpected_eof;
510
+ more_ = false;
511
+ return;
512
+ }
513
+ uint32_t val = binary::big_to_native<uint32_t>(buf32, sizeof(buf32));
514
+ more_ = visitor.uint64_value(val, semantic_tag::epoch_second, *this, ec);
515
+ }
516
+ else if (is_timestamp && len == 8)
517
+ {
518
+ uint8_t buf64[sizeof(uint64_t)];
519
+ if (source_.read(buf64, sizeof(uint64_t)) != sizeof(uint64_t))
520
+ {
521
+ ec = msgpack_errc::unexpected_eof;
522
+ more_ = false;
523
+ return;
524
+ }
525
+ uint64_t data64 = binary::big_to_native<uint64_t>(buf64, sizeof(buf64));
526
+ uint64_t sec = data64 & 0x00000003ffffffffL;
527
+ uint64_t nsec = data64 >> 34;
528
+
529
+ bigint nano(sec);
530
+ nano *= uint64_t(nanos_in_second);
531
+ nano += nsec;
532
+ text_buffer_.clear();
533
+ nano.write_string(text_buffer_);
534
+ more_ = visitor.string_value(text_buffer_, semantic_tag::epoch_nano, *this, ec);
535
+ if (!more_) return;
536
+ }
537
+ else if (is_timestamp && len == 12)
538
+ {
539
+ uint8_t buf1[sizeof(uint32_t)];
540
+ if (source_.read(buf1, sizeof(uint32_t)) != sizeof(uint32_t))
541
+ {
542
+ ec = msgpack_errc::unexpected_eof;
543
+ more_ = false;
544
+ return;
545
+ }
546
+ uint32_t nsec = binary::big_to_native<uint32_t>(buf1, sizeof(buf1));
547
+
548
+ uint8_t buf2[sizeof(int64_t)];
549
+ if (source_.read(buf2, sizeof(int64_t)) != sizeof(int64_t))
550
+ {
551
+ ec = msgpack_errc::unexpected_eof;
552
+ more_ = false;
553
+ return;
554
+ }
555
+ int64_t sec = binary::big_to_native<int64_t>(buf2, sizeof(buf2));
556
+
557
+ bigint nano(sec);
558
+
559
+ nano *= uint64_t(nanos_in_second);
560
+
561
+ if (nano < 0)
562
+ {
563
+ nano -= nsec;
564
+ }
565
+ else
566
+ {
567
+ nano += nsec;
568
+ }
569
+
570
+ text_buffer_.clear();
571
+ nano.write_string(text_buffer_);
572
+ more_ = visitor.string_value(text_buffer_, semantic_tag::epoch_nano, *this, ec);
573
+ if (!more_) return;
574
+ }
575
+ else
576
+ {
577
+ bytes_buffer_.clear();
578
+ if (source_reader<Source>::read(source_,bytes_buffer_,len) != static_cast<std::size_t>(len))
579
+ {
580
+ ec = msgpack_errc::unexpected_eof;
581
+ more_ = false;
582
+ return;
583
+ }
584
+
585
+ more_ = visitor.byte_string_value(byte_string_view(bytes_buffer_.data(),bytes_buffer_.size()),
586
+ static_cast<uint8_t>(ext_type),
587
+ *this,
588
+ ec);
589
+ }
590
+ break;
591
+ }
592
+
593
+ case jsoncons::msgpack::msgpack_type::array16_type:
594
+ case jsoncons::msgpack::msgpack_type::array32_type:
595
+ {
596
+ begin_array(visitor,type,ec);
597
+ break;
598
+ }
599
+
600
+ case jsoncons::msgpack::msgpack_type::map16_type :
601
+ case jsoncons::msgpack::msgpack_type::map32_type :
602
+ {
603
+ begin_object(visitor, type, ec);
604
+ break;
605
+ }
606
+
607
+ default:
608
+ {
609
+ ec = msgpack_errc::unknown_type;
610
+ more_ = false;
611
+ return;
612
+ }
613
+ }
614
+ }
615
+ }
616
+
617
+ void begin_array(json_visitor2& visitor, uint8_t type, std::error_code& ec)
618
+ {
619
+ if (JSONCONS_UNLIKELY(++nesting_depth_ > options_.max_nesting_depth()))
620
+ {
621
+ ec = msgpack_errc::max_nesting_depth_exceeded;
622
+ more_ = false;
623
+ return;
624
+ }
625
+ std::size_t length = get_size(type, ec);
626
+ if (!more_)
627
+ {
628
+ return;
629
+ }
630
+ state_stack_.emplace_back(parse_mode::array,length);
631
+ more_ = visitor.begin_array(length, semantic_tag::none, *this, ec);
632
+ }
633
+
634
+ void end_array(json_visitor2& visitor, std::error_code& ec)
635
+ {
636
+ --nesting_depth_;
637
+
638
+ more_ = visitor.end_array(*this, ec);
639
+ state_stack_.pop_back();
640
+ }
641
+
642
+ void begin_object(json_visitor2& visitor, uint8_t type, std::error_code& ec)
643
+ {
644
+ if (JSONCONS_UNLIKELY(++nesting_depth_ > options_.max_nesting_depth()))
645
+ {
646
+ ec = msgpack_errc::max_nesting_depth_exceeded;
647
+ more_ = false;
648
+ return;
649
+ }
650
+ std::size_t length = get_size(type, ec);
651
+ if (!more_)
652
+ {
653
+ return;
654
+ }
655
+ state_stack_.emplace_back(parse_mode::map_key,length);
656
+ more_ = visitor.begin_object(length, semantic_tag::none, *this, ec);
657
+ }
658
+
659
+ void end_object(json_visitor2& visitor, std::error_code& ec)
660
+ {
661
+ --nesting_depth_;
662
+ more_ = visitor.end_object(*this, ec);
663
+ state_stack_.pop_back();
664
+ }
665
+
666
+ std::size_t get_size(uint8_t type, std::error_code& ec)
667
+ {
668
+ switch (type)
669
+ {
670
+ case jsoncons::msgpack::msgpack_type::str8_type:
671
+ case jsoncons::msgpack::msgpack_type::bin8_type:
672
+ case jsoncons::msgpack::msgpack_type::ext8_type:
673
+ {
674
+ uint8_t buf[sizeof(int8_t)];
675
+ if (source_.read(buf, sizeof(int8_t)) != sizeof(int8_t))
676
+ {
677
+ ec = msgpack_errc::unexpected_eof;
678
+ more_ = false;
679
+ return 0;
680
+ }
681
+ uint8_t len = binary::big_to_native<uint8_t>(buf, sizeof(buf));
682
+ return static_cast<std::size_t>(len);
683
+ }
684
+
685
+ case jsoncons::msgpack::msgpack_type::str16_type:
686
+ case jsoncons::msgpack::msgpack_type::bin16_type:
687
+ case jsoncons::msgpack::msgpack_type::ext16_type:
688
+ case jsoncons::msgpack::msgpack_type::array16_type:
689
+ case jsoncons::msgpack::msgpack_type::map16_type:
690
+ {
691
+ uint8_t buf[sizeof(int16_t)];
692
+ if (source_.read(buf, sizeof(int16_t)) != sizeof(int16_t))
693
+ {
694
+ ec = msgpack_errc::unexpected_eof;
695
+ more_ = false;
696
+ return 0;
697
+ }
698
+ uint16_t len = binary::big_to_native<uint16_t>(buf, sizeof(buf));
699
+ return static_cast<std::size_t>(len);
700
+ }
701
+
702
+ case jsoncons::msgpack::msgpack_type::str32_type:
703
+ case jsoncons::msgpack::msgpack_type::bin32_type:
704
+ case jsoncons::msgpack::msgpack_type::ext32_type:
705
+ case jsoncons::msgpack::msgpack_type::array32_type:
706
+ case jsoncons::msgpack::msgpack_type::map32_type :
707
+ {
708
+ uint8_t buf[sizeof(int32_t)];
709
+ if (source_.read(buf, sizeof(int32_t)) != sizeof(int32_t))
710
+ {
711
+ ec = msgpack_errc::unexpected_eof;
712
+ more_ = false;
713
+ return 0;
714
+ }
715
+ uint32_t len = binary::big_to_native<uint32_t>(buf, sizeof(buf));
716
+ return static_cast<std::size_t>(len);
717
+ }
718
+ case jsoncons::msgpack::msgpack_type::fixext1_type:
719
+ return 1;
720
+ case jsoncons::msgpack::msgpack_type::fixext2_type:
721
+ return 2;
722
+ case jsoncons::msgpack::msgpack_type::fixext4_type:
723
+ return 4;
724
+ case jsoncons::msgpack::msgpack_type::fixext8_type:
725
+ return 8;
726
+ case jsoncons::msgpack::msgpack_type::fixext16_type:
727
+ return 16;
728
+ default:
729
+ if ((type > 0x8f && type <= 0x9f) // fixarray
730
+ || (type > 0x7f && type <= 0x8f) // fixmap
731
+ )
732
+ {
733
+ return type & 0x0f;
734
+ }
735
+ else
736
+ {
737
+ ec = msgpack_errc::unknown_type;
738
+ more_ = false;
739
+ return 0;
740
+ }
741
+ break;
742
+ }
743
+ }
744
+ };
745
+
746
+ }}
747
+
748
+ #endif