Convert to C++20 requires clauses in //core/fpdfapi

Easier to read than SFINAE.

Change-Id: Ice71c1274295ff78ad782f920c6066e21befac4a
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/131175
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/core/fpdfapi/parser/cpdf_array.h b/core/fpdfapi/parser/cpdf_array.h
index 5fd98af..473588d 100644
--- a/core/fpdfapi/parser/cpdf_array.h
+++ b/core/fpdfapi/parser/cpdf_array.h
@@ -81,8 +81,8 @@
   // to Append()/SetAt()/InsertAt() since by creating a new object with no
   // previous references, they ensure cycles can not be introduced.
   template <typename T, typename... Args>
-  typename std::enable_if<!CanInternStrings<T>::value, RetainPtr<T>>::type
-  AppendNew(Args&&... args) {
+    requires(!CanInternStrings<T>::value)
+  RetainPtr<T> AppendNew(Args&&... args) {
     static_assert(!std::is_same<T, CPDF_Stream>::value,
                   "Cannot append a CPDF_Stream directly. Add it indirectly as "
                   "a `CPDF_Reference` instead.");
@@ -90,14 +90,14 @@
         AppendInternal(pdfium::MakeRetain<T>(std::forward<Args>(args)...))));
   }
   template <typename T, typename... Args>
-  typename std::enable_if<CanInternStrings<T>::value, RetainPtr<T>>::type
-  AppendNew(Args&&... args) {
+    requires(CanInternStrings<T>::value)
+  RetainPtr<T> AppendNew(Args&&... args) {
     return pdfium::WrapRetain(static_cast<T*>(AppendInternal(
         pdfium::MakeRetain<T>(pool_, std::forward<Args>(args)...))));
   }
   template <typename T, typename... Args>
-  typename std::enable_if<!CanInternStrings<T>::value, RetainPtr<T>>::type
-  SetNewAt(size_t index, Args&&... args) {
+    requires(!CanInternStrings<T>::value)
+  RetainPtr<T> SetNewAt(size_t index, Args&&... args) {
     static_assert(!std::is_same<T, CPDF_Stream>::value,
                   "Cannot set a CPDF_Stream directly. Add it indirectly as a "
                   "`CPDF_Reference` instead.");
@@ -105,14 +105,14 @@
         index, pdfium::MakeRetain<T>(std::forward<Args>(args)...))));
   }
   template <typename T, typename... Args>
-  typename std::enable_if<CanInternStrings<T>::value, RetainPtr<T>>::type
-  SetNewAt(size_t index, Args&&... args) {
+    requires(CanInternStrings<T>::value)
+  RetainPtr<T> SetNewAt(size_t index, Args&&... args) {
     return pdfium::WrapRetain(static_cast<T*>(SetAtInternal(
         index, pdfium::MakeRetain<T>(pool_, std::forward<Args>(args)...))));
   }
   template <typename T, typename... Args>
-  typename std::enable_if<!CanInternStrings<T>::value, RetainPtr<T>>::type
-  InsertNewAt(size_t index, Args&&... args) {
+    requires(!CanInternStrings<T>::value)
+  RetainPtr<T> InsertNewAt(size_t index, Args&&... args) {
     static_assert(!std::is_same<T, CPDF_Stream>::value,
                   "Cannot insert a CPDF_Stream directly. Add it indirectly as "
                   "a `CPDF_Reference` instead.");
@@ -120,8 +120,8 @@
         index, pdfium::MakeRetain<T>(std::forward<Args>(args)...))));
   }
   template <typename T, typename... Args>
-  typename std::enable_if<CanInternStrings<T>::value, RetainPtr<T>>::type
-  InsertNewAt(size_t index, Args&&... args) {
+    requires(CanInternStrings<T>::value)
+  RetainPtr<T> InsertNewAt(size_t index, Args&&... args) {
     return pdfium::WrapRetain(static_cast<T*>(InsertAtInternal(
         index, pdfium::MakeRetain<T>(pool_, std::forward<Args>(args)...))));
   }
diff --git a/core/fpdfapi/parser/cpdf_dictionary.h b/core/fpdfapi/parser/cpdf_dictionary.h
index 73f590a..6688f7a 100644
--- a/core/fpdfapi/parser/cpdf_dictionary.h
+++ b/core/fpdfapi/parser/cpdf_dictionary.h
@@ -88,8 +88,8 @@
   // a new object with no previous references, they ensure cycles can not be
   // introduced.
   template <typename T, typename... Args>
-  typename std::enable_if<!CanInternStrings<T>::value, RetainPtr<T>>::type
-  SetNewFor(const ByteString& key, Args&&... args) {
+    requires(!CanInternStrings<T>::value)
+  RetainPtr<T> SetNewFor(const ByteString& key, Args&&... args) {
     static_assert(!std::is_same<T, CPDF_Stream>::value,
                   "Cannot set a CPDF_Stream directly. Add it indirectly as a "
                   "`CPDF_Reference` instead.");
@@ -97,8 +97,8 @@
         key, pdfium::MakeRetain<T>(std::forward<Args>(args)...))));
   }
   template <typename T, typename... Args>
-  typename std::enable_if<CanInternStrings<T>::value, RetainPtr<T>>::type
-  SetNewFor(const ByteString& key, Args&&... args) {
+    requires(CanInternStrings<T>::value)
+  RetainPtr<T> SetNewFor(const ByteString& key, Args&&... args) {
     return pdfium::WrapRetain(static_cast<T*>(SetForInternal(
         key, pdfium::MakeRetain<T>(pool_, std::forward<Args>(args)...))));
   }
diff --git a/core/fpdfapi/parser/cpdf_indirect_object_holder.h b/core/fpdfapi/parser/cpdf_indirect_object_holder.h
index a5d973c..46b9a7b 100644
--- a/core/fpdfapi/parser/cpdf_indirect_object_holder.h
+++ b/core/fpdfapi/parser/cpdf_indirect_object_holder.h
@@ -44,14 +44,14 @@
   // but which can intern strings from it. We have a special cast to handle
   // objects that can intern strings from our ByteStringPool.
   template <typename T, typename... Args>
-  typename std::enable_if<CanInternStrings<T>::value, RetainPtr<T>>::type New(
-      Args&&... args) {
+    requires(CanInternStrings<T>::value)
+  RetainPtr<T> New(Args&&... args) {
     return pdfium::MakeRetain<T>(byte_string_pool_,
                                  std::forward<Args>(args)...);
   }
   template <typename T, typename... Args>
-  typename std::enable_if<!CanInternStrings<T>::value, RetainPtr<T>>::type New(
-      Args&&... args) {
+    requires(!CanInternStrings<T>::value)
+  RetainPtr<T> New(Args&&... args) {
     return pdfium::MakeRetain<T>(std::forward<Args>(args)...);
   }