https://gcc.gnu.org/g:b907cde027dc65af5842c06c50cfa12e2f58133b

commit r15-5037-gb907cde027dc65af5842c06c50cfa12e2f58133b
Author: Jonathan Wakely <[email protected]>
Date:   Fri Nov 1 12:38:29 2024 +0000

    libstdc++: Simplify __detail::__distance_fw using 'if constexpr'
    
    This uses 'if constexpr' instead of tag dispatching, removing the need
    for a second call using that tag, and simplifying the overload set that
    needs to be resolved for calls to __distance_fw.
    
    libstdc++-v3/ChangeLog:
    
            * include/bits/hashtable_policy.h (__distance_fw): Replace tag
            dispatching with 'if constexpr'.

Diff:
---
 libstdc++-v3/include/bits/hashtable_policy.h | 24 ++++++++++--------------
 1 file changed, 10 insertions(+), 14 deletions(-)

diff --git a/libstdc++-v3/include/bits/hashtable_policy.h 
b/libstdc++-v3/include/bits/hashtable_policy.h
index e5ad85ed9f1a..ecf50313d09c 100644
--- a/libstdc++-v3/include/bits/hashtable_policy.h
+++ b/libstdc++-v3/include/bits/hashtable_policy.h
@@ -62,25 +62,21 @@ namespace __detail
           typename _Unused, typename _Traits>
     struct _Hashtable_base;
 
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wc++17-extensions" // if constexpr
   // Helper function: return distance(first, last) for forward
   // iterators, or 0/1 for input iterators.
-  template<typename _Iterator>
-    inline typename std::iterator_traits<_Iterator>::difference_type
-    __distance_fw(_Iterator __first, _Iterator __last,
-                 std::input_iterator_tag)
-    { return __first != __last ? 1 : 0; }
-
-  template<typename _Iterator>
-    inline typename std::iterator_traits<_Iterator>::difference_type
-    __distance_fw(_Iterator __first, _Iterator __last,
-                 std::forward_iterator_tag)
-    { return std::distance(__first, __last); }
-
   template<typename _Iterator>
     inline typename std::iterator_traits<_Iterator>::difference_type
     __distance_fw(_Iterator __first, _Iterator __last)
-    { return __distance_fw(__first, __last,
-                          std::__iterator_category(__first)); }
+    {
+      using _Cat = typename std::iterator_traits<_Iterator>::iterator_category;
+      if constexpr (is_convertible<_Cat, forward_iterator_tag>::value)
+       return std::distance(__first, __last);
+      else
+       return __first != __last ? 1 : 0;
+    }
+#pragma GCC diagnostic pop
 
   struct _Identity
   {

Reply via email to