blob: be2b1934f7684cb201932cef1ecdc9222e5c58f3 [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.
#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_