diff mbox series

[3/2] libstdc++: Optimize std::projected<I, std::identity>

Message ID 20240821125737.3140462-1-ppalka@redhat.com
State New
Headers show
Series None | expand

Commit Message

Patrick Palka Aug. 21, 2024, 12:57 p.m. UTC
Tested on x86_64-pc-linux-gnu, does this look OK for trunk?  I'm not
sure if the current specification of 'projected' strictly speaking
allows for this optimization, but it seems like a natural one that
should be allowed.

-- >8 --

Algorithms that are generalized to take projections usually default the
projection to std::identity, which really means no projection at all.
In that case, I believe we could shortcut the projection logic to return
the indirectly readable type unchanged rather than a wrapped version of
it.  This should help with compile times especially after P2609R3 which
made the indirect invocability concepts more expensive to check when
projections are in the picture.

libstdc++-v3/ChangeLog:

	* include/bits/iterator_concepts.h (__detail::__projected):
	Define partial specialization for a std::identity projection.
---
 libstdc++-v3/include/bits/iterator_concepts.h | 5 +++++
 1 file changed, 5 insertions(+)

Comments

Jonathan Wakely Aug. 21, 2024, 1:15 p.m. UTC | #1
On Wed, 21 Aug 2024 at 13:58, Patrick Palka wrote:
>
> Tested on x86_64-pc-linux-gnu, does this look OK for trunk?  I'm not
> sure if the current specification of 'projected' strictly speaking
> allows for this optimization, but it seems like a natural one that
> should be allowed.

Yeah, I can't see any conformance problems with doing this. I'm sure
somebody smarter than me will point it out if there's a problem, so
let's try it and see.

OK for trunk, thanks.

>
> -- >8 --
>
> Algorithms that are generalized to take projections usually default the
> projection to std::identity, which really means no projection at all.
> In that case, I believe we could shortcut the projection logic to return
> the indirectly readable type unchanged rather than a wrapped version of
> it.  This should help with compile times especially after P2609R3 which
> made the indirect invocability concepts more expensive to check when
> projections are in the picture.
>
> libstdc++-v3/ChangeLog:
>
>         * include/bits/iterator_concepts.h (__detail::__projected):
>         Define partial specialization for a std::identity projection.
> ---
>  libstdc++-v3/include/bits/iterator_concepts.h | 5 +++++
>  1 file changed, 5 insertions(+)
>
> diff --git a/libstdc++-v3/include/bits/iterator_concepts.h b/libstdc++-v3/include/bits/iterator_concepts.h
> index d849ddc32fc..642c709fee0 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
> --
> 2.46.0.267.gbb9c16bd4f
>
diff mbox series

Patch

diff --git a/libstdc++-v3/include/bits/iterator_concepts.h b/libstdc++-v3/include/bits/iterator_concepts.h
index d849ddc32fc..642c709fee0 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