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,420 @@
1
+ // Copyright 2013-2016 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_DECODER_HPP
8
+ #define JSONCONS_JSON_DECODER_HPP
9
+
10
+ #include <string>
11
+ #include <vector>
12
+ #include <type_traits> // std::true_type
13
+ #include <memory> // std::allocator
14
+ #include <iterator> // std::make_move_iterator
15
+ #include <utility> // std::move
16
+ #include <jsoncons/json_exception.hpp>
17
+ #include <jsoncons/json_visitor.hpp>
18
+
19
+ namespace jsoncons {
20
+
21
+ template <class Json,class TempAllocator=std::allocator<char>>
22
+ class json_decoder final : public basic_json_visitor<typename Json::char_type>
23
+ {
24
+ public:
25
+ using char_type = typename Json::char_type;
26
+ using typename basic_json_visitor<char_type>::string_view_type;
27
+
28
+ using key_value_type = typename Json::key_value_type;
29
+ using key_type = typename Json::key_type;
30
+ using array = typename Json::array;
31
+ using object = typename Json::object;
32
+ using result_allocator_type = typename Json::allocator_type;
33
+ using json_string_allocator = typename key_type::allocator_type;
34
+ using json_array_allocator = typename array::allocator_type;
35
+ using json_object_allocator = typename object::allocator_type;
36
+ typedef typename std::allocator_traits<result_allocator_type>:: template rebind_alloc<uint8_t> json_byte_allocator_type;
37
+ private:
38
+ struct stack_item
39
+ {
40
+ key_type name_;
41
+ Json value_;
42
+
43
+ template <class... Args>
44
+ stack_item(key_type&& name, Args&& ... args)
45
+ : name_(std::move(name)), value_(std::forward<Args>(args)...)
46
+ {
47
+ }
48
+
49
+ stack_item() = default;
50
+ stack_item(const stack_item&) = default;
51
+ stack_item(stack_item&&) = default;
52
+ stack_item& operator=(const stack_item&) = default;
53
+ stack_item& operator=(stack_item&&) = default;
54
+ };
55
+
56
+ enum class structure_type {root_t, array_t, object_t};
57
+
58
+ struct structure_info
59
+ {
60
+ structure_type type_;
61
+ std::size_t container_index_;
62
+
63
+ structure_info(structure_type type, std::size_t offset) noexcept
64
+ : type_(type), container_index_(offset)
65
+ {
66
+ }
67
+
68
+ };
69
+
70
+ using temp_allocator_type = TempAllocator;
71
+ typedef typename std::allocator_traits<temp_allocator_type>:: template rebind_alloc<stack_item> stack_item_allocator_type;
72
+ typedef typename std::allocator_traits<temp_allocator_type>:: template rebind_alloc<structure_info> structure_info_allocator_type;
73
+
74
+ result_allocator_type result_allocator_;
75
+ temp_allocator_type temp_allocator_;
76
+
77
+ Json result_;
78
+
79
+ key_type name_;
80
+ std::vector<stack_item,stack_item_allocator_type> item_stack_;
81
+ std::vector<structure_info,structure_info_allocator_type> structure_stack_;
82
+ bool is_valid_;
83
+
84
+ public:
85
+ json_decoder(const temp_allocator_type& temp_alloc = temp_allocator_type())
86
+ : result_allocator_(result_allocator_type()),
87
+ temp_allocator_(temp_alloc),
88
+ result_(),
89
+ name_(result_allocator_),
90
+ item_stack_(temp_allocator_),
91
+ structure_stack_(temp_allocator_),
92
+ is_valid_(false)
93
+ {
94
+ item_stack_.reserve(1000);
95
+ structure_stack_.reserve(100);
96
+ structure_stack_.emplace_back(structure_type::root_t, 0);
97
+ }
98
+
99
+ json_decoder(result_allocator_arg_t,
100
+ const result_allocator_type& result_alloc)
101
+ : result_allocator_(result_alloc),
102
+ temp_allocator_(),
103
+ result_(),
104
+ name_(result_allocator_),
105
+ item_stack_(),
106
+ structure_stack_(),
107
+ is_valid_(false)
108
+ {
109
+ item_stack_.reserve(1000);
110
+ structure_stack_.reserve(100);
111
+ structure_stack_.emplace_back(structure_type::root_t, 0);
112
+ }
113
+
114
+ json_decoder(result_allocator_arg_t,
115
+ const result_allocator_type& result_alloc,
116
+ const temp_allocator_type& temp_alloc)
117
+ : result_allocator_(result_alloc),
118
+ temp_allocator_(temp_alloc),
119
+ result_(),
120
+ name_(result_allocator_),
121
+ item_stack_(temp_allocator_),
122
+ structure_stack_(temp_allocator_),
123
+ is_valid_(false)
124
+ {
125
+ item_stack_.reserve(1000);
126
+ structure_stack_.reserve(100);
127
+ structure_stack_.emplace_back(structure_type::root_t, 0);
128
+ }
129
+
130
+ void reset()
131
+ {
132
+ is_valid_ = false;
133
+ item_stack_.clear();
134
+ structure_stack_.clear();
135
+ structure_stack_.emplace_back(structure_type::root_t, 0);
136
+ }
137
+
138
+ bool is_valid() const
139
+ {
140
+ return is_valid_;
141
+ }
142
+
143
+ Json get_result()
144
+ {
145
+ JSONCONS_ASSERT(is_valid_);
146
+ is_valid_ = false;
147
+ return std::move(result_);
148
+ }
149
+
150
+ #if !defined(JSONCONS_NO_DEPRECATED)
151
+ JSONCONS_DEPRECATED_MSG("Instead, use get_result()")
152
+ Json& root()
153
+ {
154
+ return result_;
155
+ }
156
+ #endif
157
+
158
+ private:
159
+
160
+ void visit_flush() override
161
+ {
162
+ }
163
+
164
+ bool visit_begin_object(semantic_tag tag, const ser_context&, std::error_code&) override
165
+ {
166
+ if (structure_stack_.back().type_ == structure_type::root_t)
167
+ {
168
+ item_stack_.clear();
169
+ is_valid_ = false;
170
+ }
171
+ item_stack_.emplace_back(std::forward<key_type>(name_), json_object_arg, tag, result_allocator_);
172
+ structure_stack_.emplace_back(structure_type::object_t, item_stack_.size()-1);
173
+ return true;
174
+ }
175
+
176
+ bool visit_end_object(const ser_context&, std::error_code&) override
177
+ {
178
+ JSONCONS_ASSERT(structure_stack_.size() > 0);
179
+ JSONCONS_ASSERT(structure_stack_.back().type_ == structure_type::object_t);
180
+ const size_t structure_index = structure_stack_.back().container_index_;
181
+ JSONCONS_ASSERT(item_stack_.size() > structure_index);
182
+ const size_t count = item_stack_.size() - (structure_index + 1);
183
+ auto first = item_stack_.begin() + (structure_index+1);
184
+ auto last = first + count;
185
+ item_stack_[structure_index].value_.object_value().insert(
186
+ std::make_move_iterator(first),
187
+ std::make_move_iterator(last),
188
+ [](stack_item&& val){return key_value_type(std::move(val.name_), std::move(val.value_));}
189
+ );
190
+ item_stack_.erase(item_stack_.begin()+structure_index+1, item_stack_.end());
191
+ structure_stack_.pop_back();
192
+ if (structure_stack_.back().type_ == structure_type::root_t)
193
+ {
194
+ result_.swap(item_stack_.front().value_);
195
+ item_stack_.pop_back();
196
+ is_valid_ = true;
197
+ return false;
198
+ }
199
+ return true;
200
+ }
201
+
202
+ bool visit_begin_array(semantic_tag tag, const ser_context&, std::error_code&) override
203
+ {
204
+ if (structure_stack_.back().type_ == structure_type::root_t)
205
+ {
206
+ item_stack_.clear();
207
+ is_valid_ = false;
208
+ }
209
+ item_stack_.emplace_back(std::forward<key_type>(name_), json_array_arg, tag, result_allocator_);
210
+ structure_stack_.emplace_back(structure_type::array_t, item_stack_.size()-1);
211
+ return true;
212
+ }
213
+
214
+ bool visit_end_array(const ser_context&, std::error_code&) override
215
+ {
216
+ JSONCONS_ASSERT(structure_stack_.size() > 1);
217
+ JSONCONS_ASSERT(structure_stack_.back().type_ == structure_type::array_t);
218
+ const size_t container_index = structure_stack_.back().container_index_;
219
+ JSONCONS_ASSERT(item_stack_.size() > container_index);
220
+
221
+ auto& container = item_stack_[container_index].value_;
222
+
223
+ const size_t size = item_stack_.size() - (container_index + 1);
224
+ //std::cout << "size on item stack: " << size << "\n";
225
+
226
+ if (size > 0)
227
+ {
228
+ container.reserve(size);
229
+ auto first = item_stack_.begin() + (container_index+1);
230
+ auto last = first + size;
231
+ for (auto it = first; it != last; ++it)
232
+ {
233
+ container.push_back(std::move(it->value_));
234
+ }
235
+ item_stack_.erase(first, item_stack_.end());
236
+ }
237
+
238
+ structure_stack_.pop_back();
239
+ if (structure_stack_.back().type_ == structure_type::root_t)
240
+ {
241
+ result_.swap(item_stack_.front().value_);
242
+ item_stack_.pop_back();
243
+ is_valid_ = true;
244
+ return false;
245
+ }
246
+ return true;
247
+ }
248
+
249
+ bool visit_key(const string_view_type& name, const ser_context&, std::error_code&) override
250
+ {
251
+ name_ = key_type(name.data(),name.length(),result_allocator_);
252
+ return true;
253
+ }
254
+
255
+ bool visit_string(const string_view_type& sv, semantic_tag tag, const ser_context&, std::error_code&) override
256
+ {
257
+ switch (structure_stack_.back().type_)
258
+ {
259
+ case structure_type::object_t:
260
+ case structure_type::array_t:
261
+ item_stack_.emplace_back(std::forward<key_type>(name_), sv, tag, result_allocator_);
262
+ break;
263
+ case structure_type::root_t:
264
+ result_ = Json(sv, tag, result_allocator_);
265
+ is_valid_ = true;
266
+ return false;
267
+ }
268
+ return true;
269
+ }
270
+
271
+ bool visit_byte_string(const byte_string_view& b,
272
+ semantic_tag tag,
273
+ const ser_context&,
274
+ std::error_code&) override
275
+ {
276
+ switch (structure_stack_.back().type_)
277
+ {
278
+ case structure_type::object_t:
279
+ case structure_type::array_t:
280
+ item_stack_.emplace_back(std::forward<key_type>(name_), byte_string_arg, b, tag, result_allocator_);
281
+ break;
282
+ case structure_type::root_t:
283
+ result_ = Json(byte_string_arg, b, tag, result_allocator_);
284
+ is_valid_ = true;
285
+ return false;
286
+ }
287
+ return true;
288
+ }
289
+
290
+ bool visit_byte_string(const byte_string_view& b,
291
+ uint64_t ext_tag,
292
+ const ser_context&,
293
+ std::error_code&) override
294
+ {
295
+ switch (structure_stack_.back().type_)
296
+ {
297
+ case structure_type::object_t:
298
+ case structure_type::array_t:
299
+ item_stack_.emplace_back(std::forward<key_type>(name_), byte_string_arg, b, ext_tag, result_allocator_);
300
+ break;
301
+ case structure_type::root_t:
302
+ result_ = Json(byte_string_arg, b, ext_tag, result_allocator_);
303
+ is_valid_ = true;
304
+ return false;
305
+ }
306
+ return true;
307
+ }
308
+
309
+ bool visit_int64(int64_t value,
310
+ semantic_tag tag,
311
+ const ser_context&,
312
+ std::error_code&) override
313
+ {
314
+ switch (structure_stack_.back().type_)
315
+ {
316
+ case structure_type::object_t:
317
+ case structure_type::array_t:
318
+ item_stack_.emplace_back(std::forward<key_type>(name_), value, tag);
319
+ break;
320
+ case structure_type::root_t:
321
+ result_ = Json(value,tag);
322
+ is_valid_ = true;
323
+ return false;
324
+ }
325
+ return true;
326
+ }
327
+
328
+ bool visit_uint64(uint64_t value,
329
+ semantic_tag tag,
330
+ const ser_context&,
331
+ std::error_code&) override
332
+ {
333
+ switch (structure_stack_.back().type_)
334
+ {
335
+ case structure_type::object_t:
336
+ case structure_type::array_t:
337
+ item_stack_.emplace_back(std::forward<key_type>(name_), value, tag);
338
+ break;
339
+ case structure_type::root_t:
340
+ result_ = Json(value,tag);
341
+ is_valid_ = true;
342
+ return false;
343
+ }
344
+ return true;
345
+ }
346
+
347
+ bool visit_half(uint16_t value,
348
+ semantic_tag tag,
349
+ const ser_context&,
350
+ std::error_code&) override
351
+ {
352
+ switch (structure_stack_.back().type_)
353
+ {
354
+ case structure_type::object_t:
355
+ case structure_type::array_t:
356
+ item_stack_.emplace_back(std::forward<key_type>(name_), half_arg, value, tag);
357
+ break;
358
+ case structure_type::root_t:
359
+ result_ = Json(half_arg, value, tag);
360
+ is_valid_ = true;
361
+ return false;
362
+ }
363
+ return true;
364
+ }
365
+
366
+ bool visit_double(double value,
367
+ semantic_tag tag,
368
+ const ser_context&,
369
+ std::error_code&) override
370
+ {
371
+ switch (structure_stack_.back().type_)
372
+ {
373
+ case structure_type::object_t:
374
+ case structure_type::array_t:
375
+ item_stack_.emplace_back(std::forward<key_type>(name_), value, tag);
376
+ break;
377
+ case structure_type::root_t:
378
+ result_ = Json(value, tag);
379
+ is_valid_ = true;
380
+ return false;
381
+ }
382
+ return true;
383
+ }
384
+
385
+ bool visit_bool(bool value, semantic_tag tag, const ser_context&, std::error_code&) override
386
+ {
387
+ switch (structure_stack_.back().type_)
388
+ {
389
+ case structure_type::object_t:
390
+ case structure_type::array_t:
391
+ item_stack_.emplace_back(std::forward<key_type>(name_), value, tag);
392
+ break;
393
+ case structure_type::root_t:
394
+ result_ = Json(value, tag);
395
+ is_valid_ = true;
396
+ return false;
397
+ }
398
+ return true;
399
+ }
400
+
401
+ bool visit_null(semantic_tag tag, const ser_context&, std::error_code&) override
402
+ {
403
+ switch (structure_stack_.back().type_)
404
+ {
405
+ case structure_type::object_t:
406
+ case structure_type::array_t:
407
+ item_stack_.emplace_back(std::forward<key_type>(name_), null_type(), tag);
408
+ break;
409
+ case structure_type::root_t:
410
+ result_ = Json(null_type(), tag);
411
+ is_valid_ = true;
412
+ return false;
413
+ }
414
+ return true;
415
+ }
416
+ };
417
+
418
+ }
419
+
420
+ #endif