[PATCH WIP 2/2] libstdc++: Optimize ranges::distance for segmented iterators [PR123211]

Patrick Palka ppalka@redhat.com
Tue Jul 14 04:29:48 GMT 2026


For segmented iterators, ranges::distance is equivalent to the sum of
ranges::distance of each of its segments.

	PR libstdc++/123211

libstdc++-v3/ChangeLog:

	* include/bits/ranges_base.h (__distance_fn::operator()): For
	the non-sized-sentinel overload,
---
 libstdc++-v3/include/bits/ranges_base.h | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/libstdc++-v3/include/bits/ranges_base.h b/libstdc++-v3/include/bits/ranges_base.h
index ce1c40fc17f6..7f169feaa6b1 100644
--- a/libstdc++-v3/include/bits/ranges_base.h
+++ b/libstdc++-v3/include/bits/ranges_base.h
@@ -994,6 +994,16 @@ namespace ranges
       constexpr iter_difference_t<_It>
       operator()[[nodiscard]](_It __first, _Sent __last) const
       {
+	if constexpr (__segmented_iterator<_It> && same_as<_It, _Sent>)
+	  {
+	    iter_difference_t<_It> __n = 0;
+	    std::__for_each_segment(__first, __last, [this, &__n](auto __first, auto __last) {
+	      __n += iter_difference_t<_It>(this->operator()(__first, __last));
+	      return __last;
+	    });
+	    return __n;
+	  }
+
 	iter_difference_t<_It> __n = 0;
 	while (__first != __last)
 	  {
-- 
2.55.0.141.g55526a1826



More information about the Libstdc++ mailing list