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.
Files changed (29) hide show
  1. checksums.yaml +4 -4
  2. data/ext/rj_schema/extconf.rb +1 -1
  3. data/ext/rj_schema/rapidjson/include/rapidjson/allocators.h +14 -1
  4. data/ext/rj_schema/rapidjson/include/rapidjson/document.h +8 -20
  5. data/ext/rj_schema/rapidjson/include/rapidjson/encodings.h +29 -29
  6. data/ext/rj_schema/rapidjson/include/rapidjson/internal/biginteger.h +1 -1
  7. data/ext/rj_schema/rapidjson/include/rapidjson/internal/diyfp.h +24 -11
  8. data/ext/rj_schema/rapidjson/include/rapidjson/internal/itoa.h +1 -2
  9. data/ext/rj_schema/rapidjson/include/rapidjson/internal/meta.h +7 -2
  10. data/ext/rj_schema/rapidjson/include/rapidjson/internal/regex.h +5 -7
  11. data/ext/rj_schema/rapidjson/include/rapidjson/internal/strtod.h +59 -38
  12. data/ext/rj_schema/rapidjson/include/rapidjson/istreamwrapper.h +1 -3
  13. data/ext/rj_schema/rapidjson/include/rapidjson/pointer.h +2 -8
  14. data/ext/rj_schema/rapidjson/include/rapidjson/prettywriter.h +12 -12
  15. data/ext/rj_schema/rapidjson/include/rapidjson/rapidjson.h +15 -13
  16. data/ext/rj_schema/rapidjson/include/rapidjson/reader.h +27 -19
  17. data/ext/rj_schema/rapidjson/include/rapidjson/schema.h +15 -6
  18. data/ext/rj_schema/rapidjson/include/rapidjson/writer.h +4 -10
  19. data/ext/rj_schema/rapidjson/test/perftest/schematest.cpp +7 -0
  20. data/ext/rj_schema/rapidjson/test/unittest/allocatorstest.cpp +12 -14
  21. data/ext/rj_schema/rapidjson/test/unittest/bigintegertest.cpp +5 -0
  22. data/ext/rj_schema/rapidjson/test/unittest/istreamwrappertest.cpp +2 -2
  23. data/ext/rj_schema/rapidjson/test/unittest/prettywritertest.cpp +29 -0
  24. data/ext/rj_schema/rapidjson/test/unittest/readertest.cpp +303 -8
  25. data/ext/rj_schema/rapidjson/test/unittest/schematest.cpp +36 -2
  26. data/ext/rj_schema/rapidjson/test/unittest/simdtest.cpp +2 -2
  27. data/ext/rj_schema/rj_schema.cpp +46 -26
  28. data/lib/rj_schema.rb +1 -1
  29. metadata +3 -3
@@ -21,9 +21,7 @@
21
21
  #ifdef __clang__
22
22
  RAPIDJSON_DIAG_PUSH
23
23
  RAPIDJSON_DIAG_OFF(padded)
24
- #endif
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
- #endif
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
- #ifdef __clang__
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. Currently the default uses 4 bytes
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
- #if RAPIDJSON_64BIT == 1
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
- // (defined(_MSC_VER) && _MSC_VER >= ????) // not yet supported
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 >= 214748364) { // Issue #313: prevent overflow exponent
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
- #ifdef __clang__
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
- #endif
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[256 + 24];
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
- context.error_handler.AddMissingProperty(properties_[index].name);
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
- #ifdef _MSC_VER
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
- #if RAPIDJSON_64BIT == 1
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));
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
- #else
75
+
75
76
  EXPECT_EQ(0u, RAPIDJSON_ALIGN(0u));
76
- for (uint32_t i = 1; i < 4; i++) {
77
- EXPECT_EQ(4u, RAPIDJSON_ALIGN(i));
78
- EXPECT_EQ(8u, RAPIDJSON_ALIGN(4u + i));
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) {