aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrick Palka <ppalka@redhat.com>2024-08-22 09:24:39 -0400
committerPatrick Palka <ppalka@redhat.com>2024-08-22 09:24:39 -0400
commit51761c50f843d5be4e24172535e4524b5072f24c (patch)
tree4694a7bf9fb7bd524eed688fdb3147d266001297
parent620232426bd83a79c81cd2be6f485834c618e920 (diff)
downloadgcc-51761c50f843d5be4e24172535e4524b5072f24c.zip
gcc-51761c50f843d5be4e24172535e4524b5072f24c.tar.gz
gcc-51761c50f843d5be4e24172535e4524b5072f24c.tar.bz2
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 <jwakely@redhat.com>
-rw-r--r--libstdc++-v3/include/bits/iterator_concepts.h5
-rw-r--r--libstdc++-v3/testsuite/24_iterators/indirect_callable/projected.cc5
2 files changed, 10 insertions, 0 deletions
diff --git a/libstdc++-v3/include/bits/iterator_concepts.h b/libstdc++-v3/include/bits/iterator_concepts.h
index d849ddc..642c709 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 0eec42c..9ab7db9 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