1 // Copyright 2017 The Chromium Authors
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"
7 #include "base/values.h"
13 // ----------------------------------------------------------------------------
16 dict_iterator::pointer::pointer(const reference& ref) : ref_(ref) {}
18 dict_iterator::pointer::pointer(const pointer& ptr) = default;
20 dict_iterator::dict_iterator(DictStorage::iterator dict_iter)
21 : dict_iter_(dict_iter) {}
23 dict_iterator::dict_iterator(const dict_iterator& dict_iter) = default;
25 dict_iterator& dict_iterator::operator=(const dict_iterator& dict_iter) =
28 dict_iterator::~dict_iterator() = default;
30 dict_iterator::reference dict_iterator::operator*() {
31 return {dict_iter_->first, *dict_iter_->second};
34 dict_iterator::pointer dict_iterator::operator->() {
35 return pointer(operator*());
38 dict_iterator& dict_iterator::operator++() {
43 dict_iterator dict_iterator::operator++(int) {
44 dict_iterator tmp(*this);
49 dict_iterator& dict_iterator::operator--() {
54 dict_iterator dict_iterator::operator--(int) {
55 dict_iterator tmp(*this);
60 bool operator==(const dict_iterator& lhs, const dict_iterator& rhs) {
61 return lhs.dict_iter_ == rhs.dict_iter_;
64 bool operator!=(const dict_iterator& lhs, const dict_iterator& rhs) {
68 // ----------------------------------------------------------------------------
69 // const_dict_iterator.
71 const_dict_iterator::pointer::pointer(const reference& ref) : ref_(ref) {}
73 const_dict_iterator::pointer::pointer(const pointer& ptr) = default;
75 const_dict_iterator::const_dict_iterator(DictStorage::const_iterator dict_iter)
76 : dict_iter_(dict_iter) {}
78 const_dict_iterator::const_dict_iterator(const const_dict_iterator& dict_iter) =
81 const_dict_iterator& const_dict_iterator::operator=(
82 const const_dict_iterator& dict_iter) = default;
84 const_dict_iterator::~const_dict_iterator() = default;
86 const_dict_iterator::reference const_dict_iterator::operator*() const {
87 return {dict_iter_->first, *dict_iter_->second};
90 const_dict_iterator::pointer const_dict_iterator::operator->() const {
91 return pointer(operator*());
94 const_dict_iterator& const_dict_iterator::operator++() {
99 const_dict_iterator const_dict_iterator::operator++(int) {
100 const_dict_iterator tmp(*this);
105 const_dict_iterator& const_dict_iterator::operator--() {
110 const_dict_iterator const_dict_iterator::operator--(int) {
111 const_dict_iterator tmp(*this);
116 bool operator==(const const_dict_iterator& lhs,
117 const const_dict_iterator& rhs) {
118 return lhs.dict_iter_ == rhs.dict_iter_;
121 bool operator!=(const const_dict_iterator& lhs,
122 const const_dict_iterator& rhs) {
123 return !(lhs == rhs);
126 // ----------------------------------------------------------------------------
127 // dict_iterator_proxy.
129 dict_iterator_proxy::dict_iterator_proxy(DictStorage* storage)
130 : storage_(storage) {}
132 dict_iterator_proxy::size_type dict_iterator_proxy::size() const {
133 return storage_->size();
136 dict_iterator_proxy::iterator dict_iterator_proxy::begin() {
137 return iterator(storage_->begin());
140 dict_iterator_proxy::const_iterator dict_iterator_proxy::begin() const {
141 return const_iterator(storage_->begin());
144 dict_iterator_proxy::iterator dict_iterator_proxy::end() {
145 return iterator(storage_->end());
148 dict_iterator_proxy::const_iterator dict_iterator_proxy::end() const {
149 return const_iterator(storage_->end());
152 dict_iterator_proxy::reverse_iterator dict_iterator_proxy::rbegin() {
153 return reverse_iterator(end());
156 dict_iterator_proxy::const_reverse_iterator dict_iterator_proxy::rbegin()
158 return const_reverse_iterator(end());
161 dict_iterator_proxy::reverse_iterator dict_iterator_proxy::rend() {
162 return reverse_iterator(begin());
165 dict_iterator_proxy::const_reverse_iterator dict_iterator_proxy::rend() const {
166 return const_reverse_iterator(begin());
169 dict_iterator_proxy::const_iterator dict_iterator_proxy::cbegin() const {
170 return const_iterator(begin());
173 dict_iterator_proxy::const_iterator dict_iterator_proxy::cend() const {
174 return const_iterator(end());
177 dict_iterator_proxy::const_reverse_iterator dict_iterator_proxy::crbegin()
179 return const_reverse_iterator(rbegin());
182 dict_iterator_proxy::const_reverse_iterator dict_iterator_proxy::crend() const {
183 return const_reverse_iterator(rend());
186 // ----------------------------------------------------------------------------
187 // const_dict_iterator_proxy.
189 const_dict_iterator_proxy::const_dict_iterator_proxy(const DictStorage* storage)
190 : storage_(storage) {}
192 const_dict_iterator_proxy::const_iterator const_dict_iterator_proxy::begin()
194 return const_iterator(storage_->begin());
197 const_dict_iterator_proxy::size_type const_dict_iterator_proxy::size() const {
198 return storage_->size();
201 const_dict_iterator_proxy::const_iterator const_dict_iterator_proxy::end()
203 return const_iterator(storage_->end());
206 const_dict_iterator_proxy::const_reverse_iterator
207 const_dict_iterator_proxy::rbegin() const {
208 return const_reverse_iterator(end());
211 const_dict_iterator_proxy::const_reverse_iterator
212 const_dict_iterator_proxy::rend() const {
213 return const_reverse_iterator(begin());
216 const_dict_iterator_proxy::const_iterator const_dict_iterator_proxy::cbegin()
218 return const_iterator(begin());
221 const_dict_iterator_proxy::const_iterator const_dict_iterator_proxy::cend()
223 return const_iterator(end());
226 const_dict_iterator_proxy::const_reverse_iterator
227 const_dict_iterator_proxy::crbegin() const {
228 return const_reverse_iterator(rbegin());
231 const_dict_iterator_proxy::const_reverse_iterator
232 const_dict_iterator_proxy::crend() const {
233 return const_reverse_iterator(rend());
236 } // namespace detail