123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 |
- // 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
|