| Index: third_party/protobuf/conformance/third_party/jsoncpp/json.h
|
| diff --git a/third_party/protobuf/conformance/third_party/jsoncpp/json.h b/third_party/protobuf/conformance/third_party/jsoncpp/json.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..42e7e7f4ad036fbd981f125ebb98c144238b1dbf
|
| --- /dev/null
|
| +++ b/third_party/protobuf/conformance/third_party/jsoncpp/json.h
|
| @@ -0,0 +1,2075 @@
|
| +/// Json-cpp amalgated header (http://jsoncpp.sourceforge.net/).
|
| +/// It is intended to be used with #include "json/json.h"
|
| +
|
| +// //////////////////////////////////////////////////////////////////////
|
| +// Beginning of content of file: LICENSE
|
| +// //////////////////////////////////////////////////////////////////////
|
| +
|
| +/*
|
| +The JsonCpp library's source code, including accompanying documentation,
|
| +tests and demonstration applications, are licensed under the following
|
| +conditions...
|
| +
|
| +The author (Baptiste Lepilleur) explicitly disclaims copyright in all
|
| +jurisdictions which recognize such a disclaimer. In such jurisdictions,
|
| +this software is released into the Public Domain.
|
| +
|
| +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 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
|
| +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
|
| +described in clear, concise terms at:
|
| +
|
| + http://en.wikipedia.org/wiki/MIT_License
|
| +
|
| +The full text of the MIT License follows:
|
| +
|
| +========================================================================
|
| +Copyright (c) 2007-2010 Baptiste Lepilleur
|
| +
|
| +Permission is hereby granted, free of charge, to any person
|
| +obtaining a copy of this software and associated documentation
|
| +files (the "Software"), to deal in the Software without
|
| +restriction, including without limitation the rights to use, copy,
|
| +modify, merge, publish, distribute, sublicense, and/or sell copies
|
| +of the Software, and to permit persons to whom the Software is
|
| +furnished to do so, subject to the following conditions:
|
| +
|
| +The above copyright notice and this permission notice shall be
|
| +included in all copies or substantial portions of the Software.
|
| +
|
| +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
| +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
| +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
| +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
| +BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
| +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
| +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
| +SOFTWARE.
|
| +========================================================================
|
| +(END LICENSE TEXT)
|
| +
|
| +The MIT license is compatible with both the GPL and commercial
|
| +software, affording one all of the rights of Public Domain with the
|
| +minor nuisance of being required to keep the above copyright notice
|
| +and license text in the source code. Note also that by accepting the
|
| +Public Domain "license" you can re-license your copy using whatever
|
| +license you like.
|
| +
|
| +*/
|
| +
|
| +// //////////////////////////////////////////////////////////////////////
|
| +// End of content of file: LICENSE
|
| +// //////////////////////////////////////////////////////////////////////
|
| +
|
| +
|
| +
|
| +
|
| +
|
| +#ifndef JSON_AMALGATED_H_INCLUDED
|
| +# define JSON_AMALGATED_H_INCLUDED
|
| +/// If defined, indicates that the source file is amalgated
|
| +/// to prevent private header inclusion.
|
| +#define JSON_IS_AMALGAMATION
|
| +
|
| +// //////////////////////////////////////////////////////////////////////
|
| +// Beginning of content of file: include/json/version.h
|
| +// //////////////////////////////////////////////////////////////////////
|
| +
|
| +// DO NOT EDIT. This file (and "version") is generated by CMake.
|
| +// Run CMake configure step to update it.
|
| +#ifndef JSON_VERSION_H_INCLUDED
|
| +# define JSON_VERSION_H_INCLUDED
|
| +
|
| +# define JSONCPP_VERSION_STRING "1.6.5"
|
| +# define JSONCPP_VERSION_MAJOR 1
|
| +# define JSONCPP_VERSION_MINOR 6
|
| +# define JSONCPP_VERSION_PATCH 5
|
| +# define JSONCPP_VERSION_QUALIFIER
|
| +# define JSONCPP_VERSION_HEXA ((JSONCPP_VERSION_MAJOR << 24) | (JSONCPP_VERSION_MINOR << 16) | (JSONCPP_VERSION_PATCH << 8))
|
| +
|
| +#endif // JSON_VERSION_H_INCLUDED
|
| +
|
| +// //////////////////////////////////////////////////////////////////////
|
| +// End of content of file: include/json/version.h
|
| +// //////////////////////////////////////////////////////////////////////
|
| +
|
| +
|
| +
|
| +
|
| +
|
| +
|
| +// //////////////////////////////////////////////////////////////////////
|
| +// Beginning of content of file: include/json/config.h
|
| +// //////////////////////////////////////////////////////////////////////
|
| +
|
| +// Copyright 2007-2010 Baptiste Lepilleur
|
| +// Distributed under MIT license, or public domain if desired and
|
| +// recognized in your jurisdiction.
|
| +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
| +
|
| +#ifndef JSON_CONFIG_H_INCLUDED
|
| +#define JSON_CONFIG_H_INCLUDED
|
| +
|
| +/// If defined, indicates that json library is embedded in CppTL library.
|
| +//# define JSON_IN_CPPTL 1
|
| +
|
| +/// If defined, indicates that json may leverage CppTL library
|
| +//# define JSON_USE_CPPTL 1
|
| +/// If defined, indicates that cpptl vector based map should be used instead of
|
| +/// std::map
|
| +/// as Value container.
|
| +//# define JSON_USE_CPPTL_SMALLMAP 1
|
| +
|
| +// If non-zero, the library uses exceptions to report bad input instead of C
|
| +// assertion macros. The default is to use exceptions.
|
| +#ifndef JSON_USE_EXCEPTION
|
| +#define JSON_USE_EXCEPTION 1
|
| +#endif
|
| +
|
| +/// If defined, indicates that the source file is amalgated
|
| +/// to prevent private header inclusion.
|
| +/// Remarks: it is automatically defined in the generated amalgated header.
|
| +// #define JSON_IS_AMALGAMATION
|
| +
|
| +#ifdef JSON_IN_CPPTL
|
| +#include <cpptl/config.h>
|
| +#ifndef JSON_USE_CPPTL
|
| +#define JSON_USE_CPPTL 1
|
| +#endif
|
| +#endif
|
| +
|
| +#ifdef JSON_IN_CPPTL
|
| +#define JSON_API CPPTL_API
|
| +#elif defined(JSON_DLL_BUILD)
|
| +#if defined(_MSC_VER)
|
| +#define JSON_API __declspec(dllexport)
|
| +#define JSONCPP_DISABLE_DLL_INTERFACE_WARNING
|
| +#endif // if defined(_MSC_VER)
|
| +#elif defined(JSON_DLL)
|
| +#if defined(_MSC_VER)
|
| +#define JSON_API __declspec(dllimport)
|
| +#define JSONCPP_DISABLE_DLL_INTERFACE_WARNING
|
| +#endif // if defined(_MSC_VER)
|
| +#endif // ifdef JSON_IN_CPPTL
|
| +#if !defined(JSON_API)
|
| +#define JSON_API
|
| +#endif
|
| +
|
| +// If JSON_NO_INT64 is defined, then Json only support C++ "int" type for
|
| +// integer
|
| +// Storages, and 64 bits integer support is disabled.
|
| +// #define JSON_NO_INT64 1
|
| +
|
| +#if defined(_MSC_VER) // MSVC
|
| +# if _MSC_VER <= 1200 // MSVC 6
|
| + // Microsoft Visual Studio 6 only support conversion from __int64 to double
|
| + // (no conversion from unsigned __int64).
|
| +# define JSON_USE_INT64_DOUBLE_CONVERSION 1
|
| + // Disable warning 4786 for VS6 caused by STL (identifier was truncated to '255'
|
| + // characters in the debug information)
|
| + // All projects I've ever seen with VS6 were using this globally (not bothering
|
| + // with pragma push/pop).
|
| +# pragma warning(disable : 4786)
|
| +# endif // MSVC 6
|
| +
|
| +# if _MSC_VER >= 1500 // MSVC 2008
|
| + /// Indicates that the following function is deprecated.
|
| +# define JSONCPP_DEPRECATED(message) __declspec(deprecated(message))
|
| +# endif
|
| +
|
| +#endif // defined(_MSC_VER)
|
| +
|
| +
|
| +#ifndef JSON_HAS_RVALUE_REFERENCES
|
| +
|
| +#if defined(_MSC_VER) && _MSC_VER >= 1600 // MSVC >= 2010
|
| +#define JSON_HAS_RVALUE_REFERENCES 1
|
| +#endif // MSVC >= 2010
|
| +
|
| +#ifdef __clang__
|
| +#if __has_feature(cxx_rvalue_references)
|
| +#define JSON_HAS_RVALUE_REFERENCES 1
|
| +#endif // has_feature
|
| +
|
| +#elif defined __GNUC__ // not clang (gcc comes later since clang emulates gcc)
|
| +#if defined(__GXX_EXPERIMENTAL_CXX0X__) || (__cplusplus >= 201103L)
|
| +#define JSON_HAS_RVALUE_REFERENCES 1
|
| +#endif // GXX_EXPERIMENTAL
|
| +
|
| +#endif // __clang__ || __GNUC__
|
| +
|
| +#endif // not defined JSON_HAS_RVALUE_REFERENCES
|
| +
|
| +#ifndef JSON_HAS_RVALUE_REFERENCES
|
| +#define JSON_HAS_RVALUE_REFERENCES 0
|
| +#endif
|
| +
|
| +#ifdef __clang__
|
| +#elif defined __GNUC__ // not clang (gcc comes later since clang emulates gcc)
|
| +# if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5))
|
| +# define JSONCPP_DEPRECATED(message) __attribute__ ((deprecated(message)))
|
| +# elif (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1))
|
| +# define JSONCPP_DEPRECATED(message) __attribute__((__deprecated__))
|
| +# endif // GNUC version
|
| +#endif // __clang__ || __GNUC__
|
| +
|
| +#if !defined(JSONCPP_DEPRECATED)
|
| +#define JSONCPP_DEPRECATED(message)
|
| +#endif // if !defined(JSONCPP_DEPRECATED)
|
| +
|
| +namespace Json {
|
| +typedef int Int;
|
| +typedef unsigned int UInt;
|
| +#if defined(JSON_NO_INT64)
|
| +typedef int LargestInt;
|
| +typedef unsigned int LargestUInt;
|
| +#undef JSON_HAS_INT64
|
| +#else // if defined(JSON_NO_INT64)
|
| +// For Microsoft Visual use specific types as long long is not supported
|
| +#if defined(_MSC_VER) // Microsoft Visual Studio
|
| +typedef __int64 Int64;
|
| +typedef unsigned __int64 UInt64;
|
| +#else // if defined(_MSC_VER) // Other platforms, use long long
|
| +typedef long long int Int64;
|
| +typedef unsigned long long int UInt64;
|
| +#endif // if defined(_MSC_VER)
|
| +typedef Int64 LargestInt;
|
| +typedef UInt64 LargestUInt;
|
| +#define JSON_HAS_INT64
|
| +#endif // if defined(JSON_NO_INT64)
|
| +} // end namespace Json
|
| +
|
| +#endif // JSON_CONFIG_H_INCLUDED
|
| +
|
| +// //////////////////////////////////////////////////////////////////////
|
| +// End of content of file: include/json/config.h
|
| +// //////////////////////////////////////////////////////////////////////
|
| +
|
| +
|
| +
|
| +
|
| +
|
| +
|
| +// //////////////////////////////////////////////////////////////////////
|
| +// Beginning of content of file: include/json/forwards.h
|
| +// //////////////////////////////////////////////////////////////////////
|
| +
|
| +// Copyright 2007-2010 Baptiste Lepilleur
|
| +// Distributed under MIT license, or public domain if desired and
|
| +// recognized in your jurisdiction.
|
| +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
| +
|
| +#ifndef JSON_FORWARDS_H_INCLUDED
|
| +#define JSON_FORWARDS_H_INCLUDED
|
| +
|
| +#if !defined(JSON_IS_AMALGAMATION)
|
| +#include "config.h"
|
| +#endif // if !defined(JSON_IS_AMALGAMATION)
|
| +
|
| +namespace Json {
|
| +
|
| +// writer.h
|
| +class FastWriter;
|
| +class StyledWriter;
|
| +
|
| +// reader.h
|
| +class Reader;
|
| +
|
| +// features.h
|
| +class Features;
|
| +
|
| +// value.h
|
| +typedef unsigned int ArrayIndex;
|
| +class StaticString;
|
| +class Path;
|
| +class PathArgument;
|
| +class Value;
|
| +class ValueIteratorBase;
|
| +class ValueIterator;
|
| +class ValueConstIterator;
|
| +
|
| +} // namespace Json
|
| +
|
| +#endif // JSON_FORWARDS_H_INCLUDED
|
| +
|
| +// //////////////////////////////////////////////////////////////////////
|
| +// End of content of file: include/json/forwards.h
|
| +// //////////////////////////////////////////////////////////////////////
|
| +
|
| +
|
| +
|
| +
|
| +
|
| +
|
| +// //////////////////////////////////////////////////////////////////////
|
| +// Beginning of content of file: include/json/features.h
|
| +// //////////////////////////////////////////////////////////////////////
|
| +
|
| +// Copyright 2007-2010 Baptiste Lepilleur
|
| +// Distributed under MIT license, or public domain if desired and
|
| +// recognized in your jurisdiction.
|
| +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
| +
|
| +#ifndef CPPTL_JSON_FEATURES_H_INCLUDED
|
| +#define CPPTL_JSON_FEATURES_H_INCLUDED
|
| +
|
| +#if !defined(JSON_IS_AMALGAMATION)
|
| +#include "forwards.h"
|
| +#endif // if !defined(JSON_IS_AMALGAMATION)
|
| +
|
| +namespace Json {
|
| +
|
| +/** \brief Configuration passed to reader and writer.
|
| + * This configuration object can be used to force the Reader or Writer
|
| + * to behave in a standard conforming way.
|
| + */
|
| +class JSON_API Features {
|
| +public:
|
| + /** \brief A configuration that allows all features and assumes all strings
|
| + * are UTF-8.
|
| + * - C & C++ comments are allowed
|
| + * - Root object can be any JSON value
|
| + * - Assumes Value strings are encoded in UTF-8
|
| + */
|
| + static Features all();
|
| +
|
| + /** \brief A configuration that is strictly compatible with the JSON
|
| + * specification.
|
| + * - Comments are forbidden.
|
| + * - Root object must be either an array or an object value.
|
| + * - Assumes Value strings are encoded in UTF-8
|
| + */
|
| + static Features strictMode();
|
| +
|
| + /** \brief Initialize the configuration like JsonConfig::allFeatures;
|
| + */
|
| + Features();
|
| +
|
| + /// \c true if comments are allowed. Default: \c true.
|
| + bool allowComments_;
|
| +
|
| + /// \c true if root must be either an array or an object value. Default: \c
|
| + /// false.
|
| + bool strictRoot_;
|
| +
|
| + /// \c true if dropped null placeholders are allowed. Default: \c false.
|
| + bool allowDroppedNullPlaceholders_;
|
| +
|
| + /// \c true if numeric object key are allowed. Default: \c false.
|
| + bool allowNumericKeys_;
|
| +};
|
| +
|
| +} // namespace Json
|
| +
|
| +#endif // CPPTL_JSON_FEATURES_H_INCLUDED
|
| +
|
| +// //////////////////////////////////////////////////////////////////////
|
| +// End of content of file: include/json/features.h
|
| +// //////////////////////////////////////////////////////////////////////
|
| +
|
| +
|
| +
|
| +
|
| +
|
| +
|
| +// //////////////////////////////////////////////////////////////////////
|
| +// Beginning of content of file: include/json/value.h
|
| +// //////////////////////////////////////////////////////////////////////
|
| +
|
| +// Copyright 2007-2010 Baptiste Lepilleur
|
| +// Distributed under MIT license, or public domain if desired and
|
| +// recognized in your jurisdiction.
|
| +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
| +
|
| +#ifndef CPPTL_JSON_H_INCLUDED
|
| +#define CPPTL_JSON_H_INCLUDED
|
| +
|
| +#if !defined(JSON_IS_AMALGAMATION)
|
| +#include "forwards.h"
|
| +#endif // if !defined(JSON_IS_AMALGAMATION)
|
| +#include <string>
|
| +#include <vector>
|
| +#include <exception>
|
| +
|
| +#ifndef JSON_USE_CPPTL_SMALLMAP
|
| +#include <map>
|
| +#else
|
| +#include <cpptl/smallmap.h>
|
| +#endif
|
| +#ifdef JSON_USE_CPPTL
|
| +#include <cpptl/forwards.h>
|
| +#endif
|
| +
|
| +// Disable warning C4251: <data member>: <type> needs to have dll-interface to
|
| +// be used by...
|
| +#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
|
| +#pragma warning(push)
|
| +#pragma warning(disable : 4251)
|
| +#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
|
| +
|
| +/** \brief JSON (JavaScript Object Notation).
|
| + */
|
| +namespace Json {
|
| +
|
| +/** Base class for all exceptions we throw.
|
| + *
|
| + * We use nothing but these internally. Of course, STL can throw others.
|
| + */
|
| +class JSON_API Exception : public std::exception {
|
| +public:
|
| + Exception(std::string const& msg);
|
| + ~Exception() throw() override;
|
| + char const* what() const throw() override;
|
| +protected:
|
| + std::string msg_;
|
| +};
|
| +
|
| +/** Exceptions which the user cannot easily avoid.
|
| + *
|
| + * E.g. out-of-memory (when we use malloc), stack-overflow, malicious input
|
| + *
|
| + * \remark derived from Json::Exception
|
| + */
|
| +class JSON_API RuntimeError : public Exception {
|
| +public:
|
| + RuntimeError(std::string const& msg);
|
| +};
|
| +
|
| +/** Exceptions thrown by JSON_ASSERT/JSON_FAIL macros.
|
| + *
|
| + * These are precondition-violations (user bugs) and internal errors (our bugs).
|
| + *
|
| + * \remark derived from Json::Exception
|
| + */
|
| +class JSON_API LogicError : public Exception {
|
| +public:
|
| + LogicError(std::string const& msg);
|
| +};
|
| +
|
| +/// used internally
|
| +void throwRuntimeError(std::string const& msg);
|
| +/// used internally
|
| +void throwLogicError(std::string const& msg);
|
| +
|
| +/** \brief Type of the value held by a Value object.
|
| + */
|
| +enum ValueType {
|
| + nullValue = 0, ///< 'null' value
|
| + intValue, ///< signed integer value
|
| + uintValue, ///< unsigned integer value
|
| + realValue, ///< double value
|
| + stringValue, ///< UTF-8 string value
|
| + booleanValue, ///< bool value
|
| + arrayValue, ///< array value (ordered list)
|
| + objectValue ///< object value (collection of name/value pairs).
|
| +};
|
| +
|
| +enum CommentPlacement {
|
| + commentBefore = 0, ///< a comment placed on the line before a value
|
| + commentAfterOnSameLine, ///< a comment just after a value on the same line
|
| + commentAfter, ///< a comment on the line after a value (only make sense for
|
| + /// root value)
|
| + numberOfCommentPlacement
|
| +};
|
| +
|
| +//# ifdef JSON_USE_CPPTL
|
| +// typedef CppTL::AnyEnumerator<const char *> EnumMemberNames;
|
| +// typedef CppTL::AnyEnumerator<const Value &> EnumValues;
|
| +//# endif
|
| +
|
| +/** \brief Lightweight wrapper to tag static string.
|
| + *
|
| + * Value constructor and objectValue member assignement takes advantage of the
|
| + * StaticString and avoid the cost of string duplication when storing the
|
| + * string or the member name.
|
| + *
|
| + * Example of usage:
|
| + * \code
|
| + * Json::Value aValue( StaticString("some text") );
|
| + * Json::Value object;
|
| + * static const StaticString code("code");
|
| + * object[code] = 1234;
|
| + * \endcode
|
| + */
|
| +class JSON_API StaticString {
|
| +public:
|
| + explicit StaticString(const char* czstring) : c_str_(czstring) {}
|
| +
|
| + operator const char*() const { return c_str_; }
|
| +
|
| + const char* c_str() const { return c_str_; }
|
| +
|
| +private:
|
| + const char* c_str_;
|
| +};
|
| +
|
| +/** \brief Represents a <a HREF="http://www.json.org">JSON</a> value.
|
| + *
|
| + * This class is a discriminated union wrapper that can represents a:
|
| + * - signed integer [range: Value::minInt - Value::maxInt]
|
| + * - unsigned integer (range: 0 - Value::maxUInt)
|
| + * - double
|
| + * - UTF-8 string
|
| + * - boolean
|
| + * - 'null'
|
| + * - an ordered list of Value
|
| + * - collection of name/value pairs (javascript object)
|
| + *
|
| + * The type of the held value is represented by a #ValueType and
|
| + * can be obtained using type().
|
| + *
|
| + * Values of an #objectValue or #arrayValue can be accessed using operator[]()
|
| + * methods.
|
| + * Non-const methods will automatically create the a #nullValue element
|
| + * if it does not exist.
|
| + * The sequence of an #arrayValue will be automatically resized and initialized
|
| + * with #nullValue. resize() can be used to enlarge or truncate an #arrayValue.
|
| + *
|
| + * The get() methods can be used to obtain default value in the case the
|
| + * required element does not exist.
|
| + *
|
| + * It is possible to iterate over the list of a #objectValue values using
|
| + * the getMemberNames() method.
|
| + *
|
| + * \note #Value string-length fit in size_t, but keys must be < 2^30.
|
| + * (The reason is an implementation detail.) A #CharReader will raise an
|
| + * exception if a bound is exceeded to avoid security holes in your app,
|
| + * but the Value API does *not* check bounds. That is the responsibility
|
| + * of the caller.
|
| + */
|
| +class JSON_API Value {
|
| + friend class ValueIteratorBase;
|
| +public:
|
| + typedef std::vector<std::string> Members;
|
| + typedef ValueIterator iterator;
|
| + typedef ValueConstIterator const_iterator;
|
| + typedef Json::UInt UInt;
|
| + typedef Json::Int Int;
|
| +#if defined(JSON_HAS_INT64)
|
| + typedef Json::UInt64 UInt64;
|
| + typedef Json::Int64 Int64;
|
| +#endif // defined(JSON_HAS_INT64)
|
| + typedef Json::LargestInt LargestInt;
|
| + typedef Json::LargestUInt LargestUInt;
|
| + typedef Json::ArrayIndex ArrayIndex;
|
| +
|
| + static const Value& null; ///< We regret this reference to a global instance; prefer the simpler Value().
|
| + static const Value& nullRef; ///< just a kludge for binary-compatibility; same as null
|
| + /// Minimum signed integer value that can be stored in a Json::Value.
|
| + static const LargestInt minLargestInt;
|
| + /// Maximum signed integer value that can be stored in a Json::Value.
|
| + static const LargestInt maxLargestInt;
|
| + /// Maximum unsigned integer value that can be stored in a Json::Value.
|
| + static const LargestUInt maxLargestUInt;
|
| +
|
| + /// Minimum signed int value that can be stored in a Json::Value.
|
| + static const Int minInt;
|
| + /// Maximum signed int value that can be stored in a Json::Value.
|
| + static const Int maxInt;
|
| + /// Maximum unsigned int value that can be stored in a Json::Value.
|
| + static const UInt maxUInt;
|
| +
|
| +#if defined(JSON_HAS_INT64)
|
| + /// Minimum signed 64 bits int value that can be stored in a Json::Value.
|
| + static const Int64 minInt64;
|
| + /// Maximum signed 64 bits int value that can be stored in a Json::Value.
|
| + static const Int64 maxInt64;
|
| + /// Maximum unsigned 64 bits int value that can be stored in a Json::Value.
|
| + static const UInt64 maxUInt64;
|
| +#endif // defined(JSON_HAS_INT64)
|
| +
|
| +private:
|
| +#ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION
|
| + class CZString {
|
| + public:
|
| + enum DuplicationPolicy {
|
| + noDuplication = 0,
|
| + duplicate,
|
| + duplicateOnCopy
|
| + };
|
| + CZString(ArrayIndex index);
|
| + CZString(char const* str, unsigned length, DuplicationPolicy allocate);
|
| + CZString(CZString const& other);
|
| +#if JSON_HAS_RVALUE_REFERENCES
|
| + CZString(CZString&& other);
|
| +#endif
|
| + ~CZString();
|
| + CZString& operator=(CZString other);
|
| + bool operator<(CZString const& other) const;
|
| + bool operator==(CZString const& other) const;
|
| + ArrayIndex index() const;
|
| + //const char* c_str() const; ///< \deprecated
|
| + char const* data() const;
|
| + unsigned length() const;
|
| + bool isStaticString() const;
|
| +
|
| + private:
|
| + void swap(CZString& other);
|
| +
|
| + struct StringStorage {
|
| + unsigned policy_: 2;
|
| + unsigned length_: 30; // 1GB max
|
| + };
|
| +
|
| + char const* cstr_; // actually, a prefixed string, unless policy is noDup
|
| + union {
|
| + ArrayIndex index_;
|
| + StringStorage storage_;
|
| + };
|
| + };
|
| +
|
| +public:
|
| +#ifndef JSON_USE_CPPTL_SMALLMAP
|
| + typedef std::map<CZString, Value> ObjectValues;
|
| +#else
|
| + typedef CppTL::SmallMap<CZString, Value> ObjectValues;
|
| +#endif // ifndef JSON_USE_CPPTL_SMALLMAP
|
| +#endif // ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION
|
| +
|
| +public:
|
| + /** \brief Create a default Value of the given type.
|
| +
|
| + This is a very useful constructor.
|
| + To create an empty array, pass arrayValue.
|
| + To create an empty object, pass objectValue.
|
| + Another Value can then be set to this one by assignment.
|
| +This is useful since clear() and resize() will not alter types.
|
| +
|
| + Examples:
|
| +\code
|
| +Json::Value null_value; // null
|
| +Json::Value arr_value(Json::arrayValue); // []
|
| +Json::Value obj_value(Json::objectValue); // {}
|
| +\endcode
|
| + */
|
| + Value(ValueType type = nullValue);
|
| + Value(Int value);
|
| + Value(UInt value);
|
| +#if defined(JSON_HAS_INT64)
|
| + Value(Int64 value);
|
| + Value(UInt64 value);
|
| +#endif // if defined(JSON_HAS_INT64)
|
| + Value(double value);
|
| + Value(const char* value); ///< Copy til first 0. (NULL causes to seg-fault.)
|
| + Value(const char* begin, const char* end); ///< Copy all, incl zeroes.
|
| + /** \brief Constructs a value from a static string.
|
| +
|
| + * Like other value string constructor but do not duplicate the string for
|
| + * internal storage. The given string must remain alive after the call to this
|
| + * constructor.
|
| + * \note This works only for null-terminated strings. (We cannot change the
|
| + * size of this class, so we have nowhere to store the length,
|
| + * which might be computed later for various operations.)
|
| + *
|
| + * Example of usage:
|
| + * \code
|
| + * static StaticString foo("some text");
|
| + * Json::Value aValue(foo);
|
| + * \endcode
|
| + */
|
| + Value(const StaticString& value);
|
| + Value(const std::string& value); ///< Copy data() til size(). Embedded zeroes too.
|
| +#ifdef JSON_USE_CPPTL
|
| + Value(const CppTL::ConstString& value);
|
| +#endif
|
| + Value(bool value);
|
| + /// Deep copy.
|
| + Value(const Value& other);
|
| +#if JSON_HAS_RVALUE_REFERENCES
|
| + /// Move constructor
|
| + Value(Value&& other);
|
| +#endif
|
| + ~Value();
|
| +
|
| + /// Deep copy, then swap(other).
|
| + /// \note Over-write existing comments. To preserve comments, use #swapPayload().
|
| + Value& operator=(Value other);
|
| + /// Swap everything.
|
| + void swap(Value& other);
|
| + /// Swap values but leave comments and source offsets in place.
|
| + void swapPayload(Value& other);
|
| +
|
| + ValueType type() const;
|
| +
|
| + /// Compare payload only, not comments etc.
|
| + bool operator<(const Value& other) const;
|
| + bool operator<=(const Value& other) const;
|
| + bool operator>=(const Value& other) const;
|
| + bool operator>(const Value& other) const;
|
| + bool operator==(const Value& other) const;
|
| + bool operator!=(const Value& other) const;
|
| + int compare(const Value& other) const;
|
| +
|
| + const char* asCString() const; ///< Embedded zeroes could cause you trouble!
|
| + std::string asString() const; ///< Embedded zeroes are possible.
|
| + /** Get raw char* of string-value.
|
| + * \return false if !string. (Seg-fault if str or end are NULL.)
|
| + */
|
| + bool getString(
|
| + char const** begin, char const** end) const;
|
| +#ifdef JSON_USE_CPPTL
|
| + CppTL::ConstString asConstString() const;
|
| +#endif
|
| + Int asInt() const;
|
| + UInt asUInt() const;
|
| +#if defined(JSON_HAS_INT64)
|
| + Int64 asInt64() const;
|
| + UInt64 asUInt64() const;
|
| +#endif // if defined(JSON_HAS_INT64)
|
| + LargestInt asLargestInt() const;
|
| + LargestUInt asLargestUInt() const;
|
| + float asFloat() const;
|
| + double asDouble() const;
|
| + bool asBool() const;
|
| +
|
| + bool isNull() const;
|
| + bool isBool() const;
|
| + bool isInt() const;
|
| + bool isInt64() const;
|
| + bool isUInt() const;
|
| + bool isUInt64() const;
|
| + bool isIntegral() const;
|
| + bool isDouble() const;
|
| + bool isNumeric() const;
|
| + bool isString() const;
|
| + bool isArray() const;
|
| + bool isObject() const;
|
| +
|
| + bool isConvertibleTo(ValueType other) const;
|
| +
|
| + /// Number of values in array or object
|
| + ArrayIndex size() const;
|
| +
|
| + /// \brief Return true if empty array, empty object, or null;
|
| + /// otherwise, false.
|
| + bool empty() const;
|
| +
|
| + /// Return isNull()
|
| + bool operator!() const;
|
| +
|
| + /// Remove all object members and array elements.
|
| + /// \pre type() is arrayValue, objectValue, or nullValue
|
| + /// \post type() is unchanged
|
| + void clear();
|
| +
|
| + /// Resize the array to size elements.
|
| + /// New elements are initialized to null.
|
| + /// May only be called on nullValue or arrayValue.
|
| + /// \pre type() is arrayValue or nullValue
|
| + /// \post type() is arrayValue
|
| + void resize(ArrayIndex size);
|
| +
|
| + /// Access an array element (zero based index ).
|
| + /// If the array contains less than index element, then null value are
|
| + /// inserted
|
| + /// in the array so that its size is index+1.
|
| + /// (You may need to say 'value[0u]' to get your compiler to distinguish
|
| + /// this from the operator[] which takes a string.)
|
| + Value& operator[](ArrayIndex index);
|
| +
|
| + /// Access an array element (zero based index ).
|
| + /// If the array contains less than index element, then null value are
|
| + /// inserted
|
| + /// in the array so that its size is index+1.
|
| + /// (You may need to say 'value[0u]' to get your compiler to distinguish
|
| + /// this from the operator[] which takes a string.)
|
| + Value& operator[](int index);
|
| +
|
| + /// Access an array element (zero based index )
|
| + /// (You may need to say 'value[0u]' to get your compiler to distinguish
|
| + /// this from the operator[] which takes a string.)
|
| + const Value& operator[](ArrayIndex index) const;
|
| +
|
| + /// Access an array element (zero based index )
|
| + /// (You may need to say 'value[0u]' to get your compiler to distinguish
|
| + /// this from the operator[] which takes a string.)
|
| + const Value& operator[](int index) const;
|
| +
|
| + /// If the array contains at least index+1 elements, returns the element
|
| + /// value,
|
| + /// otherwise returns defaultValue.
|
| + Value get(ArrayIndex index, const Value& defaultValue) const;
|
| + /// Return true if index < size().
|
| + bool isValidIndex(ArrayIndex index) const;
|
| + /// \brief Append value to array at the end.
|
| + ///
|
| + /// Equivalent to jsonvalue[jsonvalue.size()] = value;
|
| + Value& append(const Value& value);
|
| +
|
| + /// Access an object value by name, create a null member if it does not exist.
|
| + /// \note Because of our implementation, keys are limited to 2^30 -1 chars.
|
| + /// Exceeding that will cause an exception.
|
| + Value& operator[](const char* key);
|
| + /// Access an object value by name, returns null if there is no member with
|
| + /// that name.
|
| + const Value& operator[](const char* key) const;
|
| + /// Access an object value by name, create a null member if it does not exist.
|
| + /// \param key may contain embedded nulls.
|
| + Value& operator[](const std::string& key);
|
| + /// Access an object value by name, returns null if there is no member with
|
| + /// that name.
|
| + /// \param key may contain embedded nulls.
|
| + const Value& operator[](const std::string& key) const;
|
| + /** \brief Access an object value by name, create a null member if it does not
|
| + exist.
|
| +
|
| + * If the object has no entry for that name, then the member name used to store
|
| + * the new entry is not duplicated.
|
| + * Example of use:
|
| + * \code
|
| + * Json::Value object;
|
| + * static const StaticString code("code");
|
| + * object[code] = 1234;
|
| + * \endcode
|
| + */
|
| + Value& operator[](const StaticString& key);
|
| +#ifdef JSON_USE_CPPTL
|
| + /// Access an object value by name, create a null member if it does not exist.
|
| + Value& operator[](const CppTL::ConstString& key);
|
| + /// Access an object value by name, returns null if there is no member with
|
| + /// that name.
|
| + const Value& operator[](const CppTL::ConstString& key) const;
|
| +#endif
|
| + /// Return the member named key if it exist, defaultValue otherwise.
|
| + /// \note deep copy
|
| + Value get(const char* key, const Value& defaultValue) const;
|
| + /// Return the member named key if it exist, defaultValue otherwise.
|
| + /// \note deep copy
|
| + /// \note key may contain embedded nulls.
|
| + Value get(const char* begin, const char* end, const Value& defaultValue) const;
|
| + /// Return the member named key if it exist, defaultValue otherwise.
|
| + /// \note deep copy
|
| + /// \param key may contain embedded nulls.
|
| + Value get(const std::string& key, const Value& defaultValue) const;
|
| +#ifdef JSON_USE_CPPTL
|
| + /// Return the member named key if it exist, defaultValue otherwise.
|
| + /// \note deep copy
|
| + Value get(const CppTL::ConstString& key, const Value& defaultValue) const;
|
| +#endif
|
| + /// Most general and efficient version of isMember()const, get()const,
|
| + /// and operator[]const
|
| + /// \note As stated elsewhere, behavior is undefined if (end-begin) >= 2^30
|
| + Value const* find(char const* begin, char const* end) const;
|
| + /// Most general and efficient version of object-mutators.
|
| + /// \note As stated elsewhere, behavior is undefined if (end-begin) >= 2^30
|
| + /// \return non-zero, but JSON_ASSERT if this is neither object nor nullValue.
|
| + Value const* demand(char const* begin, char const* end);
|
| + /// \brief Remove and return the named member.
|
| + ///
|
| + /// Do nothing if it did not exist.
|
| + /// \return the removed Value, or null.
|
| + /// \pre type() is objectValue or nullValue
|
| + /// \post type() is unchanged
|
| + /// \deprecated
|
| + Value removeMember(const char* key);
|
| + /// Same as removeMember(const char*)
|
| + /// \param key may contain embedded nulls.
|
| + /// \deprecated
|
| + Value removeMember(const std::string& key);
|
| + /// Same as removeMember(const char* begin, const char* end, Value* removed),
|
| + /// but 'key' is null-terminated.
|
| + bool removeMember(const char* key, Value* removed);
|
| + /** \brief Remove the named map member.
|
| +
|
| + Update 'removed' iff removed.
|
| + \param key may contain embedded nulls.
|
| + \return true iff removed (no exceptions)
|
| + */
|
| + bool removeMember(std::string const& key, Value* removed);
|
| + /// Same as removeMember(std::string const& key, Value* removed)
|
| + bool removeMember(const char* begin, const char* end, Value* removed);
|
| + /** \brief Remove the indexed array element.
|
| +
|
| + O(n) expensive operations.
|
| + Update 'removed' iff removed.
|
| + \return true iff removed (no exceptions)
|
| + */
|
| + bool removeIndex(ArrayIndex i, Value* removed);
|
| +
|
| + /// Return true if the object has a member named key.
|
| + /// \note 'key' must be null-terminated.
|
| + bool isMember(const char* key) const;
|
| + /// Return true if the object has a member named key.
|
| + /// \param key may contain embedded nulls.
|
| + bool isMember(const std::string& key) const;
|
| + /// Same as isMember(std::string const& key)const
|
| + bool isMember(const char* begin, const char* end) const;
|
| +#ifdef JSON_USE_CPPTL
|
| + /// Return true if the object has a member named key.
|
| + bool isMember(const CppTL::ConstString& key) const;
|
| +#endif
|
| +
|
| + /// \brief Return a list of the member names.
|
| + ///
|
| + /// If null, return an empty list.
|
| + /// \pre type() is objectValue or nullValue
|
| + /// \post if type() was nullValue, it remains nullValue
|
| + Members getMemberNames() const;
|
| +
|
| + //# ifdef JSON_USE_CPPTL
|
| + // EnumMemberNames enumMemberNames() const;
|
| + // EnumValues enumValues() const;
|
| + //# endif
|
| +
|
| + /// \deprecated Always pass len.
|
| + JSONCPP_DEPRECATED("Use setComment(std::string const&) instead.")
|
| + void setComment(const char* comment, CommentPlacement placement);
|
| + /// Comments must be //... or /* ... */
|
| + void setComment(const char* comment, size_t len, CommentPlacement placement);
|
| + /// Comments must be //... or /* ... */
|
| + void setComment(const std::string& comment, CommentPlacement placement);
|
| + bool hasComment(CommentPlacement placement) const;
|
| + /// Include delimiters and embedded newlines.
|
| + std::string getComment(CommentPlacement placement) const;
|
| +
|
| + std::string toStyledString() const;
|
| +
|
| + const_iterator begin() const;
|
| + const_iterator end() const;
|
| +
|
| + iterator begin();
|
| + iterator end();
|
| +
|
| + // Accessors for the [start, limit) range of bytes within the JSON text from
|
| + // which this value was parsed, if any.
|
| + void setOffsetStart(size_t start);
|
| + void setOffsetLimit(size_t limit);
|
| + size_t getOffsetStart() const;
|
| + size_t getOffsetLimit() const;
|
| +
|
| +private:
|
| + void initBasic(ValueType type, bool allocated = false);
|
| +
|
| + Value& resolveReference(const char* key);
|
| + Value& resolveReference(const char* key, const char* end);
|
| +
|
| + struct CommentInfo {
|
| + CommentInfo();
|
| + ~CommentInfo();
|
| +
|
| + void setComment(const char* text, size_t len);
|
| +
|
| + char* comment_;
|
| + };
|
| +
|
| + // struct MemberNamesTransform
|
| + //{
|
| + // typedef const char *result_type;
|
| + // const char *operator()( const CZString &name ) const
|
| + // {
|
| + // return name.c_str();
|
| + // }
|
| + //};
|
| +
|
| + union ValueHolder {
|
| + LargestInt int_;
|
| + LargestUInt uint_;
|
| + double real_;
|
| + bool bool_;
|
| + char* string_; // actually ptr to unsigned, followed by str, unless !allocated_
|
| + ObjectValues* map_;
|
| + } value_;
|
| + ValueType type_ : 8;
|
| + unsigned int allocated_ : 1; // Notes: if declared as bool, bitfield is useless.
|
| + // If not allocated_, string_ must be null-terminated.
|
| + CommentInfo* comments_;
|
| +
|
| + // [start, limit) byte offsets in the source JSON text from which this Value
|
| + // was extracted.
|
| + size_t start_;
|
| + size_t limit_;
|
| +};
|
| +
|
| +/** \brief Experimental and untested: represents an element of the "path" to
|
| + * access a node.
|
| + */
|
| +class JSON_API PathArgument {
|
| +public:
|
| + friend class Path;
|
| +
|
| + PathArgument();
|
| + PathArgument(ArrayIndex index);
|
| + PathArgument(const char* key);
|
| + PathArgument(const std::string& key);
|
| +
|
| +private:
|
| + enum Kind {
|
| + kindNone = 0,
|
| + kindIndex,
|
| + kindKey
|
| + };
|
| + std::string key_;
|
| + ArrayIndex index_;
|
| + Kind kind_;
|
| +};
|
| +
|
| +/** \brief Experimental and untested: represents a "path" to access a node.
|
| + *
|
| + * Syntax:
|
| + * - "." => root node
|
| + * - ".[n]" => elements at index 'n' of root node (an array value)
|
| + * - ".name" => member named 'name' of root node (an object value)
|
| + * - ".name1.name2.name3"
|
| + * - ".[0][1][2].name1[3]"
|
| + * - ".%" => member name is provided as parameter
|
| + * - ".[%]" => index is provied as parameter
|
| + */
|
| +class JSON_API Path {
|
| +public:
|
| + Path(const std::string& path,
|
| + const PathArgument& a1 = PathArgument(),
|
| + const PathArgument& a2 = PathArgument(),
|
| + const PathArgument& a3 = PathArgument(),
|
| + const PathArgument& a4 = PathArgument(),
|
| + const PathArgument& a5 = PathArgument());
|
| +
|
| + const Value& resolve(const Value& root) const;
|
| + Value resolve(const Value& root, const Value& defaultValue) const;
|
| + /// Creates the "path" to access the specified node and returns a reference on
|
| + /// the node.
|
| + Value& make(Value& root) const;
|
| +
|
| +private:
|
| + typedef std::vector<const PathArgument*> InArgs;
|
| + typedef std::vector<PathArgument> Args;
|
| +
|
| + void makePath(const std::string& path, const InArgs& in);
|
| + void addPathInArg(const std::string& path,
|
| + const InArgs& in,
|
| + InArgs::const_iterator& itInArg,
|
| + PathArgument::Kind kind);
|
| + void invalidPath(const std::string& path, int location);
|
| +
|
| + Args args_;
|
| +};
|
| +
|
| +/** \brief base class for Value iterators.
|
| + *
|
| + */
|
| +class JSON_API ValueIteratorBase {
|
| +public:
|
| + typedef std::bidirectional_iterator_tag iterator_category;
|
| + typedef unsigned int size_t;
|
| + typedef int difference_type;
|
| + typedef ValueIteratorBase SelfType;
|
| +
|
| + bool operator==(const SelfType& other) const { return isEqual(other); }
|
| +
|
| + bool operator!=(const SelfType& other) const { return !isEqual(other); }
|
| +
|
| + difference_type operator-(const SelfType& other) const {
|
| + return other.computeDistance(*this);
|
| + }
|
| +
|
| + /// Return either the index or the member name of the referenced value as a
|
| + /// Value.
|
| + Value key() const;
|
| +
|
| + /// Return the index of the referenced Value, or -1 if it is not an arrayValue.
|
| + UInt index() const;
|
| +
|
| + /// Return the member name of the referenced Value, or "" if it is not an
|
| + /// objectValue.
|
| + /// \note Avoid `c_str()` on result, as embedded zeroes are possible.
|
| + std::string name() const;
|
| +
|
| + /// Return the member name of the referenced Value. "" if it is not an
|
| + /// objectValue.
|
| + /// \deprecated This cannot be used for UTF-8 strings, since there can be embedded nulls.
|
| + JSONCPP_DEPRECATED("Use `key = name();` instead.")
|
| + char const* memberName() const;
|
| + /// Return the member name of the referenced Value, or NULL if it is not an
|
| + /// objectValue.
|
| + /// \note Better version than memberName(). Allows embedded nulls.
|
| + char const* memberName(char const** end) const;
|
| +
|
| +protected:
|
| + Value& deref() const;
|
| +
|
| + void increment();
|
| +
|
| + void decrement();
|
| +
|
| + difference_type computeDistance(const SelfType& other) const;
|
| +
|
| + bool isEqual(const SelfType& other) const;
|
| +
|
| + void copy(const SelfType& other);
|
| +
|
| +private:
|
| + Value::ObjectValues::iterator current_;
|
| + // Indicates that iterator is for a null value.
|
| + bool isNull_;
|
| +
|
| +public:
|
| + // For some reason, BORLAND needs these at the end, rather
|
| + // than earlier. No idea why.
|
| + ValueIteratorBase();
|
| + explicit ValueIteratorBase(const Value::ObjectValues::iterator& current);
|
| +};
|
| +
|
| +/** \brief const iterator for object and array value.
|
| + *
|
| + */
|
| +class JSON_API ValueConstIterator : public ValueIteratorBase {
|
| + friend class Value;
|
| +
|
| +public:
|
| + typedef const Value value_type;
|
| + //typedef unsigned int size_t;
|
| + //typedef int difference_type;
|
| + typedef const Value& reference;
|
| + typedef const Value* pointer;
|
| + typedef ValueConstIterator SelfType;
|
| +
|
| + ValueConstIterator();
|
| + ValueConstIterator(ValueIterator const& other);
|
| +
|
| +private:
|
| +/*! \internal Use by Value to create an iterator.
|
| + */
|
| + explicit ValueConstIterator(const Value::ObjectValues::iterator& current);
|
| +public:
|
| + SelfType& operator=(const ValueIteratorBase& other);
|
| +
|
| + SelfType operator++(int) {
|
| + SelfType temp(*this);
|
| + ++*this;
|
| + return temp;
|
| + }
|
| +
|
| + SelfType operator--(int) {
|
| + SelfType temp(*this);
|
| + --*this;
|
| + return temp;
|
| + }
|
| +
|
| + SelfType& operator--() {
|
| + decrement();
|
| + return *this;
|
| + }
|
| +
|
| + SelfType& operator++() {
|
| + increment();
|
| + return *this;
|
| + }
|
| +
|
| + reference operator*() const { return deref(); }
|
| +
|
| + pointer operator->() const { return &deref(); }
|
| +};
|
| +
|
| +/** \brief Iterator for object and array value.
|
| + */
|
| +class JSON_API ValueIterator : public ValueIteratorBase {
|
| + friend class Value;
|
| +
|
| +public:
|
| + typedef Value value_type;
|
| + typedef unsigned int size_t;
|
| + typedef int difference_type;
|
| + typedef Value& reference;
|
| + typedef Value* pointer;
|
| + typedef ValueIterator SelfType;
|
| +
|
| + ValueIterator();
|
| + explicit ValueIterator(const ValueConstIterator& other);
|
| + ValueIterator(const ValueIterator& other);
|
| +
|
| +private:
|
| +/*! \internal Use by Value to create an iterator.
|
| + */
|
| + explicit ValueIterator(const Value::ObjectValues::iterator& current);
|
| +public:
|
| + SelfType& operator=(const SelfType& other);
|
| +
|
| + SelfType operator++(int) {
|
| + SelfType temp(*this);
|
| + ++*this;
|
| + return temp;
|
| + }
|
| +
|
| + SelfType operator--(int) {
|
| + SelfType temp(*this);
|
| + --*this;
|
| + return temp;
|
| + }
|
| +
|
| + SelfType& operator--() {
|
| + decrement();
|
| + return *this;
|
| + }
|
| +
|
| + SelfType& operator++() {
|
| + increment();
|
| + return *this;
|
| + }
|
| +
|
| + reference operator*() const { return deref(); }
|
| +
|
| + pointer operator->() const { return &deref(); }
|
| +};
|
| +
|
| +} // namespace Json
|
| +
|
| +
|
| +namespace std {
|
| +/// Specialize std::swap() for Json::Value.
|
| +template<>
|
| +inline void swap(Json::Value& a, Json::Value& b) { a.swap(b); }
|
| +}
|
| +
|
| +
|
| +#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
|
| +#pragma warning(pop)
|
| +#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
|
| +
|
| +#endif // CPPTL_JSON_H_INCLUDED
|
| +
|
| +// //////////////////////////////////////////////////////////////////////
|
| +// End of content of file: include/json/value.h
|
| +// //////////////////////////////////////////////////////////////////////
|
| +
|
| +
|
| +
|
| +
|
| +
|
| +
|
| +// //////////////////////////////////////////////////////////////////////
|
| +// Beginning of content of file: include/json/reader.h
|
| +// //////////////////////////////////////////////////////////////////////
|
| +
|
| +// Copyright 2007-2010 Baptiste Lepilleur
|
| +// Distributed under MIT license, or public domain if desired and
|
| +// recognized in your jurisdiction.
|
| +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
| +
|
| +#ifndef CPPTL_JSON_READER_H_INCLUDED
|
| +#define CPPTL_JSON_READER_H_INCLUDED
|
| +
|
| +#if !defined(JSON_IS_AMALGAMATION)
|
| +#include "features.h"
|
| +#include "value.h"
|
| +#endif // if !defined(JSON_IS_AMALGAMATION)
|
| +#include <deque>
|
| +#include <iosfwd>
|
| +#include <stack>
|
| +#include <string>
|
| +#include <istream>
|
| +
|
| +// Disable warning C4251: <data member>: <type> needs to have dll-interface to
|
| +// be used by...
|
| +#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
|
| +#pragma warning(push)
|
| +#pragma warning(disable : 4251)
|
| +#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
|
| +
|
| +namespace Json {
|
| +
|
| +/** \brief Unserialize a <a HREF="http://www.json.org">JSON</a> document into a
|
| + *Value.
|
| + *
|
| + * \deprecated Use CharReader and CharReaderBuilder.
|
| + */
|
| +class JSON_API Reader {
|
| +public:
|
| + typedef char Char;
|
| + typedef const Char* Location;
|
| +
|
| + /** \brief An error tagged with where in the JSON text it was encountered.
|
| + *
|
| + * The offsets give the [start, limit) range of bytes within the text. Note
|
| + * that this is bytes, not codepoints.
|
| + *
|
| + */
|
| + struct StructuredError {
|
| + size_t offset_start;
|
| + size_t offset_limit;
|
| + std::string message;
|
| + };
|
| +
|
| + /** \brief Constructs a Reader allowing all features
|
| + * for parsing.
|
| + */
|
| + Reader();
|
| +
|
| + /** \brief Constructs a Reader allowing the specified feature set
|
| + * for parsing.
|
| + */
|
| + Reader(const Features& features);
|
| +
|
| + /** \brief Read a Value from a <a HREF="http://www.json.org">JSON</a>
|
| + * document.
|
| + * \param document UTF-8 encoded string containing the document to read.
|
| + * \param root [out] Contains the root value of the document if it was
|
| + * successfully parsed.
|
| + * \param collectComments \c true to collect comment and allow writing them
|
| + * back during
|
| + * serialization, \c false to discard comments.
|
| + * This parameter is ignored if
|
| + * Features::allowComments_
|
| + * is \c false.
|
| + * \return \c true if the document was successfully parsed, \c false if an
|
| + * error occurred.
|
| + */
|
| + bool
|
| + parse(const std::string& document, Value& root, bool collectComments = true);
|
| +
|
| + /** \brief Read a Value from a <a HREF="http://www.json.org">JSON</a>
|
| + document.
|
| + * \param beginDoc Pointer on the beginning of the UTF-8 encoded string of the
|
| + document to read.
|
| + * \param endDoc Pointer on the end of the UTF-8 encoded string of the
|
| + document to read.
|
| + * Must be >= beginDoc.
|
| + * \param root [out] Contains the root value of the document if it was
|
| + * successfully parsed.
|
| + * \param collectComments \c true to collect comment and allow writing them
|
| + back during
|
| + * serialization, \c false to discard comments.
|
| + * This parameter is ignored if
|
| + Features::allowComments_
|
| + * is \c false.
|
| + * \return \c true if the document was successfully parsed, \c false if an
|
| + error occurred.
|
| + */
|
| + bool parse(const char* beginDoc,
|
| + const char* endDoc,
|
| + Value& root,
|
| + bool collectComments = true);
|
| +
|
| + /// \brief Parse from input stream.
|
| + /// \see Json::operator>>(std::istream&, Json::Value&).
|
| + bool parse(std::istream& is, Value& root, bool collectComments = true);
|
| +
|
| + /** \brief Returns a user friendly string that list errors in the parsed
|
| + * document.
|
| + * \return Formatted error message with the list of errors with their location
|
| + * in
|
| + * the parsed document. An empty string is returned if no error
|
| + * occurred
|
| + * during parsing.
|
| + * \deprecated Use getFormattedErrorMessages() instead (typo fix).
|
| + */
|
| + JSONCPP_DEPRECATED("Use getFormattedErrorMessages() instead.")
|
| + std::string getFormatedErrorMessages() const;
|
| +
|
| + /** \brief Returns a user friendly string that list errors in the parsed
|
| + * document.
|
| + * \return Formatted error message with the list of errors with their location
|
| + * in
|
| + * the parsed document. An empty string is returned if no error
|
| + * occurred
|
| + * during parsing.
|
| + */
|
| + std::string getFormattedErrorMessages() const;
|
| +
|
| + /** \brief Returns a vector of structured erros encounted while parsing.
|
| + * \return A (possibly empty) vector of StructuredError objects. Currently
|
| + * only one error can be returned, but the caller should tolerate
|
| + * multiple
|
| + * errors. This can occur if the parser recovers from a non-fatal
|
| + * parse error and then encounters additional errors.
|
| + */
|
| + std::vector<StructuredError> getStructuredErrors() const;
|
| +
|
| + /** \brief Add a semantic error message.
|
| + * \param value JSON Value location associated with the error
|
| + * \param message The error message.
|
| + * \return \c true if the error was successfully added, \c false if the
|
| + * Value offset exceeds the document size.
|
| + */
|
| + bool pushError(const Value& value, const std::string& message);
|
| +
|
| + /** \brief Add a semantic error message with extra context.
|
| + * \param value JSON Value location associated with the error
|
| + * \param message The error message.
|
| + * \param extra Additional JSON Value location to contextualize the error
|
| + * \return \c true if the error was successfully added, \c false if either
|
| + * Value offset exceeds the document size.
|
| + */
|
| + bool pushError(const Value& value, const std::string& message, const Value& extra);
|
| +
|
| + /** \brief Return whether there are any errors.
|
| + * \return \c true if there are no errors to report \c false if
|
| + * errors have occurred.
|
| + */
|
| + bool good() const;
|
| +
|
| +private:
|
| + enum TokenType {
|
| + tokenEndOfStream = 0,
|
| + tokenObjectBegin,
|
| + tokenObjectEnd,
|
| + tokenArrayBegin,
|
| + tokenArrayEnd,
|
| + tokenString,
|
| + tokenNumber,
|
| + tokenTrue,
|
| + tokenFalse,
|
| + tokenNull,
|
| + tokenArraySeparator,
|
| + tokenMemberSeparator,
|
| + tokenComment,
|
| + tokenError
|
| + };
|
| +
|
| + class Token {
|
| + public:
|
| + TokenType type_;
|
| + Location start_;
|
| + Location end_;
|
| + };
|
| +
|
| + class ErrorInfo {
|
| + public:
|
| + Token token_;
|
| + std::string message_;
|
| + Location extra_;
|
| + };
|
| +
|
| + typedef std::deque<ErrorInfo> Errors;
|
| +
|
| + bool readToken(Token& token);
|
| + void skipSpaces();
|
| + bool match(Location pattern, int patternLength);
|
| + bool readComment();
|
| + bool readCStyleComment();
|
| + bool readCppStyleComment();
|
| + bool readString();
|
| + void readNumber();
|
| + bool readValue();
|
| + bool readObject(Token& token);
|
| + bool readArray(Token& token);
|
| + bool decodeNumber(Token& token);
|
| + bool decodeNumber(Token& token, Value& decoded);
|
| + bool decodeString(Token& token);
|
| + bool decodeString(Token& token, std::string& decoded);
|
| + bool decodeDouble(Token& token);
|
| + bool decodeDouble(Token& token, Value& decoded);
|
| + bool decodeUnicodeCodePoint(Token& token,
|
| + Location& current,
|
| + Location end,
|
| + unsigned int& unicode);
|
| + bool decodeUnicodeEscapeSequence(Token& token,
|
| + Location& current,
|
| + Location end,
|
| + unsigned int& unicode);
|
| + bool addError(const std::string& message, Token& token, Location extra = 0);
|
| + bool recoverFromError(TokenType skipUntilToken);
|
| + bool addErrorAndRecover(const std::string& message,
|
| + Token& token,
|
| + TokenType skipUntilToken);
|
| + void skipUntilSpace();
|
| + Value& currentValue();
|
| + Char getNextChar();
|
| + void
|
| + getLocationLineAndColumn(Location location, int& line, int& column) const;
|
| + std::string getLocationLineAndColumn(Location location) const;
|
| + void addComment(Location begin, Location end, CommentPlacement placement);
|
| + void skipCommentTokens(Token& token);
|
| +
|
| + typedef std::stack<Value*> Nodes;
|
| + Nodes nodes_;
|
| + Errors errors_;
|
| + std::string document_;
|
| + Location begin_;
|
| + Location end_;
|
| + Location current_;
|
| + Location lastValueEnd_;
|
| + Value* lastValue_;
|
| + std::string commentsBefore_;
|
| + Features features_;
|
| + bool collectComments_;
|
| +}; // Reader
|
| +
|
| +/** Interface for reading JSON from a char array.
|
| + */
|
| +class JSON_API CharReader {
|
| +public:
|
| + virtual ~CharReader() {}
|
| + /** \brief Read a Value from a <a HREF="http://www.json.org">JSON</a>
|
| + document.
|
| + * The document must be a UTF-8 encoded string containing the document to read.
|
| + *
|
| + * \param beginDoc Pointer on the beginning of the UTF-8 encoded string of the
|
| + document to read.
|
| + * \param endDoc Pointer on the end of the UTF-8 encoded string of the
|
| + document to read.
|
| + * Must be >= beginDoc.
|
| + * \param root [out] Contains the root value of the document if it was
|
| + * successfully parsed.
|
| + * \param errs [out] Formatted error messages (if not NULL)
|
| + * a user friendly string that lists errors in the parsed
|
| + * document.
|
| + * \return \c true if the document was successfully parsed, \c false if an
|
| + error occurred.
|
| + */
|
| + virtual bool parse(
|
| + char const* beginDoc, char const* endDoc,
|
| + Value* root, std::string* errs) = 0;
|
| +
|
| + class JSON_API Factory {
|
| + public:
|
| + virtual ~Factory() {}
|
| + /** \brief Allocate a CharReader via operator new().
|
| + * \throw std::exception if something goes wrong (e.g. invalid settings)
|
| + */
|
| + virtual CharReader* newCharReader() const = 0;
|
| + }; // Factory
|
| +}; // CharReader
|
| +
|
| +/** \brief Build a CharReader implementation.
|
| +
|
| +Usage:
|
| +\code
|
| + using namespace Json;
|
| + CharReaderBuilder builder;
|
| + builder["collectComments"] = false;
|
| + Value value;
|
| + std::string errs;
|
| + bool ok = parseFromStream(builder, std::cin, &value, &errs);
|
| +\endcode
|
| +*/
|
| +class JSON_API CharReaderBuilder : public CharReader::Factory {
|
| +public:
|
| + // Note: We use a Json::Value so that we can add data-members to this class
|
| + // without a major version bump.
|
| + /** Configuration of this builder.
|
| + These are case-sensitive.
|
| + Available settings (case-sensitive):
|
| + - `"collectComments": false or true`
|
| + - true to collect comment and allow writing them
|
| + back during serialization, false to discard comments.
|
| + This parameter is ignored if allowComments is false.
|
| + - `"allowComments": false or true`
|
| + - true if comments are allowed.
|
| + - `"strictRoot": false or true`
|
| + - true if root must be either an array or an object value
|
| + - `"allowDroppedNullPlaceholders": false or true`
|
| + - true if dropped null placeholders are allowed. (See StreamWriterBuilder.)
|
| + - `"allowNumericKeys": false or true`
|
| + - true if numeric object keys are allowed.
|
| + - `"allowSingleQuotes": false or true`
|
| + - true if '' are allowed for strings (both keys and values)
|
| + - `"stackLimit": integer`
|
| + - Exceeding stackLimit (recursive depth of `readValue()`) will
|
| + cause an exception.
|
| + - This is a security issue (seg-faults caused by deeply nested JSON),
|
| + so the default is low.
|
| + - `"failIfExtra": false or true`
|
| + - If true, `parse()` returns false when extra non-whitespace trails
|
| + the JSON value in the input string.
|
| + - `"rejectDupKeys": false or true`
|
| + - If true, `parse()` returns false when a key is duplicated within an object.
|
| + - `"allowSpecialFloats": false or true`
|
| + - If true, special float values (NaNs and infinities) are allowed
|
| + and their values are lossfree restorable.
|
| +
|
| + You can examine 'settings_` yourself
|
| + to see the defaults. You can also write and read them just like any
|
| + JSON Value.
|
| + \sa setDefaults()
|
| + */
|
| + Json::Value settings_;
|
| +
|
| + CharReaderBuilder();
|
| + ~CharReaderBuilder() override;
|
| +
|
| + CharReader* newCharReader() const override;
|
| +
|
| + /** \return true if 'settings' are legal and consistent;
|
| + * otherwise, indicate bad settings via 'invalid'.
|
| + */
|
| + bool validate(Json::Value* invalid) const;
|
| +
|
| + /** A simple way to update a specific setting.
|
| + */
|
| + Value& operator[](std::string key);
|
| +
|
| + /** Called by ctor, but you can use this to reset settings_.
|
| + * \pre 'settings' != NULL (but Json::null is fine)
|
| + * \remark Defaults:
|
| + * \snippet src/lib_json/json_reader.cpp CharReaderBuilderDefaults
|
| + */
|
| + static void setDefaults(Json::Value* settings);
|
| + /** Same as old Features::strictMode().
|
| + * \pre 'settings' != NULL (but Json::null is fine)
|
| + * \remark Defaults:
|
| + * \snippet src/lib_json/json_reader.cpp CharReaderBuilderStrictMode
|
| + */
|
| + static void strictMode(Json::Value* settings);
|
| +};
|
| +
|
| +/** Consume entire stream and use its begin/end.
|
| + * Someday we might have a real StreamReader, but for now this
|
| + * is convenient.
|
| + */
|
| +bool JSON_API parseFromStream(
|
| + CharReader::Factory const&,
|
| + std::istream&,
|
| + Value* root, std::string* errs);
|
| +
|
| +/** \brief Read from 'sin' into 'root'.
|
| +
|
| + Always keep comments from the input JSON.
|
| +
|
| + This can be used to read a file into a particular sub-object.
|
| + For example:
|
| + \code
|
| + Json::Value root;
|
| + cin >> root["dir"]["file"];
|
| + cout << root;
|
| + \endcode
|
| + Result:
|
| + \verbatim
|
| + {
|
| + "dir": {
|
| + "file": {
|
| + // The input stream JSON would be nested here.
|
| + }
|
| + }
|
| + }
|
| + \endverbatim
|
| + \throw std::exception on parse error.
|
| + \see Json::operator<<()
|
| +*/
|
| +JSON_API std::istream& operator>>(std::istream&, Value&);
|
| +
|
| +} // namespace Json
|
| +
|
| +#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
|
| +#pragma warning(pop)
|
| +#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
|
| +
|
| +#endif // CPPTL_JSON_READER_H_INCLUDED
|
| +
|
| +// //////////////////////////////////////////////////////////////////////
|
| +// End of content of file: include/json/reader.h
|
| +// //////////////////////////////////////////////////////////////////////
|
| +
|
| +
|
| +
|
| +
|
| +
|
| +
|
| +// //////////////////////////////////////////////////////////////////////
|
| +// Beginning of content of file: include/json/writer.h
|
| +// //////////////////////////////////////////////////////////////////////
|
| +
|
| +// Copyright 2007-2010 Baptiste Lepilleur
|
| +// Distributed under MIT license, or public domain if desired and
|
| +// recognized in your jurisdiction.
|
| +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
| +
|
| +#ifndef JSON_WRITER_H_INCLUDED
|
| +#define JSON_WRITER_H_INCLUDED
|
| +
|
| +#if !defined(JSON_IS_AMALGAMATION)
|
| +#include "value.h"
|
| +#endif // if !defined(JSON_IS_AMALGAMATION)
|
| +#include <vector>
|
| +#include <string>
|
| +#include <ostream>
|
| +
|
| +// Disable warning C4251: <data member>: <type> needs to have dll-interface to
|
| +// be used by...
|
| +#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
|
| +#pragma warning(push)
|
| +#pragma warning(disable : 4251)
|
| +#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
|
| +
|
| +namespace Json {
|
| +
|
| +class Value;
|
| +
|
| +/**
|
| +
|
| +Usage:
|
| +\code
|
| + using namespace Json;
|
| + void writeToStdout(StreamWriter::Factory const& factory, Value const& value) {
|
| + std::unique_ptr<StreamWriter> const writer(
|
| + factory.newStreamWriter());
|
| + writer->write(value, &std::cout);
|
| + std::cout << std::endl; // add lf and flush
|
| + }
|
| +\endcode
|
| +*/
|
| +class JSON_API StreamWriter {
|
| +protected:
|
| + std::ostream* sout_; // not owned; will not delete
|
| +public:
|
| + StreamWriter();
|
| + virtual ~StreamWriter();
|
| + /** Write Value into document as configured in sub-class.
|
| + Do not take ownership of sout, but maintain a reference during function.
|
| + \pre sout != NULL
|
| + \return zero on success (For now, we always return zero, so check the stream instead.)
|
| + \throw std::exception possibly, depending on configuration
|
| + */
|
| + virtual int write(Value const& root, std::ostream* sout) = 0;
|
| +
|
| + /** \brief A simple abstract factory.
|
| + */
|
| + class JSON_API Factory {
|
| + public:
|
| + virtual ~Factory();
|
| + /** \brief Allocate a CharReader via operator new().
|
| + * \throw std::exception if something goes wrong (e.g. invalid settings)
|
| + */
|
| + virtual StreamWriter* newStreamWriter() const = 0;
|
| + }; // Factory
|
| +}; // StreamWriter
|
| +
|
| +/** \brief Write into stringstream, then return string, for convenience.
|
| + * A StreamWriter will be created from the factory, used, and then deleted.
|
| + */
|
| +std::string JSON_API writeString(StreamWriter::Factory const& factory, Value const& root);
|
| +
|
| +
|
| +/** \brief Build a StreamWriter implementation.
|
| +
|
| +Usage:
|
| +\code
|
| + using namespace Json;
|
| + Value value = ...;
|
| + StreamWriterBuilder builder;
|
| + builder["commentStyle"] = "None";
|
| + builder["indentation"] = " "; // or whatever you like
|
| + std::unique_ptr<Json::StreamWriter> writer(
|
| + builder.newStreamWriter());
|
| + writer->write(value, &std::cout);
|
| + std::cout << std::endl; // add lf and flush
|
| +\endcode
|
| +*/
|
| +class JSON_API StreamWriterBuilder : public StreamWriter::Factory {
|
| +public:
|
| + // Note: We use a Json::Value so that we can add data-members to this class
|
| + // without a major version bump.
|
| + /** Configuration of this builder.
|
| + Available settings (case-sensitive):
|
| + - "commentStyle": "None" or "All"
|
| + - "indentation": "<anything>"
|
| + - "enableYAMLCompatibility": false or true
|
| + - slightly change the whitespace around colons
|
| + - "dropNullPlaceholders": false or true
|
| + - Drop the "null" string from the writer's output for nullValues.
|
| + Strictly speaking, this is not valid JSON. But when the output is being
|
| + fed to a browser's Javascript, it makes for smaller output and the
|
| + browser can handle the output just fine.
|
| + - "useSpecialFloats": false or true
|
| + - If true, outputs non-finite floating point values in the following way:
|
| + NaN values as "NaN", positive infinity as "Infinity", and negative infinity
|
| + as "-Infinity".
|
| +
|
| + You can examine 'settings_` yourself
|
| + to see the defaults. You can also write and read them just like any
|
| + JSON Value.
|
| + \sa setDefaults()
|
| + */
|
| + Json::Value settings_;
|
| +
|
| + StreamWriterBuilder();
|
| + ~StreamWriterBuilder() override;
|
| +
|
| + /**
|
| + * \throw std::exception if something goes wrong (e.g. invalid settings)
|
| + */
|
| + StreamWriter* newStreamWriter() const override;
|
| +
|
| + /** \return true if 'settings' are legal and consistent;
|
| + * otherwise, indicate bad settings via 'invalid'.
|
| + */
|
| + bool validate(Json::Value* invalid) const;
|
| + /** A simple way to update a specific setting.
|
| + */
|
| + Value& operator[](std::string key);
|
| +
|
| + /** Called by ctor, but you can use this to reset settings_.
|
| + * \pre 'settings' != NULL (but Json::null is fine)
|
| + * \remark Defaults:
|
| + * \snippet src/lib_json/json_writer.cpp StreamWriterBuilderDefaults
|
| + */
|
| + static void setDefaults(Json::Value* settings);
|
| +};
|
| +
|
| +/** \brief Abstract class for writers.
|
| + * \deprecated Use StreamWriter. (And really, this is an implementation detail.)
|
| + */
|
| +class JSON_API Writer {
|
| +public:
|
| + virtual ~Writer();
|
| +
|
| + virtual std::string write(const Value& root) = 0;
|
| +};
|
| +
|
| +/** \brief Outputs a Value in <a HREF="http://www.json.org">JSON</a> format
|
| + *without formatting (not human friendly).
|
| + *
|
| + * The JSON document is written in a single line. It is not intended for 'human'
|
| + *consumption,
|
| + * but may be usefull to support feature such as RPC where bandwith is limited.
|
| + * \sa Reader, Value
|
| + * \deprecated Use StreamWriterBuilder.
|
| + */
|
| +class JSON_API FastWriter : public Writer {
|
| +
|
| +public:
|
| + FastWriter();
|
| + ~FastWriter() override {}
|
| +
|
| + void enableYAMLCompatibility();
|
| +
|
| + /** \brief Drop the "null" string from the writer's output for nullValues.
|
| + * Strictly speaking, this is not valid JSON. But when the output is being
|
| + * fed to a browser's Javascript, it makes for smaller output and the
|
| + * browser can handle the output just fine.
|
| + */
|
| + void dropNullPlaceholders();
|
| +
|
| + void omitEndingLineFeed();
|
| +
|
| +public: // overridden from Writer
|
| + std::string write(const Value& root) override;
|
| +
|
| +private:
|
| + void writeValue(const Value& value);
|
| +
|
| + std::string document_;
|
| + bool yamlCompatiblityEnabled_;
|
| + bool dropNullPlaceholders_;
|
| + bool omitEndingLineFeed_;
|
| +};
|
| +
|
| +/** \brief Writes a Value in <a HREF="http://www.json.org">JSON</a> format in a
|
| + *human friendly way.
|
| + *
|
| + * The rules for line break and indent are as follow:
|
| + * - Object value:
|
| + * - if empty then print {} without indent and line break
|
| + * - if not empty the print '{', line break & indent, print one value per
|
| + *line
|
| + * and then unindent and line break and print '}'.
|
| + * - Array value:
|
| + * - if empty then print [] without indent and line break
|
| + * - if the array contains no object value, empty array or some other value
|
| + *types,
|
| + * and all the values fit on one lines, then print the array on a single
|
| + *line.
|
| + * - 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.
|
| + *
|
| + * If the Value have comments then they are outputed according to their
|
| + *#CommentPlacement.
|
| + *
|
| + * \sa Reader, Value, Value::setComment()
|
| + * \deprecated Use StreamWriterBuilder.
|
| + */
|
| +class JSON_API StyledWriter : public Writer {
|
| +public:
|
| + StyledWriter();
|
| + ~StyledWriter() override {}
|
| +
|
| +public: // overridden from Writer
|
| + /** \brief Serialize a Value in <a HREF="http://www.json.org">JSON</a> format.
|
| + * \param root Value to serialize.
|
| + * \return String containing the JSON document that represents the root value.
|
| + */
|
| + std::string write(const Value& root) override;
|
| +
|
| +private:
|
| + void writeValue(const Value& value);
|
| + void writeArrayValue(const Value& value);
|
| + bool isMultineArray(const Value& value);
|
| + void pushValue(const std::string& value);
|
| + void writeIndent();
|
| + void writeWithIndent(const std::string& value);
|
| + void indent();
|
| + void unindent();
|
| + void writeCommentBeforeValue(const Value& root);
|
| + void writeCommentAfterValueOnSameLine(const Value& root);
|
| + bool hasCommentForValue(const Value& value);
|
| + static std::string normalizeEOL(const std::string& text);
|
| +
|
| + typedef std::vector<std::string> ChildValues;
|
| +
|
| + ChildValues childValues_;
|
| + std::string document_;
|
| + std::string indentString_;
|
| + int rightMargin_;
|
| + int indentSize_;
|
| + bool addChildValues_;
|
| +};
|
| +
|
| +/** \brief Writes a Value in <a HREF="http://www.json.org">JSON</a> format in a
|
| + human friendly way,
|
| + to a stream rather than to a string.
|
| + *
|
| + * The rules for line break and indent are as follow:
|
| + * - Object value:
|
| + * - if empty then print {} without indent and line break
|
| + * - if not empty the print '{', line break & indent, print one value per
|
| + line
|
| + * and then unindent and line break and print '}'.
|
| + * - Array value:
|
| + * - if empty then print [] without indent and line break
|
| + * - if the array contains no object value, empty array or some other value
|
| + types,
|
| + * and all the values fit on one lines, then print the array on a single
|
| + line.
|
| + * - 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.
|
| + *
|
| + * If the Value have comments then they are outputed according to their
|
| + #CommentPlacement.
|
| + *
|
| + * \param indentation Each level will be indented by this amount extra.
|
| + * \sa Reader, Value, Value::setComment()
|
| + * \deprecated Use StreamWriterBuilder.
|
| + */
|
| +class JSON_API StyledStreamWriter {
|
| +public:
|
| + StyledStreamWriter(std::string indentation = "\t");
|
| + ~StyledStreamWriter() {}
|
| +
|
| +public:
|
| + /** \brief Serialize a Value in <a HREF="http://www.json.org">JSON</a> format.
|
| + * \param out Stream to write to. (Can be ostringstream, e.g.)
|
| + * \param root Value to serialize.
|
| + * \note There is no point in deriving from Writer, since write() should not
|
| + * return a value.
|
| + */
|
| + void write(std::ostream& out, const Value& root);
|
| +
|
| +private:
|
| + void writeValue(const Value& value);
|
| + void writeArrayValue(const Value& value);
|
| + bool isMultineArray(const Value& value);
|
| + void pushValue(const std::string& value);
|
| + void writeIndent();
|
| + void writeWithIndent(const std::string& value);
|
| + void indent();
|
| + void unindent();
|
| + void writeCommentBeforeValue(const Value& root);
|
| + void writeCommentAfterValueOnSameLine(const Value& root);
|
| + bool hasCommentForValue(const Value& value);
|
| + static std::string normalizeEOL(const std::string& text);
|
| +
|
| + typedef std::vector<std::string> ChildValues;
|
| +
|
| + ChildValues childValues_;
|
| + std::ostream* document_;
|
| + std::string indentString_;
|
| + int rightMargin_;
|
| + std::string indentation_;
|
| + bool addChildValues_ : 1;
|
| + bool indented_ : 1;
|
| +};
|
| +
|
| +#if defined(JSON_HAS_INT64)
|
| +std::string JSON_API valueToString(Int value);
|
| +std::string JSON_API valueToString(UInt value);
|
| +#endif // if defined(JSON_HAS_INT64)
|
| +std::string JSON_API valueToString(LargestInt value);
|
| +std::string JSON_API valueToString(LargestUInt value);
|
| +std::string JSON_API valueToString(double value);
|
| +std::string JSON_API valueToString(bool value);
|
| +std::string JSON_API valueToQuotedString(const char* value);
|
| +
|
| +/// \brief Output using the StyledStreamWriter.
|
| +/// \see Json::operator>>()
|
| +JSON_API std::ostream& operator<<(std::ostream&, const Value& root);
|
| +
|
| +} // namespace Json
|
| +
|
| +#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
|
| +#pragma warning(pop)
|
| +#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
|
| +
|
| +#endif // JSON_WRITER_H_INCLUDED
|
| +
|
| +// //////////////////////////////////////////////////////////////////////
|
| +// End of content of file: include/json/writer.h
|
| +// //////////////////////////////////////////////////////////////////////
|
| +
|
| +
|
| +
|
| +
|
| +
|
| +
|
| +// //////////////////////////////////////////////////////////////////////
|
| +// Beginning of content of file: include/json/assertions.h
|
| +// //////////////////////////////////////////////////////////////////////
|
| +
|
| +// Copyright 2007-2010 Baptiste Lepilleur
|
| +// Distributed under MIT license, or public domain if desired and
|
| +// recognized in your jurisdiction.
|
| +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
| +
|
| +#ifndef CPPTL_JSON_ASSERTIONS_H_INCLUDED
|
| +#define CPPTL_JSON_ASSERTIONS_H_INCLUDED
|
| +
|
| +#include <stdlib.h>
|
| +#include <sstream>
|
| +
|
| +#if !defined(JSON_IS_AMALGAMATION)
|
| +#include "config.h"
|
| +#endif // if !defined(JSON_IS_AMALGAMATION)
|
| +
|
| +/** It should not be possible for a maliciously designed file to
|
| + * cause an abort() or seg-fault, so these macros are used only
|
| + * for pre-condition violations and internal logic errors.
|
| + */
|
| +#if JSON_USE_EXCEPTION
|
| +
|
| +// @todo <= add detail about condition in exception
|
| +# define JSON_ASSERT(condition) \
|
| + {if (!(condition)) {Json::throwLogicError( "assert json failed" );}}
|
| +
|
| +# define JSON_FAIL_MESSAGE(message) \
|
| + { \
|
| + std::ostringstream oss; oss << message; \
|
| + Json::throwLogicError(oss.str()); \
|
| + abort(); \
|
| + }
|
| +
|
| +#else // JSON_USE_EXCEPTION
|
| +
|
| +# define JSON_ASSERT(condition) assert(condition)
|
| +
|
| +// The call to assert() will show the failure message in debug builds. In
|
| +// release builds we abort, for a core-dump or debugger.
|
| +# define JSON_FAIL_MESSAGE(message) \
|
| + { \
|
| + std::ostringstream oss; oss << message; \
|
| + assert(false && oss.str().c_str()); \
|
| + abort(); \
|
| + }
|
| +
|
| +
|
| +#endif
|
| +
|
| +#define JSON_ASSERT_MESSAGE(condition, message) \
|
| + if (!(condition)) { \
|
| + JSON_FAIL_MESSAGE(message); \
|
| + }
|
| +
|
| +#endif // CPPTL_JSON_ASSERTIONS_H_INCLUDED
|
| +
|
| +// //////////////////////////////////////////////////////////////////////
|
| +// End of content of file: include/json/assertions.h
|
| +// //////////////////////////////////////////////////////////////////////
|
| +
|
| +
|
| +
|
| +
|
| +
|
| +#endif //ifndef JSON_AMALGATED_H_INCLUDED
|
|
|