OLD | NEW |
| (Empty) |
1 // Copyright 2015 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 #ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_ITERATOR_UTIL_H_ | |
6 #define MOJO_PUBLIC_CPP_BINDINGS_LIB_ITERATOR_UTIL_H_ | |
7 | |
8 #include <algorithm> | |
9 | |
10 #include "mojo/public/cpp/bindings/array.h" | |
11 #include "mojo/public/cpp/bindings/map.h" | |
12 #include "mojo/public/cpp/environment/logging.h" | |
13 | |
14 namespace mojo { | |
15 namespace internal { | |
16 | |
17 // |MapKeyIterator| and |MapValueIterator| are templated interfaces for | |
18 // iterating over a Map<>'s keys and its values, respectively. They provide a | |
19 // begin() and end() for generating an STL-iterator. The generated Iterator | |
20 // follows the BidirectionalIterator concept | |
21 // (http://en.cppreference.com/w/cpp/concept/BidirectionalIterator). | |
22 // | |
23 // Example usage: | |
24 // | |
25 // Map<int,int> my_map; | |
26 // my_map[1] = 2; | |
27 // my_map[3] = 4; | |
28 // my_map[5] = 6; | |
29 // for (int key : MapKeyIterator<int,int>(&my_map)) { | |
30 // std::cout << key << std::endl; | |
31 // } | |
32 // for (int val : MapValueIterator<int,int>(&my_map)) { | |
33 // std::cout << val << std::endl; | |
34 // } | |
35 | |
36 // Interface for iterating over a Map<K, V>'s keys. | |
37 // To construct a |MapKeyIterator|, pass in a non-null pointer to a Map<K, V>; | |
38 template <typename K, typename V> | |
39 class MapKeyIterator { | |
40 public: | |
41 class Iterator { | |
42 public: | |
43 Iterator() : it_() {} | |
44 explicit Iterator(typename Map<K, V>::MapIterator it) : it_(it) {} | |
45 Iterator& operator++() { | |
46 ++it_; | |
47 return *this; | |
48 } | |
49 Iterator operator++(int) { | |
50 Iterator original = *this; | |
51 ++it_; | |
52 return original; | |
53 } | |
54 Iterator& operator--() { | |
55 --it_; | |
56 return *this; | |
57 } | |
58 Iterator operator--(int) { | |
59 Iterator original = *this; | |
60 --it_; | |
61 return original; | |
62 } | |
63 bool operator==(const Iterator& o) const { return o.it_ == it_; } | |
64 bool operator!=(const Iterator& o) const { return o.it_ != it_; } | |
65 const K& operator*() { return it_.GetKey(); } | |
66 const K* operator->() { return &it_.GetKey(); } | |
67 | |
68 private: | |
69 typename Map<K, V>::MapIterator it_; | |
70 }; | |
71 | |
72 explicit MapKeyIterator(Map<K, V>* map) : map_(map) { MOJO_DCHECK(map); } | |
73 | |
74 size_t size() const { return map_->size(); } | |
75 Iterator begin() const { return Iterator{map_->begin()}; } | |
76 Iterator end() const { return Iterator{map_->end()}; } | |
77 | |
78 private: | |
79 Map<K, V>* const map_; | |
80 }; | |
81 | |
82 // Interface for iterating over a Map<K, V>'s values. | |
83 template <typename K, typename V> | |
84 class MapValueIterator { | |
85 public: | |
86 class Iterator { | |
87 public: | |
88 Iterator() : it_(typename Map<K, V>::MapIterator()) {} | |
89 explicit Iterator(typename Map<K, V>::MapIterator it) : it_(it) {} | |
90 Iterator& operator++() { | |
91 ++it_; | |
92 return *this; | |
93 } | |
94 Iterator operator++(int) { | |
95 Iterator original = *this; | |
96 ++it_; | |
97 return original; | |
98 } | |
99 Iterator& operator--() { | |
100 --it_; | |
101 return *this; | |
102 } | |
103 Iterator operator--(int) { | |
104 Iterator original = *this; | |
105 --it_; | |
106 return original; | |
107 } | |
108 bool operator==(const Iterator& o) const { return o.it_ == it_; } | |
109 bool operator!=(const Iterator& o) const { return o.it_ != it_; } | |
110 V& operator*() { return it_.GetValue(); } | |
111 V* operator->() { return &it_.GetValue(); } | |
112 | |
113 private: | |
114 typename Map<K, V>::MapIterator it_; | |
115 }; | |
116 | |
117 explicit MapValueIterator(Map<K, V>* map) : map_(map) { MOJO_DCHECK(map); } | |
118 size_t size() const { return map_->size(); } | |
119 Iterator begin() const { return Iterator{map_->begin()}; } | |
120 Iterator end() const { return Iterator{map_->end()}; } | |
121 | |
122 private: | |
123 Map<K, V>* const map_; | |
124 }; | |
125 | |
126 } // namespace internal | |
127 } // namespace mojo | |
128 | |
129 #endif // MOJO_PUBLIC_CPP_BINDINGS_LIB_ITERATOR_UTIL_H_ | |
OLD | NEW |