
CPPTL support is no longer relevant to JsonCpp, and can be removed from the library. This patch removes all mentions of CPPTL, by removing all definitions and code sections conditionally compiled only when JsonCpp is used with CPPTL. Include guards are also renamed to not refer to CPPTL where appropriate.
157 lines
5.1 KiB
C++
157 lines
5.1 KiB
C++
// 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
|
|
|
|
// included by json_value.cpp
|
|
|
|
namespace Json {
|
|
|
|
// //////////////////////////////////////////////////////////////////
|
|
// //////////////////////////////////////////////////////////////////
|
|
// //////////////////////////////////////////////////////////////////
|
|
// class ValueIteratorBase
|
|
// //////////////////////////////////////////////////////////////////
|
|
// //////////////////////////////////////////////////////////////////
|
|
// //////////////////////////////////////////////////////////////////
|
|
|
|
ValueIteratorBase::ValueIteratorBase() : current_() {}
|
|
|
|
ValueIteratorBase::ValueIteratorBase(
|
|
const Value::ObjectValues::iterator& current)
|
|
: current_(current), isNull_(false) {}
|
|
|
|
Value& ValueIteratorBase::deref() { return current_->second; }
|
|
const Value& ValueIteratorBase::deref() const { return current_->second; }
|
|
|
|
void ValueIteratorBase::increment() { ++current_; }
|
|
|
|
void ValueIteratorBase::decrement() { --current_; }
|
|
|
|
ValueIteratorBase::difference_type
|
|
ValueIteratorBase::computeDistance(const SelfType& other) const {
|
|
// Iterator for null value are initialized using the default
|
|
// constructor, which initialize current_ to the default
|
|
// std::map::iterator. As begin() and end() are two instance
|
|
// of the default std::map::iterator, they can not be compared.
|
|
// To allow this, we handle this comparison specifically.
|
|
if (isNull_ && other.isNull_) {
|
|
return 0;
|
|
}
|
|
|
|
// Usage of std::distance is not portable (does not compile with Sun Studio 12
|
|
// RogueWave STL,
|
|
// which is the one used by default).
|
|
// Using a portable hand-made version for non random iterator instead:
|
|
// return difference_type( std::distance( current_, other.current_ ) );
|
|
difference_type myDistance = 0;
|
|
for (Value::ObjectValues::iterator it = current_; it != other.current_;
|
|
++it) {
|
|
++myDistance;
|
|
}
|
|
return myDistance;
|
|
}
|
|
|
|
bool ValueIteratorBase::isEqual(const SelfType& other) const {
|
|
if (isNull_) {
|
|
return other.isNull_;
|
|
}
|
|
return current_ == other.current_;
|
|
}
|
|
|
|
void ValueIteratorBase::copy(const SelfType& other) {
|
|
current_ = other.current_;
|
|
isNull_ = other.isNull_;
|
|
}
|
|
|
|
Value ValueIteratorBase::key() const {
|
|
const Value::CZString czstring = (*current_).first;
|
|
if (czstring.data()) {
|
|
if (czstring.isStaticString())
|
|
return Value(StaticString(czstring.data()));
|
|
return Value(czstring.data(), czstring.data() + czstring.length());
|
|
}
|
|
return Value(czstring.index());
|
|
}
|
|
|
|
UInt ValueIteratorBase::index() const {
|
|
const Value::CZString czstring = (*current_).first;
|
|
if (!czstring.data())
|
|
return czstring.index();
|
|
return Value::UInt(-1);
|
|
}
|
|
|
|
String ValueIteratorBase::name() const {
|
|
char const* keey;
|
|
char const* end;
|
|
keey = memberName(&end);
|
|
if (!keey)
|
|
return String();
|
|
return String(keey, end);
|
|
}
|
|
|
|
char const* ValueIteratorBase::memberName() const {
|
|
const char* cname = (*current_).first.data();
|
|
return cname ? cname : "";
|
|
}
|
|
|
|
char const* ValueIteratorBase::memberName(char const** end) const {
|
|
const char* cname = (*current_).first.data();
|
|
if (!cname) {
|
|
*end = nullptr;
|
|
return nullptr;
|
|
}
|
|
*end = cname + (*current_).first.length();
|
|
return cname;
|
|
}
|
|
|
|
// //////////////////////////////////////////////////////////////////
|
|
// //////////////////////////////////////////////////////////////////
|
|
// //////////////////////////////////////////////////////////////////
|
|
// class ValueConstIterator
|
|
// //////////////////////////////////////////////////////////////////
|
|
// //////////////////////////////////////////////////////////////////
|
|
// //////////////////////////////////////////////////////////////////
|
|
|
|
ValueConstIterator::ValueConstIterator() = default;
|
|
|
|
ValueConstIterator::ValueConstIterator(
|
|
const Value::ObjectValues::iterator& current)
|
|
: ValueIteratorBase(current) {}
|
|
|
|
ValueConstIterator::ValueConstIterator(ValueIterator const& other)
|
|
: ValueIteratorBase(other) {}
|
|
|
|
ValueConstIterator& ValueConstIterator::
|
|
operator=(const ValueIteratorBase& other) {
|
|
copy(other);
|
|
return *this;
|
|
}
|
|
|
|
// //////////////////////////////////////////////////////////////////
|
|
// //////////////////////////////////////////////////////////////////
|
|
// //////////////////////////////////////////////////////////////////
|
|
// class ValueIterator
|
|
// //////////////////////////////////////////////////////////////////
|
|
// //////////////////////////////////////////////////////////////////
|
|
// //////////////////////////////////////////////////////////////////
|
|
|
|
ValueIterator::ValueIterator() = default;
|
|
|
|
ValueIterator::ValueIterator(const Value::ObjectValues::iterator& current)
|
|
: ValueIteratorBase(current) {}
|
|
|
|
ValueIterator::ValueIterator(const ValueConstIterator& other)
|
|
: ValueIteratorBase(other) {
|
|
throwRuntimeError("ConstIterator to Iterator should never be allowed.");
|
|
}
|
|
|
|
ValueIterator::ValueIterator(const ValueIterator& other) = default;
|
|
|
|
ValueIterator& ValueIterator::operator=(const SelfType& other) {
|
|
copy(other);
|
|
return *this;
|
|
}
|
|
|
|
} // namespace Json
|