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.
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) {