6#ifndef JSON_VALUE_H_INCLUDED 
    7#define JSON_VALUE_H_INCLUDED 
    9#if !defined(JSON_IS_AMALGAMATION) 
   16#if !defined(JSONCPP_NORETURN) 
   17#if defined(_MSC_VER) && _MSC_VER == 1800 
   18#define JSONCPP_NORETURN __declspec(noreturn) 
   20#define JSONCPP_NORETURN [[noreturn]] 
   27#if !defined(JSONCPP_TEMPLATE_DELETE) 
   28#if defined(__clang__) && defined(__apple_build_version__) 
   29#if __apple_build_version__ <= 8000042 
   30#define JSONCPP_TEMPLATE_DELETE 
   32#elif defined(__clang__) 
   33#if __clang_major__ == 3 && __clang_minor__ <= 8 
   34#define JSONCPP_TEMPLATE_DELETE 
   37#if !defined(JSONCPP_TEMPLATE_DELETE) 
   38#define JSONCPP_TEMPLATE_DELETE = delete 
   51#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) 
   53#pragma warning(disable : 4251 4275) 
   72  char const* what() const noexcept override;
 
 
  152  operator const char*() 
const { 
return c_str_; }
 
  154  const char* 
c_str()
 const { 
return c_str_; }
 
 
  203#if defined(JSON_HAS_INT64) 
  221  static Value const& nullSingleton();
 
  238#if defined(JSON_HAS_INT64) 
  247  static constexpr UInt defaultRealPrecision = 17;
 
  251  static constexpr double maxUInt64AsDouble = 18446744073709551615.0;
 
  260#ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION 
  263    enum DuplicationPolicy { noDuplication = 0, duplicate, duplicateOnCopy };
 
  265    CZString(
char const* str, 
unsigned length, DuplicationPolicy allocate);
 
  266    CZString(CZString 
const& other);
 
  267    CZString(CZString&& other) 
noexcept;
 
  269    CZString& operator=(
const CZString& other);
 
  270    CZString& operator=(CZString&& other) 
noexcept;
 
  272    bool operator<(CZString 
const& other) 
const;
 
  276    char const* data() 
const;
 
  277    unsigned length() 
const;
 
  278    bool isStaticString() 
