| Index: base/observer_list.h
|
| diff --git a/base/observer_list.h b/base/observer_list.h
|
| index bd1dc64055b4df3af4eeb9441e35afd02e109e39..c77ec15b1db6b692da42e091556fffe618c4d5a5 100644
|
| --- a/base/observer_list.h
|
| +++ b/base/observer_list.h
|
| @@ -79,30 +79,9 @@ class ObserverListBase
|
| // also the FOR_EACH_OBSERVER macro defined below.
|
| class Iterator {
|
| public:
|
| - Iterator(ObserverListBase<ObserverType>& list)
|
| - : list_(list.AsWeakPtr()),
|
| - index_(0),
|
| - max_index_(list.type_ == NOTIFY_ALL ?
|
| - std::numeric_limits<size_t>::max() :
|
| - list.observers_.size()) {
|
| - ++list_->notify_depth_;
|
| - }
|
| -
|
| - ~Iterator() {
|
| - if (list_.get() && --list_->notify_depth_ == 0)
|
| - list_->Compact();
|
| - }
|
| -
|
| - ObserverType* GetNext() {
|
| - if (!list_.get())
|
| - return NULL;
|
| - ListType& observers = list_->observers_;
|
| - // Advance if the current element is null
|
| - size_t max_index = std::min(max_index_, observers.size());
|
| - while (index_ < max_index && !observers[index_])
|
| - ++index_;
|
| - return index_ < max_index ? observers[index_++] : NULL;
|
| - }
|
| + Iterator(ObserverListBase<ObserverType>& list);
|
| + ~Iterator();
|
| + ObserverType* GetNext();
|
|
|
| private:
|
| base::WeakPtr<ObserverListBase<ObserverType> > list_;
|
| @@ -116,55 +95,19 @@ class ObserverListBase
|
|
|
| // Add an observer to the list. An observer should not be added to
|
| // the same list more than once.
|
| - void AddObserver(ObserverType* obs) {
|
| - if (std::find(observers_.begin(), observers_.end(), obs)
|
| - != observers_.end()) {
|
| - NOTREACHED() << "Observers can only be added once!";
|
| - return;
|
| - }
|
| - observers_.push_back(obs);
|
| - }
|
| + void AddObserver(ObserverType* obs);
|
|
|
| // Remove an observer from the list if it is in the list.
|
| - void RemoveObserver(ObserverType* obs) {
|
| - typename ListType::iterator it =
|
| - std::find(observers_.begin(), observers_.end(), obs);
|
| - if (it != observers_.end()) {
|
| - if (notify_depth_) {
|
| - *it = 0;
|
| - } else {
|
| - observers_.erase(it);
|
| - }
|
| - }
|
| - }
|
| + void RemoveObserver(ObserverType* obs);
|
|
|
| - bool HasObserver(ObserverType* observer) const {
|
| - for (size_t i = 0; i < observers_.size(); ++i) {
|
| - if (observers_[i] == observer)
|
| - return true;
|
| - }
|
| - return false;
|
| - }
|
| + bool HasObserver(ObserverType* observer) const;
|
|
|
| - void Clear() {
|
| - if (notify_depth_) {
|
| - for (typename ListType::iterator it = observers_.begin();
|
| - it != observers_.end(); ++it) {
|
| - *it = 0;
|
| - }
|
| - } else {
|
| - observers_.clear();
|
| - }
|
| - }
|
| + void Clear();
|
|
|
| protected:
|
| size_t size() const { return observers_.size(); }
|
|
|
| - void Compact() {
|
| - observers_.erase(
|
| - std::remove(observers_.begin(), observers_.end(),
|
| - static_cast<ObserverType*>(NULL)), observers_.end());
|
| - }
|
| + void Compact();
|
|
|
| private:
|
| friend class ObserverListThreadSafe<ObserverType>;
|
| @@ -180,6 +123,86 @@ class ObserverListBase
|
| DISALLOW_COPY_AND_ASSIGN(ObserverListBase);
|
| };
|
|
|
| +template <class ObserverType>
|
| +ObserverListBase<ObserverType>::Iterator::Iterator(
|
| + ObserverListBase<ObserverType>& list)
|
| + : list_(list.AsWeakPtr()),
|
| + index_(0),
|
| + max_index_(list.type_ == NOTIFY_ALL ?
|
| + std::numeric_limits<size_t>::max() :
|
| + list.observers_.size()) {
|
| + ++list_->notify_depth_;
|
| +}
|
| +
|
| +template <class ObserverType>
|
| +ObserverListBase<ObserverType>::Iterator::~Iterator() {
|
| + if (list_.get() && --list_->notify_depth_ == 0)
|
| + list_->Compact();
|
| +}
|
| +
|
| +template <class ObserverType>
|
| +ObserverType* ObserverListBase<ObserverType>::Iterator::GetNext() {
|
| + if (!list_.get())
|
| + return NULL;
|
| + ListType& observers = list_->observers_;
|
| + // Advance if the current element is null
|
| + size_t max_index = std::min(max_index_, observers.size());
|
| + while (index_ < max_index && !observers[index_])
|
| + ++index_;
|
| + return index_ < max_index ? observers[index_++] : NULL;
|
| +}
|
| +
|
| +template <class ObserverType>
|
| +void ObserverListBase<ObserverType>::AddObserver(ObserverType* obs) {
|
| + if (std::find(observers_.begin(), observers_.end(), obs)
|
| + != observers_.end()) {
|
| + NOTREACHED() << "Observers can only be added once!";
|
| + return;
|
| + }
|
| + observers_.push_back(obs);
|
| +}
|
| +
|
| +template <class ObserverType>
|
| +void ObserverListBase<ObserverType>::RemoveObserver(ObserverType* obs) {
|
| + typename ListType::iterator it =
|
| + std::find(observers_.begin(), observers_.end(), obs);
|
| + if (it != observers_.end()) {
|
| + if (notify_depth_) {
|
| + *it = 0;
|
| + } else {
|
| + observers_.erase(it);
|
| + }
|
| + }
|
| +}
|
| +
|
| +template <class ObserverType>
|
| +bool ObserverListBase<ObserverType>::HasObserver(ObserverType* observer) const {
|
| + for (size_t i = 0; i < observers_.size(); ++i) {
|
| + if (observers_[i] == observer)
|
| + return true;
|
| + }
|
| + return false;
|
| +}
|
| +
|
| +template <class ObserverType>
|
| +void ObserverListBase<ObserverType>::Clear() {
|
| + if (notify_depth_) {
|
| + for (typename ListType::iterator it = observers_.begin();
|
| + it != observers_.end(); ++it) {
|
| + *it = 0;
|
| + }
|
| + } else {
|
| + observers_.clear();
|
| + }
|
| +}
|
| +
|
| +template <class ObserverType>
|
| +void ObserverListBase<ObserverType>::Compact() {
|
| + observers_.erase(
|
| + std::remove(observers_.begin(), observers_.end(),
|
| + static_cast<ObserverType*>(NULL)), observers_.end());
|
| +}
|
| +
|
| template <class ObserverType, bool check_empty = false>
|
| class ObserverList : public ObserverListBase<ObserverType> {
|
| public:
|
|
|