| // 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. |
| |
| #ifndef FUCHSIA_BASE_RESULT_RECEIVER_H_ |
| #define FUCHSIA_BASE_RESULT_RECEIVER_H_ |
| |
| #include "base/bind.h" |
| #include "base/bind_helpers.h" |
| #include "base/optional.h" |
| |
| namespace cr_fuchsia { |
| |
| // Helper for capturing a "result" of an asynchronous operation that is passed |
| // via a Callback<ResultType>, for later retrieval. An optional Closure may also |
| // be configured, to be called when the result is captured. |
| // |
| // This is primarily useful for tests, which use a ResultReceiver<> configured |
| // with a RunLoop::QuitClosure() to pump a message-loop until an asynchronous |
| // operation has completed. |
| template <typename T> |
| class ResultReceiver { |
| public: |
| ResultReceiver() : on_result_received_() {} |
| explicit ResultReceiver(base::RepeatingClosure on_result_received) |
| : on_result_received_(std::move(on_result_received)) {} |
| |
| ~ResultReceiver() = default; |
| |
| // Returns a OnceCallback which will receive and store a result value. |
| base::OnceCallback<void(T)> GetReceiveCallback() { |
| return base::BindOnce(&ResultReceiver<T>::ReceiveResult, |
| base::Unretained(this)); |
| } |
| |
| void ReceiveResult(T result) { |
| DCHECK(!result_.has_value()); |
| result_ = std::move(result); |
| if (on_result_received_) |
| on_result_received_.Run(); |
| } |
| |
| bool has_value() const { return result_.has_value(); } |
| |
| T& operator*() { |
| DCHECK(result_.has_value()); |
| return *result_; |
| } |
| |
| T* operator->() { |
| DCHECK(result_.has_value()); |
| return &*result_; |
| } |
| |
| private: |
| base::Optional<T> result_; |
| const base::RepeatingClosure on_result_received_; |
| |
| DISALLOW_COPY_AND_ASSIGN(ResultReceiver<T>); |
| }; |
| |
| } // namespace cr_fuchsia |
| |
| #endif // FUCHSIA_BASE_RESULT_RECEIVER_H_ |