blob: a31661d4027842a5d8d6857ece6bab81821a4e1c [file] [log] [blame]
// Copyright 2017 The Fuchsia 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 "lib/callback/managed_container.h"
#include <algorithm>
#include <lib/fit/function.h>
#include "lib/callback/scoped_callback.h"
namespace callback {
ManagedContainer::ManagedContainer() : weak_ptr_factory_(this) {}
ManagedContainer::~ManagedContainer() {}
fit::closure ManagedContainer::ManageElement(std::unique_ptr<Element> element) {
Element* ptr = element.get();
managed_elements_.push_back(std::move(element));
// We use a scoped callback to ManagedContainer to allow the manager to
// be deleted.
return MakeScoped(weak_ptr_factory_.GetWeakPtr(), [this, ptr]() {
auto it = std::find_if(
managed_elements_.begin(), managed_elements_.end(),
[ptr](const std::unique_ptr<Element>& c) { return c.get() == ptr; });
FXL_DCHECK(it != managed_elements_.end());
managed_elements_.erase(it);
CheckEmpty();
});
}
void ManagedContainer::CheckEmpty() {
if (managed_elements_.empty() && on_empty_) {
on_empty_();
}
}
} // namespace callback