Re: [PATCH v1 04/10] gdb support: add gdb::replace algorithm for iterators and ranges
Matthieu Longo <[email protected]> Mon, 27 Jul 2026 15:58:01 +0100
| Newsgroups | gmane.comp.gdb.patches |
|---|---|
| Message-ID | <[email protected]> |
On 21/07/2026 22:33, Luis wrote:
> Drive-by review, and C++20 issues aside.
>
> On 07/07/2026 16:48, Matthieu Longo wrote:
>> Add a gdb::replace helper that mirrors the behavior of std::replace
>> for iterator pairs, together with a convenience overload accepting a
>> range.
>>
>> This provides a C++17-compatible replacement for the C++20 std::replace/
>> std::ranges::replace algorithms, allowing callers to use a consistent
>> interface until GDB transitions to C++20. The helpers should be removed
>> once the C++ standard library implementations become available.
>> ---
>> gdbsupport/array-view.h | 26 ++++++++++++++++++++++++++
>> 1 file changed, 26 insertions(+)
>>
>> diff --git a/gdbsupport/array-view.h b/gdbsupport/array-view.h
>> index 8431d7f5add..61119d7a8e2 100644
>> --- a/gdbsupport/array-view.h
>> +++ b/gdbsupport/array-view.h
>> @@ -225,6 +225,32 @@ void copy (gdb::array_view<U> src, gdb::array_view<T> dest)
>> std::copy_backward (src.begin (), src.end (), dest.end ());
>> }
>> +/* Replace all occurrences of a value in the provided range.
>> +
>> + Note: this helper is a reimplementation of std::replace, only available
>> + from C++20 onwards, and consequently, should be removed once we switch
>> + to C++20. */
>> +
>> +template <class ForwardIt, typename T>
>> +void replace (ForwardIt first, ForwardIt last,
>> + const T &old_value, const T &new_value)
>> +{
>> + for (auto it = first; it != last; ++it)
>> + {
>> + if (*it == old_value)
>> + *it = new_value;
>> + }
>
> Formatting: Identation of the braces is off.
>
This code will disappear in the next revision.
>> +}
>> +
>> +/* Replace all occurrences of a value in the provided array view.
>> + Note: from C++20 onwards, std::ranges::replace should be used instead. */
>> +
>> +template <class Range, typename T>
>> +void replace (Range r, const T &old_value, const T &new_value)
>> +{
>> + replace (r.begin (), r.end (), old_value, new_value);
Replaced by std::replace (r.begin (), r.end (), old_value, new_value);
>> +}
>> +
>> /* Compare LHS and RHS for (deep) equality. That is, whether LHS and
>> RHS have the same sizes, and whether each pair of elements of LHS
>> and RHS at the same position compares equal. */
>
Matthieu