// Copyright (c) 2013 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.

#include "chrome/browser/ui/browser_iterator.h"

namespace chrome {

BrowserIterator::BrowserIterator()
    : current_browser_list_(BrowserList::GetInstance(HOST_DESKTOP_TYPE_FIRST)),
      current_iterator_(current_browser_list_->begin()),
      next_desktop_type_(
          static_cast<HostDesktopType>(HOST_DESKTOP_TYPE_FIRST + 1)) {
  NextBrowserListIfAtEnd();
}

BrowserIterator::~BrowserIterator() {
}

void BrowserIterator::Next() {
  ++current_iterator_;
  NextBrowserListIfAtEnd();
}

void BrowserIterator::NextBrowserListIfAtEnd() {
  // Make sure either |current_iterator_| is valid or done().
  while (current_iterator_ == current_browser_list_->end() &&
         next_desktop_type_ < HOST_DESKTOP_TYPE_COUNT) {
    current_browser_list_ = BrowserList::GetInstance(next_desktop_type_);
    current_iterator_ = current_browser_list_->begin();
    next_desktop_type_ = static_cast<HostDesktopType>(next_desktop_type_ + 1);
  }
}

}  // namespace chrome
