In rtc::Thread implement posting AnyInvocable

Lots of code call rtc::Thread directly instead of through TaskQueueBase
interface, thus to continue migration step by step rtc::Thread needs
to implement both old and new TaskQueueBase interfaces.

Bug: webrtc:14245
Change-Id: Ie7cac897a4c8a6227b8d467a39adb30aec6f1318
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/267984
Reviewed-by: Tomas Gunnarsson <tommi@webrtc.org>
Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#37474}
diff --git a/rtc_base/thread.h b/rtc_base/thread.h
index 3364684..e87248c 100644
--- a/rtc_base/thread.h
+++ b/rtc_base/thread.h
@@ -28,10 +28,12 @@
 #include <pthread.h>
 #endif
 #include "absl/base/attributes.h"
+#include "absl/functional/any_invocable.h"
 #include "api/function_view.h"
 #include "api/task_queue/queued_task.h"
 #include "api/task_queue/task_queue_base.h"
 #include "api/task_queue/to_queued_task.h"
+#include "api/units/time_delta.h"
 #include "rtc_base/checks.h"
 #include "rtc_base/deprecated/recursive_critical_section.h"
 #include "rtc_base/location.h"
@@ -79,32 +81,6 @@
 
 class Thread;
 
-namespace rtc_thread_internal {
-
-class MessageLikeTask : public MessageData {
- public:
-  virtual void Run() = 0;
-};
-
-template <class FunctorT>
-class MessageWithFunctor final : public MessageLikeTask {
- public:
-  explicit MessageWithFunctor(FunctorT&& functor)
-      : functor_(std::forward<FunctorT>(functor)) {}
-
-  MessageWithFunctor(const MessageWithFunctor&) = delete;
-  MessageWithFunctor& operator=(const MessageWithFunctor&) = delete;
-
-  void Run() override { functor_(); }
-
- private:
-  ~MessageWithFunctor() override {}
-
-  typename std::remove_reference<FunctorT>::type functor_;
-};
-
-}  // namespace rtc_thread_internal
-
 class RTC_EXPORT ThreadManager {
  public:
   static const int kForever = -1;
@@ -418,36 +394,29 @@
   bool IsInvokeToThreadAllowed(rtc::Thread* target);
 
   // From TaskQueueBase
+  void Delete() override;
+  void PostTask(absl::AnyInvocable<void() &&> task) override;
+  void PostDelayedTask(absl::AnyInvocable<void() &&> task,
+                       webrtc::TimeDelta delay) override;
+  void PostDelayedHighPrecisionTask(absl::AnyInvocable<void() &&> task,
+                                    webrtc::TimeDelta delay) override;
+
+  // Legacy TaskQueueBase methods, do not use in new code.
+  // TODO(bugs.webrtc.org/14245): Delete when all code that use rtc::Thread
+  // directly is updated to use PostTask methods above.
   void PostTask(std::unique_ptr<webrtc::QueuedTask> task) override;
   void PostDelayedTask(std::unique_ptr<webrtc::QueuedTask> task,
                        uint32_t milliseconds) override;
   void PostDelayedHighPrecisionTask(std::unique_ptr<webrtc::QueuedTask> task,
                                     uint32_t milliseconds) override;
-  void Delete() override;
 
-  // Helper methods to avoid having to do ToQueuedTask() at the calling places.
-  template <class Closure,
-            typename std::enable_if<!std::is_convertible<
-                Closure,
-                std::unique_ptr<webrtc::QueuedTask>>::value>::type* = nullptr>
-  void PostTask(Closure&& closure) {
-    PostTask(webrtc::ToQueuedTask(std::forward<Closure>(closure)));
-  }
-  template <class Closure,
-            typename std::enable_if<!std::is_convertible<
-                Closure,
-                std::unique_ptr<webrtc::QueuedTask>>::value>::type* = nullptr>
-  void PostDelayedTask(Closure&& closure, uint32_t milliseconds) {
-    PostDelayedTask(webrtc::ToQueuedTask(std::forward<Closure>(closure)),
-                    milliseconds);
-  }
-  template <class Closure,
-            typename std::enable_if<!std::is_convertible<
-                Closure,
-                std::unique_ptr<webrtc::QueuedTask>>::value>::type* = nullptr>
-  void PostDelayedHighPrecisionTask(Closure&& closure, uint32_t milliseconds) {
-    PostDelayedHighPrecisionTask(
-        webrtc::ToQueuedTask(std::forward<Closure>(closure)), milliseconds);
+  // Legacy helper method, do not use in new code.
+  // TODO(bugs.webrtc.org/14245): Delete when all code that use rtc::Thread
+  // directly is updated to use PostTask methods above.
+  ABSL_DEPRECATED("Pass delay as webrtc::TimeDelta type")
+  void PostDelayedTask(absl::AnyInvocable<void() &&> task,
+                       uint32_t milliseconds) {
+    PostDelayedTask(std::move(task), webrtc::TimeDelta::Millis(milliseconds));
   }
 
   // ProcessMessages will process I/O and dispatch messages until:
@@ -609,10 +578,6 @@
   // Called by the ThreadManager when being unset as the current thread.
   void ClearCurrentTaskQueue();
 
-  // Returns a static-lifetime MessageHandler which runs message with
-  // MessageLikeTask payload data.
-  static MessageHandler* GetPostTaskMessageHandler();
-
   bool fPeekKeep_;
   Message msgPeek_;
   MessageList messages_ RTC_GUARDED_BY(crit_);