Add a convenient contstructor to QuicConnectionId that accepts a Span. QUIC-LB has many tests that write specific connection IDs, and a constructor that accepts array literals is way less cumbersome.

PiperOrigin-RevId: 432541846
diff --git a/quic/core/quic_connection_id.cc b/quic/core/quic_connection_id.cc
index a8cb4c0..19a35eb 100644
--- a/quic/core/quic_connection_id.cc
+++ b/quic/core/quic_connection_id.cc
@@ -71,6 +71,10 @@
   memcpy(data_long_, data, length_);
 }
 
+QuicConnectionId::QuicConnectionId(const absl::Span<const uint8_t>& data)
+    : QuicConnectionId(reinterpret_cast<const char*>(data.data()),
+                       data.length()) {}
+
 QuicConnectionId::~QuicConnectionId() {
   if (length_ > sizeof(data_short_)) {
     free(data_long_);
@@ -101,9 +105,7 @@
   return data_long_;
 }
 
-uint8_t QuicConnectionId::length() const {
-  return length_;
-}
+uint8_t QuicConnectionId::length() const { return length_; }
 
 void QuicConnectionId::set_length(uint8_t length) {
   char temporary_data[sizeof(data_short_)];
@@ -131,9 +133,7 @@
   length_ = length;
 }
 
-bool QuicConnectionId::IsEmpty() const {
-  return length_ == 0;
-}
+bool QuicConnectionId::IsEmpty() const { return length_ == 0; }
 
 size_t QuicConnectionId::Hash() const {
   static const QuicConnectionIdHasher hasher = QuicConnectionIdHasher();
@@ -170,9 +170,7 @@
   return memcmp(data(), v.data(), length_) < 0;
 }
 
-QuicConnectionId EmptyQuicConnectionId() {
-  return QuicConnectionId();
-}
+QuicConnectionId EmptyQuicConnectionId() { return QuicConnectionId(); }
 
 static_assert(kQuicDefaultConnectionIdLength == sizeof(uint64_t),
               "kQuicDefaultConnectionIdLength changed");
diff --git a/quic/core/quic_connection_id.h b/quic/core/quic_connection_id.h
index a0669d7..4b39ba2 100644
--- a/quic/core/quic_connection_id.h
+++ b/quic/core/quic_connection_id.h
@@ -8,6 +8,7 @@
 #include <string>
 #include <vector>
 
+#include "absl/types/span.h"
 #include "quic/platform/api/quic_export.h"
 
 namespace quic {
@@ -47,6 +48,7 @@
 
   // Creates a connection ID from network order bytes.
   QuicConnectionId(const char* data, uint8_t length);
+  QuicConnectionId(const absl::Span<const uint8_t>& data);
 
   // Creates a connection ID from another connection ID.
   QuicConnectionId(const QuicConnectionId& other);
@@ -89,8 +91,7 @@
 
   // operator<< allows easily logging connection IDs.
   friend QUIC_EXPORT_PRIVATE std::ostream& operator<<(
-      std::ostream& os,
-      const QuicConnectionId& v);
+      std::ostream& os, const QuicConnectionId& v);
 
   bool operator==(const QuicConnectionId& v) const;
   bool operator!=(const QuicConnectionId& v) const;
diff --git a/quic/core/quic_connection_id_test.cc b/quic/core/quic_connection_id_test.cc
index 3effb34..3f944e3 100644
--- a/quic/core/quic_connection_id_test.cc
+++ b/quic/core/quic_connection_id_test.cc
@@ -60,6 +60,33 @@
   EXPECT_EQ(kNewLength, connection_id2.length());
 }
 
+TEST_F(QuicConnectionIdTest, SpanData) {
+  QuicConnectionId connection_id = QuicConnectionId({0x01, 0x02, 0x03});
+  EXPECT_EQ(connection_id.length(), 3);
+  QuicConnectionId empty_connection_id =
+      QuicConnectionId(absl::Span<uint8_t>());
+  EXPECT_EQ(empty_connection_id.length(), 0);
+  QuicConnectionId connection_id2 = QuicConnectionId({
+      0x01,
+      0x02,
+      0x03,
+      0x04,
+      0x05,
+      0x06,
+      0x07,
+      0x08,
+      0x09,
+      0x0a,
+      0x0b,
+      0x0c,
+      0x0d,
+      0x0e,
+      0x0f,
+      0x10,
+  });
+  EXPECT_EQ(connection_id2.length(), 16);
+}
+
 TEST_F(QuicConnectionIdTest, DoubleConvert) {
   QuicConnectionId connection_id64_1 = test::TestConnectionId(1);
   QuicConnectionId connection_id64_2 = test::TestConnectionId(42);