Use `OptionalCompactString` instead of `std::optional<CompactString>`.
It is more compact.

PiperOrigin-RevId: 866726446
diff --git a/riegeli/containers/BUILD b/riegeli/containers/BUILD
index 7e2c752..d31ca66 100644
--- a/riegeli/containers/BUILD
+++ b/riegeli/containers/BUILD
@@ -19,6 +19,7 @@
         "//riegeli/base:debug",
         "//riegeli/base:dependency",
         "//riegeli/base:iterable",
+        "//riegeli/base:optional_compact_string",
         "//riegeli/base:stream_utils",
         "//riegeli/bytes:compact_string_writer",
         "//riegeli/bytes:reader",
diff --git a/riegeli/containers/linear_sorted_string_set.cc b/riegeli/containers/linear_sorted_string_set.cc
index eda6cba..2a46d47 100644
--- a/riegeli/containers/linear_sorted_string_set.cc
+++ b/riegeli/containers/linear_sorted_string_set.cc
@@ -298,8 +298,9 @@
   size_t current_length = 0;
   CompactString current_if_validated_and_shared;
   std::optional<absl::string_view> current_if_validated;
-  if (options.decode_state() != nullptr) {
-    current_if_validated = options.decode_state()->last;
+  if (options.decode_state() != nullptr &&
+      options.decode_state()->last != nullptr) {
+    current_if_validated = *options.decode_state()->last;
   }
   const absl::string_view encoded_view = encoded;
   const char* ptr = encoded_view.data();
diff --git a/riegeli/containers/linear_sorted_string_set.h b/riegeli/containers/linear_sorted_string_set.h
index bd44edf..15d940e 100644
--- a/riegeli/containers/linear_sorted_string_set.h
+++ b/riegeli/containers/linear_sorted_string_set.h
@@ -22,7 +22,6 @@
 #include <initializer_list>
 #include <iosfwd>
 #include <iterator>
-#include <optional>
 #include <string>
 #include <type_traits>
 #include <utility>
@@ -38,6 +37,7 @@
 #include "riegeli/base/compare.h"
 #include "riegeli/base/dependency.h"
 #include "riegeli/base/iterable.h"
+#include "riegeli/base/optional_compact_string.h"
 #include "riegeli/bytes/compact_string_writer.h"
 #include "riegeli/bytes/reader.h"
 #include "riegeli/bytes/writer.h"
@@ -66,9 +66,9 @@
     // Total number of elements decoded so far. The size is calculated as a side
     // effect of structural validation; calling `size()` later would be slower.
     size_t cumulative_size = 0;
-    // If not `std::nullopt`, the last element in the last decoded set.
-    // Meaningful only if `DecodeOptions::validate()`.
-    std::optional<CompactString> last;
+    // If not `nullptr`, the last element in the last decoded set. Meaningful
+    // only if `DecodeOptions::validate()`.
+    OptionalCompactString last;
   };
 
   // Options for `Decode()`.