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,1189 @@
1
+ // Copyright 2018 Daniel Parker
2
+ // Distributed under the Boost license, Version 1.0.
3
+ // (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
4
+
5
+ // See https://github.com/danielaparker/jsoncons for latest version
6
+
7
+ #ifndef JSONCONS_STAJ2_CURSOR_HPP
8
+ #define JSONCONS_STAJ2_CURSOR_HPP
9
+
10
+ #include <memory> // std::allocator
11
+ #include <string>
12
+ #include <stdexcept>
13
+ #include <system_error>
14
+ #include <ios>
15
+ #include <type_traits> // std::enable_if
16
+ #include <array> // std::array
17
+ #include <functional> // std::function
18
+ #include <jsoncons/json_exception.hpp>
19
+ #include <jsoncons/json_visitor2.hpp>
20
+ #include <jsoncons/bigint.hpp>
21
+ #include <jsoncons/json_parser.hpp>
22
+ #include <jsoncons/ser_context.hpp>
23
+ #include <jsoncons/sink.hpp>
24
+ #include <jsoncons/detail/write_number.hpp>
25
+ #include <jsoncons/json_type_traits.hpp>
26
+ #include <jsoncons/typed_array_view.hpp>
27
+ #include <jsoncons/value_converter.hpp>
28
+
29
+ namespace jsoncons {
30
+
31
+ enum class staj2_event_type
32
+ {
33
+ begin_array,
34
+ end_array,
35
+ begin_object,
36
+ end_object,
37
+ string_value,
38
+ byte_string_value,
39
+ null_value,
40
+ bool_value,
41
+ int64_value,
42
+ uint64_value,
43
+ half_value,
44
+ double_value
45
+ };
46
+
47
+ template <class CharT>
48
+ std::basic_ostream<CharT>& operator<<(std::basic_ostream<CharT>& os, staj2_event_type tag)
49
+ {
50
+ static constexpr const CharT* begin_array_name = JSONCONS_CSTRING_CONSTANT(CharT, "begin_array");
51
+ static constexpr const CharT* end_array_name = JSONCONS_CSTRING_CONSTANT(CharT, "end_array");
52
+ static constexpr const CharT* begin_object_name = JSONCONS_CSTRING_CONSTANT(CharT, "begin_object");
53
+ static constexpr const CharT* end_object_name = JSONCONS_CSTRING_CONSTANT(CharT, "end_object");
54
+ static constexpr const CharT* string_value_name = JSONCONS_CSTRING_CONSTANT(CharT, "string_value");
55
+ static constexpr const CharT* byte_string_value_name = JSONCONS_CSTRING_CONSTANT(CharT, "byte_string_value");
56
+ static constexpr const CharT* null_value_name = JSONCONS_CSTRING_CONSTANT(CharT, "null_value");
57
+ static constexpr const CharT* bool_value_name = JSONCONS_CSTRING_CONSTANT(CharT, "bool_value");
58
+ static constexpr const CharT* uint64_value_name = JSONCONS_CSTRING_CONSTANT(CharT, "uint64_value");
59
+ static constexpr const CharT* int64_value_name = JSONCONS_CSTRING_CONSTANT(CharT, "int64_value");
60
+ static constexpr const CharT* half_value_name = JSONCONS_CSTRING_CONSTANT(CharT, "half_value");
61
+ static constexpr const CharT* double_value_name = JSONCONS_CSTRING_CONSTANT(CharT, "double_value");
62
+
63
+ switch (tag)
64
+ {
65
+ case staj2_event_type::begin_array:
66
+ {
67
+ os << begin_array_name;
68
+ break;
69
+ }
70
+ case staj2_event_type::end_array:
71
+ {
72
+ os << end_array_name;
73
+ break;
74
+ }
75
+ case staj2_event_type::begin_object:
76
+ {
77
+ os << begin_object_name;
78
+ break;
79
+ }
80
+ case staj2_event_type::end_object:
81
+ {
82
+ os << end_object_name;
83
+ break;
84
+ }
85
+ case staj2_event_type::string_value:
86
+ {
87
+ os << string_value_name;
88
+ break;
89
+ }
90
+ case staj2_event_type::byte_string_value:
91
+ {
92
+ os << byte_string_value_name;
93
+ break;
94
+ }
95
+ case staj2_event_type::null_value:
96
+ {
97
+ os << null_value_name;
98
+ break;
99
+ }
100
+ case staj2_event_type::bool_value:
101
+ {
102
+ os << bool_value_name;
103
+ break;
104
+ }
105
+ case staj2_event_type::int64_value:
106
+ {
107
+ os << int64_value_name;
108
+ break;
109
+ }
110
+ case staj2_event_type::uint64_value:
111
+ {
112
+ os << uint64_value_name;
113
+ break;
114
+ }
115
+ case staj2_event_type::half_value:
116
+ {
117
+ os << half_value_name;
118
+ break;
119
+ }
120
+ case staj2_event_type::double_value:
121
+ {
122
+ os << double_value_name;
123
+ break;
124
+ }
125
+ }
126
+ return os;
127
+ }
128
+
129
+ template<class CharT>
130
+ class basic_staj2_event
131
+ {
132
+ staj2_event_type event_type_;
133
+ semantic_tag tag_;
134
+ uint64_t ext_tag_;
135
+ union
136
+ {
137
+ bool bool_value_;
138
+ int64_t int64_value_;
139
+ uint64_t uint64_value_;
140
+ uint16_t half_value_;
141
+ double double_value_;
142
+ const CharT* string_data_;
143
+ const uint8_t* byte_string_data_;
144
+ } value_;
145
+ std::size_t length_;
146
+ public:
147
+ using string_view_type = jsoncons::basic_string_view<CharT>;
148
+
149
+ basic_staj2_event(staj2_event_type event_type, semantic_tag tag = semantic_tag::none)
150
+ : event_type_(event_type), tag_(tag), ext_tag_(0), value_(), length_(0)
151
+ {
152
+ }
153
+
154
+ basic_staj2_event(staj2_event_type event_type, std::size_t length, semantic_tag tag = semantic_tag::none)
155
+ : event_type_(event_type), tag_(tag), ext_tag_(0), value_(), length_(length)
156
+ {
157
+ }
158
+
159
+ basic_staj2_event(null_type, semantic_tag tag)
160
+ : event_type_(staj2_event_type::null_value), tag_(tag), ext_tag_(0), value_(), length_(0)
161
+ {
162
+ }
163
+
164
+ basic_staj2_event(bool value, semantic_tag tag)
165
+ : event_type_(staj2_event_type::bool_value), tag_(tag), ext_tag_(0), length_(0)
166
+ {
167
+ value_.bool_value_ = value;
168
+ }
169
+
170
+ basic_staj2_event(int64_t value, semantic_tag tag)
171
+ : event_type_(staj2_event_type::int64_value), tag_(tag), ext_tag_(0), length_(0)
172
+ {
173
+ value_.int64_value_ = value;
174
+ }
175
+
176
+ basic_staj2_event(uint64_t value, semantic_tag tag)
177
+ : event_type_(staj2_event_type::uint64_value), tag_(tag), ext_tag_(0), length_(0)
178
+ {
179
+ value_.uint64_value_ = value;
180
+ }
181
+
182
+ basic_staj2_event(half_arg_t, uint16_t value, semantic_tag tag)
183
+ : event_type_(staj2_event_type::half_value), tag_(tag), ext_tag_(0), length_(0)
184
+ {
185
+ value_.half_value_ = value;
186
+ }
187
+
188
+ basic_staj2_event(double value, semantic_tag tag)
189
+ : event_type_(staj2_event_type::double_value), tag_(tag), ext_tag_(0), length_(0)
190
+ {
191
+ value_.double_value_ = value;
192
+ }
193
+
194
+ basic_staj2_event(const string_view_type& s,
195
+ staj2_event_type event_type,
196
+ semantic_tag tag = semantic_tag::none)
197
+ : event_type_(event_type), tag_(tag), ext_tag_(0), length_(s.length())
198
+ {
199
+ value_.string_data_ = s.data();
200
+ }
201
+
202
+ basic_staj2_event(const byte_string_view& s,
203
+ staj2_event_type event_type,
204
+ semantic_tag tag = semantic_tag::none)
205
+ : event_type_(event_type), tag_(tag), ext_tag_(0), length_(s.size())
206
+ {
207
+ value_.byte_string_data_ = s.data();
208
+ }
209
+
210
+ basic_staj2_event(const byte_string_view& s,
211
+ staj2_event_type event_type,
212
+ uint64_t ext_tag)
213
+ : event_type_(event_type), tag_(semantic_tag::ext), ext_tag_(ext_tag), length_(s.size())
214
+ {
215
+ value_.byte_string_data_ = s.data();
216
+ }
217
+
218
+ std::size_t size() const
219
+ {
220
+ return length_;
221
+ }
222
+
223
+ template <class T>
224
+ T get() const
225
+ {
226
+ std::error_code ec;
227
+ T val = get<T>(ec);
228
+ if (ec)
229
+ {
230
+ JSONCONS_THROW(ser_error(ec));
231
+ }
232
+ return val;
233
+ }
234
+
235
+ template<class T, class CharT_ = CharT>
236
+ typename std::enable_if<traits_extension::is_string<T>::value && std::is_same<typename T::value_type, CharT_>::value, T>::type
237
+ get(std::error_code& ec) const
238
+ {
239
+ switch (event_type_)
240
+ {
241
+ case staj2_event_type::string_value:
242
+ {
243
+ value_converter<jsoncons::basic_string_view<CharT>,T> converter;
244
+ return converter.convert(jsoncons::basic_string_view<CharT>(value_.string_data_, length_), tag(), ec);
245
+ }
246
+ case staj2_event_type::byte_string_value:
247
+ {
248
+ value_converter<byte_string_view,T> converter;
249
+ return converter.convert(byte_string_view(value_.byte_string_data_,length_),tag(),ec);
250
+ }
251
+ case staj2_event_type::uint64_value:
252
+ {
253
+ value_converter<uint64_t,T> converter;
254
+ return converter.convert(value_.uint64_value_, tag(), ec);
255
+ }
256
+ case staj2_event_type::int64_value:
257
+ {
258
+ value_converter<int64_t,T> converter;
259
+ return converter.convert(value_.int64_value_, tag(), ec);
260
+ }
261
+ case staj2_event_type::half_value:
262
+ {
263
+ value_converter<half_arg_t,T> converter;
264
+ return converter.convert(value_.half_value_, tag(), ec);
265
+ }
266
+ case staj2_event_type::double_value:
267
+ {
268
+ value_converter<double,T> converter;
269
+ return converter.convert(value_.double_value_, tag(), ec);
270
+ }
271
+ case staj2_event_type::bool_value:
272
+ {
273
+ value_converter<bool,T> converter;
274
+ return converter.convert(value_.bool_value_,tag(),ec);
275
+ }
276
+ case staj2_event_type::null_value:
277
+ {
278
+ value_converter<null_type,T> converter;
279
+ return converter.convert(tag(),ec);
280
+ }
281
+ default:
282
+ {
283
+ ec = conv_errc::not_string;
284
+ return T{};
285
+ }
286
+ }
287
+ }
288
+
289
+ template<class T, class CharT_ = CharT>
290
+ typename std::enable_if<traits_extension::is_string_view<T>::value && std::is_same<typename T::value_type, CharT_>::value, T>::type
291
+ get(std::error_code& ec) const
292
+ {
293
+ T s;
294
+ switch (event_type_)
295
+ {
296
+ case staj2_event_type::string_value:
297
+ s = T(value_.string_data_, length_);
298
+ break;
299
+ default:
300
+ ec = conv_errc::not_string_view;
301
+ break;
302
+ }
303
+ return s;
304
+ }
305
+
306
+ template<class T>
307
+ typename std::enable_if<std::is_same<T, byte_string_view>::value, T>::type
308
+ get(std::error_code& ec) const
309
+ {
310
+ T s;
311
+ switch (event_type_)
312
+ {
313
+ case staj2_event_type::byte_string_value:
314
+ s = T(value_.byte_string_data_, length_);
315
+ break;
316
+ default:
317
+ ec = conv_errc::not_byte_string_view;
318
+ break;
319
+ }
320
+ return s;
321
+ }
322
+
323
+ template<class T>
324
+ typename std::enable_if<traits_extension::is_list_like<T>::value &&
325
+ std::is_same<typename T::value_type,uint8_t>::value,T>::type
326
+ get(std::error_code& ec) const
327
+ {
328
+ switch (event_type_)
329
+ {
330
+ case staj2_event_type::byte_string_value:
331
+ {
332
+ value_converter<byte_string_view,T> converter;
333
+ return converter.convert(byte_string_view(value_.byte_string_data_, length_), tag(), ec);
334
+ }
335
+ case staj2_event_type::string_value:
336
+ {
337
+ value_converter<basic_string_view<CharT>,T> converter;
338
+ return converter.convert(jsoncons::basic_string_view<CharT>(value_.string_data_, length_), tag(), ec);
339
+ }
340
+ default:
341
+ ec = conv_errc::not_byte_string;
342
+ return T{};
343
+ }
344
+ }
345
+
346
+ template <class IntegerType>
347
+ typename std::enable_if<traits_extension::is_integer<IntegerType>::value, IntegerType>::type
348
+ get(std::error_code& ec) const
349
+ {
350
+ switch (event_type_)
351
+ {
352
+ case staj2_event_type::string_value:
353
+ {
354
+ IntegerType val;
355
+ auto result = jsoncons::detail::to_integer(value_.string_data_, length_, val);
356
+ if (!result)
357
+ {
358
+ ec = conv_errc::not_integer;
359
+ return IntegerType();
360
+ }
361
+ return val;
362
+ }
363
+ case staj2_event_type::half_value:
364
+ return static_cast<IntegerType>(value_.half_value_);
365
+ case staj2_event_type::double_value:
366
+ return static_cast<IntegerType>(value_.double_value_);
367
+ case staj2_event_type::int64_value:
368
+ return static_cast<IntegerType>(value_.int64_value_);
369
+ case staj2_event_type::uint64_value:
370
+ return static_cast<IntegerType>(value_.uint64_value_);
371
+ case staj2_event_type::bool_value:
372
+ return static_cast<IntegerType>(value_.bool_value_ ? 1 : 0);
373
+ default:
374
+ ec = conv_errc::not_integer;
375
+ return IntegerType();
376
+ }
377
+ }
378
+
379
+ template<class T>
380
+ typename std::enable_if<std::is_floating_point<T>::value, T>::type
381
+ get(std::error_code& ec) const
382
+ {
383
+ return static_cast<T>(as_double(ec));
384
+ }
385
+
386
+ template<class T>
387
+ typename std::enable_if<traits_extension::is_bool<T>::value, T>::type
388
+ get(std::error_code& ec) const
389
+ {
390
+ return as_bool(ec);
391
+ }
392
+
393
+ staj2_event_type event_type() const noexcept { return event_type_; }
394
+
395
+ semantic_tag tag() const noexcept { return tag_; }
396
+
397
+ uint64_t ext_tag() const noexcept { return ext_tag_; }
398
+
399
+ private:
400
+
401
+ double as_double(std::error_code& ec) const
402
+ {
403
+ switch (event_type_)
404
+ {
405
+ case staj2_event_type::string_value:
406
+ {
407
+ jsoncons::detail::chars_to f;
408
+ return f(value_.string_data_, length_);
409
+ }
410
+ case staj2_event_type::double_value:
411
+ return value_.double_value_;
412
+ case staj2_event_type::int64_value:
413
+ return static_cast<double>(value_.int64_value_);
414
+ case staj2_event_type::uint64_value:
415
+ return static_cast<double>(value_.uint64_value_);
416
+ case staj2_event_type::half_value:
417
+ {
418
+ double x = binary::decode_half(value_.half_value_);
419
+ return static_cast<double>(x);
420
+ }
421
+ default:
422
+ ec = conv_errc::not_double;
423
+ return double();
424
+ }
425
+ }
426
+
427
+ bool as_bool(std::error_code& ec) const
428
+ {
429
+ switch (event_type_)
430
+ {
431
+ case staj2_event_type::bool_value:
432
+ return value_.bool_value_;
433
+ case staj2_event_type::double_value:
434
+ return value_.double_value_ != 0.0;
435
+ case staj2_event_type::int64_value:
436
+ return value_.int64_value_ != 0;
437
+ case staj2_event_type::uint64_value:
438
+ return value_.uint64_value_ != 0;
439
+ default:
440
+ ec = conv_errc::not_bool;
441
+ return bool();
442
+ }
443
+ }
444
+ public:
445
+ friend bool send_value_event(const basic_staj2_event<CharT>& ev,
446
+ basic_json_visitor2<CharT>& visitor,
447
+ const ser_context& context,
448
+ std::error_code& ec)
449
+ {
450
+ switch (ev.event_type())
451
+ {
452
+ case staj2_event_type::begin_array:
453
+ return visitor.begin_array(ev.tag(), context);
454
+ case staj2_event_type::end_array:
455
+ return visitor.end_array(context);
456
+ case staj2_event_type::begin_object:
457
+ return visitor.begin_object(ev.tag(), context, ec);
458
+ case staj2_event_type::end_object:
459
+ return visitor.end_object(context, ec);
460
+ case staj2_event_type::string_value:
461
+ return visitor.string_value(string_view_type(ev.value_.string_data_,ev.length_), ev.tag(), context);
462
+ case staj2_event_type::byte_string_value:
463
+ return visitor.byte_string_value(byte_string_view(ev.value_.byte_string_data_,ev.length_), ev.tag(), context);
464
+ case staj2_event_type::null_value:
465
+ return visitor.null_value(ev.tag(), context);
466
+ case staj2_event_type::bool_value:
467
+ return visitor.bool_value(ev.value_.bool_value_, ev.tag(), context);
468
+ case staj2_event_type::int64_value:
469
+ return visitor.int64_value(ev.value_.int64_value_, ev.tag(), context);
470
+ case staj2_event_type::uint64_value:
471
+ return visitor.uint64_value(ev.value_.uint64_value_, ev.tag(), context);
472
+ case staj2_event_type::half_value:
473
+ return visitor.half_value(ev.value_.half_value_, ev.tag(), context);
474
+ case staj2_event_type::double_value:
475
+ return visitor.double_value(ev.value_.double_value_, ev.tag(), context);
476
+ default:
477
+ return false;
478
+ }
479
+ }
480
+ };
481
+
482
+ // basic_staj2_visitor
483
+
484
+ enum class staj2_cursor_state
485
+ {
486
+ typed_array = 1,
487
+ multi_dim,
488
+ shape
489
+ };
490
+
491
+ template <class CharT>
492
+ class basic_staj2_visitor : public basic_json_visitor2<CharT>
493
+ {
494
+ using super_type = basic_json_visitor2<CharT>;
495
+ public:
496
+ using char_type = CharT;
497
+ using typename super_type::string_view_type;
498
+ private:
499
+ std::function<bool(const basic_staj2_event<CharT>&, const ser_context&)> pred_;
500
+ basic_staj2_event<CharT> event_;
501
+
502
+ staj2_cursor_state state_;
503
+ typed_array_view data_;
504
+ jsoncons::span<const size_t> shape_;
505
+ std::size_t index_;
506
+ public:
507
+ basic_staj2_visitor()
508
+ : pred_(accept), event_(staj2_event_type::null_value),
509
+ state_(), data_(), shape_(), index_(0)
510
+ {
511
+ }
512
+
513
+ basic_staj2_visitor(std::function<bool(const basic_staj2_event<CharT>&, const ser_context&)> pred)
514
+ : pred_(pred), event_(staj2_event_type::null_value),
515
+ state_(), data_(), shape_(), index_(0)
516
+ {
517
+ }
518
+
519
+ void reset()
520
+ {
521
+ event_ = staj2_event_type::null_value;
522
+ state_ = {};
523
+ data_ = {};
524
+ shape_ = {};
525
+ index_ = 0;
526
+ }
527
+
528
+ const basic_staj2_event<CharT>& event() const
529
+ {
530
+ return event_;
531
+ }
532
+
533
+ bool in_available() const
534
+ {
535
+ return state_ != staj2_cursor_state();
536
+ }
537
+
538
+ void send_available(std::error_code& ec)
539
+ {
540
+ switch (state_)
541
+ {
542
+ case staj2_cursor_state::typed_array:
543
+ advance_typed_array(ec);
544
+ break;
545
+ case staj2_cursor_state::multi_dim:
546
+ case staj2_cursor_state::shape:
547
+ advance_multi_dim(ec);
548
+ break;
549
+ default:
550
+ break;
551
+ }
552
+ }
553
+
554
+ bool is_typed_array() const
555
+ {
556
+ return data_.type() != typed_array_type();
557
+ }
558
+
559
+ staj2_cursor_state state() const
560
+ {
561
+ return state_;
562
+ }
563
+
564
+ void advance_typed_array(std::error_code& ec)
565
+ {
566
+ if (is_typed_array())
567
+ {
568
+ if (index_ < data_.size())
569
+ {
570
+ switch (data_.type())
571
+ {
572
+ case typed_array_type::uint8_value:
573
+ {
574
+ this->uint64_value(data_.data(uint8_array_arg)[index_], semantic_tag::none, ser_context(), ec);
575
+ break;
576
+ }
577
+ case typed_array_type::uint16_value:
578
+ {
579
+ this->uint64_value(data_.data(uint16_array_arg)[index_], semantic_tag::none, ser_context(), ec);
580
+ break;
581
+ }
582
+ case typed_array_type::uint32_value:
583
+ {
584
+ this->uint64_value(data_.data(uint32_array_arg)[index_], semantic_tag::none, ser_context(), ec);
585
+ break;
586
+ }
587
+ case typed_array_type::uint64_value:
588
+ {
589
+ this->uint64_value(data_.data(uint64_array_arg)[index_], semantic_tag::none, ser_context(), ec);
590
+ break;
591
+ }
592
+ case typed_array_type::int8_value:
593
+ {
594
+ this->int64_value(data_.data(int8_array_arg)[index_], semantic_tag::none, ser_context(), ec);
595
+ break;
596
+ }
597
+ case typed_array_type::int16_value:
598
+ {
599
+ this->int64_value(data_.data(int16_array_arg)[index_], semantic_tag::none, ser_context(), ec);
600
+ break;
601
+ }
602
+ case typed_array_type::int32_value:
603
+ {
604
+ this->int64_value(data_.data(int32_array_arg)[index_], semantic_tag::none, ser_context(), ec);
605
+ break;
606
+ }
607
+ case typed_array_type::int64_value:
608
+ {
609
+ this->int64_value(data_.data(int64_array_arg)[index_], semantic_tag::none, ser_context(), ec);
610
+ break;
611
+ }
612
+ case typed_array_type::half_value:
613
+ {
614
+ this->half_value(data_.data(half_array_arg)[index_], semantic_tag::none, ser_context(), ec);
615
+ break;
616
+ }
617
+ case typed_array_type::float_value:
618
+ {
619
+ this->double_value(data_.data(float_array_arg)[index_], semantic_tag::none, ser_context(), ec);
620
+ break;
621
+ }
622
+ case typed_array_type::double_value:
623
+ {
624
+ this->double_value(data_.data(double_array_arg)[index_], semantic_tag::none, ser_context(), ec);
625
+ break;
626
+ }
627
+ default:
628
+ break;
629
+ }
630
+ ++index_;
631
+ }
632
+ else
633
+ {
634
+ this->end_array();
635
+ state_ = staj2_cursor_state();
636
+ data_ = typed_array_view();
637
+ index_ = 0;
638
+ }
639
+ }
640
+ }
641
+
642
+ void advance_multi_dim(std::error_code& ec)
643
+ {
644
+ if (shape_.size() != 0)
645
+ {
646
+ if (state_ == staj2_cursor_state::multi_dim)
647
+ {
648
+ this->begin_array(shape_.size(), semantic_tag::none, ser_context(), ec);
649
+ state_ = staj2_cursor_state::shape;
650
+ }
651
+ else if (index_ < shape_.size())
652
+ {
653
+ this->uint64_value(shape_[index_], semantic_tag::none, ser_context(), ec);
654
+ ++index_;
655
+ }
656
+ else
657
+ {
658
+ state_ = staj2_cursor_state();
659
+ this->end_array(ser_context(), ec);
660
+ shape_ = jsoncons::span<const size_t>();
661
+ index_ = 0;
662
+ }
663
+ }
664
+ }
665
+
666
+ bool dump(basic_json_visitor2<CharT>& visitor, const ser_context& context, std::error_code& ec)
667
+ {
668
+ bool more = true;
669
+ if (is_typed_array())
670
+ {
671
+ if (index_ != 0)
672
+ {
673
+ more = send_value_event(event(), visitor, context, ec);
674
+ while (more && is_typed_array())
675
+ {
676
+ if (index_ < data_.size())
677
+ {
678
+ switch (data_.type())
679
+ {
680
+ case typed_array_type::uint8_value:
681
+ {
682
+ more = visitor.uint64_value(data_.data(uint8_array_arg)[index_]);
683
+ break;
684
+ }
685
+ case typed_array_type::uint16_value:
686
+ {
687
+ more = visitor.uint64_value(data_.data(uint16_array_arg)[index_]);
688
+ break;
689
+ }
690
+ case typed_array_type::uint32_value:
691
+ {
692
+ more = visitor.uint64_value(data_.data(uint32_array_arg)[index_]);
693
+ break;
694
+ }
695
+ case typed_array_type::uint64_value:
696
+ {
697
+ more = visitor.uint64_value(data_.data(uint64_array_arg)[index_]);
698
+ break;
699
+ }
700
+ case typed_array_type::int8_value:
701
+ {
702
+ more = visitor.int64_value(data_.data(int8_array_arg)[index_]);
703
+ break;
704
+ }
705
+ case typed_array_type::int16_value:
706
+ {
707
+ more = visitor.int64_value(data_.data(int16_array_arg)[index_]);
708
+ break;
709
+ }
710
+ case typed_array_type::int32_value:
711
+ {
712
+ more = visitor.int64_value(data_.data(int32_array_arg)[index_]);
713
+ break;
714
+ }
715
+ case typed_array_type::int64_value:
716
+ {
717
+ more = visitor.int64_value(data_.data(int64_array_arg)[index_]);
718
+ break;
719
+ }
720
+ case typed_array_type::float_value:
721
+ {
722
+ more = visitor.double_value(data_.data(float_array_arg)[index_]);
723
+ break;
724
+ }
725
+ case typed_array_type::double_value:
726
+ {
727
+ more = visitor.double_value(data_.data(double_array_arg)[index_]);
728
+ break;
729
+ }
730
+ default:
731
+ break;
732
+ }
733
+ ++index_;
734
+ }
735
+ else
736
+ {
737
+ more = visitor.end_array();
738
+ state_ = staj2_cursor_state();
739
+ data_ = typed_array_view();
740
+ index_ = 0;
741
+ }
742
+ }
743
+ }
744
+ else
745
+ {
746
+ switch (data_.type())
747
+ {
748
+ case typed_array_type::uint8_value:
749
+ {
750
+ more = visitor.typed_array(data_.data(uint8_array_arg));
751
+ break;
752
+ }
753
+ case typed_array_type::uint16_value:
754
+ {
755
+ more = visitor.typed_array(data_.data(uint16_array_arg));
756
+ break;
757
+ }
758
+ case typed_array_type::uint32_value:
759
+ {
760
+ more = visitor.typed_array(data_.data(uint32_array_arg));
761
+ break;
762
+ }
763
+ case typed_array_type::uint64_value:
764
+ {
765
+ more = visitor.typed_array(data_.data(uint64_array_arg));
766
+ break;
767
+ }
768
+ case typed_array_type::int8_value:
769
+ {
770
+ more = visitor.typed_array(data_.data(int8_array_arg));
771
+ break;
772
+ }
773
+ case typed_array_type::int16_value:
774
+ {
775
+ more = visitor.typed_array(data_.data(int16_array_arg));
776
+ break;
777
+ }
778
+ case typed_array_type::int32_value:
779
+ {
780
+ more = visitor.typed_array(data_.data(int32_array_arg));
781
+ break;
782
+ }
783
+ case typed_array_type::int64_value:
784
+ {
785
+ more = visitor.typed_array(data_.data(int64_array_arg));
786
+ break;
787
+ }
788
+ case typed_array_type::float_value:
789
+ {
790
+ more = visitor.typed_array(data_.data(float_array_arg));
791
+ break;
792
+ }
793
+ case typed_array_type::double_value:
794
+ {
795
+ more = visitor.typed_array(data_.data(double_array_arg));
796
+ break;
797
+ }
798
+ default:
799
+ break;
800
+ }
801
+
802
+ state_ = staj2_cursor_state();
803
+ data_ = typed_array_view();
804
+ }
805
+ }
806
+ else
807
+ {
808
+ more = send_value_event(event(), visitor, context, ec);
809
+ }
810
+ return more;
811
+ }
812
+
813
+ private:
814
+ static constexpr bool accept(const basic_staj2_event<CharT>&, const ser_context&)
815
+ {
816
+ return true;
817
+ }
818
+
819
+ bool visit_begin_object(semantic_tag tag, const ser_context& context, std::error_code&) override
820
+ {
821
+ event_ = basic_staj2_event<CharT>(staj2_event_type::begin_object, tag);
822
+ return !pred_(event_, context);
823
+ }
824
+
825
+ bool visit_begin_object(std::size_t length, semantic_tag tag, const ser_context& context, std::error_code&) override
826
+ {
827
+ event_ = basic_staj2_event<CharT>(staj2_event_type::begin_object, length, tag);
828
+ return !pred_(event_, context);
829
+ }
830
+
831
+ bool visit_end_object(const ser_context& context, std::error_code&) override
832
+ {
833
+ event_ = basic_staj2_event<CharT>(staj2_event_type::end_object);
834
+ return !pred_(event_, context);
835
+ }
836
+
837
+ bool visit_begin_array(semantic_tag tag, const ser_context& context, std::error_code&) override
838
+ {
839
+ event_ = basic_staj2_event<CharT>(staj2_event_type::begin_array, tag);
840
+ return !pred_(event_, context);
841
+ }
842
+
843
+ bool visit_begin_array(std::size_t length, semantic_tag tag, const ser_context& context, std::error_code&) override
844
+ {
845
+ event_ = basic_staj2_event<CharT>(staj2_event_type::begin_array, length, tag);
846
+ return !pred_(event_, context);
847
+ }
848
+
849
+ bool visit_end_array(const ser_context& context, std::error_code&) override
850
+ {
851
+ event_ = basic_staj2_event<CharT>(staj2_event_type::end_array);
852
+ return !pred_(event_, context);
853
+ }
854
+
855
+ bool visit_null(semantic_tag tag, const ser_context& context, std::error_code&) override
856
+ {
857
+ event_ = basic_staj2_event<CharT>(staj2_event_type::null_value, tag);
858
+ return !pred_(event_, context);
859
+ }
860
+
861
+ bool visit_bool(bool value, semantic_tag tag, const ser_context& context, std::error_code&) override
862
+ {
863
+ event_ = basic_staj2_event<CharT>(value, tag);
864
+ return !pred_(event_, context);
865
+ }
866
+
867
+ bool visit_string(const string_view_type& s, semantic_tag tag, const ser_context& context, std::error_code&) override
868
+ {
869
+ event_ = basic_staj2_event<CharT>(s, staj2_event_type::string_value, tag);
870
+ return !pred_(event_, context);
871
+ }
872
+
873
+ bool visit_byte_string(const byte_string_view& s,
874
+ semantic_tag tag,
875
+ const ser_context& context,
876
+ std::error_code&) override
877
+ {
878
+ event_ = basic_staj2_event<CharT>(s, staj2_event_type::byte_string_value, tag);
879
+ return !pred_(event_, context);
880
+ }
881
+
882
+ bool visit_byte_string(const byte_string_view& s,
883
+ uint64_t ext_tag,
884
+ const ser_context& context,
885
+ std::error_code&) override
886
+ {
887
+ event_ = basic_staj2_event<CharT>(s, staj2_event_type::byte_string_value, ext_tag);
888
+ return !pred_(event_, context);
889
+ }
890
+
891
+ bool visit_uint64(uint64_t value,
892
+ semantic_tag tag,
893
+ const ser_context& context,
894
+ std::error_code&) override
895
+ {
896
+ event_ = basic_staj2_event<CharT>(value, tag);
897
+ return !pred_(event_, context);
898
+ }
899
+
900
+ bool visit_int64(int64_t value,
901
+ semantic_tag tag,
902
+ const ser_context& context,
903
+ std::error_code&) override
904
+ {
905
+ event_ = basic_staj2_event<CharT>(value, tag);
906
+ return !pred_(event_, context);
907
+ }
908
+
909
+ bool visit_half(uint16_t value,
910
+ semantic_tag tag,
911
+ const ser_context& context,
912
+ std::error_code&) override
913
+ {
914
+ event_ = basic_staj2_event<CharT>(half_arg, value, tag);
915
+ return !pred_(event_, context);
916
+ }
917
+
918
+ bool visit_double(double value,
919
+ semantic_tag tag,
920
+ const ser_context& context,
921
+ std::error_code&) override
922
+ {
923
+ event_ = basic_staj2_event<CharT>(value, tag);
924
+ return !pred_(event_, context);
925
+ }
926
+
927
+ bool visit_typed_array(const jsoncons::span<const uint8_t>& v,
928
+ semantic_tag tag,
929
+ const ser_context& context,
930
+ std::error_code& ec) override
931
+ {
932
+ state_ = staj2_cursor_state::typed_array;
933
+ data_ = typed_array_view(v.data(), v.size());
934
+ index_ = 0;
935
+ return this->begin_array(tag, context, ec);
936
+ }
937
+
938
+ bool visit_typed_array(const jsoncons::span<const uint16_t>& data,
939
+ semantic_tag tag,
940
+ const ser_context& context,
941
+ std::error_code& ec) override
942
+ {
943
+ state_ = staj2_cursor_state::typed_array;
944
+ data_ = typed_array_view(data.data(), data.size());
945
+ index_ = 0;
946
+ return this->begin_array(tag, context, ec);
947
+ }
948
+
949
+ bool visit_typed_array(const jsoncons::span<const uint32_t>& data,
950
+ semantic_tag tag,
951
+ const ser_context& context,
952
+ std::error_code& ec) override
953
+ {
954
+ state_ = staj2_cursor_state::typed_array;
955
+ data_ = typed_array_view(data.data(), data.size());
956
+ index_ = 0;
957
+ return this->begin_array(tag, context, ec);
958
+ }
959
+
960
+ bool visit_typed_array(const jsoncons::span<const uint64_t>& data,
961
+ semantic_tag tag,
962
+ const ser_context& context,
963
+ std::error_code& ec) override
964
+ {
965
+ state_ = staj2_cursor_state::typed_array;
966
+ data_ = typed_array_view(data.data(), data.size());
967
+ index_ = 0;
968
+ return this->begin_array(tag, context, ec);
969
+ }
970
+
971
+ bool visit_typed_array(const jsoncons::span<const int8_t>& data,
972
+ semantic_tag tag,
973
+ const ser_context& context,
974
+ std::error_code& ec) override
975
+ {
976
+ state_ = staj2_cursor_state::typed_array;
977
+ data_ = typed_array_view(data.data(), data.size());
978
+ index_ = 0;
979
+ return this->begin_array(tag, context, ec);
980
+ }
981
+
982
+ bool visit_typed_array(const jsoncons::span<const int16_t>& data,
983
+ semantic_tag tag,
984
+ const ser_context& context,
985
+ std::error_code& ec) override
986
+ {
987
+ state_ = staj2_cursor_state::typed_array;
988
+ data_ = typed_array_view(data.data(), data.size());
989
+ index_ = 0;
990
+ return this->begin_array(tag, context, ec);
991
+ }
992
+
993
+ bool visit_typed_array(const jsoncons::span<const int32_t>& data,
994
+ semantic_tag tag,
995
+ const ser_context& context,
996
+ std::error_code& ec) override
997
+ {
998
+ state_ = staj2_cursor_state::typed_array;
999
+ data_ = typed_array_view(data.data(), data.size());
1000
+ index_ = 0;
1001
+ return this->begin_array(tag, context, ec);
1002
+ }
1003
+
1004
+ bool visit_typed_array(const jsoncons::span<const int64_t>& data,
1005
+ semantic_tag tag,
1006
+ const ser_context& context,
1007
+ std::error_code& ec) override
1008
+ {
1009
+ state_ = staj2_cursor_state::typed_array;
1010
+ data_ = typed_array_view(data.data(), data.size());
1011
+ index_ = 0;
1012
+ return this->begin_array(tag, context, ec);
1013
+ }
1014
+
1015
+ bool visit_typed_array(half_arg_t, const jsoncons::span<const uint16_t>& data,
1016
+ semantic_tag tag,
1017
+ const ser_context& context,
1018
+ std::error_code& ec) override
1019
+ {
1020
+ state_ = staj2_cursor_state::typed_array;
1021
+ data_ = typed_array_view(data.data(), data.size());
1022
+ index_ = 0;
1023
+ return this->begin_array(tag, context, ec);
1024
+ }
1025
+
1026
+ bool visit_typed_array(const jsoncons::span<const float>& data,
1027
+ semantic_tag tag,
1028
+ const ser_context& context,
1029
+ std::error_code& ec) override
1030
+ {
1031
+ state_ = staj2_cursor_state::typed_array;
1032
+ data_ = typed_array_view(data.data(), data.size());
1033
+ index_ = 0;
1034
+ return this->begin_array(tag, context, ec);
1035
+ }
1036
+
1037
+ bool visit_typed_array(const jsoncons::span<const double>& data,
1038
+ semantic_tag tag,
1039
+ const ser_context& context,
1040
+ std::error_code& ec) override
1041
+ {
1042
+ state_ = staj2_cursor_state::typed_array;
1043
+ data_ = typed_array_view(data.data(), data.size());
1044
+ index_ = 0;
1045
+ return this->begin_array(tag, context, ec);
1046
+ }
1047
+ /*
1048
+ bool visit_typed_array(const jsoncons::span<const float128_type>&,
1049
+ semantic_tag,
1050
+ const ser_context&,
1051
+ std::error_code&) override
1052
+ {
1053
+ return true;
1054
+ }
1055
+ */
1056
+ bool visit_begin_multi_dim(const jsoncons::span<const size_t>& shape,
1057
+ semantic_tag tag,
1058
+ const ser_context& context,
1059
+ std::error_code& ec) override
1060
+ {
1061
+ state_ = staj2_cursor_state::multi_dim;
1062
+ shape_ = shape;
1063
+ return this->begin_array(2, tag, context, ec);
1064
+ }
1065
+
1066
+ bool visit_end_multi_dim(const ser_context& context,
1067
+ std::error_code& ec) override
1068
+ {
1069
+ return this->end_array(context, ec);
1070
+ }
1071
+
1072
+ void visit_flush() override
1073
+ {
1074
+ }
1075
+ };
1076
+
1077
+ // basic_staj2_cursor
1078
+
1079
+ template<class CharT>
1080
+ class basic_staj2_cursor
1081
+ {
1082
+ public:
1083
+ virtual ~basic_staj2_cursor() noexcept = default;
1084
+
1085
+ virtual void array_expected(std::error_code& ec)
1086
+ {
1087
+ if (!(current().event_type() == staj2_event_type::begin_array || current().event_type() == staj2_event_type::byte_string_value))
1088
+ {
1089
+ ec = conv_errc::not_vector;
1090
+ }
1091
+ }
1092
+
1093
+ virtual bool done() const = 0;
1094
+
1095
+ virtual const basic_staj2_event<CharT>& current() const = 0;
1096
+
1097
+ virtual void read_to(basic_json_visitor2<CharT>& visitor) = 0;
1098
+
1099
+ virtual void read_to(basic_json_visitor2<CharT>& visitor,
1100
+ std::error_code& ec) = 0;
1101
+
1102
+ virtual void next() = 0;
1103
+
1104
+ virtual void next(std::error_code& ec) = 0;
1105
+
1106
+ virtual const ser_context& context() const = 0;
1107
+ };
1108
+
1109
+ template<class CharT>
1110
+ class basic_staj2_filter_view : basic_staj2_cursor<CharT>
1111
+ {
1112
+ basic_staj2_cursor<CharT>* cursor_;
1113
+ std::function<bool(const basic_staj2_event<CharT>&, const ser_context&)> pred_;
1114
+ public:
1115
+ basic_staj2_filter_view(basic_staj2_cursor<CharT>& cursor,
1116
+ std::function<bool(const basic_staj2_event<CharT>&, const ser_context&)> pred)
1117
+ : cursor_(std::addressof(cursor)), pred_(pred)
1118
+ {
1119
+ while (!done() && !pred_(current(),context()))
1120
+ {
1121
+ cursor_->next();
1122
+ }
1123
+ }
1124
+
1125
+ bool done() const override
1126
+ {
1127
+ return cursor_->done();
1128
+ }
1129
+
1130
+ const basic_staj2_event<CharT>& current() const override
1131
+ {
1132
+ return cursor_->current();
1133
+ }
1134
+
1135
+ void read_to(basic_json_visitor2<CharT>& visitor) override
1136
+ {
1137
+ cursor_->read_to(visitor);
1138
+ }
1139
+
1140
+ void read_to(basic_json_visitor2<CharT>& visitor,
1141
+ std::error_code& ec) override
1142
+ {
1143
+ cursor_->read_to(visitor, ec);
1144
+ }
1145
+
1146
+ void next() override
1147
+ {
1148
+ cursor_->next();
1149
+ while (!done() && !pred_(current(),context()))
1150
+ {
1151
+ cursor_->next();
1152
+ }
1153
+ }
1154
+
1155
+ void next(std::error_code& ec) override
1156
+ {
1157
+ cursor_->next(ec);
1158
+ while (!done() && !pred_(current(),context()) && !ec)
1159
+ {
1160
+ cursor_->next(ec);
1161
+ }
1162
+ }
1163
+
1164
+ const ser_context& context() const override
1165
+ {
1166
+ return cursor_->context();
1167
+ }
1168
+
1169
+ friend
1170
+ basic_staj2_filter_view<CharT> operator|(basic_staj2_filter_view& cursor,
1171
+ std::function<bool(const basic_staj2_event<CharT>&, const ser_context&)> pred)
1172
+ {
1173
+ return basic_staj2_filter_view<CharT>(cursor, pred);
1174
+ }
1175
+ };
1176
+
1177
+ using staj2_event = basic_staj2_event<char>;
1178
+ using wstaj2_event = basic_staj2_event<wchar_t>;
1179
+
1180
+ using staj2_cursor = basic_staj2_cursor<char>;
1181
+ using wstaj2_cursor = basic_staj2_cursor<wchar_t>;
1182
+
1183
+ using staj2_filter_view = basic_staj2_filter_view<char>;
1184
+ using wstaj2_filter_view = basic_staj2_filter_view<wchar_t>;
1185
+
1186
+ } // namespace jsoncons
1187
+
1188
+ #endif
1189
+