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.
- checksums.yaml +7 -0
- data/ext/jsoncons/extconf.rb +43 -0
- data/ext/jsoncons/jsoncons.cpp +161 -0
- data/ext/jsoncons/jsoncons.h +10 -0
- data/jsoncons.gemspec +44 -0
- data/lib/jsoncons/jsoncons/examples/input/address-book.json +13 -0
- data/lib/jsoncons/jsoncons/examples/input/books.json +28 -0
- data/lib/jsoncons/jsoncons/examples/input/countries.json +7 -0
- data/lib/jsoncons/jsoncons/examples/input/employees.json +30 -0
- data/lib/jsoncons/jsoncons/examples/input/jsonschema/name.json +15 -0
- data/lib/jsoncons/jsoncons/examples/input/multiple-json-objects.json +3 -0
- data/lib/jsoncons/jsoncons/examples/input/sales.csv +6 -0
- data/lib/jsoncons/jsoncons/examples/input/store.json +28 -0
- data/lib/jsoncons/jsoncons/examples/input/tasks.csv +6 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/allocator_holder.hpp +38 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/basic_json.hpp +5905 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/bigint.hpp +1611 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/byte_string.hpp +820 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/config/binary_config.hpp +226 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/config/compiler_support.hpp +375 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/config/jsoncons_config.hpp +309 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/config/version.hpp +40 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/conv_error.hpp +218 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/decode_json.hpp +209 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/decode_traits.hpp +651 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/detail/endian.hpp +44 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/detail/grisu3.hpp +312 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/detail/optional.hpp +483 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/detail/parse_number.hpp +1133 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/detail/span.hpp +188 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/detail/string_view.hpp +537 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/detail/string_wrapper.hpp +370 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/detail/write_number.hpp +567 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/encode_json.hpp +315 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/encode_traits.hpp +378 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/json.hpp +18 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/json_array.hpp +324 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/json_content_handler.hpp +12 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/json_cursor.hpp +448 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/json_decoder.hpp +420 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/json_encoder.hpp +1587 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/json_error.hpp +156 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/json_exception.hpp +241 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/json_filter.hpp +653 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/json_fwd.hpp +23 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/json_object.hpp +1772 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/json_options.hpp +862 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/json_parser.hpp +2900 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/json_reader.hpp +731 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/json_traits_macros.hpp +1072 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/json_traits_macros_deprecated.hpp +144 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/json_type.hpp +206 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/json_type_traits.hpp +1830 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/json_visitor.hpp +1560 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/json_visitor2.hpp +2079 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/pretty_print.hpp +89 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/ser_context.hpp +62 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/sink.hpp +289 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/source.hpp +777 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/source_adaptor.hpp +148 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/staj2_cursor.hpp +1189 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/staj_cursor.hpp +1254 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/staj_iterator.hpp +449 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/tag_type.hpp +245 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/text_source_adaptor.hpp +144 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/traits_extension.hpp +884 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/typed_array_view.hpp +250 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/unicode_traits.hpp +1330 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/uri.hpp +635 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/value_converter.hpp +340 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson.hpp +23 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_cursor.hpp +320 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_decimal128.hpp +865 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_encoder.hpp +585 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_error.hpp +103 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_oid.hpp +245 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_options.hpp +75 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_parser.hpp +645 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_reader.hpp +92 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_type.hpp +44 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/decode_bson.hpp +201 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/encode_bson.hpp +144 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor.hpp +26 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor_cursor.hpp +351 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor_cursor2.hpp +265 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor_detail.hpp +93 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor_encoder.hpp +1766 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor_error.hpp +105 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor_options.hpp +113 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor_parser.hpp +1942 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor_reader.hpp +116 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/decode_cbor.hpp +203 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/encode_cbor.hpp +151 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/csv.hpp +17 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/csv_cursor.hpp +358 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/csv_encoder.hpp +954 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/csv_error.hpp +85 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/csv_options.hpp +973 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/csv_parser.hpp +2099 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/csv_reader.hpp +348 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/csv_serializer.hpp +12 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/decode_csv.hpp +208 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/encode_csv.hpp +122 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jmespath/jmespath.hpp +5215 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jmespath/jmespath_error.hpp +215 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpatch/jsonpatch.hpp +579 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpatch/jsonpatch_error.hpp +121 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpath/expression.hpp +3329 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpath/flatten.hpp +432 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpath/json_location.hpp +445 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpath/json_query.hpp +115 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpath/jsonpath.hpp +13 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpath/jsonpath_error.hpp +240 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpath/jsonpath_expression.hpp +2612 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpath/jsonpath_selector.hpp +1322 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpointer/jsonpointer.hpp +1577 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpointer/jsonpointer_error.hpp +119 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/format_validator.hpp +968 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/json_validator.hpp +120 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/jsonschema.hpp +13 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/jsonschema_error.hpp +105 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/jsonschema_version.hpp +18 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/keyword_validator.hpp +1745 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/keyword_validator_factory.hpp +556 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/schema_draft7.hpp +198 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/schema_location.hpp +200 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/schema_version.hpp +35 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/subschema.hpp +144 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/mergepatch/mergepatch.hpp +103 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/decode_msgpack.hpp +202 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/encode_msgpack.hpp +142 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack.hpp +24 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack_cursor.hpp +343 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack_cursor2.hpp +259 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack_encoder.hpp +753 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack_error.hpp +94 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack_options.hpp +74 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack_parser.hpp +748 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack_reader.hpp +116 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack_type.hpp +63 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/decode_ubjson.hpp +201 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/encode_ubjson.hpp +142 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/ubjson.hpp +23 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/ubjson_cursor.hpp +307 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/ubjson_encoder.hpp +502 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/ubjson_error.hpp +100 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/ubjson_options.hpp +87 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/ubjson_parser.hpp +880 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/ubjson_reader.hpp +92 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/ubjson_type.hpp +43 -0
- data/lib/jsoncons/version.rb +5 -0
- data/lib/jsoncons.rb +33 -0
- data/test/jsoncons_test.rb +108 -0
- data/test/test_helper.rb +7 -0
- metadata +268 -0
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
// Copyright 2017 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_CONFIG_BINARY_CONFIG_HPP
|
|
8
|
+
#define JSONCONS_CONFIG_BINARY_CONFIG_HPP
|
|
9
|
+
|
|
10
|
+
#include <cfloat>
|
|
11
|
+
#include <cstddef>
|
|
12
|
+
#include <cstdint>
|
|
13
|
+
#include <cstring> // std::memcpy
|
|
14
|
+
#include <memory>
|
|
15
|
+
#include <type_traits> // std::enable_if
|
|
16
|
+
|
|
17
|
+
// The definitions below follow the definitions in compiler_support_p.h, https://github.com/01org/tinycbor
|
|
18
|
+
// MIT license
|
|
19
|
+
|
|
20
|
+
#ifdef __F16C__
|
|
21
|
+
# include <immintrin.h>
|
|
22
|
+
#endif
|
|
23
|
+
|
|
24
|
+
#ifndef __has_builtin
|
|
25
|
+
# define __has_builtin(x) 0
|
|
26
|
+
#endif
|
|
27
|
+
|
|
28
|
+
#if defined(__GNUC__)
|
|
29
|
+
#if (__GNUC__ * 100 + __GNUC_MINOR__ >= 403) || (__has_builtin(__builtin_bswap64) && __has_builtin(__builtin_bswap32))
|
|
30
|
+
# define JSONCONS_BYTE_SWAP_64 __builtin_bswap64
|
|
31
|
+
# define JSONCONS_BYTE_SWAP_32 __builtin_bswap32
|
|
32
|
+
# ifdef __INTEL_COMPILER
|
|
33
|
+
# define JSONCONS_BYTE_SWAP_16 _bswap16
|
|
34
|
+
# elif (__GNUC__ * 100 + __GNUC_MINOR__ >= 608) || __has_builtin(__builtin_bswap16)
|
|
35
|
+
# define JSONCONS_BYTE_SWAP_16 __builtin_bswap16
|
|
36
|
+
# endif
|
|
37
|
+
#endif
|
|
38
|
+
#elif defined(__sun)
|
|
39
|
+
# include <sys/byteorder.h>
|
|
40
|
+
#elif defined(_MSC_VER)
|
|
41
|
+
// MSVC, which implies sizeof(long) == 4
|
|
42
|
+
# define JSONCONS_BYTE_SWAP_64 _byteswap_uint64
|
|
43
|
+
# define JSONCONS_BYTE_SWAP_32 _byteswap_ulong
|
|
44
|
+
# define JSONCONS_BYTE_SWAP_16 _byteswap_ushort
|
|
45
|
+
#endif
|
|
46
|
+
|
|
47
|
+
namespace jsoncons {
|
|
48
|
+
namespace binary {
|
|
49
|
+
|
|
50
|
+
struct uint128_holder
|
|
51
|
+
{
|
|
52
|
+
uint64_t lo;
|
|
53
|
+
uint64_t hi;
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
static inline bool add_check_overflow(std::size_t v1, std::size_t v2, std::size_t *r)
|
|
57
|
+
{
|
|
58
|
+
#if ((defined(__GNUC__) && (__GNUC__ >= 5)) && !defined(__INTEL_COMPILER)) || __has_builtin(__builtin_add_overflow)
|
|
59
|
+
return __builtin_add_overflow(v1, v2, r);
|
|
60
|
+
#else
|
|
61
|
+
// unsigned additions are well-defined
|
|
62
|
+
*r = v1 + v2;
|
|
63
|
+
return v1 > v1 + v2;
|
|
64
|
+
#endif
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
#if defined(__apple_build_version__) && ((__clang_major__ < 8) || ((__clang_major__ == 8) && (__clang_minor__ < 1)))
|
|
68
|
+
#define APPLE_MISSING_INTRINSICS 1
|
|
69
|
+
#endif
|
|
70
|
+
|
|
71
|
+
inline
|
|
72
|
+
uint16_t encode_half(double val)
|
|
73
|
+
{
|
|
74
|
+
#if defined(__F16C__) && !defined(APPLE_MISSING_INTRINSICS)
|
|
75
|
+
return _cvtss_sh((float)val, 3);
|
|
76
|
+
#else
|
|
77
|
+
uint64_t v;
|
|
78
|
+
std::memcpy(&v, &val, sizeof(v));
|
|
79
|
+
int64_t sign = static_cast<int64_t>(v >> 63 << 15);
|
|
80
|
+
int64_t exp = (v >> 52) & 0x7ff;
|
|
81
|
+
int64_t mant = v << 12 >> 12 >> (53-11); /* keep only the 11 most significant bits of the mantissa */
|
|
82
|
+
exp -= 1023;
|
|
83
|
+
if (exp == 1024) {
|
|
84
|
+
/* infinity or NaN */
|
|
85
|
+
exp = 16;
|
|
86
|
+
mant >>= 1;
|
|
87
|
+
} else if (exp >= 16) {
|
|
88
|
+
/* overflow, as largest number */
|
|
89
|
+
exp = 15;
|
|
90
|
+
mant = 1023;
|
|
91
|
+
} else if (exp >= -14) {
|
|
92
|
+
/* regular normal */
|
|
93
|
+
} else if (exp >= -24) {
|
|
94
|
+
/* subnormal */
|
|
95
|
+
mant |= 1024;
|
|
96
|
+
mant >>= -(exp + 14);
|
|
97
|
+
exp = -15;
|
|
98
|
+
} else {
|
|
99
|
+
/* underflow, make zero */
|
|
100
|
+
return 0;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/* safe cast here as bit operations above guarantee not to overflow */
|
|
104
|
+
return static_cast<uint16_t>(sign | ((exp + 15) << 10) | mant);
|
|
105
|
+
#endif
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/* this function was copied & adapted from RFC 7049 Appendix D */
|
|
109
|
+
inline
|
|
110
|
+
double decode_half(uint16_t half)
|
|
111
|
+
{
|
|
112
|
+
#if defined(__F16C__) && !defined(APPLE_MISSING_INTRINSICS)
|
|
113
|
+
return _cvtsh_ss(half);
|
|
114
|
+
#else
|
|
115
|
+
int64_t exp = (half >> 10) & 0x1f;
|
|
116
|
+
int64_t mant = half & 0x3ff;
|
|
117
|
+
double val;
|
|
118
|
+
if (exp == 0)
|
|
119
|
+
{
|
|
120
|
+
val = ldexp(static_cast<double>(mant), -24);
|
|
121
|
+
}
|
|
122
|
+
else if (exp != 31)
|
|
123
|
+
{
|
|
124
|
+
val = ldexp(static_cast<double>(mant) + 1024.0, static_cast<int>(exp - 25));
|
|
125
|
+
}
|
|
126
|
+
else
|
|
127
|
+
{
|
|
128
|
+
val = mant == 0 ? std::numeric_limits<double>::infinity() : std::nan("");
|
|
129
|
+
}
|
|
130
|
+
return half & 0x8000 ? -val : val;
|
|
131
|
+
#endif
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// byte_swap
|
|
135
|
+
|
|
136
|
+
template<class T>
|
|
137
|
+
typename std::enable_if<std::is_integral<T>::value && sizeof(T) == sizeof(uint8_t),T>::type
|
|
138
|
+
byte_swap(T val)
|
|
139
|
+
{
|
|
140
|
+
return val;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
template<class T>
|
|
144
|
+
typename std::enable_if<std::is_integral<T>::value && sizeof(T) == sizeof(uint16_t),T>::type
|
|
145
|
+
byte_swap(T val)
|
|
146
|
+
{
|
|
147
|
+
#if defined(JSONCONS_BYTE_SWAP_16)
|
|
148
|
+
return JSONCONS_BYTE_SWAP_16(val);
|
|
149
|
+
#else
|
|
150
|
+
return (static_cast<uint16_t>(val) >> 8) | (static_cast<uint16_t>(val) << 8);
|
|
151
|
+
#endif
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
template<class T>
|
|
155
|
+
typename std::enable_if<std::is_integral<T>::value && sizeof(T) == sizeof(uint32_t),T>::type
|
|
156
|
+
byte_swap(T val)
|
|
157
|
+
{
|
|
158
|
+
#if defined(JSONCONS_BYTE_SWAP_32)
|
|
159
|
+
return JSONCONS_BYTE_SWAP_32(val);
|
|
160
|
+
#else
|
|
161
|
+
uint32_t tmp = ((static_cast<uint32_t>(val) << 8) & 0xff00ff00) | ((static_cast<uint32_t>(val) >> 8) & 0xff00ff);
|
|
162
|
+
return (tmp << 16) | (tmp >> 16);
|
|
163
|
+
#endif
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
template<class T>
|
|
167
|
+
typename std::enable_if<std::is_integral<T>::value && sizeof(T) == sizeof(uint64_t),T>::type
|
|
168
|
+
byte_swap(T val)
|
|
169
|
+
{
|
|
170
|
+
#if defined(JSONCONS_BYTE_SWAP_64)
|
|
171
|
+
return JSONCONS_BYTE_SWAP_64(val);
|
|
172
|
+
#else
|
|
173
|
+
uint64_t tmp = ((static_cast<uint64_t>(val) & 0x00000000ffffffffull) << 32) | ((static_cast<uint64_t>(val) & 0xffffffff00000000ull) >> 32);
|
|
174
|
+
tmp = ((tmp & 0x0000ffff0000ffffull) << 16) | ((tmp & 0xffff0000ffff0000ull) >> 16);
|
|
175
|
+
return ((tmp & 0x00ff00ff00ff00ffull) << 8) | ((tmp & 0xff00ff00ff00ff00ull) >> 8);
|
|
176
|
+
#endif
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
template<class T>
|
|
180
|
+
typename std::enable_if<std::is_floating_point<T>::value && sizeof(T) == sizeof(uint32_t),T>::type
|
|
181
|
+
byte_swap(T val)
|
|
182
|
+
{
|
|
183
|
+
uint32_t x;
|
|
184
|
+
std::memcpy(&x,&val,sizeof(uint32_t));
|
|
185
|
+
uint32_t y = byte_swap(x);
|
|
186
|
+
T val2;
|
|
187
|
+
std::memcpy(&val2,&y,sizeof(uint32_t));
|
|
188
|
+
return val2;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
template<class T>
|
|
192
|
+
typename std::enable_if<std::is_floating_point<T>::value && sizeof(T) == sizeof(uint64_t),T>::type
|
|
193
|
+
byte_swap(T val)
|
|
194
|
+
{
|
|
195
|
+
uint64_t x;
|
|
196
|
+
std::memcpy(&x,&val,sizeof(uint64_t));
|
|
197
|
+
uint64_t y = byte_swap(x);
|
|
198
|
+
T val2;
|
|
199
|
+
std::memcpy(&val2,&y,sizeof(uint64_t));
|
|
200
|
+
return val2;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
template<class T>
|
|
204
|
+
typename std::enable_if<std::is_floating_point<T>::value && sizeof(T) == 2*sizeof(uint64_t),T>::type
|
|
205
|
+
byte_swap(T val)
|
|
206
|
+
{
|
|
207
|
+
uint128_holder x;
|
|
208
|
+
uint8_t buf[2*sizeof(uint64_t)];
|
|
209
|
+
std::memcpy(buf,&val,2*sizeof(uint64_t));
|
|
210
|
+
std::memcpy(&x.lo,buf,sizeof(uint64_t));
|
|
211
|
+
std::memcpy(&x.hi,buf+sizeof(uint64_t),sizeof(uint64_t));
|
|
212
|
+
|
|
213
|
+
uint128_holder y;
|
|
214
|
+
y.lo = byte_swap(x.hi);
|
|
215
|
+
y.hi = byte_swap(x.lo);
|
|
216
|
+
|
|
217
|
+
T val2;
|
|
218
|
+
std::memcpy(&val2,&y,2*sizeof(uint64_t));
|
|
219
|
+
|
|
220
|
+
return val2;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
} // binary
|
|
224
|
+
} // jsoncons
|
|
225
|
+
|
|
226
|
+
#endif
|
|
@@ -0,0 +1,375 @@
|
|
|
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_COMPILER_SUPPORT_HPP
|
|
8
|
+
#define JSONCONS_COMPILER_SUPPORT_HPP
|
|
9
|
+
|
|
10
|
+
#include <stdexcept>
|
|
11
|
+
#include <string>
|
|
12
|
+
#include <cmath>
|
|
13
|
+
#include <exception>
|
|
14
|
+
#include <ostream>
|
|
15
|
+
|
|
16
|
+
#if defined (__clang__)
|
|
17
|
+
#define JSONCONS_CLANG_VERSION (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__)
|
|
18
|
+
#endif
|
|
19
|
+
|
|
20
|
+
// Uncomment the following line to suppress deprecated names (recommended for new code)
|
|
21
|
+
//#define JSONCONS_NO_DEPRECATED
|
|
22
|
+
|
|
23
|
+
// The definitions below follow the definitions in compiler_support_p.h, https://github.com/01org/tinycbor
|
|
24
|
+
// MIT license
|
|
25
|
+
|
|
26
|
+
// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=54577
|
|
27
|
+
#if defined(__GNUC__) && __GNUC__ == 4 && __GNUC_MINOR__ < 9
|
|
28
|
+
#define JSONCONS_NO_VECTOR_ERASE_TAKES_CONST_ITERATOR 1
|
|
29
|
+
#define JSONCONS_NO_MAP_CONS_TAKES_ALLOCATOR 1
|
|
30
|
+
#endif
|
|
31
|
+
|
|
32
|
+
#if defined(__clang__)
|
|
33
|
+
# define JSONCONS_FALLTHROUGH [[clang::fallthrough]]
|
|
34
|
+
#elif defined(__GNUC__) && ((__GNUC__ >= 7))
|
|
35
|
+
# define JSONCONS_FALLTHROUGH __attribute__((fallthrough))
|
|
36
|
+
#elif defined (__GNUC__)
|
|
37
|
+
# define JSONCONS_FALLTHROUGH // FALLTHRU
|
|
38
|
+
#else
|
|
39
|
+
# define JSONCONS_FALLTHROUGH
|
|
40
|
+
#endif
|
|
41
|
+
|
|
42
|
+
#if defined(__GNUC__) || defined(__clang__)
|
|
43
|
+
#define JSONCONS_LIKELY(x) __builtin_expect(!!(x), 1)
|
|
44
|
+
#define JSONCONS_UNLIKELY(x) __builtin_expect(!!(x), 0)
|
|
45
|
+
#define JSONCONS_UNREACHABLE() __builtin_unreachable()
|
|
46
|
+
#elif defined(_MSC_VER)
|
|
47
|
+
#define JSONCONS_LIKELY(x) x
|
|
48
|
+
#define JSONCONS_UNLIKELY(x) x
|
|
49
|
+
#define JSONCONS_UNREACHABLE() __assume(0)
|
|
50
|
+
#else
|
|
51
|
+
#define JSONCONS_LIKELY(x) x
|
|
52
|
+
#define JSONCONS_UNLIKELY(x) x
|
|
53
|
+
#define JSONCONS_UNREACHABLE() do {} while (0)
|
|
54
|
+
#endif
|
|
55
|
+
|
|
56
|
+
// Deprecated symbols markup
|
|
57
|
+
#if (defined(__cplusplus) && __cplusplus >= 201402L)
|
|
58
|
+
#define JSONCONS_DEPRECATED_MSG(msg) [[deprecated(msg)]]
|
|
59
|
+
#endif
|
|
60
|
+
|
|
61
|
+
#if !defined(JSONCONS_DEPRECATED_MSG) && defined(__GNUC__) && defined(__has_extension)
|
|
62
|
+
#if __has_extension(attribute_deprecated_with_message)
|
|
63
|
+
#define JSONCONS_DEPRECATED_MSG(msg) __attribute__((deprecated(msg)))
|
|
64
|
+
#endif
|
|
65
|
+
#endif
|
|
66
|
+
|
|
67
|
+
#if !defined(JSONCONS_DEPRECATED_MSG) && defined(_MSC_VER)
|
|
68
|
+
#if (_MSC_VER) >= 1920
|
|
69
|
+
#define JSONCONS_DEPRECATED_MSG(msg) [[deprecated(msg)]]
|
|
70
|
+
#else
|
|
71
|
+
#define JSONCONS_DEPRECATED_MSG(msg) __declspec(deprecated(msg))
|
|
72
|
+
#endif
|
|
73
|
+
#endif
|
|
74
|
+
|
|
75
|
+
// Following boost/atomic/detail/config.hpp
|
|
76
|
+
#if !defined(JSONCONS_DEPRECATED_MSG) && (\
|
|
77
|
+
(defined(__GNUC__) && ((__GNUC__ + 0) * 100 + (__GNUC_MINOR__ + 0)) >= 405) ||\
|
|
78
|
+
(defined(__SUNPRO_CC) && (__SUNPRO_CC + 0) >= 0x5130))
|
|
79
|
+
#define JSONCONS_DEPRECATED_MSG(msg) __attribute__((deprecated(msg)))
|
|
80
|
+
#endif
|
|
81
|
+
|
|
82
|
+
#if !defined(JSONCONS_DEPRECATED_MSG) && defined(__clang__) && defined(__has_extension)
|
|
83
|
+
#if __has_extension(attribute_deprecated_with_message)
|
|
84
|
+
#define JSONCONS_DEPRECATED_MSG(msg) __attribute__((deprecated(msg)))
|
|
85
|
+
#else
|
|
86
|
+
#define JSONCONS_DEPRECATED_MSG(msg) __attribute__((deprecated))
|
|
87
|
+
#endif
|
|
88
|
+
#endif
|
|
89
|
+
|
|
90
|
+
#if !defined(JSONCONS_DEPRECATED_MSG)
|
|
91
|
+
#define JSONCONS_DEPRECATED_MSG(msg)
|
|
92
|
+
#endif
|
|
93
|
+
|
|
94
|
+
#if defined(ANDROID) || defined(__ANDROID__)
|
|
95
|
+
#if __ANDROID_API__ >= 21
|
|
96
|
+
#define JSONCONS_HAS_STRTOLD_L
|
|
97
|
+
#else
|
|
98
|
+
#define JSONCONS_NO_LOCALECONV
|
|
99
|
+
#endif
|
|
100
|
+
#endif
|
|
101
|
+
|
|
102
|
+
#if defined(_MSC_VER)
|
|
103
|
+
#define JSONCONS_HAS_MSC_STRTOD_L
|
|
104
|
+
#define JSONCONS_HAS_FOPEN_S
|
|
105
|
+
#endif
|
|
106
|
+
|
|
107
|
+
#ifndef JSONCONS_HAS_CP14
|
|
108
|
+
#if defined(_MSVC_LANG)
|
|
109
|
+
#if _MSVC_LANG >= 201402L
|
|
110
|
+
#define JSONCONS_HAS_CP14
|
|
111
|
+
#endif
|
|
112
|
+
#elif __cplusplus >= 201402L
|
|
113
|
+
#define JSONCONS_HAS_CP14
|
|
114
|
+
#endif
|
|
115
|
+
#endif
|
|
116
|
+
|
|
117
|
+
#if defined(JSONCONS_HAS_STD_FROM_CHARS) && JSONCONS_HAS_STD_FROM_CHARS
|
|
118
|
+
#include <charconv>
|
|
119
|
+
#endif
|
|
120
|
+
|
|
121
|
+
#if !defined(JSONCONS_HAS_2017)
|
|
122
|
+
# if defined(__clang__)
|
|
123
|
+
# if (__cplusplus >= 201703)
|
|
124
|
+
# define JSONCONS_HAS_2017 1
|
|
125
|
+
# endif // (__cplusplus >= 201703)
|
|
126
|
+
# endif // defined(__clang__)
|
|
127
|
+
# if defined(__GNUC__)
|
|
128
|
+
# if (__GNUC__ >= 7)
|
|
129
|
+
# if (__cplusplus >= 201703)
|
|
130
|
+
# define JSONCONS_HAS_2017 1
|
|
131
|
+
# endif // (__cplusplus >= 201703)
|
|
132
|
+
# endif // (__GNUC__ >= 7)
|
|
133
|
+
# endif // defined(__GNUC__)
|
|
134
|
+
# if defined(_MSC_VER)
|
|
135
|
+
# if (_MSC_VER >= 1910 && _MSVC_LANG >= 201703)
|
|
136
|
+
# define JSONCONS_HAS_2017 1
|
|
137
|
+
# endif // (_MSC_VER >= 1910 && MSVC_LANG >= 201703)
|
|
138
|
+
# endif // defined(_MSC_VER)
|
|
139
|
+
#endif
|
|
140
|
+
|
|
141
|
+
#if defined(JSONCONS_HAS_2017)
|
|
142
|
+
#define JSONCONS_NODISCARD [[nodiscard]]
|
|
143
|
+
#define JSONCONS_IF_CONSTEXPR if constexpr
|
|
144
|
+
#else
|
|
145
|
+
#define JSONCONS_NODISCARD
|
|
146
|
+
#define JSONCONS_IF_CONSTEXPR if
|
|
147
|
+
#endif
|
|
148
|
+
|
|
149
|
+
#if !defined(JSONCONS_HAS_STD_STRING_VIEW)
|
|
150
|
+
# if (defined JSONCONS_HAS_2017)
|
|
151
|
+
# if defined(__clang__)
|
|
152
|
+
# if __has_include(<string_view>)
|
|
153
|
+
# define JSONCONS_HAS_STD_STRING_VIEW 1
|
|
154
|
+
# endif // __has_include(<string_view>)
|
|
155
|
+
# else
|
|
156
|
+
# define JSONCONS_HAS_STD_STRING_VIEW 1
|
|
157
|
+
# endif
|
|
158
|
+
# endif // defined(JSONCONS_HAS_2017)
|
|
159
|
+
#endif // !defined(JSONCONS_HAS_STD_STRING_VIEW)
|
|
160
|
+
|
|
161
|
+
#if !defined(JSONCONS_HAS_STD_BYTE)
|
|
162
|
+
# if (defined JSONCONS_HAS_2017)
|
|
163
|
+
# define JSONCONS_HAS_STD_BYTE 1
|
|
164
|
+
# endif // defined(JSONCONS_HAS_2017)
|
|
165
|
+
#endif // !defined(JSONCONS_HAS_STD_BYTE)
|
|
166
|
+
|
|
167
|
+
#if !defined(JSONCONS_HAS_STD_OPTIONAL)
|
|
168
|
+
# if (defined JSONCONS_HAS_2017)
|
|
169
|
+
# if defined(__clang__)
|
|
170
|
+
# if __has_include(<optional>)
|
|
171
|
+
# define JSONCONS_HAS_STD_OPTIONAL 1
|
|
172
|
+
# endif // __has_include(<string_view>)
|
|
173
|
+
# else
|
|
174
|
+
# define JSONCONS_HAS_STD_OPTIONAL 1
|
|
175
|
+
# endif
|
|
176
|
+
# endif // defined(JSONCONS_HAS_2017)
|
|
177
|
+
#endif // !defined(JSONCONS_HAS_STD_OPTIONAL)
|
|
178
|
+
|
|
179
|
+
#if !defined(JSONCONS_HAS_STD_VARIANT)
|
|
180
|
+
# if (defined JSONCONS_HAS_2017)
|
|
181
|
+
# if defined(__clang__)
|
|
182
|
+
# if defined(__APPLE__)
|
|
183
|
+
# if JSONCONS_CLANG_VERSION >= 100001
|
|
184
|
+
# define JSONCONS_HAS_STD_VARIANT 1
|
|
185
|
+
# endif
|
|
186
|
+
# elif __has_include(<variant>)
|
|
187
|
+
# define JSONCONS_HAS_STD_VARIANT 1
|
|
188
|
+
# endif // __has_include(<variant>)
|
|
189
|
+
# else
|
|
190
|
+
# define JSONCONS_HAS_STD_VARIANT 1
|
|
191
|
+
# endif
|
|
192
|
+
# endif // defined(JSONCONS_HAS_2017)
|
|
193
|
+
#endif // !defined(JSONCONS_HAS_STD_VARIANT)
|
|
194
|
+
|
|
195
|
+
#if !defined(JSONCONS_HAS_FILESYSTEM)
|
|
196
|
+
# if (defined JSONCONS_HAS_2017)
|
|
197
|
+
# if defined(__clang__)
|
|
198
|
+
# if __has_include(<filesystem>)
|
|
199
|
+
# define JSONCONS_HAS_FILESYSTEM 1
|
|
200
|
+
# endif // __has_include(<filesystem>)
|
|
201
|
+
# else
|
|
202
|
+
# define JSONCONS_HAS_FILESYSTEM 1
|
|
203
|
+
# endif
|
|
204
|
+
# endif // defined(JSONCONS_HAS_2017)
|
|
205
|
+
#endif // !defined(JSONCONS_HAS_FILESYSTEM)
|
|
206
|
+
|
|
207
|
+
#if (!defined(JSONCONS_NO_EXCEPTIONS))
|
|
208
|
+
// Check if exceptions are disabled.
|
|
209
|
+
# if defined( __cpp_exceptions) && __cpp_exceptions == 0
|
|
210
|
+
# define JSONCONS_NO_EXCEPTIONS 1
|
|
211
|
+
# endif
|
|
212
|
+
#endif
|
|
213
|
+
|
|
214
|
+
#if !defined(JSONCONS_NO_EXCEPTIONS)
|
|
215
|
+
|
|
216
|
+
#if defined(__GNUC__) && !__EXCEPTIONS
|
|
217
|
+
# define JSONCONS_NO_EXCEPTIONS 1
|
|
218
|
+
#elif _MSC_VER
|
|
219
|
+
#if defined(_HAS_EXCEPTIONS) && _HAS_EXCEPTIONS == 0
|
|
220
|
+
# define JSONCONS_NO_EXCEPTIONS 1
|
|
221
|
+
#elif !defined(_CPPUNWIND)
|
|
222
|
+
# define JSONCONS_NO_EXCEPTIONS 1
|
|
223
|
+
#endif
|
|
224
|
+
#endif
|
|
225
|
+
#endif
|
|
226
|
+
|
|
227
|
+
// allow to disable exceptions
|
|
228
|
+
#if !defined(JSONCONS_NO_EXCEPTIONS)
|
|
229
|
+
#define JSONCONS_THROW(exception) throw exception
|
|
230
|
+
#define JSONCONS_RETHROW throw
|
|
231
|
+
#define JSONCONS_TRY try
|
|
232
|
+
#define JSONCONS_CATCH(exception) catch(exception)
|
|
233
|
+
#else
|
|
234
|
+
#define JSONCONS_THROW(exception) std::terminate()
|
|
235
|
+
#define JSONCONS_RETHROW std::terminate()
|
|
236
|
+
#define JSONCONS_TRY if (true)
|
|
237
|
+
#define JSONCONS_CATCH(exception) if (false)
|
|
238
|
+
#endif
|
|
239
|
+
|
|
240
|
+
#if !defined(JSONCONS_HAS_STD_MAKE_UNIQUE)
|
|
241
|
+
#if defined(__clang__) && defined(__cplusplus)
|
|
242
|
+
#if defined(__APPLE__)
|
|
243
|
+
#if __clang_major__ >= 6 && __cplusplus >= 201402L // Xcode 6
|
|
244
|
+
#define JSONCONS_HAS_STD_MAKE_UNIQUE
|
|
245
|
+
#endif
|
|
246
|
+
#elif ((__clang_major__*100 +__clang_minor__) >= 340) && __cplusplus >= 201402L
|
|
247
|
+
#define JSONCONS_HAS_STD_MAKE_UNIQUE
|
|
248
|
+
#endif
|
|
249
|
+
#elif defined(__GNUC__)
|
|
250
|
+
#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L
|
|
251
|
+
#define JSONCONS_HAS_STD_MAKE_UNIQUE
|
|
252
|
+
#endif
|
|
253
|
+
#elif defined(_MSC_VER)
|
|
254
|
+
#if _MSC_VER >= 1800
|
|
255
|
+
#define JSONCONS_HAS_STD_MAKE_UNIQUE
|
|
256
|
+
#endif
|
|
257
|
+
#endif
|
|
258
|
+
#endif // !defined(JSONCONS_HAS_STD_MAKE_UNIQUE)
|
|
259
|
+
|
|
260
|
+
#ifndef JSONCONS_HAS_CP14_CONSTEXPR
|
|
261
|
+
#if defined(_MSC_VER)
|
|
262
|
+
#if _MSC_VER >= 1910
|
|
263
|
+
#define JSONCONS_HAS_CP14_CONSTEXPR
|
|
264
|
+
#endif
|
|
265
|
+
#elif defined(__GNUC__)
|
|
266
|
+
#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 600 && __cplusplus >= 201402L
|
|
267
|
+
#define JSONCONS_HAS_CP14_CONSTEXPR
|
|
268
|
+
#endif
|
|
269
|
+
#endif
|
|
270
|
+
#endif
|
|
271
|
+
|
|
272
|
+
#if defined(JSONCONS_HAS_CP14_CONSTEXPR)
|
|
273
|
+
# define JSONCONS_CPP14_CONSTEXPR constexpr
|
|
274
|
+
#else
|
|
275
|
+
# define JSONCONS_CPP14_CONSTEXPR
|
|
276
|
+
#endif
|
|
277
|
+
|
|
278
|
+
// Follows boost
|
|
279
|
+
|
|
280
|
+
// gcc and clang
|
|
281
|
+
#if (defined(__clang__) || defined(__GNUC__)) && defined(__cplusplus)
|
|
282
|
+
#if defined(__SIZEOF_INT128__) && !defined(_MSC_VER)
|
|
283
|
+
# define JSONCONS_HAS_INT128
|
|
284
|
+
#endif
|
|
285
|
+
|
|
286
|
+
#if (defined(linux) || defined(__linux) || defined(__linux__) || defined(__GNU__) || defined(__GLIBC__)) && !defined(_CRAYC)
|
|
287
|
+
#if (__clang_major__ >= 4) && defined(__has_include)
|
|
288
|
+
#if __has_include(<quadmath.h>)
|
|
289
|
+
# define JSONCONS_HAS_FLOAT128
|
|
290
|
+
#endif
|
|
291
|
+
#endif
|
|
292
|
+
#endif
|
|
293
|
+
#endif
|
|
294
|
+
|
|
295
|
+
#if defined(__GNUC__)
|
|
296
|
+
#if defined(_GLIBCXX_USE_FLOAT128)
|
|
297
|
+
# define JSONCONS_HAS_FLOAT128
|
|
298
|
+
#endif
|
|
299
|
+
#endif
|
|
300
|
+
|
|
301
|
+
#if defined(__clang__)
|
|
302
|
+
#if (defined(linux) || defined(__linux) || defined(__linux__) || defined(__GNU__) || defined(__GLIBC__)) && !defined(_CRAYC)
|
|
303
|
+
#if (__clang_major__ >= 4) && defined(__has_include)
|
|
304
|
+
#if __has_include(<quadmath.h>)
|
|
305
|
+
# define JSONCONS_HAS_FLOAT128
|
|
306
|
+
#endif
|
|
307
|
+
#endif
|
|
308
|
+
#endif
|
|
309
|
+
#endif
|
|
310
|
+
|
|
311
|
+
// Follows boost config/detail/suffix.hpp
|
|
312
|
+
#if defined(JSONCONS_HAS_INT128) && defined(__cplusplus)
|
|
313
|
+
namespace jsoncons{
|
|
314
|
+
# ifdef __GNUC__
|
|
315
|
+
__extension__ typedef __int128 int128_type;
|
|
316
|
+
__extension__ typedef unsigned __int128 uint128_type;
|
|
317
|
+
# else
|
|
318
|
+
typedef __int128 int128_type;
|
|
319
|
+
typedef unsigned __int128 uint128_type;
|
|
320
|
+
# endif
|
|
321
|
+
}
|
|
322
|
+
#endif
|
|
323
|
+
#if defined(JSONCONS_HAS_FLOAT128) && defined(__cplusplus)
|
|
324
|
+
namespace jsoncons {
|
|
325
|
+
# ifdef __GNUC__
|
|
326
|
+
__extension__ typedef __float128 float128_type;
|
|
327
|
+
# else
|
|
328
|
+
typedef __float128 float128_type;
|
|
329
|
+
# endif
|
|
330
|
+
}
|
|
331
|
+
#endif
|
|
332
|
+
|
|
333
|
+
#if defined(_MSC_VER) && _MSC_VER <= 1900
|
|
334
|
+
#define JSONCONS_COPY(first,last,d_first) std::copy(first, last, stdext::make_checked_array_iterator(d_first, static_cast<std::size_t>(std::distance(first, last))))
|
|
335
|
+
#else
|
|
336
|
+
#define JSONCONS_COPY(first,last,d_first) std::copy(first, last, d_first)
|
|
337
|
+
#endif
|
|
338
|
+
|
|
339
|
+
#if defined(_MSC_VER) && _MSC_VER <= 1900
|
|
340
|
+
#define JSONCONS_CONSTEXPR
|
|
341
|
+
#else
|
|
342
|
+
#define JSONCONS_CONSTEXPR constexpr
|
|
343
|
+
#endif
|
|
344
|
+
|
|
345
|
+
namespace jsoncons {
|
|
346
|
+
|
|
347
|
+
class assertion_error : public std::runtime_error
|
|
348
|
+
{
|
|
349
|
+
public:
|
|
350
|
+
assertion_error(const std::string& s) noexcept
|
|
351
|
+
: std::runtime_error(s)
|
|
352
|
+
{
|
|
353
|
+
}
|
|
354
|
+
const char* what() const noexcept override
|
|
355
|
+
{
|
|
356
|
+
return std::runtime_error::what();
|
|
357
|
+
}
|
|
358
|
+
};
|
|
359
|
+
|
|
360
|
+
} // namespace jsoncons
|
|
361
|
+
|
|
362
|
+
#define JSONCONS_STR2(x) #x
|
|
363
|
+
#define JSONCONS_STR(x) JSONCONS_STR2(x)
|
|
364
|
+
|
|
365
|
+
#ifdef _DEBUG
|
|
366
|
+
#define JSONCONS_ASSERT(x) if (!(x)) { \
|
|
367
|
+
JSONCONS_THROW(jsoncons::assertion_error("assertion '" #x "' failed at " __FILE__ ":" \
|
|
368
|
+
JSONCONS_STR(__LINE__))); }
|
|
369
|
+
#else
|
|
370
|
+
#define JSONCONS_ASSERT(x) if (!(x)) { \
|
|
371
|
+
JSONCONS_THROW(jsoncons::assertion_error("assertion '" #x "' failed at <> :" \
|
|
372
|
+
JSONCONS_STR( 0 ))); }
|
|
373
|
+
#endif // _DEBUG
|
|
374
|
+
|
|
375
|
+
#endif // JSONCONS_COMPILER_SUPPORT_HPP
|