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
#define JSON_IS_AMALGATED
// //////////////////////////////////////////////////////////////////////
// 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
//# define JSON_IN_CPPTL 1
//# define JSON_USE_CPPTL 1
//# define JSON_USE_CPPTL_SMALLMAP 1
//# define JSON_VALUE_USE_INTERNAL_MAP 1
//# define JSON_USE_SIMPLE_INTERNAL_ALLOCATOR 1
#define JSON_USE_EXCEPTION 1
// #define JSON_IS_AMALGATED
#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)
#define JSON_API __declspec(dllexport)
#elif defined(JSON_DLL)
#define JSON_API __declspec(dllimport)
#else
#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) && _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
#endif // if defined(_MSC_VER) && _MSC_VER < 1200 // MSVC 6
#if defined(_MSC_VER) && _MSC_VER >= 1500 // MSVC 2008
#define JSONCPP_DEPRECATED(message) __declspec(deprecated(message))
#endif
#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_AMALGATED)
#include "config.h"
#endif // if !defined(JSON_IS_AMALGATED)
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;
#ifdef JSON_VALUE_USE_INTERNAL_MAP
class ValueMapAllocator;
class ValueInternalLink;
class ValueInternalArray;
class ValueInternalMap;
#endif // #ifdef JSON_VALUE_USE_INTERNAL_MAP
} // 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_AMALGATED)
#include "forwards.h"
#endif // if !defined(JSON_IS_AMALGATED)
namespace Json
{
class JSON_API Features
{
public:
static Features all();
static Features strictMode();
Features();
bool allowComments_;
bool strictRoot_;
};
} // 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_AMALGATED)
#include "forwards.h"
#endif // if !defined(JSON_IS_AMALGATED)
#include <string>
#include <vector>
#ifndef JSON_USE_CPPTL_SMALLMAP
#include <map>
#else
#include <cpptl/smallmap.h>
#endif
#ifdef JSON_USE_CPPTL
#include <cpptl/forwards.h>
#endif
namespace Json
{
enum ValueType
{
nullValue = 0,
intValue,
uintValue,
realValue,
stringValue,
booleanValue,
arrayValue,
objectValue
};
enum CommentPlacement
{
commentBefore = 0,
commentAfterOnSameLine,
commentAfter,
numberOfCommentPlacement
};
//# ifdef JSON_USE_CPPTL
// typedef CppTL::AnyEnumerator<const char *> EnumMemberNames;
// typedef CppTL::AnyEnumerator<const Value &> EnumValues;
//# endif
class JSON_API StaticString
{
public:
explicit StaticString(const char *czstring)
: str_(czstring)
{
}
operator const char *() const { return str_; }
const char *c_str() const { return str_; }
private:
const char *str_;
};
class JSON_API Value
{
friend class ValueIteratorBase;
#ifdef JSON_VALUE_USE_INTERNAL_MAP
friend class ValueInternalLink;
friend class ValueInternalMap;
#endif
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;
static const LargestInt minLargestInt;
static const LargestInt maxLargestInt;
static const LargestUInt maxLargestUInt;
static const Int minInt;
static const Int maxInt;
static const UInt maxUInt;
static const Int64 minInt64;
static const Int64 maxInt64;
static const UInt64 maxUInt64;
private:
#ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION
#ifndef JSON_VALUE_USE_INTERNAL_MAP
class CZString
{
public:
enum DuplicationPolicy
{
noDuplication = 0,
duplicate,
duplicateOnCopy
};
CZString(ArrayIndex index);
CZString(const char *cstr, DuplicationPolicy allocate);
CZString(const CZString &other);
~CZString();
CZString &operator=(const CZString &other);
bool operator<(const CZString &other) const;
bool operator==(const CZString &other) const;
ArrayIndex index() const;
const char *c_str() const;
bool isStaticString() const;
private:
void swap(CZString &other);
const char *cstr_;
ArrayIndex index_;
};
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 JSON_VALUE_USE_INTERNAL_MAP
#endif // ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION
public:
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);
Value(const char *beginValue, const char *endValue);
Value(const StaticString &value);
Value(const std::string &value);
#ifdef JSON_USE_CPPTL
Value(const CppTL::ConstString &value);
#endif
Value(bool value);
Value(const Value &other);
~Value();
Value &operator=(const Value &other);
void swap(Value &other);
ValueType type() 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;
bool operator!=(const Value &other) const;
int compare(const Value &other) const;
const char *asCString() const;
std::string asString() const;
#ifdef JSON_USE_CPPTL
CppTL::ConstString asConstString() const;
#endif
Int asInt() const;
UInt asUInt() const;
Int64 asInt64() const;
UInt64 asUInt64() const;
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 isUInt() const;
bool isIntegral() const;
bool isDouble() const;
bool isNumeric() const;
bool isString() const;
bool isArray() const;
bool isObject() const;
bool isConvertibleTo(ValueType other) const;
ArrayIndex size() const;
bool empty() const;
bool operator!() const;
void clear();
void resize(ArrayIndex size);
Value &operator[](ArrayIndex index);
Value &operator[](int index);
const Value &operator[](ArrayIndex index) const;
const Value &operator[](int index) const;
Value get(ArrayIndex index, const Value &defaultValue) const;
bool isValidIndex(ArrayIndex index) const;
Value &append(const Value &value);
Value &operator[](const char *key);
const Value &operator[](const char *key) const;
Value &operator[](const std::string &key);
const Value &operator[](const std::string &key) const;
Value &operator[](const StaticString &key);
#ifdef JSON_USE_CPPTL
Value &operator[](const CppTL::ConstString &key);
const Value &operator[](const CppTL::ConstString &key) const;
#endif
Value get(const char *key, const Value &defaultValue) const;
Value get(const std::string &key, const Value &defaultValue) const;
#ifdef JSON_USE_CPPTL
Value get(const CppTL::ConstString &key, const Value &defaultValue) const;
#endif
Value removeMember(const char *key);
Value removeMember(const std::string &key);
bool isMember(const char *key) const;
bool isMember(const std::string &key) const;
#ifdef JSON_USE_CPPTL
bool isMember(const CppTL::ConstString &key) const;
#endif
Members getMemberNames() const;
//# ifdef JSON_USE_CPPTL
// EnumMemberNames enumMemberNames() const;
// EnumValues enumValues() const;
//# endif
void setComment(const char *comment, CommentPlacement placement);
void setComment(const std::string &comment, CommentPlacement placement);
bool hasComment(CommentPlacement placement) const;
std::string getComment(CommentPlacement placement) const;
std::string toStyledString() const;
const_iterator begin() const;
const_iterator end() const;
iterator begin();
iterator end();
private:
Value &resolveReference(const char *key, bool isStatic);
#ifdef JSON_VALUE_USE_INTERNAL_MAP
inline bool isItemAvailable() const { return itemIsUsed_ == 0; }
inline void setItemUsed(bool isUsed = true) { itemIsUsed_ = isUsed ? 1 : 0; }
inline bool isMemberNameStatic() const { return memberNameIsStatic_ == 0; }
inline void setMemberNameIsStatic(bool isStatic) { memberNameIsStatic_ = isStatic ? 1 : 0; }
#endif // # ifdef JSON_VALUE_USE_INTERNAL_MAP
private:
struct CommentInfo
{
CommentInfo();
~CommentInfo();
void setComment(const char *text);
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_;
#ifdef JSON_VALUE_USE_INTERNAL_MAP
ValueInternalArray *array_;
ValueInternalMap *map_;
#else
ObjectValues *map_;
#endif
} value_;
ValueType type_ : 8;
int allocated_ : 1; // Notes: if declared as bool, bitfield is useless.
#ifdef JSON_VALUE_USE_INTERNAL_MAP
unsigned int itemIsUsed_ : 1; // used by the ValueInternalMap container.
int memberNameIsStatic_ : 1; // used by the ValueInternalMap container.
#endif
CommentInfo *comments_;
};
class 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_;
};
class 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;
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_;
};
#ifdef JSON_VALUE_USE_INTERNAL_MAP
class JSON_API ValueMapAllocator
{
public:
virtual ~ValueMapAllocator();
virtual ValueInternalMap *newMap() = 0;
virtual ValueInternalMap *newMapCopy(const ValueInternalMap &other) = 0;
virtual void destructMap(ValueInternalMap *map) = 0;
virtual ValueInternalLink *allocateMapBuckets(unsigned int size) = 0;
virtual void releaseMapBuckets(ValueInternalLink *links) = 0;
virtual ValueInternalLink *allocateMapLink() = 0;
virtual void releaseMapLink(ValueInternalLink *link) = 0;
};
class JSON_API ValueInternalLink
{
public:
enum
{
itemPerLink = 6
}; // sizeof(ValueInternalLink) = 128 on 32 bits architecture.
enum InternalFlags
{
flagAvailable = 0,
flagUsed = 1
};
ValueInternalLink();
~ValueInternalLink();
Value items_[itemPerLink];
char *keys_[itemPerLink];
ValueInternalLink *previous_;
ValueInternalLink *next_;
};
class JSON_API ValueInternalMap
{
friend class ValueIteratorBase;
friend class Value;
public:
typedef unsigned int HashKey;
typedef unsigned int BucketIndex;
#ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION
struct IteratorState
{
IteratorState()
: map_(0)
, link_(0)
, itemIndex_(0)
, bucketIndex_(0)
{
}
ValueInternalMap *map_;
ValueInternalLink *link_;
BucketIndex itemIndex_;
BucketIndex bucketIndex_;
};
#endif // ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION
ValueInternalMap();
ValueInternalMap(const ValueInternalMap &other);
ValueInternalMap &operator=(const ValueInternalMap &other);
~ValueInternalMap();
void swap(ValueInternalMap &other);
BucketIndex size() const;
void clear();
bool reserveDelta(BucketIndex growth);
bool reserve(BucketIndex newItemCount);
const Value *find(const char *key) const;
Value *find(const char *key);
Value &resolveReference(const char *key, bool isStatic);
void remove(const char *key);
void doActualRemove(ValueInternalLink *link, BucketIndex index, BucketIndex bucketIndex);
ValueInternalLink *&getLastLinkInBucket(BucketIndex bucketIndex);
Value &setNewItem(const char *key, bool isStatic, ValueInternalLink *link, BucketIndex index);
Value &unsafeAdd(const char *key, bool isStatic, HashKey hashedKey);
HashKey hash(const char *key) const;
int compare(const ValueInternalMap &other) const;
private:
void makeBeginIterator(IteratorState &it) const;
void makeEndIterator(IteratorState &it) const;
static bool equals(const IteratorState &x, const IteratorState &other);
static void increment(IteratorState &iterator);
static void incrementBucket(IteratorState &iterator);
static void decrement(IteratorState &iterator);
static const char *key(const IteratorState &iterator);
static const char *key(const IteratorState &iterator, bool &isStatic);
static Value &value(const IteratorState &iterator);
static int distance(const IteratorState &x, const IteratorState &y);
private:
ValueInternalLink *buckets_;
ValueInternalLink *tailLink_;
BucketIndex bucketsSize_;
BucketIndex itemCount_;
};
class JSON_API ValueInternalArray
{
friend class Value;
friend class ValueIteratorBase;
public:
enum
{
itemsPerPage = 8
}; // should be a power of 2 for fast divide and modulo.
typedef Value::ArrayIndex ArrayIndex;
typedef unsigned int PageIndex;
#ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION
struct IteratorState // Must be a POD
{
IteratorState()
: array_(0)
, currentPageIndex_(0)
, currentItemIndex_(0)
{
}
ValueInternalArray *array_;
Value **currentPageIndex_;
unsigned int currentItemIndex_;
};
#endif // ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION
ValueInternalArray();
ValueInternalArray(const ValueInternalArray &other);
ValueInternalArray &operator=(const ValueInternalArray &other);
~ValueInternalArray();
void swap(ValueInternalArray &other);
void clear();
void resize(ArrayIndex newSize);
Value &resolveReference(ArrayIndex index);
Value *find(ArrayIndex index) const;
ArrayIndex size() const;
int compare(const ValueInternalArray &other) const;
private:
static bool equals(const IteratorState &x, const IteratorState &other);
static void increment(IteratorState &iterator);
static void decrement(IteratorState &iterator);
static Value &dereference(const IteratorState &iterator);
static Value &unsafeDereference(const IteratorState &iterator);
static int distance(const IteratorState &x, const IteratorState &y);
static ArrayIndex indexOf(const IteratorState &iterator);
void makeBeginIterator(IteratorState &it) const;
void makeEndIterator(IteratorState &it) const;
void makeIterator(IteratorState &it, ArrayIndex index) const;
void makeIndexValid(ArrayIndex index);
Value **pages_;
ArrayIndex size_;
PageIndex pageCount_;
};
class JSON_API ValueArrayAllocator
{
public:
virtual ~ValueArrayAllocator();
virtual ValueInternalArray *newArray() = 0;
virtual ValueInternalArray *newArrayCopy(const ValueInternalArray &other) = 0;
virtual void destructArray(ValueInternalArray *array) = 0;
virtual void reallocateArrayPageIndex(Value **&indexes,
ValueInternalArray::PageIndex &indexCount,
ValueInternalArray::PageIndex minNewIndexCount) = 0;
virtual void releaseArrayPageIndex(Value **indexes, ValueInternalArray::PageIndex indexCount) = 0;
virtual Value *allocateArrayPage() = 0;
virtual void releaseArrayPage(Value *value) = 0;
};
#endif // #ifdef JSON_VALUE_USE_INTERNAL_MAP
class ValueIteratorBase
{
public:
typedef unsigned int size_t;
typedef int difference_type;
typedef ValueIteratorBase SelfType;
ValueIteratorBase();
#ifndef JSON_VALUE_USE_INTERNAL_MAP
explicit ValueIteratorBase(const Value::ObjectValues::iterator &current);
#else
ValueIteratorBase(const ValueInternalArray::IteratorState &state);
ValueIteratorBase(const ValueInternalMap::IteratorState &state);
#endif
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 computeDistance(other); }
Value key() const;
UInt index() const;
const char *memberName() 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:
#ifndef JSON_VALUE_USE_INTERNAL_MAP
Value::ObjectValues::iterator current_;
// Indicates that iterator is for a null value.
bool isNull_;
#else
union
{
ValueInternalArray::IteratorState array_;
ValueInternalMap::IteratorState map_;
} iterator_;
bool isArray_;
#endif
};
class ValueConstIterator : public ValueIteratorBase
{
friend class Value;
public:
typedef unsigned int size_t;
typedef int difference_type;
typedef const Value &reference;
typedef const Value *pointer;
typedef ValueConstIterator SelfType;
ValueConstIterator();
private:
#ifndef JSON_VALUE_USE_INTERNAL_MAP
explicit ValueConstIterator(const Value::ObjectValues::iterator &current);
#else
ValueConstIterator(const ValueInternalArray::IteratorState &state);
ValueConstIterator(const ValueInternalMap::IteratorState &state);
#endif
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(); }
};
class ValueIterator : public ValueIteratorBase
{
friend class Value;
public:
typedef unsigned int size_t;
typedef int difference_type;
typedef Value &reference;
typedef Value *pointer;
typedef ValueIterator SelfType;
ValueIterator();
ValueIterator(const ValueConstIterator &other);
ValueIterator(const ValueIterator &other);
private:
#ifndef JSON_VALUE_USE_INTERNAL_MAP
explicit ValueIterator(const Value::ObjectValues::iterator &current);
#else
ValueIterator(const ValueInternalArray::IteratorState &state);
ValueIterator(const ValueInternalMap::IteratorState &state);
#endif
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(); }
};
} // namespace Json
#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_AMALGATED)
#include "features.h"
#include "value.h"
#endif // if !defined(JSON_IS_AMALGATED)
#include <deque>
#include <stack>
#include <string>
#include <iostream>
namespace Json
{
class JSON_API Reader
{
public:
typedef char Char;
typedef const Char *Location;
Reader();
Reader(const Features &features);
bool parse(const std::string &document, Value &root, bool collectComments = true);
bool parse(const char *beginDoc, const char *endDoc, Value &root, bool collectComments = true);
bool parse(std::istream &is, Value &root, bool collectComments = true);
JSONCPP_DEPRECATED("Use getFormattedErrorMessages instead")
std::string getFormatedErrorMessages() const;
std::string getFormattedErrorMessages() 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 expectToken(TokenType type, Token &token, const char *message);
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 decodeString(Token &token);
bool decodeString(Token &token, std::string &decoded);
bool decodeDouble(Token &token);
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_;
};
std::istream &operator>>(std::istream &, Value &);
} // namespace Json
#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_AMALGATED)
#include "value.h"
#endif // if !defined(JSON_IS_AMALGATED)
#include <vector>
#include <string>
#include <iostream>
namespace Json
{
class Value;
class JSON_API Writer
{
public:
virtual ~Writer();
virtual std::string write(const Value &root) = 0;
};
class JSON_API FastWriter : public Writer
{
public:
FastWriter();
virtual ~FastWriter() {}
void enableYAMLCompatibility();
public: // overridden from Writer
virtual std::string write(const Value &root);
private:
void writeValue(const Value &value);
std::string document_;
bool yamlCompatiblityEnabled_;
};
class JSON_API StyledWriter : public Writer
{
public:
StyledWriter();
virtual ~StyledWriter() {}
public: // overridden from Writer
virtual std::string write(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::string document_;
std::string indentString_;
int rightMargin_;
int indentSize_;
bool addChildValues_;
};
class JSON_API StyledStreamWriter
{
public:
StyledStreamWriter(std::string indentation = "\t");
~StyledStreamWriter() {}
public:
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_;
};
#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);
std::ostream &operator<<(std::ostream &, const Value &root);
} // namespace Json
#endif // JSON_WRITER_H_INCLUDED
// //////////////////////////////////////////////////////////////////////
// End of content of file: include/json/writer.h
// //////////////////////////////////////////////////////////////////////
#endif // ifndef JSON_AMALGATED_H_INCLUDED
Json::FastWriter
Outputs a Value in JSON format without formatting (not human friendly).
Definition: json.h:1589
Json::ValueArrayAllocator
Experimental: do not use. Allocator to customize Value internal array. Below is an example of a simpl...
Definition: json.h:1140
Json::StyledWriter
Writes a Value in JSON format in a human friendly way.
Definition: json.h:1624
Json::Value::maxInt64
static const Int64 maxInt64
Maximum signed 64 bits int value that can be stored in a Json::Value.
Definition: json.h:443
Json::ValueIteratorBase
base class for Value iterators.
Definition: json.h:1170
Json::arrayValue
array value (ordered list)
Definition: json.h:332
Json::uintValue
unsigned integer value
Definition: json.h:328
Json::objectValue
object value (collection of name/value pairs).
Definition: json.h:333
Json::operator>>
std::istream & operator>>(std::istream &, Value &)
Read from &#39;sin&#39; into &#39;root&#39;.
Definition: jsoncpp.cpp:943
Json::ValueInternalMap::IteratorState
Definition: json.h:936
Json::Value::maxInt
static const Int maxInt
Maximum signed int value that can be stored in a Json::Value.
Definition: json.h:436
Json::StaticString
Lightweight wrapper to tag static string.
Definition: json.h:363
Json::Value::maxUInt
static const UInt maxUInt
Maximum unsigned int value that can be stored in a Json::Value.
Definition: json.h:438
Json::ValueInternalArray::IteratorState
Definition: json.h:1031
Json::ValueConstIterator
const iterator for object and array value.
Definition: json.h:1228
Json::PathArgument
Experimental and untested: represents an element of the "path" to access a node.
Definition: json.h:768
Json::Value::minLargestInt
static const LargestInt minLargestInt
Minimum signed integer value that can be stored in a Json::Value.
Definition: json.h:427
Json::nullValue
&#39;null&#39; value
Definition: json.h:326
Json::Features::allowComments_
bool allowComments_
true if comments are allowed. Default: true.
Definition: json.h:277
Json::CommentPlacement
CommentPlacement
Definition: json.h:336
Json::ValueInternalLink
ValueInternalMap hash-map bucket chain link (for internal use only).
Definition: json.h:891
Json::ValueMapAllocator
Allocator to customize Value internal map. Below is an example of a simple implementation (default im...
Definition: json.h:875
Json
JSON (JavaScript Object Notation).
Definition: json.h:152
Json::Path
Experimental and untested: represents a "path" to access a node.
Definition: json.h:801
Json::Value::maxUInt64
static const UInt64 maxUInt64
Maximum unsigned 64 bits int value that can be stored in a Json::Value.
Definition: json.h:445
Json::realValue
double value
Definition: json.h:329
Json::ValueInternalArray
A simplified deque implementation used internally by Value.
Definition: json.h:1017
Json::Writer
Abstract class for writers.
Definition: json.h:1575
Json::Value
Represents a JSON value.
Definition: json.h:404
Json::Value::minInt64
static const Int64 minInt64
Minimum signed 64 bits int value that can be stored in a Json::Value.
Definition: json.h:441
Json::Value::minInt
static const Int minInt
Minimum signed int value that can be stored in a Json::Value.
Definition: json.h:434
Json::commentAfter
a comment on the line after a value (only make sense for root value)
Definition: json.h:340
Json::Reader
Unserialize a JSON document into a Value.
Definition: json.h:1374
Json::StyledStreamWriter
Writes a Value in JSON format in a human friendly way, to a stream rather than to a string...
Definition: json.h:1680
Json::ValueIterator
Iterator for object and array value.
Definition: json.h:1284
Json::ValueInternalMap
A linked page based hash-table implementation used internally by Value.
Definition: json.h:926
Json::ValueType
ValueType
Type of the value held by a Value object.
Definition: json.h:324
Json::Features::strictRoot_
bool strictRoot_
true if root must be either an array or an object value. Default: false.
Definition: json.h:280
Json::booleanValue
bool value
Definition: json.h:331
Json::intValue
signed integer value
Definition: json.h:327
Json::Features
Configuration passed to reader and writer. This configuration object can be used to force the Reader ...
Definition: json.h:255
Json::commentBefore
a comment placed on the line before a value
Definition: json.h:338
Json::stringValue
UTF-8 string value.
Definition: json.h:330
Json::commentAfterOnSameLine
a comment just after a value on the same line
Definition: json.h:339
Json::operator<<
std::ostream & operator<<(std::ostream &, const Value &root)
Output using the StyledStreamWriter.
Definition: jsoncpp.cpp:3774
Json::Value::maxLargestInt
static const LargestInt maxLargestInt
Maximum signed integer value that can be stored in a Json::Value.
Definition: json.h:429
Json::Value::maxLargestUInt
static const LargestUInt maxLargestUInt
Maximum unsigned integer value that can be stored in a Json::Value.
Definition: json.h:431