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