| // 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_helper.h" |
| |
| #include <lib/fit/function.h> |
| |
| namespace callback { |
| namespace { |
| class DoneCancellable : public Cancellable { |
| public: |
| void Cancel() override {} |
| bool IsDone() override { return true; } |
| void SetOnDone(fit::closure /*callback*/) override {} |
| }; |
| } // namespace |
| |
| CancellableImpl::CancellableImpl(fit::closure on_cancel) |
| : is_cancelled_(false), on_cancel_(std::move(on_cancel)), is_done_(false) {} |
| |
| void CancellableImpl::Cancel() { |
| is_cancelled_ = true; |
| if (is_done_) |
| return; |
| is_done_ = true; |
| on_cancel_(); |
| } |
| |
| bool CancellableImpl::IsDone() { return is_done_; } |
| |
| void CancellableImpl::SetOnDone(fit::closure callback) { |
| FXL_DCHECK(!on_done_); |
| on_done_ = std::move(callback); |
| } |
| |
| fxl::RefPtr<callback::Cancellable> CreateDoneCancellable() { |
| return fxl::AdoptRef(new DoneCancellable()); |
| } |
| |
| } // namespace callback |