callback.h 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. // Copyright 2017 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #ifndef TOOLS_CLANG_BASE_BIND_REWRITERS_TESTS_CALLBACK_H_
  5. #define TOOLS_CLANG_BASE_BIND_REWRITERS_TESTS_CALLBACK_H_
  6. #include <type_traits>
  7. #include <utility>
  8. namespace base {
  9. namespace internal {
  10. template <typename T>
  11. class PassedWrapper {
  12. public:
  13. explicit PassedWrapper(T&& scoper) {}
  14. PassedWrapper(PassedWrapper&& other) {}
  15. };
  16. } // namespace internal
  17. template <typename T,
  18. std::enable_if_t<!std::is_lvalue_reference<T>::value>* = nullptr>
  19. internal::PassedWrapper<T> Passed(T&& scoper) {
  20. return internal::PassedWrapper<T>(std::move(scoper));
  21. }
  22. template <typename T>
  23. internal::PassedWrapper<T> Passed(T* scoper) {
  24. return internal::PassedWrapper<T>(std::move(*scoper));
  25. }
  26. template <typename Signature>
  27. class OnceCallback;
  28. template <typename Signature>
  29. class RepeatingCallback;
  30. template <typename Signature>
  31. using Callback = RepeatingCallback<Signature>;
  32. using OnceClosure = OnceCallback<void()>;
  33. using RepeatingClosure = RepeatingCallback<void()>;
  34. using Closure = Callback<void()>;
  35. template <typename R, typename... Args>
  36. class OnceCallback<R(Args...)> {
  37. public:
  38. OnceCallback() {}
  39. OnceCallback(OnceCallback&&) = default;
  40. OnceCallback& operator=(OnceCallback&&) = default;
  41. OnceCallback(const OnceCallback&) = delete;
  42. OnceCallback& operator=(const OnceCallback&) = delete;
  43. OnceCallback(RepeatingCallback<R(Args...)> other) {}
  44. OnceCallback& operator=(RepeatingCallback<R(Args...)> other) { return *this; }
  45. R Run(Args... args) const & {
  46. static_assert(!sizeof(*this), "");
  47. return R();
  48. }
  49. R Run(Args... args) && { return R(); }
  50. };
  51. template <typename R, typename... Args>
  52. class RepeatingCallback<R(Args...)> {
  53. public:
  54. RepeatingCallback() {}
  55. RepeatingCallback(const RepeatingCallback&) = default;
  56. RepeatingCallback& operator=(const RepeatingCallback&) = default;
  57. RepeatingCallback(RepeatingCallback&&) = default;
  58. RepeatingCallback& operator=(RepeatingCallback&&) = default;
  59. R Run(Args... args) const & { return R(); }
  60. R Run(Args... args) && { return R(); }
  61. };
  62. template <typename Functor, typename... Args>
  63. Callback<void()> Bind(Functor, Args&&...) {
  64. return Callback<void()>();
  65. }
  66. template <typename Functor, typename... Args>
  67. OnceCallback<void()> BindOnce(Functor, Args&&...) {
  68. return OnceCallback<void()>();
  69. }
  70. template <typename Functor, typename... Args>
  71. RepeatingCallback<void()> BindRepeating(Functor, Args&&...) {
  72. return RepeatingCallback<void()>();
  73. }
  74. RepeatingCallback<void()> AdaptCallbackForRepeating(
  75. OnceCallback<void()> callback) {
  76. return Callback<void()>();
  77. }
  78. } // namespace base
  79. #endif // TOOLS_CLANG_BASE_BIND_REWRITERS_TESTS_CALLBACK_H_