jsoncons 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (155) hide show
  1. checksums.yaml +7 -0
  2. data/ext/jsoncons/extconf.rb +43 -0
  3. data/ext/jsoncons/jsoncons.cpp +161 -0
  4. data/ext/jsoncons/jsoncons.h +10 -0
  5. data/jsoncons.gemspec +44 -0
  6. data/lib/jsoncons/jsoncons/examples/input/address-book.json +13 -0
  7. data/lib/jsoncons/jsoncons/examples/input/books.json +28 -0
  8. data/lib/jsoncons/jsoncons/examples/input/countries.json +7 -0
  9. data/lib/jsoncons/jsoncons/examples/input/employees.json +30 -0
  10. data/lib/jsoncons/jsoncons/examples/input/jsonschema/name.json +15 -0
  11. data/lib/jsoncons/jsoncons/examples/input/multiple-json-objects.json +3 -0
  12. data/lib/jsoncons/jsoncons/examples/input/sales.csv +6 -0
  13. data/lib/jsoncons/jsoncons/examples/input/store.json +28 -0
  14. data/lib/jsoncons/jsoncons/examples/input/tasks.csv +6 -0
  15. data/lib/jsoncons/jsoncons/include/jsoncons/allocator_holder.hpp +38 -0
  16. data/lib/jsoncons/jsoncons/include/jsoncons/basic_json.hpp +5905 -0
  17. data/lib/jsoncons/jsoncons/include/jsoncons/bigint.hpp +1611 -0
  18. data/lib/jsoncons/jsoncons/include/jsoncons/byte_string.hpp +820 -0
  19. data/lib/jsoncons/jsoncons/include/jsoncons/config/binary_config.hpp +226 -0
  20. data/lib/jsoncons/jsoncons/include/jsoncons/config/compiler_support.hpp +375 -0
  21. data/lib/jsoncons/jsoncons/include/jsoncons/config/jsoncons_config.hpp +309 -0
  22. data/lib/jsoncons/jsoncons/include/jsoncons/config/version.hpp +40 -0
  23. data/lib/jsoncons/jsoncons/include/jsoncons/conv_error.hpp +218 -0
  24. data/lib/jsoncons/jsoncons/include/jsoncons/decode_json.hpp +209 -0
  25. data/lib/jsoncons/jsoncons/include/jsoncons/decode_traits.hpp +651 -0
  26. data/lib/jsoncons/jsoncons/include/jsoncons/detail/endian.hpp +44 -0
  27. data/lib/jsoncons/jsoncons/include/jsoncons/detail/grisu3.hpp +312 -0
  28. data/lib/jsoncons/jsoncons/include/jsoncons/detail/optional.hpp +483 -0
  29. data/lib/jsoncons/jsoncons/include/jsoncons/detail/parse_number.hpp +1133 -0
  30. data/lib/jsoncons/jsoncons/include/jsoncons/detail/span.hpp +188 -0
  31. data/lib/jsoncons/jsoncons/include/jsoncons/detail/string_view.hpp +537 -0
  32. data/lib/jsoncons/jsoncons/include/jsoncons/detail/string_wrapper.hpp +370 -0
  33. data/lib/jsoncons/jsoncons/include/jsoncons/detail/write_number.hpp +567 -0
  34. data/lib/jsoncons/jsoncons/include/jsoncons/encode_json.hpp +315 -0
  35. data/lib/jsoncons/jsoncons/include/jsoncons/encode_traits.hpp +378 -0
  36. data/lib/jsoncons/jsoncons/include/jsoncons/json.hpp +18 -0
  37. data/lib/jsoncons/jsoncons/include/jsoncons/json_array.hpp +324 -0
  38. data/lib/jsoncons/jsoncons/include/jsoncons/json_content_handler.hpp +12 -0
  39. data/lib/jsoncons/jsoncons/include/jsoncons/json_cursor.hpp +448 -0
  40. data/lib/jsoncons/jsoncons/include/jsoncons/json_decoder.hpp +420 -0
  41. data/lib/jsoncons/jsoncons/include/jsoncons/json_encoder.hpp +1587 -0
  42. data/lib/jsoncons/jsoncons/include/jsoncons/json_error.hpp +156 -0
  43. data/lib/jsoncons/jsoncons/include/jsoncons/json_exception.hpp +241 -0
  44. data/lib/jsoncons/jsoncons/include/jsoncons/json_filter.hpp +653 -0
  45. data/lib/jsoncons/jsoncons/include/jsoncons/json_fwd.hpp +23 -0
  46. data/lib/jsoncons/jsoncons/include/jsoncons/json_object.hpp +1772 -0
  47. data/lib/jsoncons/jsoncons/include/jsoncons/json_options.hpp +862 -0
  48. data/lib/jsoncons/jsoncons/include/jsoncons/json_parser.hpp +2900 -0
  49. data/lib/jsoncons/jsoncons/include/jsoncons/json_reader.hpp +731 -0
  50. data/lib/jsoncons/jsoncons/include/jsoncons/json_traits_macros.hpp +1072 -0
  51. data/lib/jsoncons/jsoncons/include/jsoncons/json_traits_macros_deprecated.hpp +144 -0
  52. data/lib/jsoncons/jsoncons/include/jsoncons/json_type.hpp +206 -0
  53. data/lib/jsoncons/jsoncons/include/jsoncons/json_type_traits.hpp +1830 -0
  54. data/lib/jsoncons/jsoncons/include/jsoncons/json_visitor.hpp +1560 -0
  55. data/lib/jsoncons/jsoncons/include/jsoncons/json_visitor2.hpp +2079 -0
  56. data/lib/jsoncons/jsoncons/include/jsoncons/pretty_print.hpp +89 -0
  57. data/lib/jsoncons/jsoncons/include/jsoncons/ser_context.hpp +62 -0
  58. data/lib/jsoncons/jsoncons/include/jsoncons/sink.hpp +289 -0
  59. data/lib/jsoncons/jsoncons/include/jsoncons/source.hpp +777 -0
  60. data/lib/jsoncons/jsoncons/include/jsoncons/source_adaptor.hpp +148 -0
  61. data/lib/jsoncons/jsoncons/include/jsoncons/staj2_cursor.hpp +1189 -0
  62. data/lib/jsoncons/jsoncons/include/jsoncons/staj_cursor.hpp +1254 -0
  63. data/lib/jsoncons/jsoncons/include/jsoncons/staj_iterator.hpp +449 -0
  64. data/lib/jsoncons/jsoncons/include/jsoncons/tag_type.hpp +245 -0
  65. data/lib/jsoncons/jsoncons/include/jsoncons/text_source_adaptor.hpp +144 -0
  66. data/lib/jsoncons/jsoncons/include/jsoncons/traits_extension.hpp +884 -0
  67. data/lib/jsoncons/jsoncons/include/jsoncons/typed_array_view.hpp +250 -0
  68. data/lib/jsoncons/jsoncons/include/jsoncons/unicode_traits.hpp +1330 -0
  69. data/lib/jsoncons/jsoncons/include/jsoncons/uri.hpp +635 -0
  70. data/lib/jsoncons/jsoncons/include/jsoncons/value_converter.hpp +340 -0
  71. data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson.hpp +23 -0
  72. data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_cursor.hpp +320 -0
  73. data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_decimal128.hpp +865 -0
  74. data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_encoder.hpp +585 -0
  75. data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_error.hpp +103 -0
  76. data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_oid.hpp +245 -0
  77. data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_options.hpp +75 -0
  78. data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_parser.hpp +645 -0
  79. data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_reader.hpp +92 -0
  80. data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_type.hpp +44 -0
  81. data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/decode_bson.hpp +201 -0
  82. data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/encode_bson.hpp +144 -0
  83. data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor.hpp +26 -0
  84. data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor_cursor.hpp +351 -0
  85. data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor_cursor2.hpp +265 -0
  86. data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor_detail.hpp +93 -0
  87. data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor_encoder.hpp +1766 -0
  88. data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor_error.hpp +105 -0
  89. data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor_options.hpp +113 -0
  90. data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor_parser.hpp +1942 -0
  91. data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor_reader.hpp +116 -0
  92. data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/decode_cbor.hpp +203 -0
  93. data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/encode_cbor.hpp +151 -0
  94. data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/csv.hpp +17 -0
  95. data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/csv_cursor.hpp +358 -0
  96. data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/csv_encoder.hpp +954 -0
  97. data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/csv_error.hpp +85 -0
  98. data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/csv_options.hpp +973 -0
  99. data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/csv_parser.hpp +2099 -0
  100. data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/csv_reader.hpp +348 -0
  101. data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/csv_serializer.hpp +12 -0
  102. data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/decode_csv.hpp +208 -0
  103. data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/encode_csv.hpp +122 -0
  104. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jmespath/jmespath.hpp +5215 -0
  105. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jmespath/jmespath_error.hpp +215 -0
  106. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpatch/jsonpatch.hpp +579 -0
  107. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpatch/jsonpatch_error.hpp +121 -0
  108. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpath/expression.hpp +3329 -0
  109. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpath/flatten.hpp +432 -0
  110. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpath/json_location.hpp +445 -0
  111. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpath/json_query.hpp +115 -0
  112. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpath/jsonpath.hpp +13 -0
  113. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpath/jsonpath_error.hpp +240 -0
  114. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpath/jsonpath_expression.hpp +2612 -0
  115. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpath/jsonpath_selector.hpp +1322 -0
  116. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpointer/jsonpointer.hpp +1577 -0
  117. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpointer/jsonpointer_error.hpp +119 -0
  118. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/format_validator.hpp +968 -0
  119. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/json_validator.hpp +120 -0
  120. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/jsonschema.hpp +13 -0
  121. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/jsonschema_error.hpp +105 -0
  122. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/jsonschema_version.hpp +18 -0
  123. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/keyword_validator.hpp +1745 -0
  124. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/keyword_validator_factory.hpp +556 -0
  125. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/schema_draft7.hpp +198 -0
  126. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/schema_location.hpp +200 -0
  127. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/schema_version.hpp +35 -0
  128. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/subschema.hpp +144 -0
  129. data/lib/jsoncons/jsoncons/include/jsoncons_ext/mergepatch/mergepatch.hpp +103 -0
  130. data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/decode_msgpack.hpp +202 -0
  131. data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/encode_msgpack.hpp +142 -0
  132. data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack.hpp +24 -0
  133. data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack_cursor.hpp +343 -0
  134. data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack_cursor2.hpp +259 -0
  135. data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack_encoder.hpp +753 -0
  136. data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack_error.hpp +94 -0
  137. data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack_options.hpp +74 -0
  138. data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack_parser.hpp +748 -0
  139. data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack_reader.hpp +116 -0
  140. data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack_type.hpp +63 -0
  141. data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/decode_ubjson.hpp +201 -0
  142. data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/encode_ubjson.hpp +142 -0
  143. data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/ubjson.hpp +23 -0
  144. data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/ubjson_cursor.hpp +307 -0
  145. data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/ubjson_encoder.hpp +502 -0
  146. data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/ubjson_error.hpp +100 -0
  147. data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/ubjson_options.hpp +87 -0
  148. data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/ubjson_parser.hpp +880 -0
  149. data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/ubjson_reader.hpp +92 -0
  150. data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/ubjson_type.hpp +43 -0
  151. data/lib/jsoncons/version.rb +5 -0
  152. data/lib/jsoncons.rb +33 -0
  153. data/test/jsoncons_test.rb +108 -0
  154. data/test/test_helper.rb +7 -0
  155. metadata +268 -0
