Let `CompactString` support heterogeneous lookup against `absl::string_view`
by default, using the `absl_container_{hash,eq}` protocol.

PiperOrigin-RevId: 927191960
diff --git a/riegeli/base/compact_string.h b/riegeli/base/compact_string.h
index 37e7a94..c489f5f 100644
--- a/riegeli/base/compact_string.h
+++ b/riegeli/base/compact_string.h
@@ -76,6 +76,10 @@
 class ABSL_ATTRIBUTE_TRIVIAL_ABI CompactString
     : public WithCompare<CompactString, absl::string_view> {
  public:
+  // Supports heterogeneous lookup against `absl::string_view`.
+  struct absl_container_hash;
+  struct absl_container_eq;
+
   static constexpr size_t max_size() {
     return std::numeric_limits<size_t>::max() - 2 * sizeof(size_t);
   }
@@ -545,8 +549,9 @@
   uintptr_t repr_ = kInlineTag;
 };
 
-// Hash and equality which support heterogeneous lookup.
-struct CompactStringHash {
+// Implementation details follow.
+
+struct CompactString::absl_container_hash {
   using is_transparent = void;
   size_t operator()(const CompactString& value) const {
     return absl::Hash<CompactString>()(value);
@@ -555,7 +560,8 @@
     return absl::Hash<absl::string_view>()(value);
   }
 };
-struct CompactStringEq {
+
+struct CompactString::absl_container_eq {
   using is_transparent = void;
   bool operator()(const CompactString& a, const CompactString& b) const {
     return a == b;
@@ -566,13 +572,8 @@
   bool operator()(absl::string_view a, const CompactString& b) const {
     return a == b;
   }
-  bool operator()(absl::string_view a, absl::string_view b) const {
-    return a == b;
-  }
 };
 
-// Implementation details follow.
-
 inline uintptr_t CompactString::MakeRepr(size_t size, size_t capacity) {
   RIEGELI_ASSERT_LE(size, capacity)
       << "Failed precondition of CompactString::MakeRepr(): "