Use more concise `UnsignedClamp()` instead of a combination of `UnsignedMax()`
with `UnsignedMin()`.

PiperOrigin-RevId: 893969157
diff --git a/riegeli/base/arithmetic.h b/riegeli/base/arithmetic.h
index 14d2c8e..1f0479c 100644
--- a/riegeli/base/arithmetic.h
+++ b/riegeli/base/arithmetic.h
@@ -244,6 +244,9 @@
 
 // `UnsignedClamp(value, min_value, max_value)` is at least `min_value`,
 // at most `max(max_value, min_value)`, preferably `value`.
+//
+// If `min_value <= max_value`, then it is equivalent to `std::clamp()`,
+// otherwise `min_value` wins.
 template <
     typename Value, typename Min, typename Max,
     std::enable_if_t<std::conjunction_v<IsUnsignedInt<Value>,
diff --git a/riegeli/base/sized_shared_buffer.cc b/riegeli/base/sized_shared_buffer.cc
index 4aff4ce..32add9d 100644
--- a/riegeli/base/sized_shared_buffer.cc
+++ b/riegeli/base/sized_shared_buffer.cc
@@ -75,10 +75,9 @@
       data_ = new_data;
       return true;
     }
-    min_length_if_not = UnsignedMin(
-        UnsignedMax(length, SaturatingAdd(empty() ? capacity() : space_after(),
-                                          capacity() / 2)),
-        std::numeric_limits<size_t>::max() - size_);
+    min_length_if_not = UnsignedClamp(
+        SaturatingAdd(empty() ? capacity() : space_after(), capacity() / 2),
+        length, std::numeric_limits<size_t>::max() - size_);
   } else {
     min_length_if_not = length;
   }
@@ -104,10 +103,9 @@
       data_ = new_data;
       return true;
     }
-    min_length_if_not = UnsignedMin(
-        UnsignedMax(length, SaturatingAdd(empty() ? capacity() : space_before(),
-                                          capacity() / 2)),
-        std::numeric_limits<size_t>::max() - size_);
+    min_length_if_not = UnsignedClamp(
+        SaturatingAdd(empty() ? capacity() : space_before(), capacity() / 2),
+        length, std::numeric_limits<size_t>::max() - size_);
     space_after_if_not =
         UnsignedMin(space_after(), std::numeric_limits<size_t>::max() - size_ -
                                        min_length_if_not);
diff --git a/riegeli/base/string_utils.cc b/riegeli/base/string_utils.cc
index ea77059..c5d627d 100644
--- a/riegeli/base/string_utils.cc
+++ b/riegeli/base/string_utils.cc
@@ -28,9 +28,8 @@
 void ReserveAmortized(std::string& dest, size_t new_size) {
   dest.reserve(dest.capacity() == std::string().capacity()
                    ? new_size
-                   : UnsignedMax(new_size, UnsignedMin(dest.capacity() +
-                                                           dest.capacity() / 2,
-                                                       dest.max_size())));
+                   : UnsignedClamp(dest.capacity() + dest.capacity() / 2,
+                                   new_size, dest.max_size()));
 }
 
 }  // namespace riegeli::string_utils_internal
diff --git a/riegeli/bytes/cfile_reader.cc b/riegeli/bytes/cfile_reader.cc
index 3caa3e8..84082cc 100644
--- a/riegeli/bytes/cfile_reader.cc
+++ b/riegeli/bytes/cfile_reader.cc
@@ -308,7 +308,7 @@
       return FailOverflow();
     }
     const size_t length_to_read = UnsignedMin(
-        UnsignedMax(min_length, AvailableLength(src)), max_length,
+        UnsignedClamp(AvailableLength(src), min_length, max_length),
         Position{std::numeric_limits<cfile_internal::Offset>::max()} -
             limit_pos());
     const size_t length_read = fread(dest, 1, length_to_read, src);
diff --git a/riegeli/bytes/resizable_writer.h b/riegeli/bytes/resizable_writer.h
index 206f49e..5eb5181 100644
--- a/riegeli/bytes/resizable_writer.h
+++ b/riegeli/bytes/resizable_writer.h
@@ -364,12 +364,10 @@
       // because `Resizable` is not necessarily default-constructible. They are
       // normally the same, and even if they are not, this is a matter of
       // performance tuning, not correctness.
-      dest.reserve(
-          dest.capacity() <= std::string().capacity()
-              ? new_size
-              : UnsignedMax(new_size,
-                            UnsignedMin(dest.capacity() + dest.capacity() / 2,
-                                        dest.max_size())));
+      dest.reserve(dest.capacity() <= std::string().capacity()
+                       ? new_size
+                       : UnsignedClamp(dest.capacity() + dest.capacity() / 2,
+                                       new_size, dest.max_size()));
     }
   }
 };
diff --git a/riegeli/bytes/vector_writer.h b/riegeli/bytes/vector_writer.h
index 974d27c..e17742d 100644
--- a/riegeli/bytes/vector_writer.h
+++ b/riegeli/bytes/vector_writer.h
@@ -105,17 +105,13 @@
     if (new_num_elements > dest.capacity()) {
       dest.erase(dest.begin() + SizeToNumElements(used_size), dest.end());
       if constexpr (std::is_default_constructible_v<Resizable>) {
-        dest.reserve(
-            dest.capacity() <= Resizable().capacity()
-                ? new_num_elements
-                : UnsignedMax(new_num_elements,
-                              UnsignedMin(dest.capacity() + dest.capacity() / 2,
-                                          dest.max_size())));
-      } else {
-        dest.reserve(UnsignedMax(
-            new_num_elements, UnsignedMin(dest.capacity() + dest.capacity() / 2,
-                                          dest.max_size())));
+        if (dest.capacity() <= Resizable().capacity()) {
+          dest.reserve(new_num_elements);
+          return;
+        }
       }
+      dest.reserve(UnsignedClamp(dest.capacity() + dest.capacity() / 2,
+                                 new_num_elements, dest.max_size()));
     }
   }
 };
diff --git a/riegeli/tensorflow/io/tstring_writer.h b/riegeli/tensorflow/io/tstring_writer.h
index 76cc993..469274b 100644
--- a/riegeli/tensorflow/io/tstring_writer.h
+++ b/riegeli/tensorflow/io/tstring_writer.h
@@ -70,7 +70,7 @@
       dest.reserve(
           dest.capacity() <= tsl::tstring().capacity()
               ? new_size
-              : UnsignedMax(new_size, dest.capacity() + dest.capacity() / 2));
+              : UnsignedMax(dest.capacity() + dest.capacity() / 2, new_size));
     }
   }
 };