1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "base/value_iterators.h"
11 // ----------------------------------------------------------------------------
14 dict_iterator::pointer::pointer(const reference& ref) : ref_(ref) {}
16 dict_iterator::pointer::pointer(const pointer& ptr) = default;
18 dict_iterator::dict_iterator(DictStorage::iterator dict_iter)
19 : dict_iter_(dict_iter) {}
21 dict_iterator::dict_iterator(const dict_iterator& dict_iter) = default;
23 dict_iterator& dict_iterator::operator=(const dict_iterator& dict_iter) =
26 dict_iterator::~dict_iterator() = default;
28 dict_iterator::reference dict_iterator::operator*() {
29 return {dict_iter_->first, *dict_iter_->second};
32 dict_iterator::pointer dict_iterator::operator->() {
33 return pointer(operator*());
36 dict_iterator& dict_iterator::operator++() {
41 dict_iterator dict_iterator::operator++(int) {
42 dict_iterator tmp(*this);
47 dict_iterator& dict_iterator::operator--() {
52 dict_iterator dict_iterator::operator--(int) {
53 dict_iterator tmp(*this);
58 bool operator==(const dict_iterator& lhs, const dict_iterator& rhs) {
59 return lhs.dict_iter_ == rhs.dict_iter_;
62 bool operator!=(const dict_iterator& lhs, const dict_iterator& rhs) {
66 // ----------------------------------------------------------------------------
67 // const_dict_iterator.
69 const_dict_iterator::pointer::pointer(const reference& ref) : ref_(ref) {}
71 const_dict_iterator::pointer::pointer(const pointer& ptr) = default;
73 const_dict_iterator::const_dict_iterator(DictStorage::const_iterator dict_iter)
74 : dict_iter_(dict_iter) {}
76 const_dict_iterator::const_dict_iterator(const const_dict_iterator& dict_iter) =
79 const_dict_iterator& const_dict_iterator::operator=(
80 const const_dict_iterator& dict_iter) = default;
82 const_dict_iterator::~const_dict_iterator() = default;
84 const_dict_iterator::reference const_dict_iterator::operator*() const {
85 return {dict_iter_->first, *dict_iter_->second};
88 const_dict_iterator::pointer const_dict_iterator::operator->() const {
89 return pointer(operator*());
92 const_dict_iterator& const_dict_iterator::operator++() {
97 const_dict_iterator const_dict_iterator::operator++(int) {
98 const_dict_iterator tmp(*this);
103 const_dict_iterator& const_dict_iterator::operator--() {
108 const_dict_iterator const_dict_iterator::operator--(int) {
109 const_dict_iterator tmp(*this);
114 bool operator==(const const_dict_iterator& lhs,
115 const const_dict_iterator& rhs) {
116 return lhs.dict_iter_ == rhs.dict_iter_;
119 bool operator!=(const const_dict_iterator& lhs,
120 const const_dict_iterator& rhs) {
121 return !(lhs == rhs);
124 // ----------------------------------------------------------------------------
125 // dict_iterator_proxy.
127 dict_iterator_proxy::dict_iterator_proxy(DictStorage* storage)
128 : storage_(storage) {}
130 dict_iterator_proxy::iterator dict_iterator_proxy::begin() {
131 return iterator(storage_->begin());
134 dict_iterator_proxy::const_iterator dict_iterator_proxy::begin() const {
135 return const_iterator(storage_->begin());
138 dict_iterator_proxy::iterator dict_iterator_proxy::end() {
139 return iterator(storage_->end());
142 dict_iterator_proxy::const_iterator dict_iterator_proxy::end() const {
143 return const_iterator(storage_->end());
146 dict_iterator_proxy::reverse_iterator dict_iterator_proxy::rbegin() {
147 return reverse_iterator(end());
150 dict_iterator_proxy::const_reverse_iterator dict_iterator_proxy::rbegin()
152 return const_reverse_iterator(end());
155 dict_iterator_proxy::reverse_iterator dict_iterator_proxy::rend() {
156 return reverse_iterator(begin());
159 dict_iterator_proxy::const_reverse_iterator dict_iterator_proxy::rend() const {
160 return const_reverse_iterator(begin());
163 dict_iterator_proxy::const_iterator dict_iterator_proxy::cbegin() const {
164 return const_iterator(begin());
167 dict_iterator_proxy::const_iterator dict_iterator_proxy::cend() const {
168 return const_iterator(end());
171 dict_iterator_proxy::const_reverse_iterator dict_iterator_proxy::crbegin()
173 return const_reverse_iterator(rbegin());
176 dict_iterator_proxy::const_reverse_iterator dict_iterator_proxy::crend() const {
177 return const_reverse_iterator(rend());
180 // ----------------------------------------------------------------------------
181 // const_dict_iterator_proxy.
183 const_dict_iterator_proxy::const_dict_iterator_proxy(const DictStorage* storage)
184 : storage_(storage) {}
186 const_dict_iterator_proxy::const_iterator const_dict_iterator_proxy::begin()
188 return const_iterator(storage_->begin());
191 const_dict_iterator_proxy::const_iterator const_dict_iterator_proxy::end()
193 return const_iterator(storage_->end());
196 const_dict_iterator_proxy::const_reverse_iterator
197 const_dict_iterator_proxy::rbegin() const {
198 return const_reverse_iterator(end());
201 const_dict_iterator_proxy::const_reverse_iterator
202 const_dict_iterator_proxy::rend() const {
203 return const_reverse_iterator(begin());
206 const_dict_iterator_proxy::const_iterator const_dict_iterator_proxy::cbegin()
208 return const_iterator(begin());
211 const_dict_iterator_proxy::const_iterator const_dict_iterator_proxy::cend()
213 return const_iterator(end());
216 const_dict_iterator_proxy::const_reverse_iterator
217 const_dict_iterator_proxy::crbegin() const {
218 return const_reverse_iterator(rbegin());
221 const_dict_iterator_proxy::const_reverse_iterator
222 const_dict_iterator_proxy::crend() const {
223 return const_reverse_iterator(rend());
226 } // namespace detail