OLD | NEW |
---|---|
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef BASE_OBSERVER_LIST_H__ | 5 #ifndef BASE_OBSERVER_LIST_H__ |
6 #define BASE_OBSERVER_LIST_H__ | 6 #define BASE_OBSERVER_LIST_H__ |
7 | 7 |
8 #include <algorithm> | 8 #include <algorithm> |
9 #include <limits> | 9 #include <limits> |
10 #include <vector> | 10 #include <vector> |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
136 | 136 |
137 template <class ObserverType> | 137 template <class ObserverType> |
138 ObserverListBase<ObserverType>::Iterator::~Iterator() { | 138 ObserverListBase<ObserverType>::Iterator::~Iterator() { |
139 if (list_.get() && --list_->notify_depth_ == 0) | 139 if (list_.get() && --list_->notify_depth_ == 0) |
140 list_->Compact(); | 140 list_->Compact(); |
141 } | 141 } |
142 | 142 |
143 template <class ObserverType> | 143 template <class ObserverType> |
144 ObserverType* ObserverListBase<ObserverType>::Iterator::GetNext() { | 144 ObserverType* ObserverListBase<ObserverType>::Iterator::GetNext() { |
145 if (!list_.get()) | 145 if (!list_.get()) |
146 return NULL; | 146 return nullptr; |
147 ListType& observers = list_->observers_; | 147 ListType& observers = list_->observers_; |
148 // Advance if the current element is null | 148 // Advance if the current element is null |
149 size_t max_index = std::min(max_index_, observers.size()); | 149 size_t max_index = std::min(max_index_, observers.size()); |
150 while (index_ < max_index && !observers[index_]) | 150 while (index_ < max_index && !observers[index_]) |
151 ++index_; | 151 ++index_; |
152 return index_ < max_index ? observers[index_++] : NULL; | 152 return index_ < max_index ? observers[index_++] : nullptr; |
153 } | 153 } |
154 | 154 |
155 template <class ObserverType> | 155 template <class ObserverType> |
156 void ObserverListBase<ObserverType>::AddObserver(ObserverType* obs) { | 156 void ObserverListBase<ObserverType>::AddObserver(ObserverType* obs) { |
157 DCHECK(obs); | 157 DCHECK(obs); |
158 if (std::find(observers_.begin(), observers_.end(), obs) | 158 if (std::find(observers_.begin(), observers_.end(), obs) |
159 != observers_.end()) { | 159 != observers_.end()) { |
160 NOTREACHED() << "Observers can only be added once!"; | 160 NOTREACHED() << "Observers can only be added once!"; |
161 return; | 161 return; |
162 } | 162 } |
163 observers_.push_back(obs); | 163 observers_.push_back(obs); |
164 } | 164 } |
165 | 165 |
166 template <class ObserverType> | 166 template <class ObserverType> |
167 void ObserverListBase<ObserverType>::RemoveObserver(ObserverType* obs) { | 167 void ObserverListBase<ObserverType>::RemoveObserver(ObserverType* obs) { |
168 DCHECK(obs); | 168 DCHECK(obs); |
169 typename ListType::iterator it = | 169 typename ListType::iterator it = |
170 std::find(observers_.begin(), observers_.end(), obs); | 170 std::find(observers_.begin(), observers_.end(), obs); |
171 if (it != observers_.end()) { | 171 if (it != observers_.end()) { |
172 if (notify_depth_) { | 172 if (notify_depth_) { |
173 *it = 0; | 173 *it = nullptr; |
174 } else { | 174 } else { |
175 observers_.erase(it); | 175 observers_.erase(it); |
176 } | 176 } |
177 } | 177 } |
178 } | 178 } |
179 | 179 |
180 template <class ObserverType> | 180 template <class ObserverType> |
181 bool ObserverListBase<ObserverType>::HasObserver( | 181 bool ObserverListBase<ObserverType>::HasObserver( |
182 const ObserverType* observer) const { | 182 const ObserverType* observer) const { |
183 for (size_t i = 0; i < observers_.size(); ++i) { | 183 for (size_t i = 0; i < observers_.size(); ++i) { |
184 if (observers_[i] == observer) | 184 if (observers_[i] == observer) |
185 return true; | 185 return true; |
186 } | 186 } |
187 return false; | 187 return false; |
188 } | 188 } |
189 | 189 |
190 template <class ObserverType> | 190 template <class ObserverType> |
191 void ObserverListBase<ObserverType>::Clear() { | 191 void ObserverListBase<ObserverType>::Clear() { |
192 if (notify_depth_) { | 192 if (notify_depth_) { |
193 for (typename ListType::iterator it = observers_.begin(); | 193 for (typename ListType::iterator it = observers_.begin(); |
194 it != observers_.end(); ++it) { | 194 it != observers_.end(); ++it) { |
195 *it = 0; | 195 *it = nullptr; |
196 } | 196 } |
197 } else { | 197 } else { |
198 observers_.clear(); | 198 observers_.clear(); |
199 } | 199 } |
200 } | 200 } |
201 | 201 |
202 template <class ObserverType> | 202 template <class ObserverType> |
203 void ObserverListBase<ObserverType>::Compact() { | 203 void ObserverListBase<ObserverType>::Compact() { |
204 observers_.erase( | 204 observers_.erase( |
205 std::remove(observers_.begin(), observers_.end(), | 205 std::remove(observers_.begin(), observers_.end(), |
206 static_cast<ObserverType*>(NULL)), observers_.end()); | 206 static_cast<ObserverType*>(nullptr)), observers_.end()); |
Lei Zhang
2015/04/23 21:07:33
Can you check to see if you can get rid of the sta
robliao
2015/04/23 21:27:28
MSVC was cool with it, but MSVC tends to be more f
| |
207 } | 207 } |
208 | 208 |
209 template <class ObserverType, bool check_empty = false> | 209 template <class ObserverType, bool check_empty = false> |
210 class ObserverList : public ObserverListBase<ObserverType> { | 210 class ObserverList : public ObserverListBase<ObserverType> { |
211 public: | 211 public: |
212 typedef typename ObserverListBase<ObserverType>::NotificationType | 212 typedef typename ObserverListBase<ObserverType>::NotificationType |
213 NotificationType; | 213 NotificationType; |
214 | 214 |
215 ObserverList() {} | 215 ObserverList() {} |
216 explicit ObserverList(NotificationType type) | 216 explicit ObserverList(NotificationType type) |
(...skipping 11 matching lines...) Expand all Loading... | |
228 return ObserverListBase<ObserverType>::size() != 0; | 228 return ObserverListBase<ObserverType>::size() != 0; |
229 } | 229 } |
230 }; | 230 }; |
231 | 231 |
232 #define FOR_EACH_OBSERVER(ObserverType, observer_list, func) \ | 232 #define FOR_EACH_OBSERVER(ObserverType, observer_list, func) \ |
233 do { \ | 233 do { \ |
234 if ((observer_list).might_have_observers()) { \ | 234 if ((observer_list).might_have_observers()) { \ |
235 ObserverListBase<ObserverType>::Iterator it_inside_observer_macro( \ | 235 ObserverListBase<ObserverType>::Iterator it_inside_observer_macro( \ |
236 &observer_list); \ | 236 &observer_list); \ |
237 ObserverType* obs; \ | 237 ObserverType* obs; \ |
238 while ((obs = it_inside_observer_macro.GetNext()) != NULL) \ | 238 while ((obs = it_inside_observer_macro.GetNext()) != nullptr) \ |
239 obs->func; \ | 239 obs->func; \ |
240 } \ | 240 } \ |
241 } while (0) | 241 } while (0) |
242 | 242 |
243 #endif // BASE_OBSERVER_LIST_H__ | 243 #endif // BASE_OBSERVER_LIST_H__ |
OLD | NEW |