const;
 
  281    void swap(CZString& other);
 
  283    struct StringStorage {
 
  284      unsigned policy_ : 2;
 
  285      unsigned length_ : 30; 
 
  291      StringStorage storage_;
 
  296  typedef std::map<CZString, Value> ObjectValues;
 
  319#if defined(JSON_HAS_INT64) 
  324  Value(
const char* value); 
 
  325  Value(
const char* begin, 
const char* end); 
 
  359  void swapPayload(
Value& other);
 
  362  void copy(
const Value& other);
 
  364  void copyPayload(
const Value& other);
 
  369  bool operator<(
const Value& other) 
const;
 
  370  bool operator<=(
const Value& other) 
const;
 
  371  bool operator>=(
const Value& other) 
const;
 
  372  bool operator>(
const Value& other) 
const;
 
  375  int compare(
const Value& other) 
const;
 
  377  const char* asCString() 
const; 
 
  378#if JSONCPP_USING_SECURE_MEMORY 
  379  unsigned getCStringLength() 
const; 
 
  386  bool getString(
char const** begin, 
char const** end) 
const;
 
  389#if defined(JSON_HAS_INT64) 
  390  Int64 asInt64() 
const;
 
  395  float asFloat() 
const;
 
  396  double asDouble() 
const;
 
  402  bool isInt64() 
const;
 
  404  bool isUInt64() 
const;
 
  405  bool isIntegral() 
const;
 
  406  bool isDouble() 
const;
 
  407  bool isNumeric() 
const;
 
  408  bool isString() 
const;
 
  409  bool isArray() 
const;
 
  410  bool isObject() 
const;
 
  416  bool isConvertibleTo(
ValueType other) const;
 
  426  explicit operator 
bool() const;
 
  447  Value& operator[](
int index);
 
  455  const 
Value& operator[](
int index) const;
 
  476  Value& operator[](const 
char* key);
 
  479  const 
Value& operator[](const 
char* key) const;
 
  502  Value get(const 
char* key, const 
Value& defaultValue) const;
 
  506  Value get(const 
char* begin, const 
char* end,
 
  507            const 
Value& defaultValue) const;
 
  515  Value const* find(
char const* begin, 
char const* end) const;
 
  522  Value* demand(
char const* begin, 
char const* end);
 
  528  void removeMember(const 
char* key);
 
  531  void removeMember(const 
String& key);
 
  534  bool removeMember(const 
char* key, 
Value* removed);
 
  541  bool removeMember(
String const& key, 
Value* removed);
 
  543  bool removeMember(const 
char* begin, const 
char* end, 
Value* removed);
 
  554  bool isMember(const 
char* key) const;
 
  557  bool isMember(const 
String& key) const;
 
  559  bool isMember(const 
char* begin, const 
char* end) const;
 
  566  Members getMemberNames() const;
 
  571    setComment(
String(comment, strlen(comment)), placement);
 
  575    setComment(
String(comment, len), placement);
 
 
  583  String toStyledString() 
const;
 
  585  const_iterator begin() 
const;
 
  586  const_iterator end() 
const;
 
  594  const Value& front() 
const;
 
  604  const Value& back() 
const;
 
  613  void setOffsetStart(ptrdiff_t start);
 
  614  void setOffsetLimit(ptrdiff_t limit);
 
  615  ptrdiff_t getOffsetStart() 
const;
 
  616  ptrdiff_t getOffsetLimit() 
const;
 
  620    bits_.value_type_ = 
static_cast<unsigned char>(v);
 
  622  bool isAllocated()
 const { 
return bits_.allocated_; }
 
  623  void setIsAllocated(
bool v) { bits_.allocated_ = v; }
 
  625  void initBasic(ValueType type, 
bool allocated = 
false);
 
  626  void dupPayload(
const Value& other);
 
  627  void releasePayload();
 
  628  void dupMeta(
const Value& other);
 
  630  Value& resolveReference(
const char* key);
 
  631  Value& resolveReference(
const char* key, 
const char* end);
 
  660    Comments() = 
default;
 
  661    Comments(
const Comments& that);
 
  662    Comments(Comments&& that) 
noexcept;
 
  663    Comments& operator=(
const Comments& that);
 
  664    Comments& operator=(Comments&& that) 
noexcept;
 
  670    using Array = std::array<String, numberOfCommentPlacement>;
 
  671    std::unique_ptr<Array> ptr_;
 
 
  681template <> 
inline bool Value::as<bool>()
 const { 
return asBool(); }
 
  682template <> 
inline bool Value::is<bool>()
 const { 
return isBool(); }
 
  684template <> 
inline Int Value::as<Int>()
 const { 
return asInt(); }
 
  685template <> 
inline bool Value::is<Int>()
 const { 
return isInt(); }
 
  687template <> 
inline UInt Value::as<UInt>()
 const { 
return asUInt(); }
 
  688template <> 
inline bool Value::is<UInt>()
 const { 
return isUInt(); }
 
  690#if defined(JSON_HAS_INT64) 
  691template <> 
inline Int64 Value::as<Int64>()
 const { 
return asInt64(); }
 
  692template <> 
inline bool Value::is<Int64>()
 const { 
return isInt64(); }
 
  694template <> 
inline UInt64 Value::as<UInt64>()
 const { 
return asUInt64(); }
 
  695template <> 
inline bool Value::is<UInt64>()
 const { 
return isUInt64(); }
 
  698template <> 
inline double Value::as<double>()
 const { 
return asDouble(); }
 
  699template <> 
inline bool Value::is<double>()
 const { 
return isDouble(); }
 
  701template <> 
inline String Value::as<String>()
 const { 
return asString(); }
 
  702template <> 
inline bool Value::is<String>()
 const { 
return isString(); }
 
  706template <> 
inline float Value::as<float>()
 const { 
return asFloat(); }
 
  707template <> 
inline const char* Value::as<const char*>()
 const {
 
 
  724  enum Kind { kindNone = 0, kindIndex, kindKey };
 
  727  Kind kind_{kindNone};
 
 
  749  const Value& resolve(
const Value& root) 
const;
 
  756  using InArgs = std::vector<const PathArgument*>;
 
  757  using Args = std::vector<PathArgument>;
 
  759  void makePath(
const String& path, 
const InArgs& in);
 
  760  void addPathInArg(
const String& path, 
const InArgs& in,
 
  761                    InArgs::const_iterator& itInArg, PathArgument::Kind kind);
 
  762  static void invalidPath(
const String& path, 
int location);
 
 
  803  char const* memberName() const;
 
  807  char const* memberName(
char const** end) const;
 
  816  const 
Value& deref() const;
 
  825  bool isEqual(const 
SelfType& other) const;
 
  830  Value::ObjectValues::iterator current_;
 
 
  913  explicit ValueIterator(
const Value::ObjectValues::iterator& current);
 
 
  951inline const Value& Value::front()
 const { 
return *begin(); }
 
  953inline Value& Value::front() { 
return *begin(); }
 
  955inline const Value& Value::back()
 const { 
return *(--end()); }
 
  957inline Value& Value::back() { 
return *(--end()); }
 
  963#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) 
Base class for all exceptions we throw.
~Exception() noexcept override
Exceptions thrown by JSON_ASSERT/JSON_FAIL macros.
Experimental and untested: represents an element of the "path" to access a node.
Experimental and untested: represents a "path" to access a node.
Exceptions which the user cannot easily avoid.
Lightweight wrapper to tag static string.
const char * c_str() const
StaticString(const char *czstring)
const iterator for object and array value.
pointer operator->() const
reference operator*() const
Value(std::nullptr_t ptr)=delete
Json::ArrayIndex ArrayIndex
static const Value & null
void setComment(const char *comment, size_t len, CommentPlacement placement)
Comments must be //... or /* ... */.
T as() const =delete
The as<T> and is<T> member function templates and specializations.
std::vector< String > Members
Json::LargestInt LargestInt
Json::LargestUInt LargestUInt
void swap(Value &other)
Swap everything.
static const Value & nullRef
base class for Value iterators.
bool operator==(const SelfType &other) const
std::bidirectional_iterator_tag iterator_category
difference_type operator-(const SelfType &other) const
bool operator!=(const SelfType &other) const
difference_type computeDistance(const SelfType &other) const
Iterator for object and array value.
reference operator*() const
ValueIterator(const ValueIterator &other)
pointer operator->() const
#define JSON_API
If defined, indicates that the source file is amalgamated to prevent private header inclusion.
#define JSONCPP_DEPRECATED(message)
JSON (JavaScript Object Notation).
@ commentAfterOnSameLine
a comment just after a value on the same line
@ commentBefore
a comment placed on the line before a value
@ numberOfCommentPlacement
root value)
@ commentAfter
a comment on the line after a value (only make sense for
ValueType
Type of the value held by a Value object.
@ stringValue
UTF-8 string value.
@ arrayValue
array value (ordered list)
@ intValue
signed integer value
@ objectValue
object value (collection of name/value pairs).
@ uintValue
unsigned integer value
bool operator==(const SecureAllocator< T > &, const SecureAllocator< U > &)
bool operator!=(const SecureAllocator< T > &, const SecureAllocator< U > &)
std::basic_string< char, std::char_traits< char >, Allocator< char > > String
PrecisionType
Type of precision for formatting of real values.
@ decimalPlaces
we set max number of digits after "." in string
@ significantDigits
we set max number of significant digits in string
void swap(Value &a, Value &b)
#define JSONCPP_TEMPLATE_DELETE