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

Unified Diff: base/observer_list.h

Issue 8919: Adds the ability for ObserverList to not notify observers added during... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 12 years, 2 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | base/observer_list_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: base/observer_list.h
===================================================================
--- base/observer_list.h (revision 4210)
+++ base/observer_list.h (working copy)
@@ -5,8 +5,9 @@
#ifndef BASE_OBSERVER_LIST_H__
#define BASE_OBSERVER_LIST_H__
+#include <algorithm>
+#include <limits>
#include <vector>
-#include <algorithm>
#include "base/basictypes.h"
#include "base/logging.h"
@@ -52,12 +53,24 @@
// ObserverList<Observer> observer_list_;
// };
//
+//
///////////////////////////////////////////////////////////////////////////////
template <class ObserverType, bool check_empty = false>
class ObserverList {
public:
- ObserverList() : notify_depth_(0) {}
+ // Enumeration of which observers are notified.
+ enum NotificationType {
+ // Specifies that any observers added during notification are notified.
+ // This is the default type if non type is provided to the constructor.
+ NOTIFY_ALL,
+
+ // Specifies that observers added while sending out notification are not
+ // notified.
+ NOTIFY_EXISTING_ONLY
+ };
darin (slow to review) 2008/10/30 20:12:50 nit: add a newline below here.
+ ObserverList() : notify_depth_(0), type_(NOTIFY_ALL) {}
+ ObserverList(NotificationType type) : notify_depth_(0), type_(type) {}
~ObserverList() {
// When check_empty is true, assert that the list is empty on destruction.
if (check_empty) {
@@ -98,7 +111,12 @@
// also the FOREACH_OBSERVER macro defined below.
class Iterator {
public:
- Iterator(const ObserverList<ObserverType>& list) : list_(list), index_(0) {
+ Iterator(const ObserverList<ObserverType>& list)
+ : list_(list),
+ index_(0),
+ max_index_(list.type_ == NOTIFY_ALL ?
+ std::numeric_limits<size_t>::max() :
+ list.observers_.size()) {
++list_.notify_depth_;
}
@@ -110,14 +128,16 @@
ObserverType* GetNext() {
ListType& observers = list_.observers_;
// Advance if the current element is null
- while (index_ < observers.size() && !observers[index_])
+ size_t max_index = std::min(max_index_, observers.size());
+ while (index_ < max_index && !observers[index_])
++index_;
- return index_ < observers.size() ? observers[index_++] : NULL;
+ return index_ < max_index ? observers[index_++] : NULL;
}
private:
const ObserverList<ObserverType>& list_;
size_t index_;
+ size_t max_index_;
};
private:
@@ -137,6 +157,7 @@
// These are marked mutable to facilitate having NotifyAll be const.
mutable ListType observers_;
mutable int notify_depth_;
+ NotificationType type_;
friend class ObserverList::Iterator;
« no previous file with comments | « no previous file | base/observer_list_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698