소스 검색

Merge branch 'upstream-jsoncpp' into update-jsoncpp

* upstream-jsoncpp:
  jsoncpp 2022-01-12 (42e892d9)
Brad King 3 년 전
부모
커밋
33fae4cd7a

+ 7 - 7
Utilities/cmjsoncpp/LICENSE

@@ -1,25 +1,25 @@
-The JsonCpp library's source code, including accompanying documentation, 
+The JsonCpp library's source code, including accompanying documentation,
 tests and demonstration applications, are licensed under the following
 tests and demonstration applications, are licensed under the following
 conditions...
 conditions...
 
 
-Baptiste Lepilleur and The JsonCpp Authors explicitly disclaim copyright in all 
-jurisdictions which recognize such a disclaimer. In such jurisdictions, 
+Baptiste Lepilleur and The JsonCpp Authors explicitly disclaim copyright in all
+jurisdictions which recognize such a disclaimer. In such jurisdictions,
 this software is released into the Public Domain.
 this software is released into the Public Domain.
 
 
 In jurisdictions which do not recognize Public Domain property (e.g. Germany as of
 In jurisdictions which do not recognize Public Domain property (e.g. Germany as of
 2010), this software is Copyright (c) 2007-2010 by Baptiste Lepilleur and
 2010), this software is Copyright (c) 2007-2010 by Baptiste Lepilleur and
 The JsonCpp Authors, and is released under the terms of the MIT License (see below).
 The JsonCpp Authors, and is released under the terms of the MIT License (see below).
 
 
-In jurisdictions which recognize Public Domain property, the user of this 
-software may choose to accept it either as 1) Public Domain, 2) under the 
-conditions of the MIT License (see below), or 3) under the terms of dual 
+In jurisdictions which recognize Public Domain property, the user of this
+software may choose to accept it either as 1) Public Domain, 2) under the
+conditions of the MIT License (see below), or 3) under the terms of dual
 Public Domain/MIT License conditions described here, as they choose.
 Public Domain/MIT License conditions described here, as they choose.
 
 
 The MIT License is about as close to Public Domain as a license can get, and is
 The MIT License is about as close to Public Domain as a license can get, and is
 described in clear, concise terms at:
 described in clear, concise terms at:
 
 
    http://en.wikipedia.org/wiki/MIT_License
    http://en.wikipedia.org/wiki/MIT_License
-   
+
 The full text of the MIT License follows:
 The full text of the MIT License follows:
 
 
 ========================================================================
 ========================================================================

+ 5 - 5
Utilities/cmjsoncpp/include/json/allocator.h

@@ -10,7 +10,8 @@
 #include <memory>
 #include <memory>
 
 
 #if !defined(__SUNPRO_CC)
 #if !defined(__SUNPRO_CC)
