// Copyright 2019 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 "ui/aura/window_tracker.h"

#include "ui/aura/window.h"

namespace aura {

WindowTracker::WindowTracker(const WindowList& windows) {
  for (Window* window : windows)
    Add(window);
}

WindowTracker::WindowTracker() = default;

WindowTracker::~WindowTracker() {
  RemoveAll();
}

void WindowTracker::Add(Window* window) {
  if (base::Contains(windows_, window))
    return;

  window->AddObserver(this);
  windows_.push_back(window);
}

void WindowTracker::RemoveAll() {
  for (Window* window : windows_)
    window->RemoveObserver(this);
  windows_.clear();
}

void WindowTracker::Remove(Window* window) {
  auto iter = std::find(windows_.begin(), windows_.end(), window);
  if (iter != windows_.end()) {
    window->RemoveObserver(this);
    windows_.erase(iter);
  }
}

Window* WindowTracker::Pop() {
  DCHECK(!windows_.empty());
  Window* result = windows_[0];
  Remove(result);
  return result;
}

bool WindowTracker::Contains(Window* window) const {
  return base::Contains(windows_, window);
}

void WindowTracker::OnWindowDestroying(Window* window) {
  DCHECK(Contains(window));
  Remove(window);
}

}  // namespace aura
