// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors // 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_H_INCLUDED #define JSON_H_INCLUDED #if !defined(JSON_IS_AMALGAMATION) #include "forwards.h" #endif // if !defined(JSON_IS_AMALGAMATION) // Conditional NORETURN attribute on the throw functions would: // a) suppress false positives from static code analysis // b) possibly improve optimization opportunities. #if !defined(JSONCPP_NORETURN) #if defined(_MSC_VER) && _MSC_VER == 1800 #define JSONCPP_NORETURN … #else #define JSONCPP_NORETURN … #endif #endif // Support for '= delete' with template declarations was a late addition // to the c++11 standard and is rejected by clang 3.8 and Apple clang 8.2 // even though these declare themselves to be c++11 compilers. #if !defined(JSONCPP_TEMPLATE_DELETE) #if defined(__clang__) && defined(__apple_build_version__) #if __apple_build_version__ <= 8000042 #define JSONCPP_TEMPLATE_DELETE #endif #elif defined(__clang__) #if __clang_major__ == 3 && __clang_minor__ <= 8 #define JSONCPP_TEMPLATE_DELETE #endif #endif #if !defined(JSONCPP_TEMPLATE_DELETE) #define JSONCPP_TEMPLATE_DELETE … #endif #endif #include <array> #include <exception> #include <map> #include <memory> #include <string> #include <vector> // 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 4275) #endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) #pragma pack(push, 8) /** \brief JSON (JavaScript Object Notation). */ namespace Json { #if JSON_USE_EXCEPTION /** 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(String msg); ~Exception() noexcept override; char const* what() const noexcept override; protected: 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(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(String const& msg); }; #endif /// used internally JSONCPP_NORETURN void throwRuntimeError(String const& msg); /// used internally JSONCPP_NORETURN void throwLogicError(String const& msg); /** \brief Type of the value held by a Value object. */ enum ValueType { … }; enum CommentPlacement { … }; /** \brief Type of precision for formatting of real values. */ enum PrecisionType { … }; /** \brief Lightweight wrapper to tag static string. * * Value constructor and objectValue member assignment 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 { … }; /** \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 member keys of an object 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 { … }; template <> inline bool Value::as<bool>() const { … } template <> inline bool Value::is<bool>() const { … } template <> inline Int Value::as<Int>() const { … } template <> inline bool Value::is<Int>() const { … } template <> inline UInt Value::as<UInt>() const { … } template <> inline bool Value::is<UInt>() const { … } #if defined(JSON_HAS_INT64) template <> inline Int64 Value::as<Int64>() const { … } template <> inline bool Value::is<Int64>() const { … } template <> inline UInt64 Value::as<UInt64>() const { … } template <> inline bool Value::is<UInt64>() const { … } #endif template <> inline double Value::as<double>() const { … } template <> inline bool Value::is<double>() const { … } template <> inline String Value::as<String>() const { … } template <> inline bool Value::is<String>() const { … } /// These `as` specializations are type conversions, and do not have a /// corresponding `is`. template <> inline float Value::as<float>() const { … } template <> inline const char* Value::as<const char*>() const { … } /** \brief Experimental and untested: represents an element of the "path" to * access a node. */ class JSON_API PathArgument { … }; /** \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 provided as parameter */ class JSON_API Path { … }; /** \brief base class for Value iterators. * */ class JSON_API ValueIteratorBase { … }; /** \brief const iterator for object and array value. * */ class JSON_API ValueConstIterator : public ValueIteratorBase { … }; /** \brief Iterator for object and array value. */ class JSON_API ValueIterator : public ValueIteratorBase { … }; inline void swap(Value& a, Value& b) { … } } // namespace Json #pragma pack(pop) #if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) #pragma warning(pop) #endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) #endif // JSON_H_INCLUDED