Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(64)

Side by Side Diff: base/observer_list.h

Issue 1001833005: Update from https://crrev.com/320343 (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Supress Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « base/numerics/safe_math_impl.h ('k') | base/observer_list_threadsafe.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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__
OLDNEW
« no previous file with comments | « base/numerics/safe_math_impl.h ('k') | base/observer_list_threadsafe.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698