| // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #ifndef BASE_SCOPED_OBSERVER_H_ | 
 | #define BASE_SCOPED_OBSERVER_H_ | 
 |  | 
 | #include <stddef.h> | 
 |  | 
 | #include <algorithm> | 
 | #include <vector> | 
 |  | 
 | #include "base/logging.h" | 
 | #include "base/macros.h" | 
 |  | 
 | // ScopedObserver is used to keep track of the set of sources an object has | 
 | // attached itself to as an observer. When ScopedObserver is destroyed it | 
 | // removes the object as an observer from all sources it has been added to. | 
 | template <class Source, class Observer> | 
 | class ScopedObserver { | 
 |  public: | 
 |   explicit ScopedObserver(Observer* observer) : observer_(observer) {} | 
 |  | 
 |   ~ScopedObserver() { | 
 |     RemoveAll(); | 
 |   } | 
 |  | 
 |   // Adds the object passed to the constructor as an observer on |source|. | 
 |   void Add(Source* source) { | 
 |     sources_.push_back(source); | 
 |     source->AddObserver(observer_); | 
 |   } | 
 |  | 
 |   // Remove the object passed to the constructor as an observer from |source|. | 
 |   void Remove(Source* source) { | 
 |     auto it = std::find(sources_.begin(), sources_.end(), source); | 
 |     DCHECK(it != sources_.end()); | 
 |     sources_.erase(it); | 
 |     source->RemoveObserver(observer_); | 
 |   } | 
 |  | 
 |   void RemoveAll() { | 
 |     for (size_t i = 0; i < sources_.size(); ++i) | 
 |       sources_[i]->RemoveObserver(observer_); | 
 |     sources_.clear(); | 
 |   } | 
 |  | 
 |   bool IsObserving(Source* source) const { | 
 |     return ContainsValue(sources_, source); | 
 |   } | 
 |  | 
 |   bool IsObservingSources() const { return !sources_.empty(); } | 
 |  | 
 |  private: | 
 |   Observer* observer_; | 
 |  | 
 |   std::vector<Source*> sources_; | 
 |  | 
 |   DISALLOW_COPY_AND_ASSIGN(ScopedObserver); | 
 | }; | 
 |  | 
 | #endif  // BASE_SCOPED_OBSERVER_H_ |