-#pragma pack(push, 8)
+#pragma pack(push)
+#pragma pack()
 #endif
 #endif
 
 
 namespace Json {
 namespace Json {
@@ -37,11 +38,10 @@ public:
    * Release memory which was allocated for N items at pointer P.
    * Release memory which was allocated for N items at pointer P.
    *
    *
    * The memory block is filled with zeroes before being released.
    * The memory block is filled with zeroes before being released.
-   * The pointer argument is tagged as "volatile" to prevent the
-   * compiler optimizing out this critical step.
    */
    */
-  void deallocate(volatile pointer p, size_type n) {
-    std::memset(p, 0, n * sizeof(T));
+  void deallocate(pointer p, size_type n) {
+    // memset_s is used because memset may be optimized away by the compiler
+    memset_s(p, n * sizeof(T), 0, n * sizeof(T));
     // free using "global operator delete"
     // free using "global operator delete"
     ::operator delete(p);
     ::operator delete(p);
   }
   }

+ 2 - 1
Utilities/cmjsoncpp/include/json/json_features.h

@@ -11,7 +11,8 @@
 #endif // if !defined(JSON_IS_AMALGAMATION)
 #endif // if !defined(JSON_IS_AMALGAMATION)
 
 
 #if !defined(__SUNPRO_CC)
 #if !defined(__SUNPRO_CC)
-#pragma pack(push, 8)
+#pragma pack(push)
+#pragma pack()
 #endif
 #endif
 
 
 namespace Json {
 namespace Json {

+ 8 - 5
Utilities/cmjsoncpp/include/json/reader.h

@@ -24,7 +24,8 @@
 #endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
 #endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
 
 
 #if !defined(__SUNPRO_CC)
 #if !defined(__SUNPRO_CC)
-#pragma pack(push, 8)
+#pragma pack(push)
+#pragma pack()
 #endif
 #endif
 
 
 namespace Json {
 namespace Json {
@@ -35,8 +36,7 @@ namespace Json {
  * deprecated Use CharReader and CharReaderBuilder.
  * deprecated Use CharReader and CharReaderBuilder.
  */
  */
 
 
-class JSONCPP_DEPRECATED(
-    "Use CharReader and CharReaderBuilder instead.") JSON_API Reader {
+class JSON_API Reader {
 public:
 public:
   using Char = char;
   using Char = char;
   using Location = const Char*;
   using Location = const Char*;
@@ -53,13 +53,13 @@ public:
   };
   };
 
 
   /** \brief Constructs a Reader allowing all features for parsing.
   /** \brief Constructs a Reader allowing all features for parsing.
+    * \deprecated Use CharReader and CharReaderBuilder.
    */
    */
-  JSONCPP_DEPRECATED("Use CharReader and CharReaderBuilder instead")
   Reader();
   Reader();
 
 
   /** \brief Constructs a Reader allowing the specified feature set for parsing.
   /** \brief Constructs a Reader allowing the specified feature set for parsing.
+    * \deprecated Use CharReader and CharReaderBuilder.
    */
    */
-  JSONCPP_DEPRECATED("Use CharReader and CharReaderBuilder instead")
   Reader(const Features& features);
   Reader(const Features& features);
 
 
   /** \brief Read a Value from a <a HREF="http://www.json.org">JSON</a>
   /** \brief Read a Value from a <a HREF="http://www.json.org">JSON</a>
@@ -326,6 +326,9 @@ public:
    * - `"allowSpecialFloats": false or true`
    * - `"allowSpecialFloats": false or true`
    *   - If true, special float values (NaNs and infinities) are allowed and
    *   - If true, special float values (NaNs and infinities) are allowed and
    *     their values are lossfree restorable.
    *     their values are lossfree restorable.
+   * - `"skipBom": false or true`
+   *   - If true, if the input starts with the Unicode byte order mark (BOM),
+   *     it is skipped.
    *
    *
    * You can examine 'settings_` yourself to see the defaults. You can also
    * You can examine 'settings_` yourself to see the defaults. You can also
    * write and read them just like any JSON Value.
    * write and read them just like any JSON Value.

+ 11 - 10
Utilities/cmjsoncpp/include/json/value.h

@@ -50,11 +50,12 @@
 // be used by...
 // be used by...
 #if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
 #if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
 #pragma warning(push)
 #pragma warning(push)
-#pragma warning(disable : 4251)
+#pragma warning(disable : 4251 4275)
 #endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
 #endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
 
 
 #if !defined(__SUNPRO_CC)
 #if !defined(__SUNPRO_CC)
-#pragma pack(push, 8)
+#pragma pack(push)
+#pragma pack()
 #endif
 #endif
 
 
 /** \brief JSON (JavaScript Object Notation).
 /** \brief JSON (JavaScript Object Notation).
@@ -265,10 +266,10 @@ private:
     CZString(ArrayIndex index);
     CZString(ArrayIndex index);
     CZString(char const* str, unsigned length, DuplicationPolicy allocate);
     CZString(char const* str, unsigned length, DuplicationPolicy allocate);
     CZString(CZString const& other);
     CZString(CZString const& other);
-    CZString(CZString&& other);
+    CZString(CZString&& other) noexcept;
     ~CZString();
     ~CZString();
     CZString& operator=(const CZString& other);
     CZString& operator=(const CZString& other);
-    CZString& operator=(CZString&& other);
+    CZString& operator=(CZString&& other) noexcept;
 
 
     bool operator<(CZString const& other) const;
     bool operator<(CZString const& other) const;
     bool operator==(CZString const& other) const;
     bool operator==(CZString const& other) const;
@@ -346,13 +347,13 @@ public:
   Value(bool value);
   Value(bool value);
   Value(std::nullptr_t ptr) = delete;
   Value(std::nullptr_t ptr) = delete;
   Value(const Value& other);
   Value(const Value& other);
-  Value(Value&& other);
+  Value(Value&& other) noexcept;
   ~Value();
   ~Value();
 
 
   /// \note Overwrite existing comments. To preserve comments, use
   /// \note Overwrite existing comments. To preserve comments, use
   /// #swapPayload().
   /// #swapPayload().
   Value& operator=(const Value& other);
   Value& operator=(const Value& other);
-  Value& operator=(Value&& other);
+  Value& operator=(Value&& other) noexcept;
 
 
   /// Swap everything.
   /// Swap everything.
   void swap(Value& other);
   void swap(Value& other);
@@ -637,9 +638,9 @@ private:
   public:
   public:
     Comments() = default;
     Comments() = default;
     Comments(const Comments& that);
     Comments(const Comments& that);
-    Comments(Comments&& that);
+    Comments(Comments&& that) noexcept;
     Comments& operator=(const Comments& that);
     Comments& operator=(const Comments& that);
-    Comments& operator=(Comments&& that);
+    Comments& operator=(Comments&& that) noexcept;
     bool has(CommentPlacement slot) const;
     bool has(CommentPlacement slot) const;
     String get(CommentPlacement slot) const;
     String get(CommentPlacement slot) const;
     void set(CommentPlacement slot, String comment);
     void set(CommentPlacement slot, String comment);
@@ -920,8 +921,8 @@ public:
    *  because the returned references/pointers can be used
    *  because the returned references/pointers can be used
    *  to change state of the base class.
    *  to change state of the base class.
    */
    */
-  reference operator*() { return deref(); }
-  pointer operator->() { return &deref(); }
+  reference operator*() const { return const_cast<reference>(deref()); }
+  pointer operator->() const { return const_cast<pointer>(&deref()); }
 };
 };
 
 
 inline void swap(Value& a, Value& b) { a.swap(b); }
 inline void swap(Value& a, Value& b) { a.swap(b); }

+ 2 - 2
Utilities/cmjsoncpp/include/json/version.h

@@ -9,10 +9,10 @@
 // 3. /CMakeLists.txt
 // 3. /CMakeLists.txt
 // IMPORTANT: also update the SOVERSION!!
 // IMPORTANT: also update the SOVERSION!!
 
 
-#define JSONCPP_VERSION_STRING "1.9.4"
+#define JSONCPP_VERSION_STRING "1.9.5"
 #define JSONCPP_VERSION_MAJOR 1
 #define JSONCPP_VERSION_MAJOR 1
 #define JSONCPP_VERSION_MINOR 9
 #define JSONCPP_VERSION_MINOR 9
-#define JSONCPP_VERSION_PATCH 3
+#define JSONCPP_VERSION_PATCH 5
 #define JSONCPP_VERSION_QUALIFIER
 #define JSONCPP_VERSION_QUALIFIER
 #define JSONCPP_VERSION_HEXA                                                   \
 #define JSONCPP_VERSION_HEXA                                                   \
   ((JSONCPP_VERSION_MAJOR << 24) | (JSONCPP_VERSION_MINOR << 16) |             \
   ((JSONCPP_VERSION_MAJOR << 24) | (JSONCPP_VERSION_MINOR << 16) |             \

+ 10 - 7
Utilities/cmjsoncpp/include/json/writer.h

@@ -21,7 +21,8 @@
 #endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
 #endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
 
 
 #if !defined(__SUNPRO_CC)
 #if !defined(__SUNPRO_CC)
-#pragma pack(push, 8)
+#pragma pack(push)
+#pragma pack()
 #endif
 #endif
 
 
 namespace Json {
 namespace Json {
@@ -112,6 +113,8 @@ public:
    *  - Number of precision digits for formatting of real values.
    *  - Number of precision digits for formatting of real values.
    *  - "precisionType": "significant"(default) or "decimal"
    *  - "precisionType": "significant"(default) or "decimal"
    *  - Type of precision for formatting of real values.
    *  - Type of precision for formatting of real values.
+   *  - "emitUTF8": false or true
+   *  - If true, outputs raw UTF8 strings instead of escaping them.
 
 
    *  You can examine 'settings_` yourself
    *  You can examine 'settings_` yourself
    *  to see the defaults. You can also write and read them just like any
    *  to see the defaults. You can also write and read them just like any
@@ -147,7 +150,7 @@ public:
 /** \brief Abstract class for writers.
 /** \brief Abstract class for writers.
  * deprecated Use StreamWriter. (And really, this is an implementation detail.)
  * deprecated Use StreamWriter. (And really, this is an implementation detail.)
  */
  */
-class JSONCPP_DEPRECATED("Use StreamWriter instead") JSON_API Writer {
+class JSON_API Writer {
 public:
 public:
   virtual ~Writer();
   virtual ~Writer();
 
 
@@ -167,7 +170,7 @@ public:
 #pragma warning(push)
 #pragma warning(push)
 #pragma warning(disable : 4996) // Deriving from deprecated class
 #pragma warning(disable : 4996) // Deriving from deprecated class
 #endif
 #endif
-class JSONCPP_DEPRECATED("Use StreamWriterBuilder instead") JSON_API FastWriter
+class JSON_API FastWriter
     : public Writer {
     : public Writer {
 public:
 public:
   FastWriter();
   FastWriter();
@@ -217,7 +220,7 @@ private:
  *     - otherwise, it the values do not fit on one line, or the array contains
  *     - otherwise, it the values do not fit on one line, or the array contains
  *       object or non empty array, then print one value per line.
  *       object or non empty array, then print one value per line.
  *
  *
- * If the Value have comments then they are outputed according to their
+ * If the Value have comments then they are outputted according to their
  *#CommentPlacement.
  *#CommentPlacement.
  *
  *
  * \sa Reader, Value, Value::setComment()
  * \sa Reader, Value, Value::setComment()
@@ -227,7 +230,7 @@ private:
 #pragma warning(push)
 #pragma warning(push)
 #pragma warning(disable : 4996) // Deriving from deprecated class
 #pragma warning(disable : 4996) // Deriving from deprecated class
 #endif
 #endif
-class JSONCPP_DEPRECATED("Use StreamWriterBuilder instead") JSON_API
+class JSON_API
     StyledWriter : public Writer {
     StyledWriter : public Writer {
 public:
 public:
   StyledWriter();
   StyledWriter();
@@ -286,7 +289,7 @@ private:
  *     - otherwise, it the values do not fit on one line, or the array contains
  *     - otherwise, it the values do not fit on one line, or the array contains
  *       object or non empty array, then print one value per line.
  *       object or non empty array, then print one value per line.
  *
  *
- * If the Value have comments then they are outputed according to their
+ * If the Value have comments then they are outputted according to their
  #CommentPlacement.
  #CommentPlacement.
  *
  *
  * \sa Reader, Value, Value::setComment()
  * \sa Reader, Value, Value::setComment()
@@ -296,7 +299,7 @@ private:
 #pragma warning(push)
 #pragma warning(push)
 #pragma warning(disable : 4996) // Deriving from deprecated class
 #pragma warning(disable : 4996) // Deriving from deprecated class
 #endif
 #endif
-class JSONCPP_DEPRECATED("Use StreamWriterBuilder instead") JSON_API
+class JSON_API
     StyledStreamWriter {
     StyledStreamWriter {
 public:
 public:
   /**
   /**

+ 18 - 7
Utilities/cmjsoncpp/src/lib_json/json_reader.cpp

@@ -12,6 +12,7 @@
 #endif // if !defined(JSON_IS_AMALGAMATION)
 #endif // if !defined(JSON_IS_AMALGAMATION)
 #include <algorithm>
 #include <algorithm>
 #include <cassert>
 #include <cassert>
+#include <cmath>
 #include <cstring>
 #include <cstring>
 #include <iostream>
 #include <iostream>
 #include <istream>
 #include <istream>
@@ -104,8 +105,7 @@ bool Reader::parse(std::istream& is, Value& root, bool collectComments) {
 
 
   // Since String is reference-counted, this at least does not
   // Since String is reference-counted, this at least does not
   // create an extra copy.
   // create an extra copy.
-  String doc;
-  std::getline(is, doc, static_cast<char> EOF);
+  String doc(std::istreambuf_iterator<char>(is), {});
   return parse(doc.data(), doc.data() + doc.size(), root, collectComments);
   return parse(doc.data(), doc.data() + doc.size(), root, collectComments);
 }
 }
 
 
@@ -601,9 +601,15 @@ bool Reader::decodeDouble(Token& token, Value& decoded) {
   double value = 0;
   double value = 0;
   String buffer(token.start_, token.end_);
   String buffer(token.start_, token.end_);
   IStringStream is(buffer);
   IStringStream is(buffer);
-  if (!(is >> value))
-    return addError(
+  if (!(is >> value)) {
+    if (value == std::numeric_limits<double>::max())
+      value = std::numeric_limits<double>::infinity();
+    else if (value == std::numeric_limits<double>::lowest())
+      value = -std::numeric_limits<double>::infinity();
+    else if (!std::isinf(value))
+      return addError(
         "'" + String(token.start_, token.end_) + "' is not a number.", token);
         "'" + String(token.start_, token.end_) + "' is not a number.", token);
+  }
   decoded = value;
   decoded = value;
   return true;
   return true;
 }
 }
@@ -1608,7 +1614,7 @@ bool OurReader::decodeNumber(Token& token, Value& decoded) {
     const auto digit(static_cast<Value::UInt>(c - '0'));
     const auto digit(static_cast<Value::UInt>(c - '0'));
     if (value >= threshold) {
     if (value >= threshold) {
       // We've hit or exceeded the max value divided by 10 (rounded down). If
       // We've hit or exceeded the max value divided by 10 (rounded down). If
-      // a) we've only just touched the limit, meaing value == threshold,
+      // a) we've only just touched the limit, meaning value == threshold,
       // b) this is the last digit, or
       // b) this is the last digit, or
       // c) it's small enough to fit in that rounding delta, we're okay.
       // c) it's small enough to fit in that rounding delta, we're okay.
       // Otherwise treat this number as a double to avoid overflow.
       // Otherwise treat this number as a double to avoid overflow.
@@ -1648,7 +1654,12 @@ bool OurReader::decodeDouble(Token& token, Value& decoded) {
   const String buffer(token.start_, token.end_);
   const String buffer(token.start_, token.end_);
   IStringStream is(buffer);
   IStringStream is(buffer);
   if (!(is >> value)) {
   if (!(is >> value)) {
-    return addError(
+    if (value == std::numeric_limits<double>::max())
+      value = std::numeric_limits<double>::infinity();
+    else if (value == std::numeric_limits<double>::lowest())
+      value = -std::numeric_limits<double>::infinity();
+    else if (!std::isinf(value))
+      return addError(
         "'" + String(token.start_, token.end_) + "' is not a number.", token);
         "'" + String(token.start_, token.end_) + "' is not a number.", token);
   }
   }
   decoded = value;
   decoded = value;
@@ -1922,7 +1933,7 @@ bool CharReaderBuilder::validate(Json::Value* invalid) const {
     if (valid_keys.count(key))
     if (valid_keys.count(key))
       continue;
       continue;
     if (invalid)
     if (invalid)
-      (*invalid)[std::move(key)] = *si;
+      (*invalid)[key] = *si;
     else
     else
       return false;
       return false;
   }
   }

+ 7 - 3
Utilities/cmjsoncpp/src/lib_json/json_tool.h

@@ -116,14 +116,18 @@ template <typename Iter> void fixNumericLocaleInput(Iter begin, Iter end) {
  * Return iterator that would be the new end of the range [begin,end), if we
  * Return iterator that would be the new end of the range [begin,end), if we
  * were to delete zeros in the end of string, but not the last zero before '.'.
  * were to delete zeros in the end of string, but not the last zero before '.'.
  */
  */
-template <typename Iter> Iter fixZerosInTheEnd(Iter begin, Iter end) {
+template <typename Iter>
+Iter fixZerosInTheEnd(Iter begin, Iter end, unsigned int precision) {
   for (; begin != end; --end) {
   for (; begin != end; --end) {
     if (*(end - 1) != '0') {
     if (*(end - 1) != '0') {
       return end;
       return end;
     }
     }
     // Don't delete the last zero before the decimal point.
     // Don't delete the last zero before the decimal point.
-    if (begin != (end - 1) && *(end - 2) == '.') {
-      return end;
+    if (begin != (end - 1) && begin != (end - 2) && *(end - 2) == '.') {
+      if (precision) {
+        return end;
+      }
+      return end - 2;
     }
     }
   }
   }
   return end;
   return end;

+ 13 - 13
Utilities/cmjsoncpp/src/lib_json/json_value.cpp

@@ -259,7 +259,7 @@ Value::CZString::CZString(const CZString& other) {
   storage_.length_ = other.storage_.length_;
   storage_.length_ = other.storage_.length_;
 }
 }
 
 
-Value::CZString::CZString(CZString&& other)
+Value::CZString::CZString(CZString&& other) noexcept
     : cstr_(other.cstr_), index_(other.index_) {
     : cstr_(other.cstr_), index_(other.index_) {
   other.cstr_ = nullptr;
   other.cstr_ = nullptr;
 }
 }
@@ -285,7 +285,7 @@ Value::CZString& Value::CZString::operator=(const CZString& other) {
   return *this;
   return *this;
 }
 }
 
 
-Value::CZString& Value::CZString::operator=(CZString&& other) {
+Value::CZString& Value::CZString::operator=(CZString&& other) noexcept {
   cstr_ = other.cstr_;
   cstr_ = other.cstr_;
   index_ = other.index_;
   index_ = other.index_;
   other.cstr_ = nullptr;
   other.cstr_ = nullptr;
@@ -433,7 +433,7 @@ Value::Value(const Value& other) {
   dupMeta(other);
   dupMeta(other);
 }
 }
 
 
-Value::Value(Value&& other) {
+Value::Value(Value&& other) noexcept {
   initBasic(nullValue);
   initBasic(nullValue);
   swap(other);
   swap(other);
 }
 }
@@ -448,7 +448,7 @@ Value& Value::operator=(const Value& other) {
   return *this;
   return *this;
 }
 }
 
 
-Value& Value::operator=(Value&& other) {
+Value& Value::operator=(Value&& other) noexcept {
   other.swap(*this);
   other.swap(*this);
   return *this;
   return *this;
 }
 }
@@ -912,7 +912,8 @@ void Value::resize(ArrayIndex newSize) {
   if (newSize == 0)
   if (newSize == 0)
     clear();
     clear();
   else if (newSize > oldSize)
   else if (newSize > oldSize)
-    this->operator[](newSize - 1);
+    for (ArrayIndex i = oldSize; i < newSize; ++i)
+      (*this)[i];
   else {
   else {
     for (ArrayIndex index = newSize; index < oldSize; ++index) {
     for (ArrayIndex index = newSize; index < oldSize; ++index) {
       value_.map_->erase(index);
       value_.map_->erase(index);
@@ -1373,14 +1374,15 @@ bool Value::isObject() const { return type() == objectValue; }
 Value::Comments::Comments(const Comments& that)
 Value::Comments::Comments(const Comments& that)
     : ptr_{cloneUnique(that.ptr_)} {}
     : ptr_{cloneUnique(that.ptr_)} {}
 
 
-Value::Comments::Comments(Comments&& that) : ptr_{std::move(that.ptr_)} {}
+Value::Comments::Comments(Comments&& that) noexcept
+    : ptr_{std::move(that.ptr_)} {}
 
 
 Value::Comments& Value::Comments::operator=(const Comments& that) {
 Value::Comments& Value::Comments::operator=(const Comments& that) {
   ptr_ = cloneUnique(that.ptr_);
   ptr_ = cloneUnique(that.ptr_);
   return *this;
   return *this;
 }
 }
 
 
-Value::Comments& Value::Comments::operator=(Comments&& that) {
+Value::Comments& Value::Comments::operator=(Comments&& that) noexcept {
   ptr_ = std::move(that.ptr_);
   ptr_ = std::move(that.ptr_);
   return *this;
   return *this;
 }
 }
@@ -1396,13 +1398,11 @@ String Value::Comments::get(CommentPlacement slot) const {
 }
 }
 
 
 void Value::Comments::set(CommentPlacement slot, String comment) {
 void Value::Comments::set(CommentPlacement slot, String comment) {
-  if (!ptr_) {
+  if (slot >= CommentPlacement::numberOfCommentPlacement)
+    return;
+  if (!ptr_)
     ptr_ = std::unique_ptr<Array>(new Array());
     ptr_ = std::unique_ptr<Array>(new Array());
-  }
-  // check comments array boundry.
-  if (slot < CommentPlacement::numberOfCommentPlacement) {
-    (*ptr_)[slot] = std::move(comment);
-  }
+  (*ptr_)[slot] = std::move(comment);
 }
 }
 
 
 void Value::setComment(String comment, CommentPlacement placement) {
 void Value::setComment(String comment, CommentPlacement placement) {

+ 22 - 21
Utilities/cmjsoncpp/src/lib_json/json_writer.cpp

@@ -68,7 +68,7 @@
 
 
 #if !defined(isnan)
 #if !defined(isnan)
 // IEEE standard states that NaN values will not compare to themselves
 // IEEE standard states that NaN values will not compare to themselves
-#define isnan(x) (x != x)
+#define isnan(x) ((x) != (x))
 #endif
 #endif
 
 
 #if !defined(__APPLE__)
 #if !defined(__APPLE__)
@@ -154,16 +154,18 @@ String valueToString(double value, bool useSpecialFloats,
 
 
   buffer.erase(fixNumericLocale(buffer.begin(), buffer.end()), buffer.end());
   buffer.erase(fixNumericLocale(buffer.begin(), buffer.end()), buffer.end());
 
 
-  // strip the zero padding from the right
-  if (precisionType == PrecisionType::decimalPlaces) {
-    buffer.erase(fixZerosInTheEnd(buffer.begin(), buffer.end()), buffer.end());
-  }
-
   // try to ensure we preserve the fact that this was given to us as a double on
   // try to ensure we preserve the fact that this was given to us as a double on
   // input
   // input
   if (buffer.find('.') == buffer.npos && buffer.find('e') == buffer.npos) {
   if (buffer.find('.') == buffer.npos && buffer.find('e') == buffer.npos) {
     buffer += ".0";
     buffer += ".0";
   }
   }
+
+  // strip the zero padding from the right
+  if (precisionType == PrecisionType::decimalPlaces) {
+    buffer.erase(fixZerosInTheEnd(buffer.begin(), buffer.end(), precision),
+                 buffer.end());
+  }
+
   return buffer;
   return buffer;
 }
 }
 } // namespace
 } // namespace
@@ -270,7 +272,7 @@ static void appendHex(String& result, unsigned ch) {
   result.append("\\u").append(toHex16Bit(ch));
   result.append("\\u").append(toHex16Bit(ch));
 }
 }
 
 
-static String valueToQuotedStringN(const char* value, unsigned length,
+static String valueToQuotedStringN(const char* value, size_t length,
                                    bool emitUTF8 = false) {
                                    bool emitUTF8 = false) {
   if (value == nullptr)
   if (value == nullptr)
     return "";
     return "";
@@ -348,7 +350,7 @@ static String valueToQuotedStringN(const char* value, unsigned length,
 }
 }
 
 
 String valueToQuotedString(const char* value) {
 String valueToQuotedString(const char* value) {
-  return valueToQuotedStringN(value, static_cast<unsigned int>(strlen(value)));
+  return valueToQuotedStringN(value, strlen(value));
 }
 }
 
 
 // Class Writer
 // Class Writer
@@ -397,7 +399,7 @@ void FastWriter::writeValue(const Value& value) {
     char const* end;
     char const* end;
     bool ok = value.getString(&str, &end);
     bool ok = value.getString(&str, &end);
     if (ok)
     if (ok)
-      document_ += valueToQuotedStringN(str, static_cast<unsigned>(end - str));
+      document_ += valueToQuotedStringN(str, static_cast<size_t>(end - str));
     break;
     break;
   }
   }
   case booleanValue:
   case booleanValue:
@@ -420,8 +422,7 @@ void FastWriter::writeValue(const Value& value) {
       const String& name = *it;
       const String& name = *it;
       if (it != members.begin())
       if (it != members.begin())
         document_ += ',';
         document_ += ',';
-      document_ += valueToQuotedStringN(name.data(),
-                                        static_cast<unsigned>(name.length()));
+      document_ += valueToQuotedStringN(name.data(), name.length());
       document_ += yamlCompatibilityEnabled_ ? ": " : ":";
       document_ += yamlCompatibilityEnabled_ ? ": " : ":";
       writeValue(value[name]);
       writeValue(value[name]);
     }
     }
@@ -466,7 +467,7 @@ void StyledWriter::writeValue(const Value& value) {
     char const* end;
     char const* end;
     bool ok = value.getString(&str, &end);
     bool ok = value.getString(&str, &end);
     if (ok)
     if (ok)
-      pushValue(valueToQuotedStringN(str, static_cast<unsigned>(end - str)));
+      pushValue(valueToQuotedStringN(str, static_cast<size_t>(end - str)));
     else
     else
       pushValue("");
       pushValue("");
     break;
     break;
@@ -507,7 +508,7 @@ void StyledWriter::writeValue(const Value& value) {
 }
 }
 
 
 void StyledWriter::writeArrayValue(const Value& value) {
 void StyledWriter::writeArrayValue(const Value& value) {
-  unsigned size = value.size();
+  size_t size = value.size();
   if (size == 0)
   if (size == 0)
     pushValue("[]");
     pushValue("[]");
   else {
   else {
@@ -516,7 +517,7 @@ void StyledWriter::writeArrayValue(const Value& value) {
       writeWithIndent("[");
       writeWithIndent("[");
       indent();
       indent();
       bool hasChildValue = !childValues_.empty();
       bool hasChildValue = !childValues_.empty();
-      unsigned index = 0;
+      ArrayIndex index = 0;
       for (;;) {
       for (;;) {
         const Value& childValue = value[index];
         const Value& childValue = value[index];
         writeCommentBeforeValue(childValue);
         writeCommentBeforeValue(childValue);
@@ -539,7 +540,7 @@ void StyledWriter::writeArrayValue(const Value& value) {
     {
     {
       assert(childValues_.size() == size);
       assert(childValues_.size() == size);
       document_ += "[ ";
       document_ += "[ ";
-      for (unsigned index = 0; index < size; ++index) {
+      for (size_t index = 0; index < size; ++index) {
         if (index > 0)
         if (index > 0)
           document_ += ", ";
           document_ += ", ";
         document_ += childValues_[index];
         document_ += childValues_[index];
@@ -684,7 +685,7 @@ void StyledStreamWriter::writeValue(const Value& value) {
     char const* end;
     char const* end;
     bool ok = value.getString(&str, &end);
     bool ok = value.getString(&str, &end);
     if (ok)
     if (ok)
-      pushValue(valueToQuotedStringN(str, static_cast<unsigned>(end - str)));
+      pushValue(valueToQuotedStringN(str, static_cast<size_t>(end - str)));
     else
     else
       pushValue("");
       pushValue("");
     break;
     break;
@@ -958,8 +959,8 @@ void BuiltStyledStreamWriter::writeValue(Value const& value) {
     char const* end;
     char const* end;
     bool ok = value.getString(&str, &end);
     bool ok = value.getString(&str, &end);
     if (ok)
     if (ok)
-      pushValue(valueToQuotedStringN(str, static_cast<unsigned>(end - str),
-                                     emitUTF8_));
+      pushValue(
+          valueToQuotedStringN(str, static_cast<size_t>(end - str), emitUTF8_));
     else
     else
       pushValue("");
       pushValue("");
     break;
     break;
@@ -982,8 +983,8 @@ void BuiltStyledStreamWriter::writeValue(Value const& value) {
         String const& name = *it;
         String const& name = *it;
         Value const& childValue = value[name];
         Value const& childValue = value[name];
         writeCommentBeforeValue(childValue);
         writeCommentBeforeValue(childValue);
-        writeWithIndent(valueToQuotedStringN(
-            name.data(), static_cast<unsigned>(name.length()), emitUTF8_));
+        writeWithIndent(
+            valueToQuotedStringN(name.data(), name.length(), emitUTF8_));
         *sout_ << colonSymbol_;
         *sout_ << colonSymbol_;
         writeValue(childValue);
         writeValue(childValue);
         if (++it == members.end()) {
         if (++it == members.end()) {
@@ -1217,7 +1218,7 @@ bool StreamWriterBuilder::validate(Json::Value* invalid) const {
     if (valid_keys.count(key))
     if (valid_keys.count(key))
       continue;
       continue;
     if (invalid)
     if (invalid)
-      (*invalid)[std::move(key)] = *si;
+      (*invalid)[key] = *si;
     else
     else
       return false;
       return false;
   }
   }