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,973 @@
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_CSV_CSV_OPTIONS_HPP
8
+ #define JSONCONS_CSV_CSV_OPTIONS_HPP
9
+
10
+ #include <string>
11
+ #include <vector>
12
+ #include <utility> // std::pair
13
+ #include <unordered_map> // std::unordered_map
14
+ #include <map>
15
+ #include <limits> // std::numeric_limits
16
+ #include <cwchar>
17
+ #include <jsoncons/json_options.hpp>
18
+
19
+ namespace jsoncons { namespace csv {
20
+
21
+ enum class csv_column_type : uint8_t
22
+ {
23
+ string_t,integer_t,float_t,boolean_t,repeat_t
24
+ };
25
+
26
+ enum class quote_style_kind : uint8_t
27
+ {
28
+ minimal,all,nonnumeric,none
29
+ };
30
+
31
+ enum class csv_mapping_kind : uint8_t
32
+ {
33
+ n_rows = 1,
34
+ n_objects,
35
+ m_columns
36
+ };
37
+
38
+ #if !defined(JSONCONS_NO_DEPRECATED)
39
+ using mapping_kind = csv_mapping_kind;
40
+ JSONCONS_DEPRECATED_MSG("Instead, use quote_style_kind") typedef quote_style_kind quote_styles;
41
+ JSONCONS_DEPRECATED_MSG("Instead, use quote_style_kind") typedef quote_style_kind quote_style_type;
42
+ JSONCONS_DEPRECATED_MSG("Instead, use csv_mapping_kind") typedef csv_mapping_kind mapping_type;
43
+ #endif
44
+
45
+ enum class column_state {sequence,label};
46
+
47
+ struct csv_type_info
48
+ {
49
+ csv_type_info() = default;
50
+ csv_type_info(const csv_type_info&) = default;
51
+ csv_type_info(csv_type_info&&) = default;
52
+
53
+ csv_type_info(csv_column_type ctype, std::size_t lev, std::size_t repcount = 0) noexcept
54
+ {
55
+ col_type = ctype;
56
+ level = lev;
57
+ rep_count = repcount;
58
+ }
59
+
60
+ csv_column_type col_type;
61
+ std::size_t level;
62
+ std::size_t rep_count;
63
+ };
64
+
65
+ namespace detail {
66
+
67
+ template <class CharT,class Container>
68
+ void parse_column_names(const std::basic_string<CharT>& names,
69
+ Container& cont)
70
+ {
71
+ column_state state = column_state::sequence;
72
+ typename Container::value_type buffer(cont.get_allocator());
73
+
74
+ auto p = names.begin();
75
+ while (p != names.end())
76
+ {
77
+ switch (state)
78
+ {
79
+ case column_state::sequence:
80
+ {
81
+ switch (*p)
82
+ {
83
+ case ' ': case '\t':case '\r': case '\n':
84
+ ++p;
85
+ break;
86
+ default:
87
+ buffer.clear();
88
+ state = column_state::label;
89
+ break;
90
+ }
91
+ break;
92
+ }
93
+ case column_state::label:
94
+ {
95
+ switch (*p)
96
+ {
97
+ case ',':
98
+ cont.push_back(buffer);
99
+ buffer.clear();
100
+ ++p;
101
+ state = column_state::sequence;
102
+ break;
103
+ default:
104
+ buffer.push_back(*p);
105
+ ++p;
106
+ break;
107
+ }
108
+ break;
109
+ }
110
+ }
111
+ }
112
+ if (state == column_state::label)
113
+ {
114
+ cont.push_back(buffer);
115
+ buffer.clear();
116
+ }
117
+ }
118
+
119
+ template <class CharT,class Container>
120
+ void parse_column_types(const std::basic_string<CharT>& types,
121
+ Container& column_types)
122
+ {
123
+ const std::map<jsoncons::basic_string_view<CharT>,csv_column_type> type_dictionary =
124
+ {
125
+
126
+ {JSONCONS_STRING_VIEW_CONSTANT(CharT,"string"),csv_column_type::string_t},
127
+ {JSONCONS_STRING_VIEW_CONSTANT(CharT,"integer"),csv_column_type::integer_t},
128
+ {JSONCONS_STRING_VIEW_CONSTANT(CharT,"float"),csv_column_type::float_t},
129
+ {JSONCONS_STRING_VIEW_CONSTANT(CharT,"boolean"),csv_column_type::boolean_t}
130
+ };
131
+
132
+ column_state state = column_state::sequence;
133
+ int depth = 0;
134
+ std::basic_string<CharT> buffer;
135
+
136
+ auto p = types.begin();
137
+ while (p != types.end())
138
+ {
139
+ switch (state)
140
+ {
141
+ case column_state::sequence:
142
+ {
143
+ switch (*p)
144
+ {
145
+ case ' ': case '\t':case '\r': case '\n':
146
+ ++p;
147
+ break;
148
+ case '[':
149
+ ++depth;
150
+ ++p;
151
+ break;
152
+ case ']':
153
+ JSONCONS_ASSERT(depth > 0);
154
+ --depth;
155
+ ++p;
156
+ break;
157
+ case '*':
158
+ {
159
+ JSONCONS_ASSERT(column_types.size() != 0);
160
+ std::size_t offset = 0;
161
+ std::size_t level = column_types.size() > 0 ? column_types.back().level: 0;
162
+ if (level > 0)
163
+ {
164
+ for (auto it = column_types.rbegin();
165
+ it != column_types.rend() && level == it->level;
166
+ ++it)
167
+ {
168
+ ++offset;
169
+ }
170
+ }
171
+ else
172
+ {
173
+ offset = 1;
174
+ }
175
+ column_types.emplace_back(csv_column_type::repeat_t,depth,offset);
176
+ ++p;
177
+ break;
178
+ }
179
+ default:
180
+ buffer.clear();
181
+ state = column_state::label;
182
+ break;
183
+ }
184
+ break;
185
+ }
186
+ case column_state::label:
187
+ {
188
+ switch (*p)
189
+ {
190
+ case '*':
191
+ {
192
+ auto it = type_dictionary.find(buffer);
193
+ if (it != type_dictionary.end())
194
+ {
195
+ column_types.emplace_back(it->second,depth);
196
+ buffer.clear();
197
+ }
198
+ else
199
+ {
200
+ JSONCONS_ASSERT(false);
201
+ }
202
+ state = column_state::sequence;
203
+ break;
204
+ }
205
+ case ',':
206
+ {
207
+ auto it = type_dictionary.find(buffer);
208
+ if (it != type_dictionary.end())
209
+ {
210
+ column_types.emplace_back(it->second,depth);
211
+ buffer.clear();
212
+ }
213
+ else
214
+ {
215
+ JSONCONS_ASSERT(false);
216
+ }
217
+ ++p;
218
+ state = column_state::sequence;
219
+ break;
220
+ }
221
+ case ']':
222
+ {
223
+ JSONCONS_ASSERT(depth > 0);
224
+ auto it = type_dictionary.find(buffer);
225
+ if (it != type_dictionary.end())
226
+ {
227
+ column_types.emplace_back(it->second,depth);
228
+ buffer.clear();
229
+ }
230
+ else
231
+ {
232
+ JSONCONS_ASSERT(false);
233
+ }
234
+ --depth;
235
+ ++p;
236
+ state = column_state::sequence;
237
+ break;
238
+ }
239
+ default:
240
+ {
241
+ buffer.push_back(*p);
242
+ ++p;
243
+ break;
244
+ }
245
+ }
246
+ break;
247
+ }
248
+ }
249
+ }
250
+ if (state == column_state::label)
251
+ {
252
+ auto it = type_dictionary.find(buffer);
253
+ if (it != type_dictionary.end())
254
+ {
255
+ column_types.emplace_back(it->second,depth);
256
+ buffer.clear();
257
+ }
258
+ else
259
+ {
260
+ JSONCONS_ASSERT(false);
261
+ }
262
+ }
263
+ }
264
+
265
+ } // detail
266
+
267
+ template <class CharT>
268
+ class basic_csv_options;
269
+
270
+ template <class CharT>
271
+ class basic_csv_options_common
272
+ {
273
+ friend class basic_csv_options<CharT>;
274
+ public:
275
+ using char_type = CharT;
276
+ using string_type = std::basic_string<CharT>;
277
+ private:
278
+ char_type field_delimiter_;
279
+ char_type quote_char_;
280
+ char_type quote_escape_char_;
281
+ char_type subfield_delimiter_;
282
+
283
+ bool enable_nan_to_num_:1;
284
+ bool enable_inf_to_num_:1;
285
+ bool enable_neginf_to_num_:1;
286
+ bool enable_nan_to_str_:1;
287
+ bool enable_inf_to_str_:1;
288
+ bool enable_neginf_to_str_:1;
289
+ bool enable_str_to_nan_:1;
290
+ bool enable_str_to_inf_:1;
291
+ bool enable_str_to_neginf_:1;
292
+
293
+ string_type nan_to_num_;
294
+ string_type inf_to_num_;
295
+ string_type neginf_to_num_;
296
+ string_type nan_to_str_;
297
+ string_type inf_to_str_;
298
+ string_type neginf_to_str_;
299
+ string_type column_names_;
300
+
301
+ protected:
302
+ basic_csv_options_common()
303
+ : field_delimiter_(','),
304
+ quote_char_('\"'),
305
+ quote_escape_char_('\"'),
306
+ subfield_delimiter_(char_type()),
307
+ enable_nan_to_num_(false),
308
+ enable_inf_to_num_(false),
309
+ enable_neginf_to_num_(false),
310
+ enable_nan_to_str_(false),
311
+ enable_inf_to_str_(false),
312
+ enable_neginf_to_str_(false),
313
+ enable_str_to_nan_(false),
314
+ enable_str_to_inf_(false),
315
+ enable_str_to_neginf_(false)
316
+ {
317
+ }
318
+
319
+ basic_csv_options_common(const basic_csv_options_common&) = default;
320
+ basic_csv_options_common& operator=(const basic_csv_options_common&) = default;
321
+
322
+ virtual ~basic_csv_options_common() noexcept = default;
323
+ public:
324
+
325
+ char_type field_delimiter() const
326
+ {
327
+ return field_delimiter_;
328
+ }
329
+
330
+ const char_type subfield_delimiter() const
331
+ {
332
+ return subfield_delimiter_;
333
+ }
334
+
335
+ char_type quote_char() const
336
+ {
337
+ return quote_char_;
338
+ }
339
+
340
+ char_type quote_escape_char() const
341
+ {
342
+ return quote_escape_char_;
343
+ }
344
+
345
+ string_type column_names() const
346
+ {
347
+ return column_names_;
348
+ }
349
+
350
+ bool enable_nan_to_num() const
351
+ {
352
+ return enable_nan_to_num_;
353
+ }
354
+
355
+ bool enable_inf_to_num() const
356
+ {
357
+ return enable_inf_to_num_;
358
+ }
359
+
360
+ bool enable_neginf_to_num() const
361
+ {
362
+ return enable_neginf_to_num_ || enable_inf_to_num_;
363
+ }
364
+
365
+ bool enable_nan_to_str() const
366
+ {
367
+ return enable_nan_to_str_;
368
+ }
369
+
370
+ bool enable_str_to_nan() const
371
+ {
372
+ return enable_str_to_nan_;
373
+ }
374
+
375
+ bool enable_inf_to_str() const
376
+ {
377
+ return enable_inf_to_str_;
378
+ }
379
+
380
+ bool enable_str_to_inf() const
381
+ {
382
+ return enable_str_to_inf_;
383
+ }
384
+
385
+ bool enable_neginf_to_str() const
386
+ {
387
+ return enable_neginf_to_str_ || enable_inf_to_str_;
388
+ }
389
+
390
+ bool enable_str_to_neginf() const
391
+ {
392
+ return enable_str_to_neginf_ || enable_str_to_inf_;
393
+ }
394
+
395
+ string_type nan_to_num() const
396
+ {
397
+ return nan_to_num_;
398
+ }
399
+
400
+ string_type inf_to_num() const
401
+ {
402
+ return inf_to_num_;
403
+ }
404
+
405
+ string_type neginf_to_num() const
406
+ {
407
+ if (enable_neginf_to_num_)
408
+ {
409
+ return neginf_to_num_;
410
+ }
411
+ else if (enable_inf_to_num_)
412
+ {
413
+ string_type s;
414
+ s.push_back('-');
415
+ s.append(inf_to_num_);
416
+ return s;
417
+ }
418
+ else
419
+ {
420
+ return neginf_to_num_;
421
+ }
422
+ }
423
+
424
+ string_type nan_to_str() const
425
+ {
426
+ return nan_to_str_;
427
+ }
428
+
429
+ string_type inf_to_str() const
430
+ {
431
+ return inf_to_str_;
432
+ }
433
+
434
+ string_type neginf_to_str() const
435
+ {
436
+ if (enable_neginf_to_str_)
437
+ {
438
+ return neginf_to_str_;
439
+ }
440
+ else if (enable_inf_to_str_)
441
+ {
442
+ string_type s;
443
+ s.push_back('-');
444
+ s.append(inf_to_str_);
445
+ return s;
446
+ }
447
+ else
448
+ {
449
+ return neginf_to_str_; // empty string
450
+ }
451
+ }
452
+ };
453
+
454
+ template <class CharT>
455
+ class basic_csv_decode_options : public virtual basic_csv_options_common<CharT>
456
+ {
457
+ friend class basic_csv_options<CharT>;
458
+ using super_type = basic_csv_options_common<CharT>;
459
+ public:
460
+ using typename super_type::char_type;
461
+ using typename super_type::string_type;
462
+
463
+ private:
464
+ bool assume_header_:1;
465
+ bool ignore_empty_values_:1;
466
+ bool ignore_empty_lines_:1;
467
+ bool trim_leading_:1;
468
+ bool trim_trailing_:1;
469
+ bool trim_leading_inside_quotes_:1;
470
+ bool trim_trailing_inside_quotes_:1;
471
+ bool unquoted_empty_value_is_null_:1;
472
+ bool infer_types_:1;
473
+ bool lossless_number_:1;
474
+ char_type comment_starter_;
475
+ csv_mapping_kind mapping_;
476
+ std::size_t header_lines_;
477
+ std::size_t max_lines_;
478
+ string_type column_types_;
479
+ string_type column_defaults_;
480
+ public:
481
+ basic_csv_decode_options()
482
+ : assume_header_(false),
483
+ ignore_empty_values_(false),
484
+ ignore_empty_lines_(true),
485
+ trim_leading_(false),
486
+ trim_trailing_(false),
487
+ trim_leading_inside_quotes_(false),
488
+ trim_trailing_inside_quotes_(false),
489
+ unquoted_empty_value_is_null_(false),
490
+ infer_types_(true),
491
+ lossless_number_(false),
492
+ comment_starter_('\0'),
493
+ mapping_(),
494
+ header_lines_(0),
495
+ max_lines_((std::numeric_limits<std::size_t>::max)())
496
+ {}
497
+
498
+ basic_csv_decode_options(const basic_csv_decode_options& other) = default;
499
+
500
+ basic_csv_decode_options(basic_csv_decode_options&& other)
501
+ : super_type(std::forward<basic_csv_decode_options>(other)),
502
+ assume_header_(other.assume_header_),
503
+ ignore_empty_values_(other.ignore_empty_values_),
504
+ ignore_empty_lines_(other.ignore_empty_lines_),
505
+ trim_leading_(other.trim_leading_),
506
+ trim_trailing_(other.trim_trailing_),
507
+ trim_leading_inside_quotes_(other.trim_leading_inside_quotes_),
508
+ trim_trailing_inside_quotes_(other.trim_trailing_inside_quotes_),
509
+ unquoted_empty_value_is_null_(other.unquoted_empty_value_is_null_),
510
+ infer_types_(other.infer_types_),
511
+ lossless_number_(other.lossless_number_),
512
+ comment_starter_(other.comment_starter_),
513
+ mapping_(other.mapping_),
514
+ header_lines_(other.header_lines_),
515
+ max_lines_(other.max_lines_),
516
+ column_types_(std::move(other.column_types_)),
517
+ column_defaults_(std::move(other.column_defaults_))
518
+ {}
519
+
520
+ std::size_t header_lines() const
521
+ {
522
+ return (assume_header_ && header_lines_ <= 1) ? 1 : header_lines_;
523
+ }
524
+
525
+ bool assume_header() const
526
+ {
527
+ return assume_header_;
528
+ }
529
+
530
+ bool ignore_empty_values() const
531
+ {
532
+ return ignore_empty_values_;
533
+ }
534
+
535
+ bool ignore_empty_lines() const
536
+ {
537
+ return ignore_empty_lines_;
538
+ }
539
+
540
+ bool trim_leading() const
541
+ {
542
+ return trim_leading_;
543
+ }
544
+
545
+ bool trim_trailing() const
546
+ {
547
+ return trim_trailing_;
548
+ }
549
+
550
+ bool trim_leading_inside_quotes() const
551
+ {
552
+ return trim_leading_inside_quotes_;
553
+ }
554
+
555
+ bool trim_trailing_inside_quotes() const
556
+ {
557
+ return trim_trailing_inside_quotes_;
558
+ }
559
+
560
+ bool trim() const
561
+ {
562
+ return trim_leading_ && trim_trailing_;
563
+ }
564
+
565
+ bool trim_inside_quotes() const
566
+ {
567
+ return trim_leading_inside_quotes_ && trim_trailing_inside_quotes_;
568
+ }
569
+
570
+ bool unquoted_empty_value_is_null() const
571
+ {
572
+ return unquoted_empty_value_is_null_;
573
+ }
574
+
575
+ bool infer_types() const
576
+ {
577
+ return infer_types_;
578
+ }
579
+
580
+ bool lossless_number() const
581
+ {
582
+ return lossless_number_;
583
+ }
584
+
585
+ char_type comment_starter() const
586
+ {
587
+ return comment_starter_;
588
+ }
589
+
590
+ csv_mapping_kind mapping_kind() const
591
+ {
592
+ return mapping_ != csv_mapping_kind() ? mapping_ : (assume_header() || this->column_names().size() > 0 ? csv_mapping_kind::n_objects : csv_mapping_kind::n_rows);
593
+ }
594
+
595
+ #if !defined(JSONCONS_NO_DEPRECATED)
596
+ csv_mapping_kind mapping() const
597
+ {
598
+ return mapping_kind();
599
+ }
600
+ #endif
601
+
602
+ std::size_t max_lines() const
603
+ {
604
+ return max_lines_;
605
+ }
606
+
607
+ string_type column_types() const
608
+ {
609
+ return column_types_;
610
+ }
611
+
612
+ string_type column_defaults() const
613
+ {
614
+ return column_defaults_;
615
+ }
616
+ };
617
+
618
+ template <class CharT>
619
+ class basic_csv_encode_options : public virtual basic_csv_options_common<CharT>
620
+ {
621
+ friend class basic_csv_options<CharT>;
622
+ using super_type = basic_csv_options_common<CharT>;
623
+ public:
624
+ using typename super_type::char_type;
625
+ using typename super_type::string_type;
626
+ private:
627
+ quote_style_kind quote_style_;
628
+ float_chars_format float_format_;
629
+ int8_t precision_;
630
+ string_type line_delimiter_;
631
+ public:
632
+ basic_csv_encode_options()
633
+ : quote_style_(quote_style_kind::minimal),
634
+ float_format_(float_chars_format::general),
635
+ precision_(0)
636
+ {
637
+ line_delimiter_.push_back('\n');
638
+ }
639
+
640
+ basic_csv_encode_options(const basic_csv_encode_options& other) = default;
641
+
642
+ basic_csv_encode_options(basic_csv_encode_options&& other)
643
+ : super_type(std::forward<basic_csv_encode_options>(other)),
644
+ quote_style_(other.quote_style_),
645
+ float_format_(other.float_format_),
646
+ precision_(other.precision_),
647
+ line_delimiter_(std::move(other.line_delimiter_))
648
+ {
649
+ }
650
+
651
+ quote_style_kind quote_style() const
652
+ {
653
+ return quote_style_;
654
+ }
655
+
656
+ float_chars_format float_format() const
657
+ {
658
+ return float_format_;
659
+ }
660
+
661
+ int8_t precision() const
662
+ {
663
+ return precision_;
664
+ }
665
+
666
+ string_type line_delimiter() const
667
+ {
668
+ return line_delimiter_;
669
+ }
670
+ };
671
+
672
+ template <class CharT>
673
+ class basic_csv_options final : public basic_csv_decode_options<CharT>, public basic_csv_encode_options<CharT>
674
+ {
675
+ using char_type = CharT;
676
+ using string_type = std::basic_string<CharT>;
677
+
678
+ public:
679
+ using basic_csv_decode_options<CharT>::enable_str_to_nan;
680
+ using basic_csv_decode_options<CharT>::enable_str_to_inf;
681
+ using basic_csv_decode_options<CharT>::enable_str_to_neginf;
682
+ using basic_csv_decode_options<CharT>::nan_to_str;
683
+ using basic_csv_decode_options<CharT>::inf_to_str;
684
+ using basic_csv_decode_options<CharT>::neginf_to_str;
685
+ using basic_csv_decode_options<CharT>::nan_to_num;
686
+ using basic_csv_decode_options<CharT>::inf_to_num;
687
+ using basic_csv_decode_options<CharT>::neginf_to_num;
688
+ using basic_csv_decode_options<CharT>::field_delimiter;
689
+ using basic_csv_decode_options<CharT>::subfield_delimiter;
690
+ using basic_csv_decode_options<CharT>::quote_char;
691
+ using basic_csv_decode_options<CharT>::quote_escape_char;
692
+ using basic_csv_decode_options<CharT>::column_names;
693
+ using basic_csv_decode_options<CharT>::header_lines;
694
+ using basic_csv_decode_options<CharT>::assume_header;
695
+ using basic_csv_decode_options<CharT>::ignore_empty_values;
696
+ using basic_csv_decode_options<CharT>::ignore_empty_lines;
697
+ using basic_csv_decode_options<CharT>::trim_leading;
698
+ using basic_csv_decode_options<CharT>::trim_trailing;
699
+ using basic_csv_decode_options<CharT>::trim_leading_inside_quotes;
700
+ using basic_csv_decode_options<CharT>::trim_trailing_inside_quotes;
701
+ using basic_csv_decode_options<CharT>::trim;
702
+ using basic_csv_decode_options<CharT>::trim_inside_quotes;
703
+ using basic_csv_decode_options<CharT>::unquoted_empty_value_is_null;
704
+ using basic_csv_decode_options<CharT>::infer_types;
705
+ using basic_csv_decode_options<CharT>::lossless_number;
706
+ using basic_csv_decode_options<CharT>::comment_starter;
707
+ using basic_csv_decode_options<CharT>::mapping;
708
+ using basic_csv_decode_options<CharT>::max_lines;
709
+ using basic_csv_decode_options<CharT>::column_types;
710
+ using basic_csv_decode_options<CharT>::column_defaults;
711
+ using basic_csv_encode_options<CharT>::float_format;
712
+ using basic_csv_encode_options<CharT>::precision;
713
+ using basic_csv_encode_options<CharT>::line_delimiter;
714
+ using basic_csv_encode_options<CharT>::quote_style;
715
+
716
+ static constexpr size_t default_indent = 4;
717
+
718
+ // Constructors
719
+
720
+ basic_csv_options() = default;
721
+ basic_csv_options(const basic_csv_options&) = default;
722
+ basic_csv_options(basic_csv_options&&) = default;
723
+ basic_csv_options& operator=(const basic_csv_options&) = default;
724
+ basic_csv_options& operator=(basic_csv_options&&) = default;
725
+
726
+ basic_csv_options& float_format(float_chars_format value)
727
+ {
728
+ this->float_format_ = value;
729
+ return *this;
730
+ }
731
+
732
+ basic_csv_options& precision(int8_t value)
733
+ {
734
+ this->precision_ = value;
735
+ return *this;
736
+ }
737
+
738
+ basic_csv_options& header_lines(std::size_t value)
739
+ {
740
+ this->header_lines_ = value;
741
+ return *this;
742
+ }
743
+
744
+ basic_csv_options& assume_header(bool value)
745
+ {
746
+ this->assume_header_ = value;
747
+ return *this;
748
+ }
749
+
750
+ basic_csv_options& ignore_empty_values(bool value)
751
+ {
752
+ this->ignore_empty_values_ = value;
753
+ return *this;
754
+ }
755
+
756
+ basic_csv_options& ignore_empty_lines(bool value)
757
+ {
758
+ this->ignore_empty_lines_ = value;
759
+ return *this;
760
+ }
761
+
762
+ basic_csv_options& trim_leading(bool value)
763
+ {
764
+ this->trim_leading_ = value;
765
+ return *this;
766
+ }
767
+
768
+ basic_csv_options& trim_trailing(bool value)
769
+ {
770
+ this->trim_trailing_ = value;
771
+ return *this;
772
+ }
773
+
774
+ basic_csv_options& trim_leading_inside_quotes(bool value)
775
+ {
776
+ this->trim_leading_inside_quotes_ = value;
777
+ return *this;
778
+ }
779
+
780
+ basic_csv_options& trim_trailing_inside_quotes(bool value)
781
+ {
782
+ this->trim_trailing_inside_quotes_ = value;
783
+ return *this;
784
+ }
785
+
786
+ basic_csv_options& trim(bool value)
787
+ {
788
+ this->trim_leading_ = value;
789
+ this->trim_trailing_ = value;
790
+ return *this;
791
+ }
792
+
793
+ basic_csv_options& trim_inside_quotes(bool value)
794
+ {
795
+ this->trim_leading_inside_quotes_ = value;
796
+ this->trim_trailing_inside_quotes_ = value;
797
+ return *this;
798
+ }
799
+
800
+ basic_csv_options& unquoted_empty_value_is_null(bool value)
801
+ {
802
+ this->unquoted_empty_value_is_null_ = value;
803
+ return *this;
804
+ }
805
+
806
+ basic_csv_options& column_names(const string_type& value)
807
+ {
808
+ this->column_names_ = value;
809
+ return *this;
810
+ }
811
+
812
+ basic_csv_options& column_types(const string_type& value)
813
+ {
814
+ this->column_types_ = value;
815
+ return *this;
816
+ }
817
+
818
+ basic_csv_options& column_defaults(const string_type& value)
819
+ {
820
+ this->column_defaults_ = value;
821
+ return *this;
822
+ }
823
+
824
+ basic_csv_options& field_delimiter(char_type value)
825
+ {
826
+ this->field_delimiter_ = value;
827
+ return *this;
828
+ }
829
+
830
+ basic_csv_options& subfield_delimiter(char_type value)
831
+ {
832
+ this->subfield_delimiter_ = value;
833
+ return *this;
834
+ }
835
+
836
+ basic_csv_options& line_delimiter(const string_type& value)
837
+ {
838
+ this->line_delimiter_ = value;
839
+ return *this;
840
+ }
841
+
842
+ basic_csv_options& quote_char(char_type value)
843
+ {
844
+ this->quote_char_ = value;
845
+ return *this;
846
+ }
847
+
848
+ basic_csv_options& infer_types(bool value)
849
+ {
850
+ this->infer_types_ = value;
851
+ return *this;
852
+ }
853
+
854
+ basic_csv_options& lossless_number(bool value)
855
+ {
856
+ this->lossless_number_ = value;
857
+ return *this;
858
+ }
859
+
860
+ basic_csv_options& quote_escape_char(char_type value)
861
+ {
862
+ this->quote_escape_char_ = value;
863
+ return *this;
864
+ }
865
+
866
+ basic_csv_options& comment_starter(char_type value)
867
+ {
868
+ this->comment_starter_ = value;
869
+ return *this;
870
+ }
871
+
872
+ basic_csv_options& quote_style(quote_style_kind value)
873
+ {
874
+ this->quote_style_ = value;
875
+ return *this;
876
+ }
877
+
878
+ //#if !defined(JSONCONS_NO_DEPRECATED)
879
+ basic_csv_options& mapping(csv_mapping_kind value)
880
+ {
881
+ this->mapping_ = value;
882
+ return *this;
883
+ }
884
+ //#endif
885
+
886
+ basic_csv_options& mapping_kind(csv_mapping_kind value)
887
+ {
888
+ this->mapping_ = value;
889
+ return *this;
890
+ }
891
+
892
+ basic_csv_options& max_lines(std::size_t value)
893
+ {
894
+ this->max_lines_ = value;
895
+ return *this;
896
+ }
897
+
898
+ basic_csv_options& nan_to_num(const string_type& value)
899
+ {
900
+ this->enable_nan_to_num_ = true;
901
+ this->nan_to_str_.clear();
902
+ this->nan_to_num_ = value;
903
+ return *this;
904
+ }
905
+
906
+ basic_csv_options& inf_to_num(const string_type& value)
907
+ {
908
+ this->enable_inf_to_num_ = true;
909
+ this->inf_to_str_.clear();
910
+ this->inf_to_num_ = value;
911
+ return *this;
912
+ }
913
+
914
+ basic_csv_options& neginf_to_num(const string_type& value)
915
+ {
916
+ this->enable_neginf_to_num_ = true;
917
+ this->neginf_to_str_.clear();
918
+ this->neginf_to_num_ = value;
919
+ return *this;
920
+ }
921
+
922
+ basic_csv_options& nan_to_str(const string_type& value, bool enable_inverse = true)
923
+ {
924
+ this->enable_nan_to_str_ = true;
925
+ this->enable_str_to_nan_ = enable_inverse;
926
+ this->nan_to_num_.clear();
927
+ this->nan_to_str_ = value;
928
+ return *this;
929
+ }
930
+
931
+ basic_csv_options& inf_to_str(const string_type& value, bool enable_inverse = true)
932
+ {
933
+ this->enable_inf_to_str_ = true;
934
+ this->enable_inf_to_str_ = enable_inverse;
935
+ this->inf_to_num_.clear();
936
+ this->inf_to_str_ = value;
937
+ return *this;
938
+ }
939
+
940
+ basic_csv_options& neginf_to_str(const string_type& value, bool enable_inverse = true)
941
+ {
942
+ this->enable_neginf_to_str_ = true;
943
+ this->enable_neginf_to_str_ = enable_inverse;
944
+ this->neginf_to_num_.clear();
945
+ this->neginf_to_str_ = value;
946
+ return *this;
947
+ }
948
+
949
+ #if !defined(JSONCONS_NO_DEPRECATED)
950
+
951
+ JSONCONS_DEPRECATED_MSG("Instead, use float_format(float_chars_format)")
952
+ basic_csv_options& floating_point_format(float_chars_format value)
953
+ {
954
+ this->float_format_ = value;
955
+ return *this;
956
+ }
957
+ #endif
958
+
959
+ };
960
+
961
+ using csv_options = basic_csv_options<char>;
962
+ using wcsv_options = basic_csv_options<wchar_t>;
963
+
964
+ #if !defined(JSONCONS_NO_DEPRECATED)
965
+ JSONCONS_DEPRECATED_MSG("Instead, use csv_options") typedef csv_options csv_parameters;
966
+ JSONCONS_DEPRECATED_MSG("Instead, use wcsv_options") typedef wcsv_options wcsv_parameters;
967
+ JSONCONS_DEPRECATED_MSG("Instead, use csv_options") typedef csv_options csv_serializing_options;
968
+ JSONCONS_DEPRECATED_MSG("Instead, use wcsv_options") typedef wcsv_options wcsv_serializing_options;
969
+ #endif
970
+
971
+
972
+ }}
973
+ #endif