Home | History | Annotate | Download | only in ui
      1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef CHROME_BROWSER_UI_BROWSER_ITERATOR_H_
      6 #define CHROME_BROWSER_UI_BROWSER_ITERATOR_H_
      7 
      8 #include "chrome/browser/ui/browser_list.h"
      9 #include "chrome/browser/ui/host_desktop.h"
     10 
     11 class Browser;
     12 
     13 namespace chrome {
     14 
     15 // Iterates over all existing browsers (potentially across multiple desktops).
     16 // Note: to iterate only over the browsers of a specific desktop, use the
     17 // const_iterator of a given BrowserList instead.
     18 //
     19 // Example:
     20 //   for (BrowserIterator iterator; !iterator.done(); iterator.Next()) {
     21 //     Browser* cur = *iterator;
     22 //     -or-
     23 //     iterator->OperationOnBrowser();
     24 //     ...
     25 //   }
     26 class BrowserIterator {
     27  public:
     28   BrowserIterator();
     29   ~BrowserIterator();
     30 
     31   // Returns true if this iterator is past the last Browser.
     32   bool done() const {
     33     // |current_iterator_| is never at the end of a list unless it is done (it
     34     // immediately moves to the next browser list upon hitting the end of the
     35     // current list unless there are no remaining empty browser lists).
     36     return current_iterator_ == current_browser_list_->end();
     37   }
     38 
     39   // Returns the current Browser, valid as long as !done().
     40   Browser* operator->() const {
     41     return *current_iterator_;
     42   }
     43   Browser* operator*() const {
     44     return *current_iterator_;
     45   }
     46 
     47   // Advances |current_iterator_| to the next browser.
     48   void Next();
     49 
     50  private:
     51   // If |current_iterator_| is at |current_browser_list_->end()|, advance to the
     52   // next non-empty browser list. After a call to this method: either
     53   // |current_iterator_| is valid or done().
     54   void NextBrowserListIfAtEnd();
     55 
     56   // The BrowserList currently being iterated over. Instances of this class do
     57   // not own this pointer.
     58   BrowserList* current_browser_list_;
     59 
     60   // The underlying iterator over browsers in |current_browser_list_|.
     61   BrowserList::const_iterator current_iterator_;
     62 
     63   // The next HostDesktopType to iterate over when |current_iterator_| reaches
     64   // |current_browser_list_->end()|.
     65   HostDesktopType next_desktop_type_;
     66 
     67   DISALLOW_COPY_AND_ASSIGN(BrowserIterator);
     68 };
     69 
     70 }  // namespace chrome
     71 
     72 #endif  // CHROME_BROWSER_UI_BROWSER_ITERATOR_H_
     73