// Copyright 2017 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 TOOLS_CLANG_BASE_BIND_REWRITERS_TESTS_CALLBACK_H_
#define TOOLS_CLANG_BASE_BIND_REWRITERS_TESTS_CALLBACK_H_
#include <type_traits>
#include <utility>
namespace base {
namespace internal {
template <typename T>
class PassedWrapper {
public:
explicit PassedWrapper(T&& scoper) {}
PassedWrapper(PassedWrapper&& other) {}
};
} // namespace internal
template <typename T,
std::enable_if_t<!std::is_lvalue_reference<T>::value>* = nullptr>
internal::PassedWrapper<T> Passed(T&& scoper) {
return internal::PassedWrapper<T>(std::move(scoper));
}
template <typename T>
internal::PassedWrapper<T> Passed(T* scoper) {
return internal::PassedWrapper<T>(std::move(*scoper));
}
template <typename Signature>
class OnceCallback;
template <typename Signature>
class RepeatingCallback;
template <typename Signature>
using Callback = RepeatingCallback<Signature>;
using OnceClosure = OnceCallback<void()>;
using RepeatingClosure = RepeatingCallback<void()>;
using Closure = Callback<void()>;
template <typename R, typename... Args>
class OnceCallback<R(Args...)> {
public:
OnceCallback() {}
OnceCallback(OnceCallback&&) = default;
OnceCallback& operator=(OnceCallback&&) = default;
OnceCallback(const OnceCallback&) = delete;
OnceCallback& operator=(const OnceCallback&) = delete;
OnceCallback(RepeatingCallback<R(Args...)> other) {}
OnceCallback& operator=(RepeatingCallback<R(Args...)> other) { return *this; }
R Run(Args... args) const & {
static_assert(!sizeof(*this), "");
return R();
}
R Run(Args... args) && { return R(); }
};
template <typename R, typename... Args>
class RepeatingCallback<R(Args...)> {
public:
RepeatingCallback() {}
RepeatingCallback(const RepeatingCallback&) = default;
RepeatingCallback& operator=(const RepeatingCallback&) = default;
RepeatingCallback(RepeatingCallback&&) = default;
RepeatingCallback& operator=(RepeatingCallback&&) = default;
R Run(Args... args) const & { return R(); }
R Run(Args... args) && { return R(); }
};
template <typename Functor, typename... Args>
Callback<void()> Bind(Functor, Args&&...) {
return Callback<void()>();
}
template <typename Functor, typename... Args>
OnceCallback<void()> BindOnce(Functor, Args&&...) {
return OnceCallback<void()>();
}
template <typename Functor, typename... Args>
RepeatingCallback<void()> BindRepeating(Functor, Args&&...) {
return RepeatingCallback<void()>();
}
RepeatingCallback<void()> AdaptCallbackForRepeating(
OnceCallback<void()> callback) {
return Callback<void()>();
}
} // namespace base
#endif // TOOLS_CLANG_BASE_BIND_REWRITERS_TESTS_CALLBACK_H_