rj_schema 0.1.4 → 0.2.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 +4 -4
- data/ext/rj_schema/extconf.rb +1 -1
- data/ext/rj_schema/rapidjson/include/rapidjson/allocators.h +14 -1
- data/ext/rj_schema/rapidjson/include/rapidjson/document.h +8 -20
- data/ext/rj_schema/rapidjson/include/rapidjson/encodings.h +29 -29
- data/ext/rj_schema/rapidjson/include/rapidjson/internal/biginteger.h +1 -1
- data/ext/rj_schema/rapidjson/include/rapidjson/internal/diyfp.h +24 -11
- data/ext/rj_schema/rapidjson/include/rapidjson/internal/itoa.h +1 -2
- data/ext/rj_schema/rapidjson/include/rapidjson/internal/meta.h +7 -2
- data/ext/rj_schema/rapidjson/include/rapidjson/internal/regex.h +5 -7
- data/ext/rj_schema/rapidjson/include/rapidjson/internal/strtod.h +59 -38
- data/ext/rj_schema/rapidjson/include/rapidjson/istreamwrapper.h +1 -3
- data/ext/rj_schema/rapidjson/include/rapidjson/pointer.h +2 -8
- data/ext/rj_schema/rapidjson/include/rapidjson/prettywriter.h +12 -12
- data/ext/rj_schema/rapidjson/include/rapidjson/rapidjson.h +15 -13
- data/ext/rj_schema/rapidjson/include/rapidjson/reader.h +27 -19
- data/ext/rj_schema/rapidjson/include/rapidjson/schema.h +15 -6
- data/ext/rj_schema/rapidjson/include/rapidjson/writer.h +4 -10
- data/ext/rj_schema/rapidjson/test/perftest/schematest.cpp +7 -0
- data/ext/rj_schema/rapidjson/test/unittest/allocatorstest.cpp +12 -14
- data/ext/rj_schema/rapidjson/test/unittest/bigintegertest.cpp +5 -0
- data/ext/rj_schema/rapidjson/test/unittest/istreamwrappertest.cpp +2 -2
- data/ext/rj_schema/rapidjson/test/unittest/prettywritertest.cpp +29 -0
- data/ext/rj_schema/rapidjson/test/unittest/readertest.cpp +303 -8
- data/ext/rj_schema/rapidjson/test/unittest/schematest.cpp +36 -2
- data/ext/rj_schema/rapidjson/test/unittest/simdtest.cpp +2 -2
- data/ext/rj_schema/rj_schema.cpp +46 -26
- data/lib/rj_schema.rb +1 -1
- metadata +3 -3
@@ -21,9 +21,7 @@
|
|
21
21
|
#ifdef __clang__
|
22
22
|
RAPIDJSON_DIAG_PUSH
|
23
23
|
RAPIDJSON_DIAG_OFF(padded)
|
24
|
-
#
|
25
|
-
|
26
|
-
#ifdef _MSC_VER
|
24
|
+
#elif defined(_MSC_VER)
|
27
25
|
RAPIDJSON_DIAG_PUSH
|
28
26
|
RAPIDJSON_DIAG_OFF(4351) // new behavior: elements of array 'array' will be default initialized
|
29
27
|
#endif
|
@@ -21,9 +21,7 @@
|
|
21
21
|
#ifdef __clang__
|
22
22
|
RAPIDJSON_DIAG_PUSH
|
23
23
|
RAPIDJSON_DIAG_OFF(switch-enum)
|
24
|
-
#
|
25
|
-
|
26
|
-
#ifdef _MSC_VER
|
24
|
+
#elif defined(_MSC_VER)
|
27
25
|
RAPIDJSON_DIAG_PUSH
|
28
26
|
RAPIDJSON_DIAG_OFF(4512) // assignment operator could not be generated
|
29
27
|
#endif
|
@@ -1352,11 +1350,7 @@ bool EraseValueByPointer(T& root, const CharType(&source)[N]) {
|
|
1352
1350
|
|
1353
1351
|
RAPIDJSON_NAMESPACE_END
|
1354
1352
|
|
1355
|
-
#
|
1356
|
-
RAPIDJSON_DIAG_POP
|
1357
|
-
#endif
|
1358
|
-
|
1359
|
-
#ifdef _MSC_VER
|
1353
|
+
#if defined(__clang__) || defined(_MSC_VER)
|
1360
1354
|
RAPIDJSON_DIAG_POP
|
1361
1355
|
#endif
|
1362
1356
|
|
@@ -92,26 +92,26 @@ public:
|
|
92
92
|
*/
|
93
93
|
//@{
|
94
94
|
|
95
|
-
bool Null() { PrettyPrefix(kNullType); return Base::WriteNull(); }
|
96
|
-
bool Bool(bool b) { PrettyPrefix(b ? kTrueType : kFalseType); return Base::WriteBool(b); }
|
97
|
-
bool Int(int i) { PrettyPrefix(kNumberType); return Base::WriteInt(i); }
|
98
|
-
bool Uint(unsigned u) { PrettyPrefix(kNumberType); return Base::WriteUint(u); }
|
99
|
-
bool Int64(int64_t i64) { PrettyPrefix(kNumberType); return Base::WriteInt64(i64); }
|
100
|
-
bool Uint64(uint64_t u64) { PrettyPrefix(kNumberType); return Base::WriteUint64(u64); }
|
101
|
-
bool Double(double d) { PrettyPrefix(kNumberType); return Base::WriteDouble(d); }
|
95
|
+
bool Null() { PrettyPrefix(kNullType); return Base::EndValue(Base::WriteNull()); }
|
96
|
+
bool Bool(bool b) { PrettyPrefix(b ? kTrueType : kFalseType); return Base::EndValue(Base::WriteBool(b)); }
|
97
|
+
bool Int(int i) { PrettyPrefix(kNumberType); return Base::EndValue(Base::WriteInt(i)); }
|
98
|
+
bool Uint(unsigned u) { PrettyPrefix(kNumberType); return Base::EndValue(Base::WriteUint(u)); }
|
99
|
+
bool Int64(int64_t i64) { PrettyPrefix(kNumberType); return Base::EndValue(Base::WriteInt64(i64)); }
|
100
|
+
bool Uint64(uint64_t u64) { PrettyPrefix(kNumberType); return Base::EndValue(Base::WriteUint64(u64)); }
|
101
|
+
bool Double(double d) { PrettyPrefix(kNumberType); return Base::EndValue(Base::WriteDouble(d)); }
|
102
102
|
|
103
103
|
bool RawNumber(const Ch* str, SizeType length, bool copy = false) {
|
104
104
|
RAPIDJSON_ASSERT(str != 0);
|
105
105
|
(void)copy;
|
106
106
|
PrettyPrefix(kNumberType);
|
107
|
-
return Base::WriteString(str, length);
|
107
|
+
return Base::EndValue(Base::WriteString(str, length));
|
108
108
|
}
|
109
109
|
|
110
110
|
bool String(const Ch* str, SizeType length, bool copy = false) {
|
111
111
|
RAPIDJSON_ASSERT(str != 0);
|
112
112
|
(void)copy;
|
113
113
|
PrettyPrefix(kStringType);
|
114
|
-
return Base::WriteString(str, length);
|
114
|
+
return Base::EndValue(Base::WriteString(str, length));
|
115
115
|
}
|
116
116
|
|
117
117
|
#if RAPIDJSON_HAS_STDSTRING
|
@@ -146,7 +146,7 @@ public:
|
|
146
146
|
Base::os_->Put('\n');
|
147
147
|
WriteIndent();
|
148
148
|
}
|
149
|
-
bool ret = Base::WriteEndObject();
|
149
|
+
bool ret = Base::EndValue(Base::WriteEndObject());
|
150
150
|
(void)ret;
|
151
151
|
RAPIDJSON_ASSERT(ret == true);
|
152
152
|
if (Base::level_stack_.Empty()) // end of json text
|
@@ -170,7 +170,7 @@ public:
|
|
170
170
|
Base::os_->Put('\n');
|
171
171
|
WriteIndent();
|
172
172
|
}
|
173
|
-
bool ret = Base::WriteEndArray();
|
173
|
+
bool ret = Base::EndValue(Base::WriteEndArray());
|
174
174
|
(void)ret;
|
175
175
|
RAPIDJSON_ASSERT(ret == true);
|
176
176
|
if (Base::level_stack_.Empty()) // end of json text
|
@@ -201,7 +201,7 @@ public:
|
|
201
201
|
bool RawValue(const Ch* json, size_t length, Type type) {
|
202
202
|
RAPIDJSON_ASSERT(json != 0);
|
203
203
|
PrettyPrefix(type);
|
204
|
-
return Base::WriteRawValue(json, length);
|
204
|
+
return Base::EndValue(Base::WriteRawValue(json, length));
|
205
205
|
}
|
206
206
|
|
207
207
|
protected:
|
@@ -269,16 +269,11 @@
|
|
269
269
|
/*! \ingroup RAPIDJSON_CONFIG
|
270
270
|
\param x pointer to align
|
271
271
|
|
272
|
-
Some machines require strict data alignment.
|
273
|
-
alignment on 32-bit platforms and 8 bytes alignment for 64-bit platforms.
|
272
|
+
Some machines require strict data alignment. The default is 8 bytes.
|
274
273
|
User can customize by defining the RAPIDJSON_ALIGN function macro.
|
275
274
|
*/
|
276
275
|
#ifndef RAPIDJSON_ALIGN
|
277
|
-
#
|
278
|
-
#define RAPIDJSON_ALIGN(x) (((x) + static_cast<uint64_t>(7u)) & ~static_cast<uint64_t>(7u))
|
279
|
-
#else
|
280
|
-
#define RAPIDJSON_ALIGN(x) (((x) + 3u) & ~3u)
|
281
|
-
#endif
|
276
|
+
#define RAPIDJSON_ALIGN(x) (((x) + static_cast<size_t>(7u)) & ~static_cast<size_t>(7u))
|
282
277
|
#endif
|
283
278
|
|
284
279
|
///////////////////////////////////////////////////////////////////////////////
|
@@ -433,7 +428,7 @@ template <> struct STATIC_ASSERTION_FAILURE<true> { enum { value = 1 }; };
|
|
433
428
|
template <size_t x> struct StaticAssertTest {};
|
434
429
|
RAPIDJSON_NAMESPACE_END
|
435
430
|
|
436
|
-
#if defined(__GNUC__)
|
431
|
+
#if defined(__GNUC__) || defined(__clang__)
|
437
432
|
#define RAPIDJSON_STATIC_ASSERT_UNUSED_ATTRIBUTE __attribute__((unused))
|
438
433
|
#else
|
439
434
|
#define RAPIDJSON_STATIC_ASSERT_UNUSED_ATTRIBUTE
|
@@ -543,13 +538,14 @@ RAPIDJSON_NAMESPACE_END
|
|
543
538
|
#ifndef RAPIDJSON_HAS_CXX11_RVALUE_REFS
|
544
539
|
#if defined(__clang__)
|
545
540
|
#if __has_feature(cxx_rvalue_references) && \
|
546
|
-
(defined(_LIBCPP_VERSION) || defined(__GLIBCXX__) && __GLIBCXX__ >= 20080306)
|
541
|
+
(defined(_MSC_VER) || defined(_LIBCPP_VERSION) || defined(__GLIBCXX__) && __GLIBCXX__ >= 20080306)
|
547
542
|
#define RAPIDJSON_HAS_CXX11_RVALUE_REFS 1
|
548
543
|
#else
|
549
544
|
#define RAPIDJSON_HAS_CXX11_RVALUE_REFS 0
|
550
545
|
#endif
|
551
546
|
#elif (defined(RAPIDJSON_GNUC) && (RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,3,0)) && defined(__GXX_EXPERIMENTAL_CXX0X__)) || \
|
552
|
-
(defined(_MSC_VER) && _MSC_VER >= 1600)
|
547
|
+
(defined(_MSC_VER) && _MSC_VER >= 1600) || \
|
548
|
+
(defined(__SUNPRO_CC) && __SUNPRO_CC >= 0x5140 && defined(__GXX_EXPERIMENTAL_CXX0X__))
|
553
549
|
|
554
550
|
#define RAPIDJSON_HAS_CXX11_RVALUE_REFS 1
|
555
551
|
#else
|
@@ -560,8 +556,9 @@ RAPIDJSON_NAMESPACE_END
|
|
560
556
|
#ifndef RAPIDJSON_HAS_CXX11_NOEXCEPT
|
561
557
|
#if defined(__clang__)
|
562
558
|
#define RAPIDJSON_HAS_CXX11_NOEXCEPT __has_feature(cxx_noexcept)
|
563
|
-
#elif (defined(RAPIDJSON_GNUC) && (RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,6,0)) && defined(__GXX_EXPERIMENTAL_CXX0X__))
|
564
|
-
|
559
|
+
#elif (defined(RAPIDJSON_GNUC) && (RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,6,0)) && defined(__GXX_EXPERIMENTAL_CXX0X__)) || \
|
560
|
+
(defined(_MSC_VER) && _MSC_VER >= 1900) || \
|
561
|
+
(defined(__SUNPRO_CC) && __SUNPRO_CC >= 0x5140 && defined(__GXX_EXPERIMENTAL_CXX0X__))
|
565
562
|
#define RAPIDJSON_HAS_CXX11_NOEXCEPT 1
|
566
563
|
#else
|
567
564
|
#define RAPIDJSON_HAS_CXX11_NOEXCEPT 0
|
@@ -575,14 +572,19 @@ RAPIDJSON_NAMESPACE_END
|
|
575
572
|
|
576
573
|
// no automatic detection, yet
|
577
574
|
#ifndef RAPIDJSON_HAS_CXX11_TYPETRAITS
|
575
|
+
#if (defined(_MSC_VER) && _MSC_VER >= 1700)
|
576
|
+
#define RAPIDJSON_HAS_CXX11_TYPETRAITS 1
|
577
|
+
#else
|
578
578
|
#define RAPIDJSON_HAS_CXX11_TYPETRAITS 0
|
579
579
|
#endif
|
580
|
+
#endif
|
580
581
|
|
581
582
|
#ifndef RAPIDJSON_HAS_CXX11_RANGE_FOR
|
582
583
|
#if defined(__clang__)
|
583
584
|
#define RAPIDJSON_HAS_CXX11_RANGE_FOR __has_feature(cxx_range_for)
|
584
585
|
#elif (defined(RAPIDJSON_GNUC) && (RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,6,0)) && defined(__GXX_EXPERIMENTAL_CXX0X__)) || \
|
585
|
-
(defined(_MSC_VER) && _MSC_VER >= 1700)
|
586
|
+
(defined(_MSC_VER) && _MSC_VER >= 1700) || \
|
587
|
+
(defined(__SUNPRO_CC) && __SUNPRO_CC >= 0x5140 && defined(__GXX_EXPERIMENTAL_CXX0X__))
|
586
588
|
#define RAPIDJSON_HAS_CXX11_RANGE_FOR 1
|
587
589
|
#else
|
588
590
|
#define RAPIDJSON_HAS_CXX11_RANGE_FOR 0
|
@@ -37,17 +37,15 @@
|
|
37
37
|
#include <arm_neon.h>
|
38
38
|
#endif
|
39
39
|
|
40
|
-
#ifdef _MSC_VER
|
41
|
-
RAPIDJSON_DIAG_PUSH
|
42
|
-
RAPIDJSON_DIAG_OFF(4127) // conditional expression is constant
|
43
|
-
RAPIDJSON_DIAG_OFF(4702) // unreachable code
|
44
|
-
#endif
|
45
|
-
|
46
40
|
#ifdef __clang__
|
47
41
|
RAPIDJSON_DIAG_PUSH
|
48
42
|
RAPIDJSON_DIAG_OFF(old-style-cast)
|
49
43
|
RAPIDJSON_DIAG_OFF(padded)
|
50
44
|
RAPIDJSON_DIAG_OFF(switch-enum)
|
45
|
+
#elif defined(_MSC_VER)
|
46
|
+
RAPIDJSON_DIAG_PUSH
|
47
|
+
RAPIDJSON_DIAG_OFF(4127) // conditional expression is constant
|
48
|
+
RAPIDJSON_DIAG_OFF(4702) // unreachable code
|
51
49
|
#endif
|
52
50
|
|
53
51
|
#ifdef __GNUC__
|
@@ -674,7 +672,7 @@ public:
|
|
674
672
|
//! Check if token-by-token parsing JSON text is complete
|
675
673
|
/*! \return Whether the JSON has been fully decoded.
|
676
674
|
*/
|
677
|
-
RAPIDJSON_FORCEINLINE bool IterativeParseComplete() {
|
675
|
+
RAPIDJSON_FORCEINLINE bool IterativeParseComplete() const {
|
678
676
|
return IsIterativeParsingCompleteState(state_);
|
679
677
|
}
|
680
678
|
|
@@ -1563,8 +1561,6 @@ private:
|
|
1563
1561
|
// Force double for big integer
|
1564
1562
|
if (useDouble) {
|
1565
1563
|
while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) {
|
1566
|
-
if (RAPIDJSON_UNLIKELY(d >= 1.7976931348623157e307)) // DBL_MAX / 10.0
|
1567
|
-
RAPIDJSON_PARSE_ERROR(kParseErrorNumberTooBig, startOffset);
|
1568
1564
|
d = d * 10 + (s.TakePush() - '0');
|
1569
1565
|
}
|
1570
1566
|
}
|
@@ -1634,9 +1630,18 @@ private:
|
|
1634
1630
|
if (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) {
|
1635
1631
|
exp = static_cast<int>(s.Take() - '0');
|
1636
1632
|
if (expMinus) {
|
1633
|
+
// (exp + expFrac) must not underflow int => we're detecting when -exp gets
|
1634
|
+
// dangerously close to INT_MIN (a pessimistic next digit 9 would push it into
|
1635
|
+
// underflow territory):
|
1636
|
+
//
|
1637
|
+
// -(exp * 10 + 9) + expFrac >= INT_MIN
|
1638
|
+
// <=> exp <= (expFrac - INT_MIN - 9) / 10
|
1639
|
+
RAPIDJSON_ASSERT(expFrac <= 0);
|
1640
|
+
int maxExp = (expFrac + 2147483639) / 10;
|
1641
|
+
|
1637
1642
|
while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) {
|
1638
1643
|
exp = exp * 10 + static_cast<int>(s.Take() - '0');
|
1639
|
-
if (exp
|
1644
|
+
if (RAPIDJSON_UNLIKELY(exp > maxExp)) {
|
1640
1645
|
while (RAPIDJSON_UNLIKELY(s.Peek() >= '0' && s.Peek() <= '9')) // Consume the rest of exponent
|
1641
1646
|
s.Take();
|
1642
1647
|
}
|
@@ -1695,6 +1700,13 @@ private:
|
|
1695
1700
|
else
|
1696
1701
|
d = internal::StrtodNormalPrecision(d, p);
|
1697
1702
|
|
1703
|
+
// Use > max, instead of == inf, to fix bogus warning -Wfloat-equal
|
1704
|
+
if (d > (std::numeric_limits<double>::max)()) {
|
1705
|
+
// Overflow
|
1706
|
+
// TODO: internal::StrtodX should report overflow (or underflow)
|
1707
|
+
RAPIDJSON_PARSE_ERROR(kParseErrorNumberTooBig, startOffset);
|
1708
|
+
}
|
1709
|
+
|
1698
1710
|
cont = handler.Double(minus ? -d : d);
|
1699
1711
|
}
|
1700
1712
|
else if (useNanOrInf) {
|
@@ -1786,7 +1798,7 @@ private:
|
|
1786
1798
|
kTokenCount
|
1787
1799
|
};
|
1788
1800
|
|
1789
|
-
RAPIDJSON_FORCEINLINE Token Tokenize(Ch c) {
|
1801
|
+
RAPIDJSON_FORCEINLINE Token Tokenize(Ch c) const {
|
1790
1802
|
|
1791
1803
|
//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN
|
1792
1804
|
#define N NumberToken
|
@@ -1813,7 +1825,7 @@ private:
|
|
1813
1825
|
return NumberToken;
|
1814
1826
|
}
|
1815
1827
|
|
1816
|
-
RAPIDJSON_FORCEINLINE IterativeParsingState Predict(IterativeParsingState state, Token token) {
|
1828
|
+
RAPIDJSON_FORCEINLINE IterativeParsingState Predict(IterativeParsingState state, Token token) const {
|
1817
1829
|
// current state x one lookahead token -> new state
|
1818
1830
|
static const char G[cIterativeParsingStateCount][kTokenCount] = {
|
1819
1831
|
// Finish(sink state)
|
@@ -2152,11 +2164,11 @@ private:
|
|
2152
2164
|
}
|
2153
2165
|
}
|
2154
2166
|
|
2155
|
-
RAPIDJSON_FORCEINLINE bool IsIterativeParsingDelimiterState(IterativeParsingState s) {
|
2167
|
+
RAPIDJSON_FORCEINLINE bool IsIterativeParsingDelimiterState(IterativeParsingState s) const {
|
2156
2168
|
return s >= IterativeParsingElementDelimiterState;
|
2157
2169
|
}
|
2158
2170
|
|
2159
|
-
RAPIDJSON_FORCEINLINE bool IsIterativeParsingCompleteState(IterativeParsingState s) {
|
2171
|
+
RAPIDJSON_FORCEINLINE bool IsIterativeParsingCompleteState(IterativeParsingState s) const {
|
2160
2172
|
return s <= IterativeParsingErrorState;
|
2161
2173
|
}
|
2162
2174
|
|
@@ -2206,7 +2218,7 @@ typedef GenericReader<UTF8<>, UTF8<> > Reader;
|
|
2206
2218
|
|
2207
2219
|
RAPIDJSON_NAMESPACE_END
|
2208
2220
|
|
2209
|
-
#
|
2221
|
+
#if defined(__clang__) || defined(_MSC_VER)
|
2210
2222
|
RAPIDJSON_DIAG_POP
|
2211
2223
|
#endif
|
2212
2224
|
|
@@ -2215,8 +2227,4 @@ RAPIDJSON_DIAG_POP
|
|
2215
2227
|
RAPIDJSON_DIAG_POP
|
2216
2228
|
#endif
|
2217
2229
|
|
2218
|
-
#ifdef _MSC_VER
|
2219
|
-
RAPIDJSON_DIAG_POP
|
2220
|
-
#endif
|
2221
|
-
|
2222
2230
|
#endif // RAPIDJSON_READER_H_
|
@@ -63,9 +63,7 @@ RAPIDJSON_DIAG_OFF(weak-vtables)
|
|
63
63
|
RAPIDJSON_DIAG_OFF(exit-time-destructors)
|
64
64
|
RAPIDJSON_DIAG_OFF(c++98-compat-pedantic)
|
65
65
|
RAPIDJSON_DIAG_OFF(variadic-macros)
|
66
|
-
#
|
67
|
-
|
68
|
-
#ifdef _MSC_VER
|
66
|
+
#elif defined(_MSC_VER)
|
69
67
|
RAPIDJSON_DIAG_OFF(4512) // assignment operator could not be generated
|
70
68
|
#endif
|
71
69
|
|
@@ -442,7 +440,8 @@ public:
|
|
442
440
|
minLength_(0),
|
443
441
|
maxLength_(~SizeType(0)),
|
444
442
|
exclusiveMinimum_(false),
|
445
|
-
exclusiveMaximum_(false)
|
443
|
+
exclusiveMaximum_(false),
|
444
|
+
defaultValueLength_(0)
|
446
445
|
{
|
447
446
|
typedef typename SchemaDocumentType::ValueType ValueType;
|
448
447
|
typedef typename ValueType::ConstValueIterator ConstValueIterator;
|
@@ -465,7 +464,7 @@ public:
|
|
465
464
|
enum_ = static_cast<uint64_t*>(allocator_->Malloc(sizeof(uint64_t) * v->Size()));
|
466
465
|
for (ConstValueIterator itr = v->Begin(); itr != v->End(); ++itr) {
|
467
466
|
typedef Hasher<EncodingType, MemoryPoolAllocator<> > EnumHasherType;
|
468
|
-
char buffer[
|
467
|
+
char buffer[256u + 24];
|
469
468
|
MemoryPoolAllocator<> hasherAllocator(buffer, sizeof(buffer));
|
470
469
|
EnumHasherType h(&hasherAllocator, 256);
|
471
470
|
itr->Accept(h);
|
@@ -637,6 +636,12 @@ public:
|
|
637
636
|
if (const ValueType* v = GetMember(value, GetMultipleOfString()))
|
638
637
|
if (v->IsNumber() && v->GetDouble() > 0.0)
|
639
638
|
multipleOf_.CopyFrom(*v, *allocator_);
|
639
|
+
|
640
|
+
// Default
|
641
|
+
if (const ValueType* v = GetMember(value, GetDefaultValueString()))
|
642
|
+
if (v->IsString())
|
643
|
+
defaultValueLength_ = v->GetStringLength();
|
644
|
+
|
640
645
|
}
|
641
646
|
|
642
647
|
~Schema() {
|
@@ -938,7 +943,8 @@ public:
|
|
938
943
|
context.error_handler.StartMissingProperties();
|
939
944
|
for (SizeType index = 0; index < propertyCount_; index++)
|
940
945
|
if (properties_[index].required && !context.propertyExist[index])
|
941
|
-
|
946
|
+
if (properties_[index].schema->defaultValueLength_ == 0 )
|
947
|
+
context.error_handler.AddMissingProperty(properties_[index].name);
|
942
948
|
if (context.error_handler.EndMissingProperties())
|
943
949
|
RAPIDJSON_INVALID_KEYWORD_RETURN(GetRequiredString());
|
944
950
|
}
|
@@ -1048,6 +1054,7 @@ public:
|
|
1048
1054
|
RAPIDJSON_STRING_(ExclusiveMinimum, 'e', 'x', 'c', 'l', 'u', 's', 'i', 'v', 'e', 'M', 'i', 'n', 'i', 'm', 'u', 'm')
|
1049
1055
|
RAPIDJSON_STRING_(ExclusiveMaximum, 'e', 'x', 'c', 'l', 'u', 's', 'i', 'v', 'e', 'M', 'a', 'x', 'i', 'm', 'u', 'm')
|
1050
1056
|
RAPIDJSON_STRING_(MultipleOf, 'm', 'u', 'l', 't', 'i', 'p', 'l', 'e', 'O', 'f')
|
1057
|
+
RAPIDJSON_STRING_(DefaultValue, 'd', 'e', 'f', 'a', 'u', 'l', 't')
|
1051
1058
|
|
1052
1059
|
#undef RAPIDJSON_STRING_
|
1053
1060
|
|
@@ -1428,6 +1435,8 @@ private:
|
|
1428
1435
|
SValue multipleOf_;
|
1429
1436
|
bool exclusiveMinimum_;
|
1430
1437
|
bool exclusiveMaximum_;
|
1438
|
+
|
1439
|
+
SizeType defaultValueLength_;
|
1431
1440
|
};
|
1432
1441
|
|
1433
1442
|
template<typename Stack, typename Ch>
|
@@ -36,16 +36,14 @@
|
|
36
36
|
#include <arm_neon.h>
|
37
37
|
#endif
|
38
38
|
|
39
|
-
#ifdef _MSC_VER
|
40
|
-
RAPIDJSON_DIAG_PUSH
|
41
|
-
RAPIDJSON_DIAG_OFF(4127) // conditional expression is constant
|
42
|
-
#endif
|
43
|
-
|
44
39
|
#ifdef __clang__
|
45
40
|
RAPIDJSON_DIAG_PUSH
|
46
41
|
RAPIDJSON_DIAG_OFF(padded)
|
47
42
|
RAPIDJSON_DIAG_OFF(unreachable-code)
|
48
43
|
RAPIDJSON_DIAG_OFF(c++98-compat)
|
44
|
+
#elif defined(_MSC_VER)
|
45
|
+
RAPIDJSON_DIAG_PUSH
|
46
|
+
RAPIDJSON_DIAG_OFF(4127) // conditional expression is constant
|
49
47
|
#endif
|
50
48
|
|
51
49
|
RAPIDJSON_NAMESPACE_BEGIN
|
@@ -705,11 +703,7 @@ inline bool Writer<StringBuffer>::ScanWriteUnescapedString(StringStream& is, siz
|
|
705
703
|
|
706
704
|
RAPIDJSON_NAMESPACE_END
|
707
705
|
|
708
|
-
#
|
709
|
-
RAPIDJSON_DIAG_POP
|
710
|
-
#endif
|
711
|
-
|
712
|
-
#ifdef __clang__
|
706
|
+
#if defined(_MSC_VER) || defined(__clang__)
|
713
707
|
RAPIDJSON_DIAG_POP
|
714
708
|
#endif
|
715
709
|
|
@@ -11,6 +11,11 @@
|
|
11
11
|
|
12
12
|
using namespace rapidjson;
|
13
13
|
|
14
|
+
RAPIDJSON_DIAG_PUSH
|
15
|
+
#if defined(__GNUC__) && __GNUC__ >= 7
|
16
|
+
RAPIDJSON_DIAG_OFF(format-overflow)
|
17
|
+
#endif
|
18
|
+
|
14
19
|
template <typename Allocator>
|
15
20
|
static char* ReadFile(const char* filename, Allocator& allocator) {
|
16
21
|
const char *paths[] = {
|
@@ -42,6 +47,8 @@ static char* ReadFile(const char* filename, Allocator& allocator) {
|
|
42
47
|
return json;
|
43
48
|
}
|
44
49
|
|
50
|
+
RAPIDJSON_DIAG_POP
|
51
|
+
|
45
52
|
class Schema : public PerfTest {
|
46
53
|
public:
|
47
54
|
Schema() {}
|
@@ -63,23 +63,21 @@ TEST(Allocator, MemoryPoolAllocator) {
|
|
63
63
|
}
|
64
64
|
|
65
65
|
TEST(Allocator, Alignment) {
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
66
|
+
if (sizeof(size_t) >= 8) {
|
67
|
+
EXPECT_EQ(RAPIDJSON_UINT64_C2(0x00000000, 0x00000000), RAPIDJSON_ALIGN(0));
|
68
|
+
for (uint64_t i = 1; i < 8; i++) {
|
69
|
+
EXPECT_EQ(RAPIDJSON_UINT64_C2(0x00000000, 0x00000008), RAPIDJSON_ALIGN(i));
|
70
|
+
EXPECT_EQ(RAPIDJSON_UINT64_C2(0x00000000, 0x00000010), RAPIDJSON_ALIGN(RAPIDJSON_UINT64_C2(0x00000000, 0x00000008) + i));
|
71
|
+
EXPECT_EQ(RAPIDJSON_UINT64_C2(0x00000001, 0x00000000), RAPIDJSON_ALIGN(RAPIDJSON_UINT64_C2(0x00000000, 0xFFFFFFF8) + i));
|
72
|
+
EXPECT_EQ(RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0xFFFFFFF8), RAPIDJSON_ALIGN(RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0xFFFFFFF0) + i));
|
73
|
+
}
|
73
74
|
}
|
74
|
-
|
75
|
+
|
75
76
|
EXPECT_EQ(0u, RAPIDJSON_ALIGN(0u));
|
76
|
-
for (uint32_t i = 1; i <
|
77
|
-
EXPECT_EQ(
|
78
|
-
EXPECT_EQ(
|
79
|
-
EXPECT_EQ(0xFFFFFFF8u, RAPIDJSON_ALIGN(0xFFFFFFF4u + i));
|
80
|
-
EXPECT_EQ(0xFFFFFFFCu, RAPIDJSON_ALIGN(0xFFFFFFF8u + i));
|
77
|
+
for (uint32_t i = 1; i < 8; i++) {
|
78
|
+
EXPECT_EQ(8u, RAPIDJSON_ALIGN(i));
|
79
|
+
EXPECT_EQ(0xFFFFFFF8u, RAPIDJSON_ALIGN(0xFFFFFFF0u + i));
|
81
80
|
}
|
82
|
-
#endif
|
83
81
|
}
|
84
82
|
|
85
83
|
TEST(Allocator, Issue399) {
|