// Copyright 2017 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "base/value_iterators.h" namespace base { namespace detail { // ---------------------------------------------------------------------------- // dict_iterator. dict_iterator::pointer::pointer(const reference& ref) : ref_(ref) {} dict_iterator::pointer::pointer(const pointer& ptr) = default; dict_iterator::dict_iterator(DictStorage::iterator dict_iter) : dict_iter_(dict_iter) {} dict_iterator::dict_iterator(const dict_iterator& dict_iter) = default; dict_iterator& dict_iterator::operator=(const dict_iterator& dict_iter) = default; dict_iterator::~dict_iterator() = default; dict_iterator::reference dict_iterator::operator*() { return {dict_iter_->first, *dict_iter_->second}; } dict_iterator::pointer dict_iterator::operator->() { return pointer(operator*()); } dict_iterator& dict_iterator::operator++() { ++dict_iter_; return *this; } dict_iterator dict_iterator::operator++(int) { dict_iterator tmp(*this); ++dict_iter_; return tmp; } dict_iterator& dict_iterator::operator--() { --dict_iter_; return *this; } dict_iterator dict_iterator::operator--(int) { dict_iterator tmp(*this); --dict_iter_; return tmp; } bool operator==(const dict_iterator& lhs, const dict_iterator& rhs) { return lhs.dict_iter_ == rhs.dict_iter_; } bool operator!=(const dict_iterator& lhs, const dict_iterator& rhs) { return !(lhs == rhs); } // ---------------------------------------------------------------------------- // const_dict_iterator. const_dict_iterator::pointer::pointer(const reference& ref) : ref_(ref) {} const_dict_iterator::pointer::pointer(const pointer& ptr) = default; const_dict_iterator::const_dict_iterator(DictStorage::const_iterator dict_iter) : dict_iter_(dict_iter) {} const_dict_iterator::const_dict_iterator(const const_dict_iterator& dict_iter) = default; const_dict_iterator& const_dict_iterator::operator=( const const_dict_iterator& dict_iter) = default; const_dict_iterator::~const_dict_iterator() = default; const_dict_iterator::reference const_dict_iterator::operator*() const { return {dict_iter_->first, *dict_iter_->second}; } const_dict_iterator::pointer const_dict_iterator::operator->() const { return pointer(operator*()); } const_dict_iterator& const_dict_iterator::operator++() { ++dict_iter_; return *this; } const_dict_iterator const_dict_iterator::operator++(int) { const_dict_iterator tmp(*this); ++dict_iter_; return tmp; } const_dict_iterator& const_dict_iterator::operator--() { --dict_iter_; return *this; } const_dict_iterator const_dict_iterator::operator--(int) { const_dict_iterator tmp(*this); --dict_iter_; return tmp; } bool operator==(const const_dict_iterator& lhs, const const_dict_iterator& rhs) { return lhs.dict_iter_ == rhs.dict_iter_; } bool operator!=(const const_dict_iterator& lhs, const const_dict_iterator& rhs) { return !(lhs == rhs); } // ---------------------------------------------------------------------------- // dict_iterator_proxy. dict_iterator_proxy::dict_iterator_proxy(DictStorage* storage) : storage_(storage) {} dict_iterator_proxy::iterator dict_iterator_proxy::begin() { return iterator(storage_->begin()); } dict_iterator_proxy::const_iterator dict_iterator_proxy::begin() const { return const_iterator(storage_->begin()); } dict_iterator_proxy::iterator dict_iterator_proxy::end() { return iterator(storage_->end()); } dict_iterator_proxy::const_iterator dict_iterator_proxy::end() const { return const_iterator(storage_->end()); } dict_iterator_proxy::reverse_iterator dict_iterator_proxy::rbegin() { return reverse_iterator(end()); } dict_iterator_proxy::const_reverse_iterator dict_iterator_proxy::rbegin() const { return const_reverse_iterator(end()); } dict_iterator_proxy::reverse_iterator dict_iterator_proxy::rend() { return reverse_iterator(begin()); } dict_iterator_proxy::const_reverse_iterator dict_iterator_proxy::rend() const { return const_reverse_iterator(begin()); } dict_iterator_proxy::const_iterator dict_iterator_proxy::cbegin() const { return const_iterator(begin()); } dict_iterator_proxy::const_iterator dict_iterator_proxy::cend() const { return const_iterator(end()); } dict_iterator_proxy::const_reverse_iterator dict_iterator_proxy::crbegin() const { return const_reverse_iterator(rbegin()); } dict_iterator_proxy::const_reverse_iterator dict_iterator_proxy::crend() const { return const_reverse_iterator(rend()); } // ---------------------------------------------------------------------------- // const_dict_iterator_proxy. const_dict_iterator_proxy::const_dict_iterator_proxy(const DictStorage* storage) : storage_(storage) {} const_dict_iterator_proxy::const_iterator const_dict_iterator_proxy::begin() const { return const_iterator(storage_->begin()); } const_dict_iterator_proxy::const_iterator const_dict_iterator_proxy::end() const { return const_iterator(storage_->end()); } const_dict_iterator_proxy::const_reverse_iterator const_dict_iterator_proxy::rbegin() const { return const_reverse_iterator(end()); } const_dict_iterator_proxy::const_reverse_iterator const_dict_iterator_proxy::rend() const { return const_reverse_iterator(begin()); } const_dict_iterator_proxy::const_iterator const_dict_iterator_proxy::cbegin() const { return const_iterator(begin()); } const_dict_iterator_proxy::const_iterator const_dict_iterator_proxy::cend() const { return const_iterator(end()); } const_dict_iterator_proxy::const_reverse_iterator const_dict_iterator_proxy::crbegin() const { return const_reverse_iterator(rbegin()); } const_dict_iterator_proxy::const_reverse_iterator const_dict_iterator_proxy::crend() const { return const_reverse_iterator(rend()); } } // namespace detail } // namespace base