| // 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_ |