| 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 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 72 | 72 |
| 73 // Specifies that observers added while sending out notification are not | 73 // Specifies that observers added while sending out notification are not |
| 74 // notified. | 74 // notified. |
| 75 NOTIFY_EXISTING_ONLY | 75 NOTIFY_EXISTING_ONLY |
| 76 }; | 76 }; |
| 77 | 77 |
| 78 // An iterator class that can be used to access the list of observers. See | 78 // An iterator class that can be used to access the list of observers. See |
| 79 // also the FOR_EACH_OBSERVER macro defined below. | 79 // also the FOR_EACH_OBSERVER macro defined below. |
| 80 class Iterator { | 80 class Iterator { |
| 81 public: | 81 public: |
| 82 Iterator(ObserverListBase<ObserverType>& list); | 82 explicit Iterator(ObserverListBase<ObserverType>* list); |
| 83 ~Iterator(); | 83 ~Iterator(); |
| 84 ObserverType* GetNext(); | 84 ObserverType* GetNext(); |
| 85 | 85 |
| 86 private: | 86 private: |
| 87 base::WeakPtr<ObserverListBase<ObserverType> > list_; | 87 base::WeakPtr<ObserverListBase<ObserverType> > list_; |
| 88 size_t index_; | 88 size_t index_; |
| 89 size_t max_index_; | 89 size_t max_index_; |
| 90 }; | 90 }; |
| 91 | 91 |
| 92 ObserverListBase() : notify_depth_(0), type_(NOTIFY_ALL) {} | 92 ObserverListBase() : notify_depth_(0), type_(NOTIFY_ALL) {} |
| (...skipping 26 matching lines...) Expand all Loading... |
| 119 int notify_depth_; | 119 int notify_depth_; |
| 120 NotificationType type_; | 120 NotificationType type_; |
| 121 | 121 |
| 122 friend class ObserverListBase::Iterator; | 122 friend class ObserverListBase::Iterator; |
| 123 | 123 |
| 124 DISALLOW_COPY_AND_ASSIGN(ObserverListBase); | 124 DISALLOW_COPY_AND_ASSIGN(ObserverListBase); |
| 125 }; | 125 }; |
| 126 | 126 |
| 127 template <class ObserverType> | 127 template <class ObserverType> |
| 128 ObserverListBase<ObserverType>::Iterator::Iterator( | 128 ObserverListBase<ObserverType>::Iterator::Iterator( |
| 129 ObserverListBase<ObserverType>& list) | 129 ObserverListBase<ObserverType>* list) |
| 130 : list_(list.AsWeakPtr()), | 130 : list_(list->AsWeakPtr()), |
| 131 index_(0), | 131 index_(0), |
| 132 max_index_(list.type_ == NOTIFY_ALL ? | 132 max_index_(list->type_ == NOTIFY_ALL ? std::numeric_limits<size_t>::max() |
| 133 std::numeric_limits<size_t>::max() : | 133 : list->observers_.size()) { |
| 134 list.observers_.size()) { | |
| 135 ++list_->notify_depth_; | 134 ++list_->notify_depth_; |
| 136 } | 135 } |
| 137 | 136 |
| 138 template <class ObserverType> | 137 template <class ObserverType> |
| 139 ObserverListBase<ObserverType>::Iterator::~Iterator() { | 138 ObserverListBase<ObserverType>::Iterator::~Iterator() { |
| 140 if (list_.get() && --list_->notify_depth_ == 0) | 139 if (list_.get() && --list_->notify_depth_ == 0) |
| 141 list_->Compact(); | 140 list_->Compact(); |
| 142 } | 141 } |
| 143 | 142 |
| 144 template <class ObserverType> | 143 template <class ObserverType> |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 221 ObserverListBase<ObserverType>::Compact(); | 220 ObserverListBase<ObserverType>::Compact(); |
| 222 DCHECK_EQ(ObserverListBase<ObserverType>::size(), 0U); | 221 DCHECK_EQ(ObserverListBase<ObserverType>::size(), 0U); |
| 223 } | 222 } |
| 224 } | 223 } |
| 225 | 224 |
| 226 bool might_have_observers() const { | 225 bool might_have_observers() const { |
| 227 return ObserverListBase<ObserverType>::size() != 0; | 226 return ObserverListBase<ObserverType>::size() != 0; |
| 228 } | 227 } |
| 229 }; | 228 }; |
| 230 | 229 |
| 231 #define FOR_EACH_OBSERVER(ObserverType, observer_list, func) \ | 230 #define FOR_EACH_OBSERVER(ObserverType, observer_list, func) \ |
| 232 do { \ | 231 do { \ |
| 233 if ((observer_list).might_have_observers()) { \ | 232 if ((observer_list).might_have_observers()) { \ |
| 234 ObserverListBase<ObserverType>::Iterator \ | 233 ObserverListBase<ObserverType>::Iterator it_inside_observer_macro( \ |
| 235 it_inside_observer_macro(observer_list); \ | 234 &observer_list); \ |
| 236 ObserverType* obs; \ | 235 ObserverType* obs; \ |
| 237 while ((obs = it_inside_observer_macro.GetNext()) != NULL) \ | 236 while ((obs = it_inside_observer_macro.GetNext()) != NULL) \ |
| 238 obs->func; \ | 237 obs->func; \ |
| 239 } \ | 238 } \ |
| 240 } while (0) | 239 } while (0) |
| 241 | 240 |
| 242 #endif // BASE_OBSERVER_LIST_H__ | 241 #endif // BASE_OBSERVER_LIST_H__ |
| OLD | NEW |