| // 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. |
| |
| #ifndef SRC_LIB_CALLBACK_SCOPED_CALLBACK_H_ |
| #define SRC_LIB_CALLBACK_SCOPED_CALLBACK_H_ |
| |
| #include <utility> |
| |
| namespace callback { |
| namespace internal { |
| |
| template <typename W, typename T> |
| class ScopedLambda { |
| public: |
| explicit ScopedLambda(W witness, T function) |
| : witness_(std::move(witness)), function_(std::move(function)) {} |
| |
| template <typename... ArgType> |
| void operator()(ArgType&&... args) { |
| if (witness_) { |
| function_(std::forward<ArgType>(args)...); |
| } |
| } |
| |
| template <typename... ArgType> |
| void operator()(ArgType&&... args) const { |
| if (witness_) { |
| function_(std::forward<ArgType>(args)...); |
| } |
| } |
| |
| private: |
| W witness_; |
| T function_; |
| }; |
| |
| } // namespace internal |
| |
| // Scopes the given |lambda| to the given |witness|. |
| // |
| // This returns a new callable with the same signature as the original one. |
| // Calling the new callable will be forwarded to |lambda| if and only if |
| // |witness| is true at the time where the callable is called. |
| template <typename W, typename T> |
| internal::ScopedLambda<W, T> MakeScoped(W witness, T lambda) { |
| return internal::ScopedLambda<W, T>(std::move(witness), std::move(lambda)); |
| } |
| |
| } // namespace callback |
| |
| #endif // SRC_LIB_CALLBACK_SCOPED_CALLBACK_H_ |