// Copyright 2017 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/resource_coordinator/lifecycle_unit_source_base.h"

#include "chrome/browser/resource_coordinator/lifecycle_unit_base.h"
#include "chrome/browser/resource_coordinator/lifecycle_unit_source_observer.h"

namespace resource_coordinator {

LifecycleUnitSourceBase::LifecycleUnitSourceBase() = default;
LifecycleUnitSourceBase::~LifecycleUnitSourceBase() = default;

void LifecycleUnitSourceBase::AddObserver(
    LifecycleUnitSourceObserver* observer) {
  observers_.AddObserver(observer);
}

void LifecycleUnitSourceBase::RemoveObserver(
    LifecycleUnitSourceObserver* observer) {
  observers_.RemoveObserver(observer);
}

void LifecycleUnitSourceBase::NotifyLifecycleUnitBeingCreated(
    LifecycleUnitBase* lifecycle_unit) {
  ++lifecycle_unit_count_;
  if (lifecycle_unit_count_ == 1)
    OnFirstLifecycleUnitCreated();
}

void LifecycleUnitSourceBase::NotifyLifecycleUnitCreated(
    LifecycleUnitBase* lifecycle_unit) {
  for (LifecycleUnitSourceObserver& observer : observers_) {
    observer.OnLifecycleUnitCreated(lifecycle_unit);
  }
}

void LifecycleUnitSourceBase::NotifyLifecycleUnitBeingDestroyed(
    LifecycleUnitBase* lifecycle_unit) {
  DCHECK_LT(0u, lifecycle_unit_count_);
  --lifecycle_unit_count_;
  if (lifecycle_unit_count_ == 0)
    OnAllLifecycleUnitsDestroyed();
}

void LifecycleUnitSourceBase::OnFirstLifecycleUnitCreated() {}

void LifecycleUnitSourceBase::OnAllLifecycleUnitsDestroyed() {}

}  // namespace resource_coordinator
