On Mon, 21 Sept 2026 at 19:10, Tomasz Kaminski <[email protected]> wrote:
>
> Double loop allows us to check capacity (and throw) early and avoid 
> insertions when
> range is forward.

And typical uses of std::inplace_vector will not be for huge sequences
with many thousands of elements, so the cost of computing the distance
first is bounded and should be reasonable.

I don't think we should try to remove the double loop. What could be
useful is not using ranges::distance or std::distance for non-sized
sentinels, because what we could do is stop counting after finding
that the range will not fit.

If the remaining capacity is 5 and we try to insert a range of 200
elements, we only need to count to 5 to determine that we haven't
reached the sentinel and so it won't fit. Counting the other 195
elements is wasted work.


>
> On Mon, Sep 21, 2026 at 7:44 PM François Dumont <[email protected]> wrote:
>>
>> Hi
>>
>> I wonder what you think about this patch.
>>
>> Maybe this has already been discuss, sorry if so.
>>
>> If fine I'll try to isolate _S_distance in a testable helper.
>>
>>      libstdc++: Do not loop several times on range given to
>> std::inplace_vector::assign
>>
>>      std::inplace_vector::assign first compute the distance between the
>> input iterators
>>      before running the assignment loop. The distance is computed as
>> long as the input
>>      range is a sized-sentinel or forward iterators. It means that when
>> computing distance
>>      on a forward_list like in the added test the range will be loop
>> through twice.
>>
>>      As inplace_vector do not need reallocation to increase its capacity
>> it seems more
>>      optimal to only get the distance if it can be done in O(1).
>> Otherwise we just loop
>>      through the range and add elements using emplace_back.
>>
>>      libstdc++-v3/ChangeLog:
>>
>>              * include/std/inplace_vector (inplace_vector::_S_distance):
>> Return a distance
>>              only if sized_sentinel_for or iterator is derived from
>> random_access_iterator_tag.
>>              *
>> testsuite/23_containers/inplace_vector/modifiers/assign_forward_list.cc:
>> New test
>>              case. Only checking that the right thing is done but not
>> that it is done with only
>>              one loop on the input range.
>>
>> Quickly tested with the added test case for now.
>>
>> François
>>

Reply via email to