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. 4 5#include "base/value_iterators.h" 6 7#include "base/values.h" 8 9namespace base { 10 11namespace detail { 12 13// ---------------------------------------------------------------------------- 14// dict_iterator. 15 16dict_iterator::pointer::pointer(const reference& ref) : ref_(ref) {} 17 18dict_iterator::pointer::pointer(const pointer& ptr) = default; 19 20dict_iterator::dict_iterator(DictStorage::iterator dict_iter) 21 : dict_iter_(dict_iter) {} 22 23dict_iterator::dict_iterator(const dict_iterator& dict_iter) = default; 24 25dict_iterator& dict_iterator::operator=(const dict_iterator& dict_iter) = 26 default; 27 28dict_iterator::~dict_iterator() = default; 29 30dict_iterator::reference dict_iterator::operator*() { 31 return {dict_iter_->first, *dict_iter_->second}; 32} 33 34dict_iterator::pointer dict_iterator::operator->() { 35 return pointer(operator*()); 36} 37 38dict_iterator& dict_iterator::operator++() { 39 ++dict_iter_; 40 return *this; 41} 42 43dict_iterator dict_iterator::operator++(int) { 44 dict_iterator tmp(*this); 45 ++dict_iter_; 46 return tmp; 47} 48 49dict_iterator& dict_iterator::operator--() { 50 --dict_iter_; 51 return *this; 52} 53 54dict_iterator dict_iterator::operator--(int) { 55 dict_iterator tmp(*this); 56 --dict_iter_; 57 return tmp; 58} 59 60bool operator==(const dict_iterator& lhs, const dict_iterator& rhs) { 61 return lhs.dict_iter_ == rhs.dict_iter_; 62} 63 64bool operator!=(const dict_iterator& lhs, const dict_iterator& rhs) { 65 return !(lhs == rhs); 66} 67 68// ---------------------------------------------------------------------------- 69// const_dict_iterator. 70 71const_dict_iterator::pointer::pointer(const reference& ref) : ref_(ref) {} 72 73const_dict_iterator::pointer::pointer(const pointer& ptr) = default; 74 75const_dict_iterator::const_dict_iterator(DictStorage::const_iterator dict_iter) 76 : dict_iter_(dict_iter) {} 77 78const_dict_iterator::const_dict_iterator(const const_dict_iterator& dict_iter) = 79 default; 80 81const_dict_iterator& const_dict_iterator::operator=( 82 const const_dict_iterator& dict_iter) = default; 83 84const_dict_iterator::~const_dict_iterator() = default; 85 86const_dict_iterator::reference const_dict_iterator::operator*() const { 87 return {dict_iter_->first, *dict_iter_->second}; 88} 89 90const_dict_iterator::pointer const_dict_iterator::operator->() const { 91 return pointer(operator*()); 92} 93 94const_dict_iterator& const_dict_iterator::operator++() { 95 ++dict_iter_; 96 return *this; 97} 98 99const_dict_iterator const_dict_iterator::operator++(int) { 100 const_dict_iterator tmp(*this); 101 ++dict_iter_; 102 return tmp; 103} 104 105const_dict_iterator& const_dict_iterator::operator--() { 106 --dict_iter_; 107 return *this; 108} 109 110const_dict_iterator const_dict_iterator::operator--(int) { 111 const_dict_iterator tmp(*this); 112 --dict_iter_; 113 return tmp; 114} 115 116bool operator==(const const_dict_iterator& lhs, 117 const const_dict_iterator& rhs) { 118 return lhs.dict_iter_ == rhs.dict_iter_; 119} 120 121bool operator!=(const const_dict_iterator& lhs, 122 const const_dict_iterator& rhs) { 123 return !(lhs == rhs); 124} 125 126// ---------------------------------------------------------------------------- 127// dict_iterator_proxy. 128 129dict_iterator_proxy::dict_iterator_proxy(DictStorage* storage) 130 : storage_(storage) {} 131 132dict_iterator_proxy::iterator dict_iterator_proxy::begin() { 133 return iterator(storage_->begin()); 134} 135 136dict_iterator_proxy::const_iterator dict_iterator_proxy::begin() const { 137 return const_iterator(storage_->begin()); 138} 139 140dict_iterator_proxy::iterator dict_iterator_proxy::end() { 141 return iterator(storage_->end()); 142} 143 144dict_iterator_proxy::const_iterator dict_iterator_proxy::end() const { 145 return const_iterator(storage_->end()); 146} 147 148dict_iterator_proxy::reverse_iterator dict_iterator_proxy::rbegin() { 149 return reverse_iterator(end()); 150} 151 152dict_iterator_proxy::const_reverse_iterator dict_iterator_proxy::rbegin() 153 const { 154 return const_reverse_iterator(end()); 155} 156 157dict_iterator_proxy::reverse_iterator dict_iterator_proxy::rend() { 158 return reverse_iterator(begin()); 159} 160 161dict_iterator_proxy::const_reverse_iterator dict_iterator_proxy::rend() const { 162 return const_reverse_iterator(begin()); 163} 164 165dict_iterator_proxy::const_iterator dict_iterator_proxy::cbegin() const { 166 return const_iterator(begin()); 167} 168 169dict_iterator_proxy::const_iterator dict_iterator_proxy::cend() const { 170 return const_iterator(end()); 171} 172 173dict_iterator_proxy::const_reverse_iterator dict_iterator_proxy::crbegin() 174 const { 175 return const_reverse_iterator(rbegin()); 176} 177 178dict_iterator_proxy::const_reverse_iterator dict_iterator_proxy::crend() const { 179 return const_reverse_iterator(rend()); 180} 181 182// ---------------------------------------------------------------------------- 183// const_dict_iterator_proxy. 184 185const_dict_iterator_proxy::const_dict_iterator_proxy(const DictStorage* storage) 186 : storage_(storage) {} 187 188const_dict_iterator_proxy::const_iterator const_dict_iterator_proxy::begin() 189 const { 190 return const_iterator(storage_->begin()); 191} 192 193const_dict_iterator_proxy::const_iterator const_dict_iterator_proxy::end() 194 const { 195 return const_iterator(storage_->end()); 196} 197 198const_dict_iterator_proxy::const_reverse_iterator 199const_dict_iterator_proxy::rbegin() const { 200 return const_reverse_iterator(end()); 201} 202 203const_dict_iterator_proxy::const_reverse_iterator 204const_dict_iterator_proxy::rend() const { 205 return const_reverse_iterator(begin()); 206} 207 208const_dict_iterator_proxy::const_iterator const_dict_iterator_proxy::cbegin() 209 const { 210 return const_iterator(begin()); 211} 212 213const_dict_iterator_proxy::const_iterator const_dict_iterator_proxy::cend() 214 const { 215 return const_iterator(end()); 216} 217 218const_dict_iterator_proxy::const_reverse_iterator 219const_dict_iterator_proxy::crbegin() const { 220 return const_reverse_iterator(rbegin()); 221} 222 223const_dict_iterator_proxy::const_reverse_iterator 224const_dict_iterator_proxy::crend() const { 225 return const_reverse_iterator(rend()); 226} 227 228} // namespace detail 229 230} // namespace base 231