jsoncons 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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