value_iterators.cc 6.1 KB

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