Replace uses of std::function with quiche::UnretainedCallback where appropriate

UnretainedCallback is not nullable, unlike std::function, so in one of the places it gets replaced with an absl::optional<UnretainedCallback>.

PiperOrigin-RevId: 536781656
diff --git a/quiche/balsa/balsa_headers.cc b/quiche/balsa/balsa_headers.cc
index 80642c3..e6ee93c 100644
--- a/quiche/balsa/balsa_headers.cc
+++ b/quiche/balsa/balsa_headers.cc
@@ -873,8 +873,8 @@
 }
 
 bool BalsaHeaders::ForEachHeader(
-    std::function<bool(const absl::string_view key,
-                       const absl::string_view value)>
+    quiche::UnretainedCallback<bool(const absl::string_view key,
+                                    const absl::string_view value)>
         fn) const {
   int s = header_lines_.size();
   for (int i = 0; i < s; ++i) {
@@ -980,7 +980,7 @@
 void BalsaHeaders::RemoveAuthority() { RemoveAllOfHeader(kHost); }
 
 void BalsaHeaders::ApplyToCookie(
-    std::function<void(absl::string_view cookie)> f) const {
+    quiche::UnretainedCallback<void(absl::string_view cookie)> f) const {
   f(GetHeader(kCookie));
 }
 
diff --git a/quiche/balsa/balsa_headers.h b/quiche/balsa/balsa_headers.h
index 0005bb5..d0a4b6f 100644
--- a/quiche/balsa/balsa_headers.h
+++ b/quiche/balsa/balsa_headers.h
@@ -30,6 +30,7 @@
 #include "quiche/common/platform/api/quiche_bug_tracker.h"
 #include "quiche/common/platform/api/quiche_export.h"
 #include "quiche/common/platform/api/quiche_logging.h"
+#include "quiche/common/quiche_callbacks.h"
 
 namespace gfe2 {
 class Http2HeaderValidator;
@@ -834,9 +835,10 @@
   void DumpToString(std::string* str) const;
   std::string DebugString() const override;
 
-  bool ForEachHeader(std::function<bool(const absl::string_view key,
-                                        const absl::string_view value)>
-                         fn) const override;
+  bool ForEachHeader(
+      quiche::UnretainedCallback<bool(const absl::string_view key,
+                                      const absl::string_view value)>
+          fn) const override;
 
   void DumpToPrefixedString(const char* spaces, std::string* str) const;
 
@@ -1007,8 +1009,8 @@
   absl::string_view Authority() const override;
   void ReplaceOrAppendAuthority(absl::string_view value) override;
   void RemoveAuthority() override;
-  void ApplyToCookie(
-      std::function<void(absl::string_view cookie)> f) const override;
+  void ApplyToCookie(quiche::UnretainedCallback<void(absl::string_view cookie)>
+                         f) const override;
 
   void set_enforce_header_policy(bool enforce) override {
     enforce_header_policy_ = enforce;
diff --git a/quiche/balsa/header_api.h b/quiche/balsa/header_api.h
index 889c984..e607172 100644
--- a/quiche/balsa/header_api.h
+++ b/quiche/balsa/header_api.h
@@ -13,6 +13,7 @@
 #include "absl/strings/string_view.h"
 #include "quiche/common/platform/api/quiche_export.h"
 #include "quiche/common/platform/api/quiche_lower_case_string.h"
+#include "quiche/common/quiche_callbacks.h"
 
 namespace quiche {
 
@@ -116,9 +117,10 @@
   // Applies the argument function to each header line.  If the argument
   // function returns false, iteration stops and ForEachHeader returns false;
   // otherwise, ForEachHeader returns true.
-  virtual bool ForEachHeader(std::function<bool(const absl::string_view key,
-                                                const absl::string_view value)>
-                                 fn) const = 0;
+  virtual bool ForEachHeader(
+      quiche::UnretainedCallback<bool(const absl::string_view key,
+                                      const absl::string_view value)>
+          fn) const = 0;
 
   // Returns the upper bound byte size of the headers. This can be used to size
   // a Buffer when serializing headers.
@@ -167,7 +169,7 @@
   // cookie.data() will be nullptr. The lifetime of the cookie isn't guaranteed
   // to extend beyond this call.
   virtual void ApplyToCookie(
-      std::function<void(absl::string_view cookie)> f) const = 0;
+      quiche::UnretainedCallback<void(absl::string_view cookie)> f) const = 0;
 
   virtual size_t content_length() const = 0;
   virtual bool content_length_valid() const = 0;
diff --git a/quiche/quic/core/quic_dispatcher.cc b/quiche/quic/core/quic_dispatcher.cc
index d92ffff..70e4e6b 100644
--- a/quiche/quic/core/quic_dispatcher.cc
+++ b/quiche/quic/core/quic_dispatcher.cc
@@ -27,6 +27,7 @@
 #include "quiche/quic/platform/api/quic_logging.h"
 #include "quiche/quic/platform/api/quic_socket_address.h"
 #include "quiche/quic/platform/api/quic_stack_trace.h"
+#include "quiche/common/quiche_callbacks.h"
 #include "quiche/common/quiche_text_utils.h"
 
 namespace quic {
@@ -791,7 +792,7 @@
 }
 
 void QuicDispatcher::PerformActionOnActiveSessions(
-    std::function<void(QuicSession*)> operation) const {
+    quiche::UnretainedCallback<void(QuicSession*)> operation) const {
   absl::flat_hash_set<QuicSession*> visited_session;
   visited_session.reserve(reference_counted_session_map_.size());
   for (auto const& kv : reference_counted_session_map_) {
diff --git a/quiche/quic/core/quic_dispatcher.h b/quiche/quic/core/quic_dispatcher.h
index 24602b3..82a8618 100644
--- a/quiche/quic/core/quic_dispatcher.h
+++ b/quiche/quic/core/quic_dispatcher.h
@@ -30,6 +30,7 @@
 #include "quiche/quic/core/quic_version_manager.h"
 #include "quiche/quic/platform/api/quic_socket_address.h"
 #include "quiche/common/platform/api/quiche_reference_counted.h"
+#include "quiche/common/quiche_callbacks.h"
 #include "quiche/common/quiche_linked_hash_map.h"
 
 namespace quic {
@@ -163,7 +164,7 @@
 
   // Apply an operation for each session.
   void PerformActionOnActiveSessions(
-      std::function<void(QuicSession*)> operation) const;
+      quiche::UnretainedCallback<void(QuicSession*)> operation) const;
 
   // Get a snapshot of all sessions.
   std::vector<std::shared_ptr<QuicSession>> GetSessionsSnapshot() const;
diff --git a/quiche/quic/core/quic_linux_socket_utils.h b/quiche/quic/core/quic_linux_socket_utils.h
index 8d53e47..41be945 100644
--- a/quiche/quic/core/quic_linux_socket_utils.h
+++ b/quiche/quic/core/quic_linux_socket_utils.h
@@ -24,6 +24,7 @@
 #include "quiche/quic/platform/api/quic_ip_address.h"
 #include "quiche/quic/platform/api/quic_logging.h"
 #include "quiche/quic/platform/api/quic_socket_address.h"
+#include "quiche/common/quiche_callbacks.h"
 
 #ifndef SOL_UDP
 #define SOL_UDP 17
@@ -156,11 +157,13 @@
 //   QuicSocketUtils::WriteMultiplePackets(fd, &mhdr, &num_packets_sent);
 class QUIC_EXPORT_PRIVATE QuicMMsgHdr {
  public:
-  using ControlBufferInitializer = std::function<void(
+  using ControlBufferInitializer = quiche::UnretainedCallback<void(
       QuicMMsgHdr* mhdr, int i, const BufferedWrite& buffered_write)>;
   template <typename IteratorT>
-  QuicMMsgHdr(const IteratorT& first, const IteratorT& last, size_t cbuf_size,
-              ControlBufferInitializer cbuf_initializer)
+  QuicMMsgHdr(
+      const IteratorT& first, const IteratorT& last, size_t cbuf_size,
+      ControlBufferInitializer cbuf_initializer =
+          +[](quic::QuicMMsgHdr*, int, const quic::BufferedWrite&) {})
       : num_msgs_(std::distance(first, last)), cbuf_size_(cbuf_size) {
     static_assert(
         std::is_same<typename std::iterator_traits<IteratorT>::value_type,
@@ -180,9 +183,7 @@
       ++i;
 
       InitOneHeader(i, *it);
-      if (cbuf_initializer) {
-        cbuf_initializer(this, i, *it);
-      }
+      cbuf_initializer(this, i, *it);
     }
   }
 
diff --git a/quiche/quic/core/quic_linux_socket_utils_test.cc b/quiche/quic/core/quic_linux_socket_utils_test.cc
index e9d1b14..9c45662 100644
--- a/quiche/quic/core/quic_linux_socket_utils_test.cc
+++ b/quiche/quic/core/quic_linux_socket_utils_test.cc
@@ -178,7 +178,7 @@
       QuicSocketAddress(QuicIpAddress::Loopback6(), 6));
 
   QuicMMsgHdr quic_mhdr_without_cbuf(buffered_writes.begin(),
-                                     buffered_writes.end(), 0, nullptr);
+                                     buffered_writes.end(), 0);
   for (size_t i = 0; i < buffered_writes.size(); ++i) {
     const BufferedWrite& bw = buffered_writes[i];
     CheckMsghdrWithoutCbuf(&quic_mhdr_without_cbuf.mhdr()[i].msg_hdr, bw.buffer,
diff --git a/quiche/quic/core/quic_session.cc b/quiche/quic/core/quic_session.cc
index 39fef52..74a0fc0 100644
--- a/quiche/quic/core/quic_session.cc
+++ b/quiche/quic/core/quic_session.cc
@@ -29,6 +29,7 @@
 #include "quiche/quic/platform/api/quic_server_stats.h"
 #include "quiche/quic/platform/api/quic_stack_trace.h"
 #include "quiche/common/platform/api/quiche_logging.h"
+#include "quiche/common/quiche_callbacks.h"
 #include "quiche/common/quiche_text_utils.h"
 
 namespace quic {
@@ -2641,7 +2642,7 @@
 }
 
 void QuicSession::PerformActionOnActiveStreams(
-    std::function<bool(QuicStream*)> action) {
+    quiche::UnretainedCallback<bool(QuicStream*)> action) {
   std::vector<QuicStream*> active_streams;
   for (const auto& it : stream_map_) {
     if (!it.second->is_static() && !it.second->IsZombie()) {
@@ -2657,7 +2658,7 @@
 }
 
 void QuicSession::PerformActionOnActiveStreams(
-    std::function<bool(QuicStream*)> action) const {
+    quiche::UnretainedCallback<bool(QuicStream*)> action) const {
   for (const auto& it : stream_map_) {
     if (!it.second->is_static() && !it.second->IsZombie() &&
         !action(it.second.get())) {
diff --git a/quiche/quic/core/quic_session.h b/quiche/quic/core/quic_session.h
index d503b01..fe7e4bb 100644
--- a/quiche/quic/core/quic_session.h
+++ b/quiche/quic/core/quic_session.h
@@ -45,6 +45,7 @@
 #include "quiche/quic/platform/api/quic_flags.h"
 #include "quiche/quic/platform/api/quic_socket_address.h"
 #include "quiche/common/platform/api/quiche_mem_slice.h"
+#include "quiche/common/quiche_callbacks.h"
 #include "quiche/common/quiche_linked_hash_map.h"
 
 namespace quic {
@@ -804,9 +805,10 @@
 
   // Called by applications to perform |action| on active streams.
   // Stream iteration will be stopped if action returns false.
-  void PerformActionOnActiveStreams(std::function<bool(QuicStream*)> action);
   void PerformActionOnActiveStreams(
-      std::function<bool(QuicStream*)> action) const;
+      quiche::UnretainedCallback<bool(QuicStream*)> action);
+  void PerformActionOnActiveStreams(
+      quiche::UnretainedCallback<bool(QuicStream*)> action) const;
 
   // Return the largest peer created stream id depending on directionality
   // indicated by |unidirectional|.
diff --git a/quiche/quic/qbone/platform/icmp_packet.cc b/quiche/quic/qbone/platform/icmp_packet.cc
index 3f15bb7..79df687 100644
--- a/quiche/quic/qbone/platform/icmp_packet.cc
+++ b/quiche/quic/qbone/platform/icmp_packet.cc
@@ -8,6 +8,7 @@
 
 #include "absl/strings/string_view.h"
 #include "quiche/quic/qbone/platform/internet_checksum.h"
+#include "quiche/common/quiche_callbacks.h"
 #include "quiche/common/quiche_endian.h"
 
 namespace quic {
@@ -41,7 +42,7 @@
 
 void CreateIcmpPacket(in6_addr src, in6_addr dst, const icmp6_hdr& icmp_header,
                       absl::string_view body,
-                      const std::function<void(absl::string_view)>& cb) {
+                      quiche::UnretainedCallback<void(absl::string_view)> cb) {
   const size_t body_size = std::min(body.size(), kICMPv6BodyMaxSize);
   const size_t payload_size = kICMPv6HeaderSize + body_size;
 
diff --git a/quiche/quic/qbone/platform/icmp_packet.h b/quiche/quic/qbone/platform/icmp_packet.h
index c83513c..82608a7 100644
--- a/quiche/quic/qbone/platform/icmp_packet.h
+++ b/quiche/quic/qbone/platform/icmp_packet.h
@@ -12,6 +12,7 @@
 
 #include "absl/strings/string_view.h"
 #include "quiche/quic/platform/api/quic_ip_address.h"
+#include "quiche/common/quiche_callbacks.h"
 
 namespace quic {
 
@@ -20,7 +21,7 @@
 // stack allocated inside CreateIcmpPacket.
 void CreateIcmpPacket(in6_addr src, in6_addr dst, const icmp6_hdr& icmp_header,
                       absl::string_view body,
-                      const std::function<void(absl::string_view)>& cb);
+                      quiche::UnretainedCallback<void(absl::string_view)> cb);
 
 }  // namespace quic
 
diff --git a/quiche/quic/qbone/platform/tcp_packet.cc b/quiche/quic/qbone/platform/tcp_packet.cc
index e73e284..9c2f409 100644
--- a/quiche/quic/qbone/platform/tcp_packet.cc
+++ b/quiche/quic/qbone/platform/tcp_packet.cc
@@ -10,6 +10,7 @@
 #include "absl/strings/string_view.h"
 #include "quiche/quic/platform/api/quic_logging.h"
 #include "quiche/quic/qbone/platform/internet_checksum.h"
+#include "quiche/common/quiche_callbacks.h"
 #include "quiche/common/quiche_endian.h"
 
 namespace quic {
@@ -31,8 +32,9 @@
 
 }  // namespace
 
-void CreateTcpResetPacket(absl::string_view original_packet,
-                          const std::function<void(absl::string_view)>& cb) {
+void CreateTcpResetPacket(
+    absl::string_view original_packet,
+    quiche::UnretainedCallback<void(absl::string_view)> cb) {
   // By the time this method is called, original_packet should be fairly
   // strongly validated. However, it's better to be more paranoid than not, so
   // here are a bunch of very obvious checks.
diff --git a/quiche/quic/qbone/platform/tcp_packet.h b/quiche/quic/qbone/platform/tcp_packet.h
index 7e9550f..bb4acd0 100644
--- a/quiche/quic/qbone/platform/tcp_packet.h
+++ b/quiche/quic/qbone/platform/tcp_packet.h
@@ -12,13 +12,15 @@
 
 #include "absl/strings/string_view.h"
 #include "quiche/quic/platform/api/quic_ip_address.h"
+#include "quiche/common/quiche_callbacks.h"
 
 namespace quic {
 
 // Creates an TCPv6 RST packet, returning a packed string representation of the
 // packet to |cb|.
-void CreateTcpResetPacket(absl::string_view original_packet,
-                          const std::function<void(absl::string_view)>& cb);
+void CreateTcpResetPacket(
+    absl::string_view original_packet,
+    quiche::UnretainedCallback<void(absl::string_view)> cb);
 
 }  // namespace quic
 
diff --git a/quiche/quic/test_tools/crypto_test_utils.cc b/quiche/quic/test_tools/crypto_test_utils.cc
index 4df4f8f..f7cf1cf 100644
--- a/quiche/quic/test_tools/crypto_test_utils.cc
+++ b/quiche/quic/test_tools/crypto_test_utils.cc
@@ -47,6 +47,7 @@
 #include "quiche/quic/test_tools/quic_test_utils.h"
 #include "quiche/quic/test_tools/simple_quic_framer.h"
 #include "quiche/quic/test_tools/test_certificates.h"
+#include "quiche/common/quiche_callbacks.h"
 #include "quiche/common/test_tools/quiche_test_utils.h"
 
 namespace quic {
@@ -399,13 +400,12 @@
   }
 }
 
-bool CommunicateHandshakeMessagesUntil(PacketSavingConnection* client_conn,
-                                       QuicCryptoStream* client,
-                                       std::function<bool()> client_condition,
-                                       PacketSavingConnection* server_conn,
-                                       QuicCryptoStream* server,
-                                       std::function<bool()> server_condition,
-                                       bool process_stream_data) {
+bool CommunicateHandshakeMessagesUntil(
+    PacketSavingConnection* client_conn, QuicCryptoStream* client,
+    quiche::UnretainedCallback<bool()> client_condition,
+    PacketSavingConnection* server_conn, QuicCryptoStream* server,
+    quiche::UnretainedCallback<bool()> server_condition,
+    bool process_stream_data) {
   size_t client_next_packet_to_deliver =
       client_conn->number_of_packets_delivered_;
   size_t server_next_packet_to_deliver =
diff --git a/quiche/quic/test_tools/crypto_test_utils.h b/quiche/quic/test_tools/crypto_test_utils.h
index d650706..42738e4 100644
--- a/quiche/quic/test_tools/crypto_test_utils.h
+++ b/quiche/quic/test_tools/crypto_test_utils.h
@@ -18,6 +18,7 @@
 #include "quiche/quic/core/quic_framer.h"
 #include "quiche/quic/core/quic_packets.h"
 #include "quiche/quic/test_tools/quic_test_utils.h"
+#include "quiche/common/quiche_callbacks.h"
 
 namespace quic {
 
@@ -114,13 +115,12 @@
 // 4) Returns true if both conditions are met.
 // 5) Returns false if either connection is closed or there is no more packet to
 // deliver before both conditions are met.
-bool CommunicateHandshakeMessagesUntil(PacketSavingConnection* client_conn,
-                                       QuicCryptoStream* client,
-                                       std::function<bool()> client_condition,
-                                       PacketSavingConnection* server_conn,
-                                       QuicCryptoStream* server,
-                                       std::function<bool()> server_condition,
-                                       bool process_stream_data);
+bool CommunicateHandshakeMessagesUntil(
+    PacketSavingConnection* client_conn, QuicCryptoStream* client,
+    quiche::UnretainedCallback<bool()> client_condition,
+    PacketSavingConnection* server_conn, QuicCryptoStream* server,
+    quiche::UnretainedCallback<bool()> server_condition,
+    bool process_stream_data);
 
 // AdvanceHandshake attempts to moves messages from |client| to |server| and
 // |server| to |client|. Returns the number of messages moved.
diff --git a/quiche/quic/test_tools/quic_test_client.cc b/quiche/quic/test_tools/quic_test_client.cc
index 5835800..223ef87 100644
--- a/quiche/quic/test_tools/quic_test_client.cc
+++ b/quiche/quic/test_tools/quic_test_client.cc
@@ -29,6 +29,7 @@
 #include "quiche/quic/test_tools/quic_spdy_stream_peer.h"
 #include "quiche/quic/test_tools/quic_test_utils.h"
 #include "quiche/quic/tools/quic_url.h"
+#include "quiche/common/quiche_callbacks.h"
 #include "quiche/common/quiche_text_utils.h"
 
 namespace quic {
@@ -627,17 +628,19 @@
   return push_promise_data_to_resend_.get() || !open_streams_.empty();
 }
 
-bool QuicTestClient::WaitUntil(int timeout_ms, std::function<bool()> trigger) {
+bool QuicTestClient::WaitUntil(
+    int timeout_ms,
+    absl::optional<quiche::UnretainedCallback<bool()>> trigger) {
   QuicTime::Delta timeout = QuicTime::Delta::FromMilliseconds(timeout_ms);
   const QuicClock* clock = client()->session()->connection()->clock();
   QuicTime end_waiting_time = clock->Now() + timeout;
-  while (connected() && !(trigger && trigger()) &&
+  while (connected() && !(trigger.has_value() && (*trigger)()) &&
          (timeout_ms < 0 || clock->Now() < end_waiting_time)) {
     event_loop_->RunEventLoopOnce(timeout);
     client_->WaitForEventsPostprocessing();
   }
   ReadNextResponse();
-  if (trigger && !trigger()) {
+  if (trigger.has_value() && !(*trigger)()) {
     QUIC_VLOG(1) << "Client WaitUntil returning with trigger returning false.";
     return false;
   }
@@ -839,8 +842,7 @@
 QuicTestClient::PerStreamState::PerStreamState(
     QuicRstStreamErrorCode stream_error, bool response_complete,
     bool response_headers_complete,
-    const spdy::Http2HeaderBlock& response_headers,
-    const std::string& response,
+    const spdy::Http2HeaderBlock& response_headers, const std::string& response,
     const spdy::Http2HeaderBlock& response_trailers, uint64_t bytes_read,
     uint64_t bytes_written, int64_t response_body_size)
     : stream_error(stream_error),
diff --git a/quiche/quic/test_tools/quic_test_client.h b/quiche/quic/test_tools/quic_test_client.h
index 4b95046..8d5ba85 100644
--- a/quiche/quic/test_tools/quic_test_client.h
+++ b/quiche/quic/test_tools/quic_test_client.h
@@ -17,6 +17,7 @@
 #include "quiche/quic/core/quic_packets.h"
 #include "quiche/quic/platform/api/quic_test.h"
 #include "quiche/quic/tools/quic_default_client.h"
+#include "quiche/common/quiche_callbacks.h"
 #include "quiche/common/quiche_linked_hash_map.h"
 #include "quiche/spdy/core/http2_header_block.h"
 
@@ -160,7 +161,8 @@
   void Disconnect();
   QuicSocketAddress local_address() const;
   void ClearPerRequestState();
-  bool WaitUntil(int timeout_ms, std::function<bool()> trigger);
+  bool WaitUntil(int timeout_ms,
+                 absl::optional<quiche::UnretainedCallback<bool()>> trigger);
   int64_t Send(absl::string_view data);
   bool connected() const;
   bool buffer_body() const;