Switch uses of std::function to QUICHE callback aliases as appropriate.

PiperOrigin-RevId: 537898189
diff --git a/quiche/binary_http/binary_http_message.cc b/quiche/binary_http/binary_http_message.cc
index 6d333ac..11ae79d 100644
--- a/quiche/binary_http/binary_http_message.cc
+++ b/quiche/binary_http/binary_http_message.cc
@@ -15,6 +15,7 @@
 #include "absl/strings/str_cat.h"
 #include "absl/strings/str_join.h"
 #include "absl/strings/string_view.h"
+#include "quiche/common/quiche_callbacks.h"
 #include "quiche/common/quiche_data_reader.h"
 #include "quiche/common/quiche_data_writer.h"
 
@@ -56,10 +57,10 @@
   return control_data;
 }
 
-absl::Status DecodeFields(
-    quiche::QuicheDataReader& reader,
-    const std::function<void(absl::string_view name, absl::string_view value)>&
-        callback) {
+absl::Status DecodeFields(quiche::QuicheDataReader& reader,
+                          quiche::UnretainedCallback<void(
+                              absl::string_view name, absl::string_view value)>
+                              callback) {
   absl::string_view fields;
   if (!reader.ReadStringPieceVarInt62(&fields)) {
     return absl::InvalidArgumentError("Failed to read fields.");
diff --git a/quiche/quic/core/io/event_loop_connecting_client_socket_test.cc b/quiche/quic/core/io/event_loop_connecting_client_socket_test.cc
index 37cb607..b0d4406 100644
--- a/quiche/quic/core/io/event_loop_connecting_client_socket_test.cc
+++ b/quiche/quic/core/io/event_loop_connecting_client_socket_test.cc
@@ -32,6 +32,7 @@
 #include "quiche/common/platform/api/quiche_test.h"
 #include "quiche/common/platform/api/quiche_test_loopback.h"
 #include "quiche/common/platform/api/quiche_thread.h"
+#include "quiche/common/quiche_callbacks.h"
 #include "quiche/common/simple_buffer_allocator.h"
 
 namespace quic::test {
@@ -43,7 +44,7 @@
 
 class TestServerSocketRunner : public quiche::QuicheThread {
  public:
-  using SocketBehavior = std::function<void(
+  using SocketBehavior = quiche::MultiUseCallback<void(
       SocketFd connected_socket, socket_api::SocketProtocol protocol)>;
 
   TestServerSocketRunner(SocketFd server_socket_descriptor,
@@ -80,7 +81,7 @@
   // closes the accepted connection socket.
   TestTcpServerSocketRunner(SocketFd server_socket_descriptor,
                             SocketBehavior behavior)
-      : TestServerSocketRunner(server_socket_descriptor, behavior) {
+      : TestServerSocketRunner(server_socket_descriptor, std::move(behavior)) {
     Start();
   }
 
@@ -119,7 +120,7 @@
   TestUdpServerSocketRunner(SocketFd server_socket_descriptor,
                             SocketBehavior behavior,
                             QuicSocketAddress client_socket_address)
-      : TestServerSocketRunner(server_socket_descriptor, behavior),
+      : TestServerSocketRunner(server_socket_descriptor, std::move(behavior)),
         client_socket_address_(std::move(client_socket_address)) {
     Start();
   }
diff --git a/quiche/quic/qbone/bonnet/tun_device_controller.cc b/quiche/quic/qbone/bonnet/tun_device_controller.cc
index b6e3d76..fe9e2a0 100644
--- a/quiche/quic/qbone/bonnet/tun_device_controller.cc
+++ b/quiche/quic/qbone/bonnet/tun_device_controller.cc
@@ -9,6 +9,7 @@
 #include "absl/time/clock.h"
 #include "quiche/quic/platform/api/quic_logging.h"
 #include "quiche/quic/qbone/qbone_constants.h"
+#include "quiche/common/quiche_callbacks.h"
 
 ABSL_FLAG(bool, qbone_tun_device_replace_default_routing_rules, true,
           "If true, will define a rule that points packets sourced from the "
@@ -169,8 +170,8 @@
 }
 
 void TunDeviceController::RegisterAddressUpdateCallback(
-    const std::function<void(QuicIpAddress)>& cb) {
-  address_update_cbs_.push_back(cb);
+    quiche::MultiUseCallback<void(QuicIpAddress)> cb) {
+  address_update_cbs_.push_back(std::move(cb));
 }
 
 }  // namespace quic
diff --git a/quiche/quic/qbone/bonnet/tun_device_controller.h b/quiche/quic/qbone/bonnet/tun_device_controller.h
index 3043583..350a056 100644
--- a/quiche/quic/qbone/bonnet/tun_device_controller.h
+++ b/quiche/quic/qbone/bonnet/tun_device_controller.h
@@ -5,10 +5,12 @@
 #ifndef QUICHE_QUIC_QBONE_BONNET_TUN_DEVICE_CONTROLLER_H_
 #define QUICHE_QUIC_QBONE_BONNET_TUN_DEVICE_CONTROLLER_H_
 
+#include "quiche/quic/platform/api/quic_ip_address.h"
 #include "quiche/quic/qbone/bonnet/tun_device.h"
 #include "quiche/quic/qbone/platform/netlink_interface.h"
 #include "quiche/quic/qbone/qbone_control.pb.h"
 #include "quiche/quic/qbone/qbone_control_stream.h"
+#include "quiche/common/quiche_callbacks.h"
 
 namespace quic {
 
@@ -50,7 +52,7 @@
       int retries);
 
   virtual void RegisterAddressUpdateCallback(
-      const std::function<void(QuicIpAddress)>& cb);
+      quiche::MultiUseCallback<void(QuicIpAddress)> cb);
 
   virtual QuicIpAddress current_address();
 
@@ -65,7 +67,8 @@
 
   QuicIpAddress current_address_;
 
-  std::vector<std::function<void(QuicIpAddress)>> address_update_cbs_;
+  std::vector<quiche::MultiUseCallback<void(QuicIpAddress)>>
+      address_update_cbs_;
 };
 
 }  // namespace quic
diff --git a/quiche/quic/qbone/qbone_session_test.cc b/quiche/quic/qbone/qbone_session_test.cc
index ab92c1c..46a41d9 100644
--- a/quiche/quic/qbone/qbone_session_test.cc
+++ b/quiche/quic/qbone/qbone_session_test.cc
@@ -26,6 +26,7 @@
 #include "quiche/quic/test_tools/quic_connection_peer.h"
 #include "quiche/quic/test_tools/quic_session_peer.h"
 #include "quiche/quic/test_tools/quic_test_utils.h"
+#include "quiche/common/quiche_callbacks.h"
 
 namespace quic {
 namespace test {
@@ -238,7 +239,7 @@
 
     void Run() {
       if (!cancelled_) {
-        task_();
+        std::move(task_)();
       }
     }
 
@@ -246,7 +247,7 @@
 
    private:
     bool cancelled_ = false;
-    std::function<void()> task_;
+    quiche::SingleUseCallback<void()> task_;
     QuicTime time_;
   };
 
@@ -260,8 +261,9 @@
 
  private:
   using TaskType = std::shared_ptr<InnerTask>;
-  std::priority_queue<TaskType, std::vector<TaskType>,
-                      std::function<bool(const TaskType&, const TaskType&)>>
+  std::priority_queue<
+      TaskType, std::vector<TaskType>,
+      quiche::UnretainedCallback<bool(const TaskType&, const TaskType&)>>
       tasks_;
   MockQuicConnectionHelper* helper_;
 };
diff --git a/quiche/quic/test_tools/qpack/qpack_test_utils.h b/quiche/quic/test_tools/qpack/qpack_test_utils.h
index c6f1c65..4c19d3a 100644
--- a/quiche/quic/test_tools/qpack/qpack_test_utils.h
+++ b/quiche/quic/test_tools/qpack/qpack_test_utils.h
@@ -11,13 +11,14 @@
 #include "absl/strings/string_view.h"
 #include "quiche/quic/core/qpack/qpack_stream_sender_delegate.h"
 #include "quiche/quic/platform/api/quic_test.h"
+#include "quiche/common/quiche_callbacks.h"
 
 namespace quic {
 namespace test {
 
 // Called repeatedly to determine the size of each fragment when encoding or
 // decoding.  Must return a positive value.
-using FragmentSizeGenerator = std::function<size_t()>;
+using FragmentSizeGenerator = quiche::MultiUseCallback<size_t()>;
 
 enum class FragmentMode {
   kSingleChunk,
diff --git a/quiche/quic/test_tools/server_thread.cc b/quiche/quic/test_tools/server_thread.cc
index c0d32ea..5667410 100644
--- a/quiche/quic/test_tools/server_thread.cc
+++ b/quiche/quic/test_tools/server_thread.cc
@@ -9,6 +9,7 @@
 #include "quiche/quic/test_tools/crypto_test_utils.h"
 #include "quiche/quic/test_tools/quic_dispatcher_peer.h"
 #include "quiche/quic/test_tools/quic_server_peer.h"
+#include "quiche/common/quiche_callbacks.h"
 
 namespace quic {
 namespace test {
@@ -62,7 +63,7 @@
   return rc;
 }
 
-void ServerThread::Schedule(std::function<void()> action) {
+void ServerThread::Schedule(quiche::SingleUseCallback<void()> action) {
   QUICHE_DCHECK(!quit_.HasBeenNotified());
   QuicWriterMutexLock lock(&scheduled_actions_lock_);
   scheduled_actions_.push_back(std::move(action));
@@ -72,8 +73,9 @@
   confirmed_.WaitForNotification();
 }
 
-bool ServerThread::WaitUntil(std::function<bool()> termination_predicate,
-                             QuicTime::Delta timeout) {
+bool ServerThread::WaitUntil(
+    quiche::UnretainedCallback<bool()> termination_predicate,
+    QuicTime::Delta timeout) {
   const QuicTime deadline = clock_->Now() + timeout;
   while (clock_->Now() < deadline) {
     QuicNotification done_checking;
@@ -128,13 +130,13 @@
 }
 
 void ServerThread::ExecuteScheduledActions() {
-  quiche::QuicheCircularDeque<std::function<void()>> actions;
+  quiche::QuicheCircularDeque<quiche::SingleUseCallback<void()>> actions;
   {
     QuicWriterMutexLock lock(&scheduled_actions_lock_);
     actions.swap(scheduled_actions_);
   }
   while (!actions.empty()) {
-    actions.front()();
+    std::move(actions.front())();
     actions.pop_front();
   }
 }
diff --git a/quiche/quic/test_tools/server_thread.h b/quiche/quic/test_tools/server_thread.h
index c29d633..baaa693 100644
--- a/quiche/quic/test_tools/server_thread.h
+++ b/quiche/quic/test_tools/server_thread.h
@@ -12,6 +12,7 @@
 #include "quiche/quic/platform/api/quic_socket_address.h"
 #include "quiche/quic/platform/api/quic_thread.h"
 #include "quiche/quic/tools/quic_server.h"
+#include "quiche/common/quiche_callbacks.h"
 
 namespace quic {
 namespace test {
@@ -34,7 +35,7 @@
   void Run() override;
 
   // Schedules the given action for execution in the event loop.
-  void Schedule(std::function<void()> action);
+  void Schedule(quiche::SingleUseCallback<void()> action);
 
   // Waits for the handshake to be confirmed for the first session created.
   void WaitForCryptoHandshakeConfirmed();
@@ -43,7 +44,7 @@
   // reached |timeout|. Must be called from an external thread.
   // Return whether the function returned after |termination_predicate| become
   // true.
-  bool WaitUntil(std::function<bool()> termination_predicate,
+  bool WaitUntil(quiche::UnretainedCallback<bool()> termination_predicate,
                  QuicTime::Delta timeout);
 
   // Pauses execution of the server until Resume() is called.  May only be
@@ -86,8 +87,8 @@
   bool initialized_;
 
   QuicMutex scheduled_actions_lock_;
-  quiche::QuicheCircularDeque<std::function<void()>> scheduled_actions_
-      QUIC_GUARDED_BY(scheduled_actions_lock_);
+  quiche::QuicheCircularDeque<quiche::SingleUseCallback<void()>>
+      scheduled_actions_ QUIC_GUARDED_BY(scheduled_actions_lock_);
 };
 
 }  // namespace test
diff --git a/quiche/quic/tools/quic_simple_client_session.cc b/quiche/quic/tools/quic_simple_client_session.cc
index c2c266f..ab44f5f 100644
--- a/quiche/quic/tools/quic_simple_client_session.cc
+++ b/quiche/quic/tools/quic_simple_client_session.cc
@@ -7,6 +7,7 @@
 #include <utility>
 
 #include "quiche/quic/core/quic_path_validator.h"
+#include "quiche/spdy/core/http2_header_block.h"
 
 namespace quic {
 
@@ -39,7 +40,9 @@
   auto stream = std::make_unique<QuicSimpleClientStream>(
       GetNextOutgoingBidirectionalStreamId(), this, BIDIRECTIONAL,
       drop_response_body_);
-  stream->set_on_interim_headers(on_interim_headers_);
+  stream->set_on_interim_headers([this](const spdy::Http2HeaderBlock& headers) {
+    on_interim_headers_(headers);
+  });
   return stream;
 }
 
diff --git a/quiche/quic/tools/quic_simple_client_session.h b/quiche/quic/tools/quic_simple_client_session.h
index 1017341..9d1b4c7 100644
--- a/quiche/quic/tools/quic_simple_client_session.h
+++ b/quiche/quic/tools/quic_simple_client_session.h
@@ -11,6 +11,7 @@
 #include "quiche/quic/core/http/quic_spdy_client_session.h"
 #include "quiche/quic/tools/quic_client_base.h"
 #include "quiche/quic/tools/quic_simple_client_stream.h"
+#include "quiche/common/quiche_callbacks.h"
 #include "quiche/spdy/core/http2_header_block.h"
 
 namespace quic {
@@ -46,12 +47,14 @@
   bool drop_response_body() const { return drop_response_body_; }
 
   void set_on_interim_headers(
-      std::function<void(const spdy::Http2HeaderBlock&)> on_interim_headers) {
+      quiche::MultiUseCallback<void(const spdy::Http2HeaderBlock&)>
+          on_interim_headers) {
     on_interim_headers_ = std::move(on_interim_headers);
   }
 
  private:
-  std::function<void(const spdy::Http2HeaderBlock&)> on_interim_headers_;
+  quiche::MultiUseCallback<void(const spdy::Http2HeaderBlock&)>
+      on_interim_headers_;
   QuicClientBase::NetworkHelper* network_helper_;
   const bool drop_response_body_;
   const bool enable_web_transport_;
diff --git a/quiche/quic/tools/quic_simple_client_stream.h b/quiche/quic/tools/quic_simple_client_stream.h
index fd7ede4..db7588b 100644
--- a/quiche/quic/tools/quic_simple_client_stream.h
+++ b/quiche/quic/tools/quic_simple_client_stream.h
@@ -9,6 +9,7 @@
 #include <utility>
 
 #include "quiche/quic/core/http/quic_spdy_client_stream.h"
+#include "quiche/common/quiche_callbacks.h"
 
 namespace quic {
 
@@ -21,7 +22,8 @@
   void OnBodyAvailable() override;
 
   void set_on_interim_headers(
-      std::function<void(const spdy::Http2HeaderBlock&)> on_interim_headers) {
+      quiche::MultiUseCallback<void(const spdy::Http2HeaderBlock&)>
+          on_interim_headers) {
     on_interim_headers_ = std::move(on_interim_headers);
   }
 
@@ -29,7 +31,8 @@
   bool ParseAndValidateStatusCode() override;
 
  private:
-  std::function<void(const spdy::Http2HeaderBlock&)> on_interim_headers_;
+  quiche::MultiUseCallback<void(const spdy::Http2HeaderBlock&)>
+      on_interim_headers_;
   const bool drop_response_body_;
 };
 
diff --git a/quiche/quic/tools/web_transport_test_visitors.h b/quiche/quic/tools/web_transport_test_visitors.h
index 5fc3fbd..be7932f 100644
--- a/quiche/quic/tools/web_transport_test_visitors.h
+++ b/quiche/quic/tools/web_transport_test_visitors.h
@@ -12,6 +12,7 @@
 #include "quiche/quic/platform/api/quic_logging.h"
 #include "quiche/common/platform/api/quiche_logging.h"
 #include "quiche/common/platform/api/quiche_mem_slice.h"
+#include "quiche/common/quiche_callbacks.h"
 #include "quiche/common/quiche_circular_deque.h"
 #include "quiche/common/quiche_stream.h"
 #include "quiche/common/simple_buffer_allocator.h"
@@ -111,7 +112,7 @@
 class WebTransportUnidirectionalEchoReadVisitor
     : public WebTransportStreamVisitor {
  public:
-  using Callback = std::function<void(const std::string&)>;
+  using Callback = quiche::MultiUseCallback<void(const std::string&)>;
 
   WebTransportUnidirectionalEchoReadVisitor(WebTransportStream* stream,
                                             Callback callback)