blob: 5551b3090ca86c81ae0c34c736df26f0b60358e2 [file] [log] [blame]
// Copyright 2018 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/cancellable.h"
#include <utility>
#include <lib/fit/function.h>
namespace callback {
Cancellable::Cancellable() {}
Cancellable::~Cancellable() {}
AutoCancel::AutoCancel(fxl::RefPtr<Cancellable> cancellable)
: cancellable_(std::move(cancellable)) {
if (cancellable_) {
cancellable_->SetOnDone([this] { OnDone(); });
}
}
AutoCancel::~AutoCancel() {
if (cancellable_)
cancellable_->Cancel();
}
void AutoCancel::Reset(fxl::RefPtr<Cancellable> cancellable) {
if (cancellable == cancellable_)
return;
if (cancellable_)
cancellable_->Cancel();
cancellable_ = cancellable;
if (cancellable_)
cancellable_->SetOnDone([this] { OnDone(); });
}
void AutoCancel::set_on_empty(fit::closure callback) {
FXL_DCHECK(!on_empty_);
on_empty_ = std::move(callback);
if (cancellable_->IsDone()) {
OnDone();
}
}
void AutoCancel::OnDone() {
if (on_empty_) {
on_empty_();
}
}
} // namespace callback