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