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,340 @@
1
+ // Copyright 2020 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_CONVERTER_HPP
8
+ #define JSONCONS_CONVERTER_HPP
9
+
10
+ #include <system_error> // std::error_code
11
+ #include <jsoncons/traits_extension.hpp>
12
+ #include <jsoncons/byte_string.hpp>
13
+ #include <jsoncons/json_type.hpp>
14
+ #include <jsoncons/conv_error.hpp>
15
+ #include <jsoncons/detail/write_number.hpp> // from_integer
16
+ #include <jsoncons/tag_type.hpp>
17
+
18
+ namespace jsoncons {
19
+
20
+ template <class From, class Into, class Enable = void>
21
+ class value_converter
22
+ {
23
+ };
24
+
25
+ template <class Into>
26
+ class value_converter_base
27
+ {
28
+ public:
29
+ using allocator_type = typename std::conditional<traits_extension::has_allocator_type<Into>::value, typename Into::allocator_type, std::allocator<char>>::type;
30
+ private:
31
+ allocator_type alloc_;
32
+
33
+ public:
34
+ value_converter_base(const allocator_type& alloc = allocator_type())
35
+ : alloc_(alloc)
36
+ {
37
+ }
38
+
39
+ allocator_type get_allocator() const noexcept
40
+ {
41
+ return alloc_;
42
+ }
43
+ };
44
+
45
+ // From any byte sequence, Into string
46
+ template <class From, class Into>
47
+ class value_converter<From, Into,
48
+ typename std::enable_if<traits_extension::is_byte_sequence<From>::value && !traits_extension::is_string_or_string_view<From>::value &&
49
+ traits_extension::is_string<Into>::value>::type> : value_converter_base<Into>
50
+ {
51
+ public:
52
+ using allocator_type = typename value_converter_base<Into>::allocator_type;
53
+
54
+ template <class CharT = typename Into::value_type>
55
+ typename std::enable_if<traits_extension::is_narrow_character<CharT>::value,Into>::type
56
+ convert(const From& value, semantic_tag tag, std::error_code&)
57
+ {
58
+ Into s(this->get_allocator());
59
+ switch (tag)
60
+ {
61
+ case semantic_tag::base64:
62
+ encode_base64(value.begin(), value.end(), s);
63
+ break;
64
+ case semantic_tag::base16:
65
+ encode_base16(value.begin(), value.end(), s);
66
+ break;
67
+ default:
68
+ encode_base64url(value.begin(), value.end(), s);
69
+ break;
70
+ }
71
+ return s;
72
+ }
73
+ template <class CharT = typename Into::value_type>
74
+ typename std::enable_if<traits_extension::is_wide_character<CharT>::value,Into>::type
75
+ convert(const From& value, semantic_tag tag, std::error_code& ec)
76
+ {
77
+ std::string s;
78
+ switch (tag)
79
+ {
80
+ case semantic_tag::base64:
81
+ encode_base64(value.begin(), value.end(), s);
82
+ break;
83
+ case semantic_tag::base16:
84
+ encode_base16(value.begin(), value.end(), s);
85
+ break;
86
+ default:
87
+ encode_base64url(value.begin(), value.end(), s);
88
+ break;
89
+ }
90
+
91
+ Into ws(this->get_allocator());
92
+ auto retval = unicode_traits::convert(s.data(), s.size(), ws);
93
+ if (retval.ec != unicode_traits::conv_errc())
94
+ {
95
+ ec = conv_errc::not_wide_char;
96
+ }
97
+
98
+ return ws;
99
+ }
100
+ };
101
+
102
+ // From byte string, Into byte string
103
+ template <class From, class Into>
104
+ class value_converter<From, Into,
105
+ typename std::enable_if<traits_extension::is_byte_sequence<From>::value &&
106
+ !traits_extension::is_string_or_string_view<From>::value &&
107
+ !traits_extension::is_string_or_string_view<Into>::value &&
108
+ traits_extension::is_back_insertable_byte_container<Into>::value>::type> : value_converter_base<Into>
109
+ {
110
+ public:
111
+ using allocator_type = typename value_converter_base<Into>::allocator_type;
112
+
113
+ Into convert(const From& value, semantic_tag, std::error_code&)
114
+ {
115
+ Into s(value.begin(),value.end(),this->get_allocator());
116
+ return s;
117
+ }
118
+ };
119
+
120
+ // From string or string_view, Into string, same character type
121
+ template <class From, class Into>
122
+ class value_converter<From, Into,
123
+ typename std::enable_if<traits_extension::is_string_or_string_view<From>::value &&
124
+ traits_extension::is_string<Into>::value &&
125
+ std::is_same<typename From::value_type,typename Into::value_type>::value>::type> : value_converter_base<Into>
126
+ {
127
+ public:
128
+ using allocator_type = typename value_converter_base<Into>::allocator_type;
129
+
130
+ Into convert(const From& value, semantic_tag, std::error_code&)
131
+ {
132
+ return Into(value.begin(),value.end(),this->get_allocator());
133
+ }
134
+ };
135
+
136
+ // From string or string_view, Into string, different character type
137
+ template <class From, class Into>
138
+ class value_converter<From, Into,
139
+ typename std::enable_if<traits_extension::is_string_or_string_view<From>::value &&
140
+ traits_extension::is_string<Into>::value &&
141
+ !std::is_same<typename From::value_type,typename Into::value_type>::value>::type> : value_converter_base<Into>
142
+ {
143
+ public:
144
+ using allocator_type = typename value_converter_base<Into>::allocator_type;
145
+
146
+ Into convert(const From& value, semantic_tag, std::error_code& ec)
147
+ {
148
+ Into ws(this->get_allocator());
149
+ auto retval = unicode_traits::convert(value.data(), value.size(), ws);
150
+ if (retval.ec != unicode_traits::conv_errc())
151
+ {
152
+ ec = conv_errc::not_wide_char;
153
+ }
154
+
155
+ return ws;
156
+ }
157
+ };
158
+
159
+ // From string, Into byte_string
160
+ template <class From, class Into>
161
+ class value_converter<From, Into,
162
+ typename std::enable_if<traits_extension::is_char_sequence<From>::value &&
163
+ !traits_extension::is_string_or_string_view<Into>::value &&
164
+ traits_extension::is_back_insertable_byte_container<Into>::value>::type> : value_converter_base<Into>
165
+ {
166
+ public:
167
+ using allocator_type = typename value_converter_base<Into>::allocator_type;
168
+
169
+ template <class CharT = typename From::value_type>
170
+ typename std::enable_if<traits_extension::is_narrow_character<CharT>::value,Into>::type
171
+ convert(const From& value, semantic_tag tag, std::error_code& ec)
172
+ {
173
+ Into bytes(this->get_allocator());
174
+ switch (tag)
175
+ {
176
+ case semantic_tag::base16:
177
+ {
178
+ auto res = decode_base16(value.begin(), value.end(), bytes);
179
+ if (res.ec != conv_errc::success)
180
+ {
181
+ ec = conv_errc::not_byte_string;
182
+ }
183
+ break;
184
+ }
185
+ case semantic_tag::base64:
186
+ {
187
+ decode_base64(value.begin(), value.end(), bytes);
188
+ break;
189
+ }
190
+ case semantic_tag::base64url:
191
+ {
192
+ decode_base64url(value.begin(), value.end(), bytes);
193
+ break;
194
+ }
195
+ default:
196
+ {
197
+ ec = conv_errc::not_byte_string;
198
+ break;
199
+ }
200
+ }
201
+ return bytes;
202
+ }
203
+
204
+ template <class CharT = typename From::value_type>
205
+ typename std::enable_if<traits_extension::is_wide_character<CharT>::value,Into>::type
206
+ convert(const From& value, semantic_tag tag, std::error_code& ec)
207
+ {
208
+ Into bytes(this->get_allocator());
209
+
210
+ std::string s(this->get_allocator());
211
+ auto retval = unicode_traits::convert(value.data(), value.size(), s);
212
+ if (retval.ec != unicode_traits::conv_errc())
213
+ {
214
+ ec = conv_errc::not_wide_char;
215
+ }
216
+ switch (tag)
217
+ {
218
+ case semantic_tag::base16:
219
+ {
220
+ auto res = decode_base16(s.begin(), s.end(), bytes);
221
+ if (res.ec != conv_errc::success)
222
+ {
223
+ ec = conv_errc::not_byte_string;
224
+ }
225
+ break;
226
+ }
227
+ case semantic_tag::base64:
228
+ {
229
+ decode_base64(s.begin(), s.end(), bytes);
230
+ break;
231
+ }
232
+ case semantic_tag::base64url:
233
+ {
234
+ decode_base64url(s.begin(), s.end(), bytes);
235
+ break;
236
+ }
237
+ default:
238
+ {
239
+ ec = conv_errc::not_byte_string;
240
+ break;
241
+ }
242
+ }
243
+ return bytes;
244
+ }
245
+ };
246
+
247
+ // From integer, Into string
248
+ template <class From, class Into>
249
+ class value_converter<From, Into,
250
+ typename std::enable_if<traits_extension::is_integer<From>::value &&
251
+ traits_extension::is_string<Into>::value>::type> : value_converter_base<Into>
252
+ {
253
+ public:
254
+ using allocator_type = typename value_converter_base<Into>::allocator_type;
255
+
256
+ Into convert(From value, semantic_tag, std::error_code&)
257
+ {
258
+ Into s(this->get_allocator());
259
+ jsoncons::detail::from_integer(value, s);
260
+ return s;
261
+ }
262
+ };
263
+
264
+ // From integer, Into string
265
+ template <class From, class Into>
266
+ class value_converter<From, Into,
267
+ typename std::enable_if<std::is_floating_point<From>::value &&
268
+ traits_extension::is_string<Into>::value>::type> : value_converter_base<Into>
269
+ {
270
+ public:
271
+ using allocator_type = typename value_converter_base<Into>::allocator_type;
272
+
273
+ Into convert(From value, semantic_tag, std::error_code&)
274
+ {
275
+ Into s(this->get_allocator());
276
+ jsoncons::detail::write_double f{float_chars_format::general,0};
277
+ f(value, s);
278
+ return s;
279
+ }
280
+ };
281
+
282
+ // From half, Into string
283
+ template <class Into>
284
+ class value_converter<half_arg_t, Into,
285
+ typename std::enable_if<traits_extension::is_string<Into>::value>::type> : value_converter_base<Into>
286
+ {
287
+ public:
288
+ using allocator_type = typename value_converter_base<Into>::allocator_type;
289
+
290
+ Into convert(uint16_t value, semantic_tag, std::error_code&)
291
+ {
292
+ Into s(this->get_allocator());
293
+ jsoncons::detail::write_double f{float_chars_format::general,0};
294
+ double x = binary::decode_half(value);
295
+ f(x, s);
296
+ return s;
297
+ }
298
+ };
299
+
300
+ // From bool, Into string
301
+ template <class From, class Into>
302
+ class value_converter<From, Into,
303
+ typename std::enable_if<traits_extension::is_bool<From>::value &&
304
+ traits_extension::is_string<Into>::value>::type> : value_converter_base<Into>
305
+ {
306
+ public:
307
+ using allocator_type = typename value_converter_base<Into>::allocator_type;
308
+ using char_type = typename Into::value_type;
309
+
310
+ JSONCONS_CPP14_CONSTEXPR
311
+ Into convert(From value, semantic_tag, std::error_code&)
312
+ {
313
+ constexpr const char_type* true_constant = JSONCONS_CSTRING_CONSTANT(char_type,"true");
314
+ constexpr const char_type* false_constant = JSONCONS_CSTRING_CONSTANT(char_type,"false");
315
+
316
+ return value ? Into(true_constant,4) : Into(false_constant,5);
317
+ }
318
+ };
319
+
320
+ // From null, Into string
321
+ template <class Into>
322
+ class value_converter<null_type, Into, void> : value_converter_base<Into>
323
+ {
324
+ public:
325
+ using allocator_type = typename value_converter_base<Into>::allocator_type;
326
+ using char_type = typename Into::value_type;
327
+
328
+ JSONCONS_CPP14_CONSTEXPR
329
+ Into convert(semantic_tag, std::error_code&)
330
+ {
331
+ constexpr const char_type* null_constant = JSONCONS_CSTRING_CONSTANT(char_type,"null");
332
+
333
+ return Into(null_constant,4);
334
+ }
335
+ };
336
+
337
+ } // namespace jsoncons
338
+
339
+ #endif
340
+
@@ -0,0 +1,23 @@
1
+ // Copyright 2013 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_BSON_BSON_HPP
8
+ #define JSONCONS_BSON_BSON_HPP
9
+
10
+ #include <string>
11
+ #include <vector>
12
+ #include <memory>
13
+ #include <type_traits> // std::enable_if
14
+ #include <istream> // std::basic_istream
15
+ #include <jsoncons/json.hpp>
16
+ #include <jsoncons/config/jsoncons_config.hpp>
17
+ #include <jsoncons_ext/bson/bson_encoder.hpp>
18
+ #include <jsoncons_ext/bson/bson_reader.hpp>
19
+ #include <jsoncons_ext/bson/bson_cursor.hpp>
20
+ #include <jsoncons_ext/bson/encode_bson.hpp>
21
+ #include <jsoncons_ext/bson/decode_bson.hpp>
22
+
23
+ #endif
@@ -0,0 +1,320 @@
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_BSON_BSON_CURSOR_HPP
8
+ #define JSONCONS_BSON_BSON_CURSOR_HPP
9
+
10
+ #include <memory> // std::allocator
11
+ #include <string>
12
+ #include <vector>
13
+ #include <stdexcept>
14
+ #include <system_error>
15
+ #include <ios>
16
+ #include <istream> // std::basic_istream
17
+ #include <jsoncons/byte_string.hpp>
18
+ #include <jsoncons/config/jsoncons_config.hpp>
19
+ #include <jsoncons/json_visitor.hpp>
20
+ #include <jsoncons/json_exception.hpp>
21
+ #include <jsoncons/staj_cursor.hpp>
22
+ #include <jsoncons/source.hpp>
23
+ #include <jsoncons_ext/bson/bson_parser.hpp>
24
+
25
+ namespace jsoncons {
26
+ namespace bson {
27
+
28
+ template<class Source=jsoncons::binary_stream_source,class Allocator=std::allocator<char>>
29
+ class basic_bson_cursor : public basic_staj_cursor<char>, private virtual ser_context
30
+ {
31
+ using super_type = basic_staj_cursor<char>;
32
+ public:
33
+ using source_type = Source;
34
+ using char_type = char;
35
+ using allocator_type = Allocator;
36
+ private:
37
+ basic_bson_parser<Source,Allocator> parser_;
38
+ basic_staj_visitor<char_type> cursor_visitor_;
39
+ bool eof_;
40
+
41
+ // Noncopyable and nonmoveable
42
+ basic_bson_cursor(const basic_bson_cursor&) = delete;
43
+ basic_bson_cursor& operator=(const basic_bson_cursor&) = delete;
44
+
45
+ public:
46
+ using string_view_type = string_view;
47
+
48
+ template <class Sourceable>
49
+ basic_bson_cursor(Sourceable&& source,
50
+ const bson_decode_options& options = bson_decode_options(),
51
+ const Allocator& alloc = Allocator())
52
+ : parser_(std::forward<Sourceable>(source), options, alloc),
53
+ cursor_visitor_(accept_all),
54
+ eof_(false)
55
+ {
56
+ if (!done())
57
+ {
58
+ next();
59
+ }
60
+ }
61
+
62
+ // Constructors that set parse error codes
63
+
64
+ template <class Sourceable>
65
+ basic_bson_cursor(Sourceable&& source,
66
+ std::error_code& ec)
67
+ : basic_bson_cursor(std::allocator_arg, Allocator(),
68
+ std::forward<Sourceable>(source),
69
+ bson_decode_options(),
70
+ ec)
71
+ {
72
+ }
73
+
74
+ template <class Sourceable>
75
+ basic_bson_cursor(Sourceable&& source,
76
+ const bson_decode_options& options,
77
+ std::error_code& ec)
78
+ : basic_bson_cursor(std::allocator_arg, Allocator(),
79
+ std::forward<Sourceable>(source),
80
+ options,
81
+ ec)
82
+ {
83
+ }
84
+
85
+ template <class Sourceable>
86
+ basic_bson_cursor(std::allocator_arg_t, const Allocator& alloc,
87
+ Sourceable&& source,
88
+ const bson_decode_options& options,
89
+ std::error_code& ec)
90
+ : parser_(std::forward<Sourceable>(source), options, alloc),
91
+ cursor_visitor_(accept_all),
92
+ eof_(false)
93
+ {
94
+ if (!done())
95
+ {
96
+ next(ec);
97
+ }
98
+ }
99
+
100
+ void reset()
101
+ {
102
+ parser_.reset();
103
+ cursor_visitor_.reset();
104
+ eof_ = false;
105
+ if (!done())
106
+ {
107
+ next();
108
+ }
109
+ }
110
+
111
+ template <class Sourceable>
112
+ void reset(Sourceable&& source)
113
+ {
114
+ parser_.reset(std::forward<Sourceable>(source));
115
+ cursor_visitor_.reset();
116
+ eof_ = false;
117
+ if (!done())
118
+ {
119
+ next();
120
+ }
121
+ }
122
+
123
+ void reset(std::error_code& ec)
124
+ {
125
+ parser_.reset();
126
+ cursor_visitor_.reset();
127
+ eof_ = false;
128
+ if (!done())
129
+ {
130
+ next(ec);
131
+ }
132
+ }
133
+
134
+ template <class Sourceable>
135
+ void reset(Sourceable&& source, std::error_code& ec)
136
+ {
137
+ parser_.reset(std::forward<Sourceable>(source));
138
+ cursor_visitor_.reset();
139
+ eof_ = false;
140
+ if (!done())
141
+ {
142
+ next(ec);
143
+ }
144
+ }
145
+
146
+ bool done() const override
147
+ {
148
+ return parser_.done();
149
+ }
150
+
151
+ void array_expected(std::error_code& ec) override
152
+ {
153
+ if (cursor_visitor_.event().event_type() == staj_event_type::begin_object)
154
+ {
155
+ parser_.array_expected(cursor_visitor_, ec);
156
+ }
157
+ else
158
+ {
159
+ super_type::array_expected(ec);
160
+ }
161
+ }
162
+
163
+ const staj_event& current() const override
164
+ {
165
+ return cursor_visitor_.event();
166
+ }
167
+
168
+ void read_to(basic_json_visitor<char_type>& visitor) override
169
+ {
170
+ std::error_code ec;
171
+ read_to(visitor, ec);
172
+ if (ec)
173
+ {
174
+ JSONCONS_THROW(ser_error(ec,parser_.line(),parser_.column()));
175
+ }
176
+ }
177
+
178
+ void read_to(basic_json_visitor<char_type>& visitor,
179
+ std::error_code& ec) override
180
+ {
181
+ if (send_json_event(cursor_visitor_.event(), visitor, *this, ec))
182
+ {
183
+ read_next(visitor, ec);
184
+ }
185
+ }
186
+
187
+ void next() override
188
+ {
189
+ std::error_code ec;
190
+ next(ec);
191
+ if (ec)
192
+ {
193
+ JSONCONS_THROW(ser_error(ec,parser_.line(),parser_.column()));
194
+ }
195
+ }
196
+
197
+ void next(std::error_code& ec) override
198
+ {
199
+ read_next(ec);
200
+ }
201
+
202
+ const ser_context& context() const override
203
+ {
204
+ return *this;
205
+ }
206
+
207
+ bool eof() const
208
+ {
209
+ return eof_;
210
+ }
211
+
212
+ std::size_t line() const override
213
+ {
214
+ return parser_.line();
215
+ }
216
+
217
+ std::size_t column() const override
218
+ {
219
+ return parser_.column();
220
+ }
221
+
222
+ friend
223
+ staj_filter_view operator|(basic_bson_cursor& cursor,
224
+ std::function<bool(const staj_event&, const ser_context&)> pred)
225
+ {
226
+ return staj_filter_view(cursor, pred);
227
+ }
228
+
229
+ #if !defined(JSONCONS_NO_DEPRECATED)
230
+
231
+ template <class Sourceable>
232
+ JSONCONS_DEPRECATED_MSG("Instead, use pipe syntax for filter")
233
+ basic_bson_cursor(Sourceable&& source,
234
+ std::function<bool(const staj_event&, const ser_context&)> filter,
235
+ std::error_code& ec)
236
+ : basic_bson_cursor(std::allocator_arg, Allocator(),
237
+ std::forward<Sourceable>(source), filter, ec)
238
+ {
239
+ }
240
+
241
+ template <class Sourceable>
242
+ JSONCONS_DEPRECATED_MSG("Instead, use pipe syntax for filter")
243
+ basic_bson_cursor(Sourceable&& source,
244
+ std::function<bool(const staj_event&, const ser_context&)> filter,
245
+ const bson_decode_options& options = bson_decode_options(),
246
+ const Allocator& alloc = Allocator())
247
+ : parser_(std::forward<Sourceable>(source), options, alloc),
248
+ cursor_visitor_(filter),
249
+ eof_(false)
250
+ {
251
+ if (!done())
252
+ {
253
+ next();
254
+ }
255
+ }
256
+
257
+ template <class Sourceable>
258
+ JSONCONS_DEPRECATED_MSG("Instead, use pipe syntax for filter")
259
+ basic_bson_cursor(std::allocator_arg_t, const Allocator& alloc,
260
+ Sourceable&& source,
261
+ std::function<bool(const staj_event&, const ser_context&)> filter,
262
+ std::error_code& ec)
263
+ : parser_(std::forward<Sourceable>(source),alloc),
264
+ cursor_visitor_(filter),
265
+ eof_(false)
266
+ {
267
+ if (!done())
268
+ {
269
+ next(ec);
270
+ }
271
+ }
272
+
273
+ JSONCONS_DEPRECATED_MSG("Instead, use read_to(basic_json_visitor<char_type>&)")
274
+ void read(basic_json_visitor<char_type>& visitor)
275
+ {
276
+ read_to(visitor);
277
+ }
278
+
279
+ JSONCONS_DEPRECATED_MSG("Instead, use read_to(basic_json_visitor<char_type>&, std::error_code&)")
280
+ void read(basic_json_visitor<char_type>& visitor,
281
+ std::error_code& ec)
282
+ {
283
+ read_to(visitor, ec);
284
+ }
285
+ #endif
286
+ private:
287
+ static bool accept_all(const staj_event&, const ser_context&)
288
+ {
289
+ return true;
290
+ }
291
+
292
+ void read_next(std::error_code& ec)
293
+ {
294
+ parser_.restart();
295
+ while (!parser_.stopped())
296
+ {
297
+ parser_.parse(cursor_visitor_, ec);
298
+ if (ec) return;
299
+ }
300
+ }
301
+
302
+ void read_next(basic_json_visitor<char_type>& visitor, std::error_code& ec)
303
+ {
304
+ parser_.restart();
305
+ while (!parser_.stopped())
306
+ {
307
+ parser_.parse(visitor, ec);
308
+ if (ec) return;
309
+ }
310
+ }
311
+ };
312
+
313
+ using bson_stream_cursor = basic_bson_cursor<jsoncons::binary_stream_source>;
314
+ using bson_bytes_cursor = basic_bson_cursor<jsoncons::bytes_source>;
315
+
316
+ } // namespace bson
317
+ } // namespace jsoncons
318
+
319
+ #endif
320
+