jsoncons 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (155) hide show
  1. checksums.yaml +7 -0
  2. data/ext/jsoncons/extconf.rb +43 -0
  3. data/ext/jsoncons/jsoncons.cpp +161 -0
  4. data/ext/jsoncons/jsoncons.h +10 -0
  5. data/jsoncons.gemspec +44 -0
  6. data/lib/jsoncons/jsoncons/examples/input/address-book.json +13 -0
  7. data/lib/jsoncons/jsoncons/examples/input/books.json +28 -0
  8. data/lib/jsoncons/jsoncons/examples/input/countries.json +7 -0
  9. data/lib/jsoncons/jsoncons/examples/input/employees.json +30 -0
  10. data/lib/jsoncons/jsoncons/examples/input/jsonschema/name.json +15 -0
  11. data/lib/jsoncons/jsoncons/examples/input/multiple-json-objects.json +3 -0
  12. data/lib/jsoncons/jsoncons/examples/input/sales.csv +6 -0
  13. data/lib/jsoncons/jsoncons/examples/input/store.json +28 -0
  14. data/lib/jsoncons/jsoncons/examples/input/tasks.csv +6 -0
  15. data/lib/jsoncons/jsoncons/include/jsoncons/allocator_holder.hpp +38 -0
  16. data/lib/jsoncons/jsoncons/include/jsoncons/basic_json.hpp +5905 -0
  17. data/lib/jsoncons/jsoncons/include/jsoncons/bigint.hpp +1611 -0
  18. data/lib/jsoncons/jsoncons/include/jsoncons/byte_string.hpp +820 -0
  19. data/lib/jsoncons/jsoncons/include/jsoncons/config/binary_config.hpp +226 -0
  20. data/lib/jsoncons/jsoncons/include/jsoncons/config/compiler_support.hpp +375 -0
  21. data/lib/jsoncons/jsoncons/include/jsoncons/config/jsoncons_config.hpp +309 -0
  22. data/lib/jsoncons/jsoncons/include/jsoncons/config/version.hpp +40 -0
  23. data/lib/jsoncons/jsoncons/include/jsoncons/conv_error.hpp +218 -0
  24. data/lib/jsoncons/jsoncons/include/jsoncons/decode_json.hpp +209 -0
  25. data/lib/jsoncons/jsoncons/include/jsoncons/decode_traits.hpp +651 -0
  26. data/lib/jsoncons/jsoncons/include/jsoncons/detail/endian.hpp +44 -0
  27. data/lib/jsoncons/jsoncons/include/jsoncons/detail/grisu3.hpp +312 -0
  28. data/lib/jsoncons/jsoncons/include/jsoncons/detail/optional.hpp +483 -0
  29. data/lib/jsoncons/jsoncons/include/jsoncons/detail/parse_number.hpp +1133 -0
  30. data/lib/jsoncons/jsoncons/include/jsoncons/detail/span.hpp +188 -0
  31. data/lib/jsoncons/jsoncons/include/jsoncons/detail/string_view.hpp +537 -0
  32. data/lib/jsoncons/jsoncons/include/jsoncons/detail/string_wrapper.hpp +370 -0
  33. data/lib/jsoncons/jsoncons/include/jsoncons/detail/write_number.hpp +567 -0
  34. data/lib/jsoncons/jsoncons/include/jsoncons/encode_json.hpp +315 -0
  35. data/lib/jsoncons/jsoncons/include/jsoncons/encode_traits.hpp +378 -0
  36. data/lib/jsoncons/jsoncons/include/jsoncons/json.hpp +18 -0
  37. data/lib/jsoncons/jsoncons/include/jsoncons/json_array.hpp +324 -0
  38. data/lib/jsoncons/jsoncons/include/jsoncons/json_content_handler.hpp +12 -0
  39. data/lib/jsoncons/jsoncons/include/jsoncons/json_cursor.hpp +448 -0
  40. data/lib/jsoncons/jsoncons/include/jsoncons/json_decoder.hpp +420 -0
  41. data/lib/jsoncons/jsoncons/include/jsoncons/json_encoder.hpp +1587 -0
  42. data/lib/jsoncons/jsoncons/include/jsoncons/json_error.hpp +156 -0
  43. data/lib/jsoncons/jsoncons/include/jsoncons/json_exception.hpp +241 -0
  44. data/lib/jsoncons/jsoncons/include/jsoncons/json_filter.hpp +653 -0
  45. data/lib/jsoncons/jsoncons/include/jsoncons/json_fwd.hpp +23 -0
  46. data/lib/jsoncons/jsoncons/include/jsoncons/json_object.hpp +1772 -0
  47. data/lib/jsoncons/jsoncons/include/jsoncons/json_options.hpp +862 -0
  48. data/lib/jsoncons/jsoncons/include/jsoncons/json_parser.hpp +2900 -0
  49. data/lib/jsoncons/jsoncons/include/jsoncons/json_reader.hpp +731 -0
  50. data/lib/jsoncons/jsoncons/include/jsoncons/json_traits_macros.hpp +1072 -0
  51. data/lib/jsoncons/jsoncons/include/jsoncons/json_traits_macros_deprecated.hpp +144 -0
  52. data/lib/jsoncons/jsoncons/include/jsoncons/json_type.hpp +206 -0
  53. data/lib/jsoncons/jsoncons/include/jsoncons/json_type_traits.hpp +1830 -0
  54. data/lib/jsoncons/jsoncons/include/jsoncons/json_visitor.hpp +1560 -0
  55. data/lib/jsoncons/jsoncons/include/jsoncons/json_visitor2.hpp +2079 -0
  56. data/lib/jsoncons/jsoncons/include/jsoncons/pretty_print.hpp +89 -0
  57. data/lib/jsoncons/jsoncons/include/jsoncons/ser_context.hpp +62 -0
  58. data/lib/jsoncons/jsoncons/include/jsoncons/sink.hpp +289 -0
  59. data/lib/jsoncons/jsoncons/include/jsoncons/source.hpp +777 -0
  60. data/lib/jsoncons/jsoncons/include/jsoncons/source_adaptor.hpp +148 -0
  61. data/lib/jsoncons/jsoncons/include/jsoncons/staj2_cursor.hpp +1189 -0
  62. data/lib/jsoncons/jsoncons/include/jsoncons/staj_cursor.hpp +1254 -0
  63. data/lib/jsoncons/jsoncons/include/jsoncons/staj_iterator.hpp +449 -0
  64. data/lib/jsoncons/jsoncons/include/jsoncons/tag_type.hpp +245 -0
  65. data/lib/jsoncons/jsoncons/include/jsoncons/text_source_adaptor.hpp +144 -0
  66. data/lib/jsoncons/jsoncons/include/jsoncons/traits_extension.hpp +884 -0
  67. data/lib/jsoncons/jsoncons/include/jsoncons/typed_array_view.hpp +250 -0
  68. data/lib/jsoncons/jsoncons/include/jsoncons/unicode_traits.hpp +1330 -0
  69. data/lib/jsoncons/jsoncons/include/jsoncons/uri.hpp +635 -0
  70. data/lib/jsoncons/jsoncons/include/jsoncons/value_converter.hpp +340 -0
  71. data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson.hpp +23 -0
  72. data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_cursor.hpp +320 -0
  73. data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_decimal128.hpp +865 -0
  74. data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_encoder.hpp +585 -0
  75. data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_error.hpp +103 -0
  76. data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_oid.hpp +245 -0
  77. data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_options.hpp +75 -0
  78. data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_parser.hpp +645 -0
  79. data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_reader.hpp +92 -0
  80. data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_type.hpp +44 -0
  81. data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/decode_bson.hpp +201 -0
  82. data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/encode_bson.hpp +144 -0
  83. data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor.hpp +26 -0
  84. data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor_cursor.hpp +351 -0
  85. data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor_cursor2.hpp +265 -0
  86. data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor_detail.hpp +93 -0
  87. data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor_encoder.hpp +1766 -0
  88. data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor_error.hpp +105 -0
  89. data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor_options.hpp +113 -0
  90. data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor_parser.hpp +1942 -0
  91. data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor_reader.hpp +116 -0
  92. data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/decode_cbor.hpp +203 -0
  93. data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/encode_cbor.hpp +151 -0
  94. data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/csv.hpp +17 -0
  95. data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/csv_cursor.hpp +358 -0
  96. data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/csv_encoder.hpp +954 -0
  97. data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/csv_error.hpp +85 -0
  98. data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/csv_options.hpp +973 -0
  99. data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/csv_parser.hpp +2099 -0
  100. data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/csv_reader.hpp +348 -0
  101. data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/csv_serializer.hpp +12 -0
  102. data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/decode_csv.hpp +208 -0
  103. data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/encode_csv.hpp +122 -0
  104. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jmespath/jmespath.hpp +5215 -0
  105. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jmespath/jmespath_error.hpp +215 -0
  106. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpatch/jsonpatch.hpp +579 -0
  107. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpatch/jsonpatch_error.hpp +121 -0
  108. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpath/expression.hpp +3329 -0
  109. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpath/flatten.hpp +432 -0
  110. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpath/json_location.hpp +445 -0
  111. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpath/json_query.hpp +115 -0
  112. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpath/jsonpath.hpp +13 -0
  113. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpath/jsonpath_error.hpp +240 -0
  114. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpath/jsonpath_expression.hpp +2612 -0
  115. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpath/jsonpath_selector.hpp +1322 -0
  116. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpointer/jsonpointer.hpp +1577 -0
  117. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpointer/jsonpointer_error.hpp +119 -0
  118. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/format_validator.hpp +968 -0
  119. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/json_validator.hpp +120 -0
  120. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/jsonschema.hpp +13 -0
  121. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/jsonschema_error.hpp +105 -0
  122. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/jsonschema_version.hpp +18 -0
  123. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/keyword_validator.hpp +1745 -0
  124. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/keyword_validator_factory.hpp +556 -0
  125. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/schema_draft7.hpp +198 -0
  126. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/schema_location.hpp +200 -0
  127. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/schema_version.hpp +35 -0
  128. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/subschema.hpp +144 -0
  129. data/lib/jsoncons/jsoncons/include/jsoncons_ext/mergepatch/mergepatch.hpp +103 -0
  130. data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/decode_msgpack.hpp +202 -0
  131. data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/encode_msgpack.hpp +142 -0
  132. data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack.hpp +24 -0
  133. data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack_cursor.hpp +343 -0
  134. data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack_cursor2.hpp +259 -0
  135. data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack_encoder.hpp +753 -0
  136. data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack_error.hpp +94 -0
  137. data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack_options.hpp +74 -0
  138. data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack_parser.hpp +748 -0
  139. data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack_reader.hpp +116 -0
  140. data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack_type.hpp +63 -0
  141. data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/decode_ubjson.hpp +201 -0
  142. data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/encode_ubjson.hpp +142 -0
  143. data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/ubjson.hpp +23 -0
  144. data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/ubjson_cursor.hpp +307 -0
  145. data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/ubjson_encoder.hpp +502 -0
  146. data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/ubjson_error.hpp +100 -0
  147. data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/ubjson_options.hpp +87 -0
  148. data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/ubjson_parser.hpp +880 -0
  149. data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/ubjson_reader.hpp +92 -0
  150. data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/ubjson_type.hpp +43 -0
  151. data/lib/jsoncons/version.rb +5 -0
  152. data/lib/jsoncons.rb +33 -0
  153. data/test/jsoncons_test.rb +108 -0
  154. data/test/test_helper.rb +7 -0
  155. metadata +268 -0
@@ -0,0 +1,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
+