Replace uses of std::function inside QUICHE.

Those are mostly replaced with quiche_callbacks.h types.

PiperOrigin-RevId: 537905671
diff --git a/quiche/http2/adapter/callback_visitor.h b/quiche/http2/adapter/callback_visitor.h
index 5132104..497bf95 100644
--- a/quiche/http2/adapter/callback_visitor.h
+++ b/quiche/http2/adapter/callback_visitor.h
@@ -11,6 +11,7 @@
 #include "quiche/http2/adapter/nghttp2.h"
 #include "quiche/http2/adapter/nghttp2_util.h"
 #include "quiche/common/platform/api/quiche_export.h"
+#include "quiche/common/quiche_callbacks.h"
 
 namespace http2 {
 namespace adapter {
@@ -20,7 +21,8 @@
 class QUICHE_EXPORT CallbackVisitor : public Http2VisitorInterface {
  public:
   // Called when the visitor receives a close event for `stream_id`.
-  using StreamCloseListener = std::function<void(Http2StreamId stream_id)>;
+  using StreamCloseListener =
+      quiche::MultiUseCallback<void(Http2StreamId stream_id)>;
 
   explicit CallbackVisitor(Perspective perspective,
                            const nghttp2_session_callbacks& callbacks,
diff --git a/quiche/http2/adapter/event_forwarder.h b/quiche/http2/adapter/event_forwarder.h
index 74140f9..36446f6 100644
--- a/quiche/http2/adapter/event_forwarder.h
+++ b/quiche/http2/adapter/event_forwarder.h
@@ -4,6 +4,7 @@
 #include <functional>
 
 #include "quiche/common/platform/api/quiche_export.h"
+#include "quiche/common/quiche_callbacks.h"
 #include "quiche/spdy/core/http2_frame_decoder_adapter.h"
 
 namespace http2 {
@@ -16,7 +17,7 @@
 class QUICHE_EXPORT EventForwarder : public spdy::SpdyFramerVisitorInterface {
  public:
   // Whether the forwarder can forward events to the receiver.
-  using ForwardPredicate = std::function<bool()>;
+  using ForwardPredicate = quiche::MultiUseCallback<bool()>;
 
   EventForwarder(ForwardPredicate can_forward,
                  spdy::SpdyFramerVisitorInterface& receiver);
diff --git a/quiche/http2/adapter/oghttp2_session.cc b/quiche/http2/adapter/oghttp2_session.cc
index fe6127a..e7cccdd 100644
--- a/quiche/http2/adapter/oghttp2_session.cc
+++ b/quiche/http2/adapter/oghttp2_session.cc
@@ -5,6 +5,7 @@
 #include <utility>
 #include <vector>
 
+#include "absl/cleanup/cleanup.h"
 #include "absl/memory/memory.h"
 #include "absl/strings/escaping.h"
 #include "quiche/http2/adapter/header_validator.h"
@@ -13,6 +14,7 @@
 #include "quiche/http2/adapter/http2_visitor_interface.h"
 #include "quiche/http2/adapter/noop_header_validator.h"
 #include "quiche/http2/adapter/oghttp2_util.h"
+#include "quiche/common/quiche_callbacks.h"
 #include "quiche/spdy/core/spdy_protocol.h"
 
 namespace http2 {
@@ -127,29 +129,6 @@
   return "OGHTTP2_SERVER";
 }
 
-class RunOnExit {
- public:
-  RunOnExit() = default;
-  explicit RunOnExit(std::function<void()> f) : f_(std::move(f)) {}
-
-  RunOnExit(const RunOnExit& other) = delete;
-  RunOnExit& operator=(const RunOnExit& other) = delete;
-  RunOnExit(RunOnExit&& other) = delete;
-  RunOnExit& operator=(RunOnExit&& other) = delete;
-
-  ~RunOnExit() {
-    if (f_) {
-      f_();
-    }
-    f_ = {};
-  }
-
-  void emplace(std::function<void()> f) { f_ = std::move(f); }
-
- private:
-  std::function<void()> f_;
-};
-
 Http2ErrorCode GetHttp2ErrorCode(SpdyFramerError error) {
   switch (error) {
     case SpdyFramerError::SPDY_NO_ERROR:
@@ -473,7 +452,7 @@
     return 0;
   }
   processing_bytes_ = true;
-  RunOnExit r{[this]() { processing_bytes_ = false; }};
+  auto cleanup = absl::MakeCleanup([this]() { processing_bytes_ = false; });
 
   if (options_.blackhole_data_on_connection_error && latched_error_) {
     return static_cast<int64_t>(bytes.size());
@@ -592,7 +571,7 @@
     return 0;
   }
   sending_ = true;
-  RunOnExit r{[this]() { sending_ = false; }};
+  auto cleanup = absl::MakeCleanup([this]() { sending_ = false; });
 
   if (fatal_send_error_) {
     return kSendError;
@@ -1313,7 +1292,7 @@
   if (!settings_ack_callbacks_.empty()) {
     SettingsAckCallback callback = std::move(settings_ack_callbacks_.front());
     settings_ack_callbacks_.pop_front();
-    callback();
+    std::move(callback)();
   }
 
   visitor_.OnSettingsAck();
diff --git a/quiche/http2/adapter/oghttp2_session.h b/quiche/http2/adapter/oghttp2_session.h
index 9b31fa4..0954395 100644
--- a/quiche/http2/adapter/oghttp2_session.h
+++ b/quiche/http2/adapter/oghttp2_session.h
@@ -24,6 +24,7 @@
 #include "quiche/common/platform/api/quiche_bug_tracker.h"
 #include "quiche/common/platform/api/quiche_export.h"
 #include "quiche/common/platform/api/quiche_flags.h"
+#include "quiche/common/quiche_callbacks.h"
 #include "quiche/common/quiche_linked_hash_map.h"
 #include "quiche/spdy/core/http2_frame_decoder_adapter.h"
 #include "quiche/spdy/core/http2_header_block.h"
@@ -468,7 +469,7 @@
 
   // Stores the queue of callbacks to invoke upon receiving SETTINGS acks. At
   // most one callback is invoked for each SETTINGS ack.
-  using SettingsAckCallback = std::function<void()>;
+  using SettingsAckCallback = quiche::SingleUseCallback<void()>;
   std::list<SettingsAckCallback> settings_ack_callbacks_;
 
   // Delivers header name-value pairs to the visitor.
diff --git a/quiche/http2/adapter/window_manager.h b/quiche/http2/adapter/window_manager.h
index 7005974..ffe1a7f 100644
--- a/quiche/http2/adapter/window_manager.h
+++ b/quiche/http2/adapter/window_manager.h
@@ -7,6 +7,7 @@
 #include <functional>
 
 #include "quiche/common/platform/api/quiche_export.h"
+#include "quiche/common/quiche_callbacks.h"
 
 namespace http2 {
 namespace adapter {
@@ -20,12 +21,12 @@
 class QUICHE_EXPORT WindowManager {
  public:
   // A WindowUpdateListener is invoked when it is time to send a window update.
-  using WindowUpdateListener = std::function<void(int64_t)>;
+  using WindowUpdateListener = quiche::MultiUseCallback<void(int64_t)>;
 
   // Invoked to determine whether to call the listener based on the window
   // limit, window size, and delta that would be sent.
-  using ShouldWindowUpdateFn =
-      std::function<bool(int64_t limit, int64_t size, int64_t delta)>;
+  using ShouldWindowUpdateFn = bool (*)(int64_t limit, int64_t size,
+                                        int64_t delta);
 
   WindowManager(int64_t window_size_limit, WindowUpdateListener listener,
                 ShouldWindowUpdateFn should_window_update_fn = {},
diff --git a/quiche/http2/core/http2_trace_logging.cc b/quiche/http2/core/http2_trace_logging.cc
index ac0a827..7d6a883 100644
--- a/quiche/http2/core/http2_trace_logging.cc
+++ b/quiche/http2/core/http2_trace_logging.cc
@@ -7,6 +7,7 @@
 #include "absl/strings/string_view.h"
 #include "quiche/common/platform/api/quiche_bug_tracker.h"
 #include "quiche/common/platform/api/quiche_logging.h"
+#include "quiche/common/quiche_callbacks.h"
 #include "quiche/spdy/core/http2_header_block.h"
 #include "quiche/spdy/core/spdy_protocol.h"
 
@@ -114,7 +115,7 @@
 
 Http2TraceLogger::Http2TraceLogger(SpdyFramerVisitorInterface* parent,
                                    absl::string_view perspective,
-                                   std::function<bool()> is_enabled,
+                                   quiche::MultiUseCallback<bool()> is_enabled,
                                    const void* connection_id)
     : wrapped_(parent),
       perspective_(perspective),
diff --git a/quiche/http2/core/http2_trace_logging.h b/quiche/http2/core/http2_trace_logging.h
index f7218fe..7106a72 100644
--- a/quiche/http2/core/http2_trace_logging.h
+++ b/quiche/http2/core/http2_trace_logging.h
@@ -10,6 +10,7 @@
 #include "absl/strings/string_view.h"
 #include "quiche/common/platform/api/quiche_export.h"
 #include "quiche/common/platform/api/quiche_logging.h"
+#include "quiche/common/quiche_callbacks.h"
 #include "quiche/spdy/core/http2_frame_decoder_adapter.h"
 #include "quiche/spdy/core/recording_headers_handler.h"
 #include "quiche/spdy/core/spdy_headers_handler_interface.h"
@@ -41,7 +42,8 @@
 
   Http2TraceLogger(SpdyFramerVisitorInterface* parent,
                    absl::string_view perspective,
-                   std::function<bool()> is_enabled, const void* connection_id);
+                   quiche::MultiUseCallback<bool()> is_enabled,
+                   const void* connection_id);
   ~Http2TraceLogger() override;
 
   Http2TraceLogger(const Http2TraceLogger&) = delete;
@@ -98,7 +100,7 @@
 
   SpdyFramerVisitorInterface* wrapped_;
   const absl::string_view perspective_;
-  const std::function<bool()> is_enabled_;
+  const quiche::MultiUseCallback<bool()> is_enabled_;
   const void* connection_id_;
 };
 
@@ -108,7 +110,8 @@
   // This class will preface all of its log messages with the value of
   // |connection_id| in hexadecimal.
   Http2FrameLogger(absl::string_view perspective,
-                   std::function<bool()> is_enabled, const void* connection_id)
+                   quiche::MultiUseCallback<bool()> is_enabled,
+                   const void* connection_id)
       : perspective_(perspective),
         is_enabled_(std::move(is_enabled)),
         connection_id_(connection_id) {}
@@ -135,7 +138,7 @@
 
  private:
   const absl::string_view perspective_;
-  const std::function<bool()> is_enabled_;
+  const quiche::MultiUseCallback<bool()> is_enabled_;
   const void* connection_id_;
 };
 
diff --git a/quiche/http2/test_tools/payload_decoder_base_test_util.h b/quiche/http2/test_tools/payload_decoder_base_test_util.h
index 375fee6..9f7a5f3 100644
--- a/quiche/http2/test_tools/payload_decoder_base_test_util.h
+++ b/quiche/http2/test_tools/payload_decoder_base_test_util.h
@@ -25,6 +25,7 @@
 #include "quiche/http2/test_tools/verify_macros.h"
 #include "quiche/common/platform/api/quiche_export.h"
 #include "quiche/common/platform/api/quiche_logging.h"
+#include "quiche/common/quiche_callbacks.h"
 
 namespace http2 {
 namespace test {
@@ -119,7 +120,7 @@
   // size of payload, else false to skip that size. Typically used for negative
   // tests; for example, decoding a SETTINGS frame at all sizes except for
   // multiples of 6.
-  typedef std::function<bool(size_t size)> ApproveSize;
+  typedef quiche::MultiUseCallback<bool(size_t size)> ApproveSize;
 
   AbstractPayloadDecoderTest() {}
 
@@ -303,13 +304,13 @@
   // As above, but for frames without padding.
   ::testing::AssertionResult VerifyDetectsFrameSizeError(
       uint8_t required_flags, absl::string_view unpadded_payload,
-      const ApproveSize& approve_size) {
+      ApproveSize approve_size) {
     Http2FrameType frame_type = DecoderPeer::FrameType();
     uint8_t known_flags = KnownFlagsMaskForFrameType(frame_type);
     HTTP2_VERIFY_EQ(0, known_flags & Http2FrameFlag::PADDED);
     HTTP2_VERIFY_EQ(0, required_flags & Http2FrameFlag::PADDED);
     return VerifyDetectsMultipleFrameSizeErrors(
-        required_flags, unpadded_payload, approve_size, 0);
+        required_flags, unpadded_payload, std::move(approve_size), 0);
   }
 
   Listener listener_;
diff --git a/quiche/http2/test_tools/random_decoder_test_base_test.cc b/quiche/http2/test_tools/random_decoder_test_base_test.cc
index 29f665c..f5fe67e 100644
--- a/quiche/http2/test_tools/random_decoder_test_base_test.cc
+++ b/quiche/http2/test_tools/random_decoder_test_base_test.cc
@@ -11,6 +11,7 @@
 #include "quiche/http2/test_tools/http2_random.h"
 #include "quiche/common/platform/api/quiche_logging.h"
 #include "quiche/common/platform/api/quiche_test.h"
+#include "quiche/common/quiche_callbacks.h"
 
 namespace http2 {
 namespace test {
@@ -27,7 +28,7 @@
   }
 
  protected:
-  typedef std::function<DecodeStatus(DecodeBuffer* db)> DecodingFn;
+  typedef quiche::MultiUseCallback<DecodeStatus(DecodeBuffer* db)> DecodingFn;
 
   DecodeStatus StartDecoding(DecodeBuffer* db) override {
     ++start_decoding_calls_;
diff --git a/quiche/spdy/core/hpack/hpack_encoder.h b/quiche/spdy/core/hpack/hpack_encoder.h
index 50e4711..a36b734 100644
--- a/quiche/spdy/core/hpack/hpack_encoder.h
+++ b/quiche/spdy/core/hpack/hpack_encoder.h
@@ -16,6 +16,7 @@
 
 #include "absl/strings/string_view.h"
 #include "quiche/common/platform/api/quiche_export.h"
+#include "quiche/common/quiche_callbacks.h"
 #include "quiche/spdy/core/hpack/hpack_header_table.h"
 #include "quiche/spdy/core/hpack/hpack_output_stream.h"
 #include "quiche/spdy/core/http2_header_block.h"
@@ -38,12 +39,12 @@
   // Callers may provide a HeaderListener to be informed of header name-value
   // pairs processed by this encoder.
   using HeaderListener =
-      std::function<void(absl::string_view, absl::string_view)>;
+      quiche::MultiUseCallback<void(absl::string_view, absl::string_view)>;
 
   // An indexing policy should return true if the provided header name-value
   // pair should be inserted into the HPACK dynamic table.
   using IndexingPolicy =
-      std::function<bool(absl::string_view, absl::string_view)>;
+      quiche::MultiUseCallback<bool(absl::string_view, absl::string_view)>;
 
   HpackEncoder();
   HpackEncoder(const HpackEncoder&) = delete;
@@ -87,11 +88,15 @@
 
   // This HpackEncoder will use |policy| to determine whether to insert header
   // name-value pairs into the dynamic table.
-  void SetIndexingPolicy(IndexingPolicy policy) { should_index_ = policy; }
+  void SetIndexingPolicy(IndexingPolicy policy) {
+    should_index_ = std::move(policy);
+  }
 
   // |listener| will be invoked for each header name-value pair processed by
   // this encoder.
-  void SetHeaderListener(HeaderListener listener) { listener_ = listener; }
+  void SetHeaderListener(HeaderListener listener) {
+    listener_ = std::move(listener);
+  }
 
   void DisableCompression() { enable_compression_ = false; }
 
diff --git a/quiche/spdy/core/metadata_extension.h b/quiche/spdy/core/metadata_extension.h
index 9ac2b91..66c79c8 100644
--- a/quiche/spdy/core/metadata_extension.h
+++ b/quiche/spdy/core/metadata_extension.h
@@ -7,6 +7,7 @@
 
 #include "absl/container/flat_hash_map.h"
 #include "quiche/common/platform/api/quiche_export.h"
+#include "quiche/common/quiche_callbacks.h"
 #include "quiche/spdy/core/hpack/hpack_encoder.h"
 #include "quiche/spdy/core/http2_frame_decoder_adapter.h"
 #include "quiche/spdy/core/http2_header_block.h"
@@ -28,9 +29,9 @@
   static_assert(!std::is_copy_constructible<MetadataPayload>::value,
                 "MetadataPayload should be a move-only type!");
 
-  using OnMetadataSupport = std::function<void(bool)>;
+  using OnMetadataSupport = quiche::MultiUseCallback<void(bool)>;
   using OnCompletePayload =
-      std::function<void(spdy::SpdyStreamId, MetadataPayload)>;
+      quiche::MultiUseCallback<void(spdy::SpdyStreamId, MetadataPayload)>;
 
   // The HTTP/2 SETTINGS ID that is used to indicate support for METADATA
   // frames.