rj_schema 0.1.4 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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) {
|