Internal change

PiperOrigin-RevId: 489267804
diff --git a/fuzztest/internal/domain.h b/fuzztest/internal/domain.h
index cb39be3..63b5103 100644
--- a/fuzztest/internal/domain.h
+++ b/fuzztest/internal/domain.h
@@ -2168,12 +2168,23 @@
 
   VariantOfImpl() = default;
   explicit VariantOfImpl(std::in_place_t, Inner... inner)
-      : inner_(std::move(inner)...) {}
+      : inner_(std::move(inner)...), init_case_index_(std::nullopt) {}
 
   template <typename PRNG>
   corpus_type Init(PRNG& prng) {
+    return Init(prng, init_case_index_);
+  }
+
+  template <typename PRNG>
+  corpus_type Init(PRNG& prng, std::optional<int> init_case_index) {
+    auto lower = size_t{};
+    auto upper = sizeof...(Inner);
+    if (init_case_index.has_value()) {
+      lower = *init_case_index;
+      upper = lower + 1;
+    }
     return Switch<sizeof...(Inner)>(
-        absl::Uniform(prng, size_t{}, sizeof...(Inner)), [&](auto I) {
+        absl::Uniform(prng, lower, upper), [&](auto I) {
           return corpus_type(std::in_place_index<I>,
                              std::get<I>(inner_).Init(prng));
         });
@@ -2186,7 +2197,7 @@
     // mutating case in order to explore more on a given type before we start
     // from scratch again.
     if (absl::Bernoulli(prng, 0.2)) {
-      val = Init(prng);
+      val = Init(prng, std::nullopt);
     } else {
       Switch<sizeof...(Inner)>(val.index(), [&](auto I) {
         std::get<I>(inner_).Mutate(std::get<I>(val), prng, only_shrink);
@@ -2224,8 +2235,14 @@
     return SerializeWithDomainVariant(inner_, v);
   }
 
+  VariantOfImpl&& WithInitCaseIndex(int init_case_index) && {
+    init_case_index_ = init_case_index;
+    return std::move(*this);
+  }
+
  private:
   std::tuple<Inner...> inner_;
+  std::optional<int> init_case_index_;
 };
 
 template <typename... T>
@@ -2652,12 +2669,9 @@
 
   template <typename PRNG>
   void Mutate(corpus_type& val, PRNG& prng, bool only_shrink) {
-    corpus_type original_val = val;
-    while (true) {
+    do {
       inner_.Mutate(val, prng, only_shrink);
-      if (RunFilter(val)) return;
-      val = original_val;
-    }
+    } while (!RunFilter(val));
   }
 
   value_type GetValue(const corpus_type& v) const { return inner_.GetValue(v); }
@@ -2826,4 +2840,4 @@
 
 }  // namespace fuzztest::internal
 
-#endif  // FUZZTEST_FUZZTEST_INTERNAL_DOMAIN_H_
+#endif  // FUZZTEST_FUZZTEST_INTERNAL_DOMAIN_H_
\ No newline at end of file