| // 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&) = default; |
| |
| ValueIterator& ValueIterator::operator=(const SelfType& other) { |
| copy(other); |
| return *this; |
| } |
| |
| } // namespace Json |