@@ -0,0 +1,884 @@
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_TRAITS_EXTENSION_HPP
8
+ #define JSONCONS_TRAITS_EXTENSION_HPP
9
+
10
+ #include <stdexcept>
11
+ #include <string>
12
+ #include <cmath>
13
+ #include <type_traits> // std::enable_if, std::true_type
14
+ #include <memory>
15
+ #include <iterator> // std::iterator_traits
16
+ #include <exception>
17
+ #include <array> // std::array
18
+ #include <cstddef> // std::byte
19
+ #include <utility> // std::declval
20
+ #include <climits> // CHAR_BIT
21
+ #include <jsoncons/config/compiler_support.hpp>
22
+
23
+ namespace jsoncons {
24
+ namespace traits_extension {
25
+
26
+ // is_char8
27
+ template <typename CharT, typename Enable=void>
28
+ struct is_char8 : std::false_type {};
29
+
30
+ template <typename CharT>
31
+ struct is_char8<CharT, typename std::enable_if<std::is_integral<CharT>::value &&
32
+ !std::is_same<CharT,bool>::value &&
33
+ sizeof(uint8_t) == sizeof(CharT)>::type> : std::true_type {};
34
+
35
+ // is_char16
36
+ template <typename CharT, typename Enable=void>
37
+ struct is_char16 : std::false_type {};
38
+
39
+ template <typename CharT>
40
+ struct is_char16<CharT, typename std::enable_if<std::is_integral<CharT>::value &&
41
+ !std::is_same<CharT,bool>::value &&
42
+ (std::is_same<CharT,char16_t>::value || sizeof(uint16_t) == sizeof(CharT))>::type> : std::true_type {};
43
+
44
+ // is_char32
45
+ template <typename CharT, typename Enable=void>
46
+ struct is_char32 : std::false_type {};
47
+
48
+ template <typename CharT>
49
+ struct is_char32<CharT, typename std::enable_if<std::is_integral<CharT>::value &&
50
+ !std::is_same<CharT,bool>::value &&
51
+ (std::is_same<CharT,char32_t>::value || (!std::is_same<CharT,char16_t>::value && sizeof(uint32_t) == sizeof(CharT)))>::type> : std::true_type {};
52
+
53
+ // is_int128
54
+
55
+ template <class T, class Enable=void>
56
+ struct is_int128_type : std::false_type {};
57
+
58
+ #if defined(JSONCONS_HAS_INT128)
59
+ template <class T>
60
+ struct is_int128_type<T,typename std::enable_if<std::is_same<T,int128_type>::value>::type> : std::true_type {};
61
+ #endif
62
+
63
+ // is_unsigned_integer
64
+
65
+ template <class T, class Enable=void>
66
+ struct is_uint128_type : std::false_type {};
67
+
68
+ #if defined (JSONCONS_HAS_INT128)
69
+ template <class T>
70
+ struct is_uint128_type<T,typename std::enable_if<std::is_same<T,uint128_type>::value>::type> : std::true_type {};
71
+ #endif
72
+
73
+ template <class T, class Enable = void>
74
+ class integer_limits
75
+ {
76
+ public:
77
+ static constexpr bool is_specialized = false;
78
+ };
79
+
80
+ template <class T>
81
+ class integer_limits<T,typename std::enable_if<std::is_integral<T>::value && !std::is_same<T,bool>::value>::type>
82
+ {
83
+ public:
84
+ static constexpr bool is_specialized = true;
85
+ static constexpr bool is_signed = std::numeric_limits<T>::is_signed;
86
+ static constexpr int digits = std::numeric_limits<T>::digits;
87
+ static constexpr std::size_t buffer_size = static_cast<std::size_t>(sizeof(T)*CHAR_BIT*0.302) + 3;
88
+
89
+ static constexpr T(max)() noexcept
90
+ {
91
+ return (std::numeric_limits<T>::max)();
92
+ }
93
+ static constexpr T(min)() noexcept
94
+ {
95
+ return (std::numeric_limits<T>::min)();
96
+ }
97
+ static constexpr T lowest() noexcept
98
+ {
99
+ return std::numeric_limits<T>::lowest();
100
+ }
101
+ };
102
+
103
+ template <class T>
104
+ class integer_limits<T,typename std::enable_if<!std::is_integral<T>::value && is_int128_type<T>::value>::type>
105
+ {
106
+ public:
107
+ static constexpr bool is_specialized = true;
108
+ static constexpr bool is_signed = true;
109
+ static constexpr int digits = sizeof(T)*CHAR_BIT - 1;
110
+ static constexpr std::size_t buffer_size = (sizeof(T)*CHAR_BIT*0.302) + 3;
111
+
112
+ static constexpr T(max)() noexcept
113
+ {
114
+ return (((((T)1 << (digits - 1)) - 1) << 1) + 1);
115
+ }
116
+ static constexpr T(min)() noexcept
117
+ {
118
+ return -(max)() - 1;
119
+ }
120
+ static constexpr T lowest() noexcept
121
+ {
122
+ return (min)();
123
+ }
124
+ };
125
+
126
+ template <class T>
127
+ class integer_limits<T,typename std::enable_if<!std::is_integral<T>::value && is_uint128_type<T>::value>::type>
128
+ {
129
+ public:
130
+ static constexpr bool is_specialized = true;
131
+ static constexpr bool is_signed = false;
132
+ static constexpr int digits = sizeof(T)*CHAR_BIT;
133
+
134
+ static constexpr T(max)() noexcept
135
+ {
136
+ return T(T(~0));
137
+ }
138
+ static constexpr T(min)() noexcept
139
+ {
140
+ return 0;
141
+ }
142
+ static constexpr T lowest() noexcept
143
+ {
144
+ return std::numeric_limits<T>::lowest();
145
+ }
146
+ };
147
+
148
+ #ifndef JSONCONS_HAS_VOID_T
149
+ // follows https://en.cppreference.com/w/cpp/types/void_t
150
+ template<typename... Ts> struct make_void { typedef void type;};
151
+ template<typename... Ts> using void_t = typename make_void<Ts...>::type;
152
+ #else
153
+ using void_t = std::void_t;
154
+ #endif
155
+
156
+ // follows http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4436.pdf
157
+
158
+ // detector
159
+
160
+ // primary template handles all types not supporting the archetypal Op
161
+ template<
162
+ class Default,
163
+ class, // always void; supplied externally
164
+ template<class...> class Op,
165
+ class... Args
166
+ >
167
+ struct detector
168
+ {
169
+ constexpr static auto value = false;
170
+ using type = Default;
171
+ };
172
+
173
+ // specialization recognizes and handles only types supporting Op
174
+ template<
175
+ class Default,
176
+ template<class...> class Op,
177
+ class... Args
178
+ >
179
+ struct detector<Default, void_t<Op<Args...>>, Op, Args...>
180
+ {
181
+ constexpr static auto value = true;
182
+ using type = Op<Args...>;
183
+ };
184
+
185
+ // is_detected, is_detected_t
186
+
187
+ template< template<class...> class Op, class... Args >
188
+ using
189
+ is_detected = detector<void, void, Op, Args...>;
190
+
191
+ template< template<class...> class Op, class... Args >
192
+ using
193
+ is_detected_t = typename is_detected<Op, Args...>::type;
194
+
195
+ // detected_or, detected_or_t
196
+
197
+ template< class Default, template<class...> class Op, class... Args >
198
+ using
199
+ detected_or = detector<Default, void, Op, Args...>;
200
+
201
+ template< class Default, template<class...> class Op, class... Args >
202
+ using
203
+ detected_or_t = typename detected_or<Default, Op, Args...>::type;
204
+
205
+ // is_detected_exact
206
+
207
+ template< class Expected, template<class...> class Op, class... Args >
208
+ using
209
+ is_detected_exact = std::is_same< Expected, is_detected_t<Op, Args...> >;
210
+
211
+ // is_detected_convertible
212
+
213
+ template< class To, template<class...> class Op, class... Args >
214
+ using
215
+ is_detected_convertible = std::is_convertible< is_detected_t<Op, Args...>, To >;
216
+
217
+ template <typename T>
218
+ struct is_stateless
219
+ : public std::integral_constant<bool,
220
+ (std::is_default_constructible<T>::value &&
221
+ std::is_empty<T>::value)>
222
+ {};
223
+
224
+ // to_plain_pointer
225
+
226
+ template<class Pointer> inline
227
+ typename std::pointer_traits<Pointer>::element_type* to_plain_pointer(Pointer ptr)
228
+ {
229
+ return (std::addressof(*ptr));
230
+ }
231
+
232
+ template<class T> inline
233
+ T * to_plain_pointer(T * ptr)
234
+ {
235
+ return (ptr);
236
+ }
237
+
238
+ // is_std_byte
239
+
240
+ template <class T, class Enable=void>
241
+ struct is_std_byte : std::false_type {};
242
+ #if defined(JSONCONS_HAS_STD_BYTE)
243
+ template <class T>
244
+ struct is_std_byte<T,
245
+ typename std::enable_if<std::is_same<T,std::byte>::value
246
+ >::type> : std::true_type {};
247
+ #endif
248
+ // is_byte
249
+
250
+ template <class T, class Enable=void>
251
+ struct is_byte : std::false_type {};
252
+
253
+ template <class T>
254
+ struct is_byte<T,
255
+ typename std::enable_if<std::is_same<T,char>::value ||
256
+ std::is_same<T,signed char>::value ||
257
+ std::is_same<T,unsigned char>::value ||
258
+ is_std_byte<T>::value
259
+ >::type> : std::true_type {};
260
+
261
+ // is_character
262
+
263
+ template <class T, class Enable=void>
264
+ struct is_character : std::false_type {};
265
+
266
+ template <class T>
267
+ struct is_character<T,
268
+ typename std::enable_if<std::is_same<T,char>::value ||
269
+ std::is_same<T,wchar_t>::value
270
+ >::type> : std::true_type {};
271
+
272
+ // is_narrow_character
273
+
274
+ template <class T, class Enable=void>
275
+ struct is_narrow_character : std::false_type {};
276
+
277
+ template <class T>
278
+ struct is_narrow_character<T,
279
+ typename std::enable_if<is_character<T>::value && (sizeof(T) == sizeof(char))
280
+ >::type> : std::true_type {};
281
+
282
+ // is_wide_character
283
+
284
+ template <class T, class Enable=void>
285
+ struct is_wide_character : std::false_type {};
286
+
287
+ template <class T>
288
+ struct is_wide_character<T,
289
+ typename std::enable_if<is_character<T>::value && (sizeof(T) != sizeof(char))
290
+ >::type> : std::true_type {};
291
+
292
+ // From boost
293
+ namespace ut_detail {
294
+
295
+ template<typename T>
296
+ struct is_cstring_impl : public std::false_type {};
297
+
298
+ template<typename T>
299
+ struct is_cstring_impl<T const*> : public is_cstring_impl<T*> {};
300
+
301
+ template<typename T>
302
+ struct is_cstring_impl<T const* const> : public is_cstring_impl<T*> {};
303
+
304
+ template<>
305
+ struct is_cstring_impl<char*> : public std::true_type {};
306
+
307
+ template<>
308
+ struct is_cstring_impl<wchar_t*> : public std::true_type {};
309
+
310
+ } // namespace ut_detail
311
+
312
+ template<typename T>
313
+ struct is_cstring : public ut_detail::is_cstring_impl<typename std::decay<T>::type> {};
314
+
315
+ // is_bool
316
+
317
+ template <class T, class Enable=void>
318
+ struct is_bool : std::false_type {};
319
+
320
+ template <class T>
321
+ struct is_bool<T,
322
+ typename std::enable_if<std::is_same<T,bool>::value
323
+ >::type> : std::true_type {};
324
+
325
+ // is_u8_u16_u32_or_u64
326
+
327
+ template <class T, class Enable=void>
328
+ struct is_u8_u16_u32_or_u64 : std::false_type {};
329
+
330
+ template <class T>
331
+ struct is_u8_u16_u32_or_u64<T,
332
+ typename std::enable_if<std::is_same<T,uint8_t>::value ||
333
+ std::is_same<T,uint16_t>::value ||
334
+ std::is_same<T,uint32_t>::value ||
335
+ std::is_same<T,uint64_t>::value
336
+ >::type> : std::true_type {};
337
+
338
+ // is_int
339
+
340
+ template <class T, class Enable=void>
341
+ struct is_i8_i16_i32_or_i64 : std::false_type {};
342
+
343
+ template <class T>
344
+ struct is_i8_i16_i32_or_i64<T,
345
+ typename std::enable_if<std::is_same<T,int8_t>::value ||
346
+ std::is_same<T,int16_t>::value ||
347
+ std::is_same<T,int32_t>::value ||
348
+ std::is_same<T,int64_t>::value
349
+ >::type> : std::true_type {};
350
+
351
+ // is_float_or_double
352
+
353
+ template <class T, class Enable=void>
354
+ struct is_float_or_double : std::false_type {};
355
+
356
+ template <class T>
357
+ struct is_float_or_double<T,
358
+ typename std::enable_if<std::is_same<T,float>::value ||
359
+ std::is_same<T,double>::value
360
+ >::type> : std::true_type {};
361
+
362
+ // make_unsigned
363
+ template <class T>
364
+ struct make_unsigned_impl {using type = typename std::make_unsigned<T>::type;};
365
+
366
+ #if defined(JSONCONS_HAS_INT128)
367
+ template <>
368
+ struct make_unsigned_impl<int128_type> {using type = uint128_type;};
369
+ template <>
370
+ struct make_unsigned_impl<uint128_type> {using type = uint128_type;};
371
+ #endif
372
+
373
+ template <class T>
374
+ struct make_unsigned
375
+ : make_unsigned_impl<typename std::remove_cv<T>::type>
376
+ {};
377
+
378
+ // is_integer
379
+
380
+ template <class T, class Enable=void>
381
+ struct is_integer : std::false_type {};
382
+
383
+ template <class T>
384
+ struct is_integer<T,typename std::enable_if<integer_limits<T>::is_specialized>::type> : std::true_type {};
385
+
386
+ // is_signed_integer
387
+
388
+ template <class T, class Enable=void>
389
+ struct is_signed_integer : std::false_type {};
390
+
391
+ template <class T>
392
+ struct is_signed_integer<T, typename std::enable_if<integer_limits<T>::is_specialized &&
393
+ integer_limits<T>::is_signed>::type> : std::true_type {};
394
+
395
+ // is_unsigned_integer
396
+
397
+ template <class T, class Enable=void>
398
+ struct is_unsigned_integer : std::false_type {};
399
+
400
+ template <class T>
401
+ struct is_unsigned_integer<T,
402
+ typename std::enable_if<integer_limits<T>::is_specialized &&
403
+ !integer_limits<T>::is_signed>::type> : std::true_type {};
404
+
405
+ // is_primitive
406
+
407
+ template <class T, class Enable=void>
408
+ struct is_primitive : std::false_type {};
409
+
410
+ template <class T>
411
+ struct is_primitive<T,
412
+ typename std::enable_if<is_integer<T>::value ||
413
+ is_bool<T>::value ||
414
+ std::is_floating_point<T>::value
415
+ >::type> : std::true_type {};
416
+
417
+ // Containers
418
+
419
+ template <class Container>
420
+ using
421
+ container_npos_t = decltype(Container::npos);
422
+
423
+ template <class Container>
424
+ using
425
+ container_allocator_type_t = typename Container::allocator_type;
426
+
427
+ template <class Container>
428
+ using
429
+ container_mapped_type_t = typename Container::mapped_type;
430
+
431
+ template <class Container>
432
+ using
433
+ container_key_type_t = typename Container::key_type;
434
+
435
+ template <class Container>
436
+ using
437
+ container_value_type_t = typename std::iterator_traits<typename Container::iterator>::value_type;
438
+
439
+ template <class Container>
440
+ using
441
+ container_char_traits_t = typename Container::traits_type::char_type;
442
+
443
+ template<class Container>
444
+ using
445
+ container_push_back_t = decltype(std::declval<Container>().push_back(std::declval<typename Container::value_type>()));
446
+
447
+ template<class Container>
448
+ using
449
+ container_push_front_t = decltype(std::declval<Container>().push_front(std::declval<typename Container::value_type>()));
450
+
451
+ template<class Container>
452
+ using
453
+ container_insert_t = decltype(std::declval<Container>().insert(std::declval<typename Container::value_type>()));
454
+
455
+ template<class Container>
456
+ using
457
+ container_reserve_t = decltype(std::declval<Container>().reserve(typename Container::size_type()));
458
+
459
+ template<class Container>
460
+ using
461
+ container_data_t = decltype(std::declval<Container>().data());
462
+
463
+ template<class Container>
464
+ using
465
+ container_size_t = decltype(std::declval<Container>().size());
466
+
467
+ // has_allocator_type
468
+
469
+ template <class T, class Enable=void>
470
+ struct has_allocator_type : std::false_type {};
471
+
472
+ template <class T>
473
+ struct has_allocator_type<T,
474
+ typename std::enable_if<is_detected<container_allocator_type_t,T>::value
475
+ >::type> : std::true_type {};
476
+
477
+ // is_string_or_string_view
478
+
479
+ template <class T, class Enable=void>
480
+ struct is_string_or_string_view : std::false_type {};
481
+
482
+ template <class T>
483
+ struct is_string_or_string_view<T,
484
+ typename std::enable_if<is_character<typename T::value_type>::value &&
485
+ is_detected_exact<typename T::value_type,container_char_traits_t,T>::value &&
486
+ is_detected<container_npos_t,T>::value
487
+ >::type> : std::true_type {};
488
+
489
+ // is_string
490
+
491
+ template <class T, class Enable=void>
492
+ struct is_string : std::false_type {};
493
+
494
+ template <class T>
495
+ struct is_string<T,
496
+ typename std::enable_if<is_string_or_string_view<T>::value &&
497
+ has_allocator_type<T>::value
498
+ >::type> : std::true_type {};
499
+
500
+ // is_string_view
501
+
502
+ template <class T, class Enable=void>
503
+ struct is_string_view : std::false_type {};
504
+
505
+ template <class T>
506
+ struct is_string_view<T,
507
+ typename std::enable_if<is_string_or_string_view<T>::value &&
508
+ !is_detected<container_allocator_type_t,T>::value
509
+ >::type> : std::true_type {};
510
+
511
+ // is_map_like
512
+
513
+ template <class T, class Enable=void>
514
+ struct is_map_like : std::false_type {};
515
+
516
+ template <class T>
517
+ struct is_map_like<T,
518
+ typename std::enable_if<is_detected<container_mapped_type_t,T>::value &&
519
+ is_detected<container_allocator_type_t,T>::value &&
520
+ is_detected<container_key_type_t,T>::value &&
521
+ is_detected<container_value_type_t,T>::value
522
+ >::type>
523
+ : std::true_type {};
524
+
525
+ // is_std_array
526
+ template<class T>
527
+ struct is_std_array : std::false_type {};
528
+
529
+ template<class E, std::size_t N>
530
+ struct is_std_array<std::array<E, N>> : std::true_type {};
531
+
532
+ // is_list_like
533
+
534
+ template <class T, class Enable=void>
535
+ struct is_list_like : std::false_type {};
536
+
537
+ template <class T>
538
+ struct is_list_like<T,
539
+ typename std::enable_if<is_detected<container_value_type_t,T>::value &&
540
+ is_detected<container_allocator_type_t,T>::value &&
541
+ !is_std_array<T>::value &&
542
+ !is_detected_exact<typename T::value_type,container_char_traits_t,T>::value &&
543
+ !is_map_like<T>::value
544
+ >::type>
545
+ : std::true_type {};
546
+
547
+ // is_constructible_from_const_pointer_and_size
548
+
549
+ template <class T, class Enable=void>
550
+ struct is_constructible_from_const_pointer_and_size : std::false_type {};
551
+
552
+ template <class T>
553
+ struct is_constructible_from_const_pointer_and_size<T,
554
+ typename std::enable_if<std::is_constructible<T,typename T::const_pointer,typename T::size_type>::value
555
+ >::type>
556
+ : std::true_type {};
557
+
558
+ // has_reserve
559
+
560
+ template<class Container>
561
+ using
562
+ has_reserve = is_detected<container_reserve_t, Container>;
563
+
564
+ // is_back_insertable
565
+
566
+ template<class Container>
567
+ using
568
+ is_back_insertable = is_detected<container_push_back_t, Container>;
569
+
570
+ // is_front_insertable
571
+
572
+ template<class Container>
573
+ using
574
+ is_front_insertable = is_detected<container_push_front_t, Container>;
575
+
576
+ // is_insertable
577
+
578
+ template<class Container>
579
+ using
580
+ is_insertable = is_detected<container_insert_t, Container>;
581
+
582
+ // has_data, has_data_exact
583
+
584
+ template<class Container>
585
+ using
586
+ has_data = is_detected<container_data_t, Container>;
587
+
588
+ template<class Ret, class Container>
589
+ using
590
+ has_data_exact = is_detected_exact<Ret, container_data_t, Container>;
591
+
592
+ // has_size
593
+
594
+ template<class Container>
595
+ using
596
+ has_size = is_detected<container_size_t, Container>;
597
+
598
+ // has_data_and_size
599
+
600
+ template<class Container>
601
+ struct has_data_and_size
602
+ {
603
+ static constexpr bool value = has_data<Container>::value && has_size<Container>::value;
604
+ };
605
+
606
+ // is_byte_sequence
607
+
608
+ template <class Container, class Enable=void>
609
+ struct is_byte_sequence : std::false_type {};
610
+
611
+ template <class Container>
612
+ struct is_byte_sequence<Container,
613
+ typename std::enable_if<has_data_exact<const typename Container::value_type*,const Container>::value &&
614
+ has_size<Container>::value &&
615
+ is_byte<typename Container::value_type>::value
616
+ >::type> : std::true_type {};
617
+
618
+ // is_char_sequence
619
+
620
+ template <class Container, class Enable=void>
621
+ struct is_char_sequence : std::false_type {};
622
+
623
+ template <class Container>
624
+ struct is_char_sequence<Container,
625
+ typename std::enable_if<has_data_exact<const typename Container::value_type*,const Container>::value &&
626
+ has_size<Container>::value &&
627
+ is_character<typename Container::value_type>::value
628
+ >::type> : std::true_type {};
629
+
630
+ // is_sequence_of
631
+
632
+ template <class Container, class ValueT, class Enable=void>
633
+ struct is_sequence_of : std::false_type {};
634
+
635
+ template <class Container, class ValueT>
636
+ struct is_sequence_of<Container,ValueT,
637
+ typename std::enable_if<has_data_exact<const typename Container::value_type*,const Container>::value &&
638
+ has_size<Container>::value &&
639
+ std::is_same<typename Container::value_type,ValueT>::value
640
+ >::type> : std::true_type {};
641
+
642
+ // is_back_insertable_byte_container
643
+
644
+ template <class Container, class Enable=void>
645
+ struct is_back_insertable_byte_container : std::false_type {};
646
+
647
+ template <class Container>
648
+ struct is_back_insertable_byte_container<Container,
649
+ typename std::enable_if<is_back_insertable<Container>::value &&
650
+ is_byte<typename Container::value_type>::value
651
+ >::type> : std::true_type {};
652
+
653
+ // is_back_insertable_char_container
654
+
655
+ template <class Container, class Enable=void>
656
+ struct is_back_insertable_char_container : std::false_type {};
657
+
658
+ template <class Container>
659
+ struct is_back_insertable_char_container<Container,
660
+ typename std::enable_if<is_back_insertable<Container>::value &&
661
+ is_character<typename Container::value_type>::value
662
+ >::type> : std::true_type {};
663
+
664
+ // is_back_insertable_container_of
665
+
666
+ template <class Container, class ValueT, class Enable=void>
667
+ struct is_back_insertable_container_of : std::false_type {};
668
+
669
+ template <class Container, class ValueT>
670
+ struct is_back_insertable_container_of<Container, ValueT,
671
+ typename std::enable_if<is_back_insertable<Container>::value &&
672
+ std::is_same<typename Container::value_type,ValueT>::value
673
+ >::type> : std::true_type {};
674
+
675
+ // is_c_array
676
+
677
+ template<class T>
678
+ struct is_c_array : std::false_type {};
679
+
680
+ template<class T>
681
+ struct is_c_array<T[]> : std::true_type {};
682
+
683
+ template<class T, std::size_t N>
684
+ struct is_c_array<T[N]> : std::true_type {};
685
+
686
+ namespace impl {
687
+
688
+ template<class C, class Enable=void>
689
+ struct is_typed_array : std::false_type {};
690
+
691
+ template<class T>
692
+ struct is_typed_array
693
+ <
694
+ T,
695
+ typename std::enable_if<is_list_like<T>::value &&
696
+ (std::is_same<typename std::decay<typename T::value_type>::type,uint8_t>::value ||
697
+ std::is_same<typename std::decay<typename T::value_type>::type,uint16_t>::value ||
698
+ std::is_same<typename std::decay<typename T::value_type>::type,uint32_t>::value ||
699
+ std::is_same<typename std::decay<typename T::value_type>::type,uint64_t>::value ||
700
+ std::is_same<typename std::decay<typename T::value_type>::type,int8_t>::value ||
701
+ std::is_same<typename std::decay<typename T::value_type>::type,int16_t>::value ||
702
+ std::is_same<typename std::decay<typename T::value_type>::type,int32_t>::value ||
703
+ std::is_same<typename std::decay<typename T::value_type>::type,int64_t>::value ||
704
+ std::is_same<typename std::decay<typename T::value_type>::type,float_t>::value ||
705
+ std::is_same<typename std::decay<typename T::value_type>::type,double_t>::value)>::type
706
+ > : std::true_type{};
707
+
708
+ } // namespace impl
709
+
710
+ template <typename T>
711
+ using is_typed_array = impl::is_typed_array<typename std::decay<T>::type>;
712
+
713
+ // is_compatible_element
714
+
715
+ template<class Container, class Element, class Enable=void>
716
+ struct is_compatible_element : std::false_type {};
717
+
718
+ template<class Container, class Element>
719
+ struct is_compatible_element
720
+ <
721
+ Container, Element,
722
+ typename std::enable_if<has_data<Container>::value>::type>
723
+ : std::is_convertible< typename std::remove_pointer<decltype(std::declval<Container>().data() )>::type(*)[], Element(*)[]>
724
+ {};
725
+
726
+ template<typename T>
727
+ using
728
+ construct_from_string_t = decltype(T(std::string{}));
729
+
730
+
731
+ template<class T>
732
+ using
733
+ is_constructible_from_string = is_detected<construct_from_string_t,T>;
734
+
735
+ template<typename T, typename Data, typename Size>
736
+ using
737
+ construct_from_data_size_t = decltype(T(static_cast<Data>(nullptr),Size{}));
738
+
739
+
740
+ template<class T, typename Data, typename Size>
741
+ using
742
+ is_constructible_from_data_size = is_detected<construct_from_data_size_t,T,Data,Size>;
743
+
744
+ // is_unary_function_object
745
+ // is_unary_function_object_exact
746
+
747
+ template<class FunctionObject, class Arg>
748
+ using
749
+ unary_function_object_t = decltype(std::declval<FunctionObject>()(std::declval<Arg>()));
750
+
751
+ template<class FunctionObject, class Arg>
752
+ using
753
+ is_unary_function_object = is_detected<unary_function_object_t, FunctionObject, Arg>;
754
+
755
+ template<class FunctionObject, class T, class Arg>
756
+ using
757
+ is_unary_function_object_exact = is_detected_exact<T,unary_function_object_t, FunctionObject, Arg>;
758
+
759
+ // is_binary_function_object
760
+ // is_binary_function_object_exact
761
+
762
+ template<class FunctionObject, class Arg1, class Arg2>
763
+ using
764
+ binary_function_object_t = decltype(std::declval<FunctionObject>()(std::declval<Arg1>(),std::declval<Arg2>()));
765
+
766
+ template<class FunctionObject, class Arg1, class Arg2>
767
+ using
768
+ is_binary_function_object = is_detected<binary_function_object_t, FunctionObject, Arg1, Arg2>;
769
+
770
+ template<class FunctionObject, class T, class Arg1, class Arg2>
771
+ using
772
+ is_binary_function_object_exact = is_detected_exact<T,binary_function_object_t, FunctionObject, Arg1, Arg2>;
773
+
774
+ template <class Source, class Enable=void>
775
+ struct is_convertible_to_string_view : std::false_type {};
776
+
777
+ template <class Source>
778
+ struct is_convertible_to_string_view<Source,typename std::enable_if<is_string_or_string_view<Source>::value ||
779
+ is_cstring<Source>::value
780
+ >::type> : std::true_type {};
781
+
782
+ #if defined(JSONCONS_HAS_2017)
783
+ template <typename T>
784
+ using is_nothrow_swappable = std::is_nothrow_swappable<T>;
785
+ #else
786
+ template <typename T>
787
+ struct is_nothrow_swappable {
788
+ static const bool value = noexcept(swap(std::declval<T&>(), std::declval<T&>()));
789
+ };
790
+ #endif
791
+
792
+ #if defined(JSONCONS_HAS_2014)
793
+ template <class T>
794
+ using alignment_of = std::alignment_of<T>;
795
+
796
+ template< class T, T... Ints >
797
+ using integer_sequence = std::integer_sequence<T,Ints...>;
798
+
799
+ template <T ... Inds>
800
+ using index_sequence = std::index_sequence<Inds...>;
801
+
802
+ template <class T, T N>
803
+ using make_integer_sequence = std::make_integer_sequence<T,N>;
804
+
805
+ template <std::size_t N>
806
+ using make_index_sequence = std::make_index_sequence<N>;
807
+
808
+ template<class... T>
809
+ using index_sequence_for = std::index_sequence_for<T...>;
810
+
811
+ #else
812
+ template <class T>
813
+ struct alignment_of
814
+ : std::integral_constant<std::size_t, alignof(typename std::remove_all_extents<T>::type)> {};
815
+
816
+ template <class T, T... Ints>
817
+ class integer_sequence
818
+ {
819
+ public:
820
+ using value_type = T;
821
+ static_assert(std::is_integral<value_type>::value, "not integral type");
822
+ static constexpr std::size_t size() noexcept
823
+ {
824
+ return sizeof...(Ints);
825
+ }
826
+ };
827
+
828
+ template <std::size_t... Inds>
829
+ using index_sequence = integer_sequence<std::size_t, Inds...>;
830
+ namespace detail_ {
831
+ template <class T, T Begin, T End, bool>
832
+ struct IntSeqImpl {
833
+ using TValue = T;
834
+ static_assert(std::is_integral<TValue>::value, "not integral type");
835
+ static_assert(Begin >= 0 && Begin < End, "unexpected argument (Begin<0 || Begin<=End)");
836
+
837
+ template <class, class>
838
+ struct IntSeqCombiner;
839
+
840
+ template <TValue... Inds0, TValue... Inds1>
841
+ struct IntSeqCombiner<integer_sequence<TValue, Inds0...>, integer_sequence<TValue, Inds1...>> {
842
+ using TResult = integer_sequence<TValue, Inds0..., Inds1...>;
843
+ };
844
+
845
+ using TResult =
846
+ typename IntSeqCombiner<typename IntSeqImpl<TValue, Begin, Begin + (End - Begin) / 2,
847
+ (End - Begin) / 2 == 1>::TResult,
848
+ typename IntSeqImpl<TValue, Begin + (End - Begin) / 2, End,
849
+ (End - Begin + 1) / 2 == 1>::TResult>::TResult;
850
+ };
851
+
852
+ template <class T, T Begin>
853
+ struct IntSeqImpl<T, Begin, Begin, false> {
854
+ using TValue = T;
855
+ static_assert(std::is_integral<TValue>::value, "not integral type");
856
+ static_assert(Begin >= 0, "unexpected argument (Begin<0)");
857
+ using TResult = integer_sequence<TValue>;
858
+ };
859
+
860
+ template <class T, T Begin, T End>
861
+ struct IntSeqImpl<T, Begin, End, true> {
862
+ using TValue = T;
863
+ static_assert(std::is_integral<TValue>::value, "not integral type");
864
+ static_assert(Begin >= 0, "unexpected argument (Begin<0)");
865
+ using TResult = integer_sequence<TValue, Begin>;
866
+ };
867
+ } // namespace detail_
868
+
869
+ template <class T, T N>
870
+ using make_integer_sequence = typename detail_::IntSeqImpl<T, 0, N, (N - 0) == 1>::TResult;
871
+
872
+ template <std::size_t N>
873
+ using make_index_sequence = make_integer_sequence<std::size_t, N>;
874
+
875
+ template <class... T>
876
+ using index_sequence_for = make_index_sequence<sizeof...(T)>;
877
+
878
+
879
+ #endif
880
+
881
+ } // traits_extension
882
+ } // jsoncons
883
+
884
+ #endif