https://gcc.gnu.org/g:51761c50f843d5be4e24172535e4524b5072f24c

commit r15-3091-g51761c50f843d5be4e24172535e4524b5072f24c
Author: Patrick Palka <ppa...@redhat.com>
Date:   Thu Aug 22 09:24:39 2024 -0400

    libstdc++: Optimize std::projected<I, std::identity>
    
    Algorithms that are generalized to take projections typically default the
    projection to std::identity, which is equivalent to no projection at all.
    In that case, I believe we could shortcut the projection logic to return
    the iterator unchanged rather than wrapping it.  This should reduce compile
    times especially after P2609R3 which made the indirect invocability
    concepts more expensive to check when actual projections are involved.
    
    libstdc++-v3/ChangeLog:
    
            * include/bits/iterator_concepts.h (__detail::__projected): Define
            an optimized partial specialization for when the projection is
            std::identity.
            * testsuite/24_iterators/indirect_callable/projected.cc: Verify the
            optimization.
    
    Reviewed-by: Jonathan Wakely <jwak...@redhat.com>

Diff:
---
 libstdc++-v3/include/bits/iterator_concepts.h                      | 5 +++++
 libstdc++-v3/testsuite/24_iterators/indirect_callable/projected.cc | 5 +++++
 2 files changed, 10 insertions(+)

diff --git a/libstdc++-v3/include/bits/iterator_concepts.h 
b/libstdc++-v3/include/bits/iterator_concepts.h
index d849ddc32fc2..642c709fee0c 100644
--- a/libstdc++-v3/include/bits/iterator_concepts.h
+++ b/libstdc++-v3/include/bits/iterator_concepts.h
@@ -803,6 +803,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
          using __projected_Proj = _Proj;
        };
       };
+
+    // Optimize the common case of the projection being std::identity.
+    template<typename _Iter>
+      struct __projected<_Iter, identity>
+      { using __type = _Iter; };
   } // namespace __detail
 
   /// [projected], projected
diff --git a/libstdc++-v3/testsuite/24_iterators/indirect_callable/projected.cc 
b/libstdc++-v3/testsuite/24_iterators/indirect_callable/projected.cc
index 0eec42c2d5fa..9ab7db9d65df 100644
--- a/libstdc++-v3/testsuite/24_iterators/indirect_callable/projected.cc
+++ b/libstdc++-v3/testsuite/24_iterators/indirect_callable/projected.cc
@@ -22,7 +22,12 @@
 template<typename T>
   using PI = std::projected<T, std::identity>;
 
+#if __GLIBCXX__
+// Verify our projected<I, identity> optimization.
+static_assert(std::same_as<PI<int*>, int*>);
+#else
 static_assert(std::same_as<PI<int*>::value_type, int>);
+#endif
 static_assert(std::same_as<decltype(*std::declval<const PI<int*>&>()), int&>);
 
 struct X

Reply via email to