On Sat, Sep 5, 2026 at 7:29 PM feedable <[email protected]> wrote:
>
>
> On 25/08/2026 13:49, Richard Biener wrote:
> > On Tue, Aug 25, 2026 at 1:27 AM feedable via Sourceware Forge
> > <[email protected]> wrote:
> >> From: feedable <[email protected]>
> >>
> >> gcc/ChangeLog:
> >>
> >> * vec.h (array_slice::contains): New function.
> >> (array_slice::find): New function.
> >> ---
> >> gcc/vec.h | 31 +++++++++++++++++++++++++++++++
> >> 1 file changed, 31 insertions(+)
> >>
> >> diff --git a/gcc/vec.h b/gcc/vec.h
> >> index a2ff7a9b77694..9d25678029832 100644
> >> --- a/gcc/vec.h
> >> +++ b/gcc/vec.h
> >> @@ -2422,6 +2422,15 @@ public:
> >> const value_type &back () const;
> >> const value_type &operator[] (unsigned int i) const;
> >>
> >> + /* Check if there is an element equal to V exists in the array. */
> >> + template<class U>
> >> + bool contains (const U &v);
> >> +
> >> + /* Check if there is an element in the array that satisfies the
> >> predicate
> >> + PRED. */
> >> + template<class F>
> >> + bool find (const F &pred);
> > Both should have a big fat warning that these are O(n) operations and use
> > is discouraged. So ... you need those? Absolutely?
> Yes, these functions are basically just me extracting loops from RA into
> the functions here. Those uses want to be linear in complexity, and that
> is logical and should be expected of an unsorted vector.
I see. vec<>::find does not exist though, I'd like to keep symmetry between
vec<> and array_slice<>. Also ...
> >> +
> >> unsigned size () const { return m_size; }
> >> size_t size_bytes () const { return m_size * sizeof (T); }
> >> bool empty () const { return m_size == 0; }
> >> @@ -2486,6 +2495,28 @@ array_slice<T>::operator[] (unsigned int i) const
> >> return m_base[i];
> >> }
> >>
> >> +template<typename T>
> >> +template<typename U>
> >> +bool
> >> +array_slice<T>::contains (const U &v)
vec<> gets away with a single template parameter, why
do you need T != U?
> >> +{
> >> + for (const auto &x : *this)
> >> + if (v == x)
> >> + return true;
> >> + return false;
> >> +}
> >> +
> >> +template<typename T>
> >> +template<typename F>
> >> +bool
> >> +array_slice<T>::find (const F &pred)
Similarly, IMO we should constrain F by a signature like
::find (bool (*pred) (const T&))
matching vec::bsearch and friends.
> >> +{
> >> + for (const auto &x : *this)
> >> + if (pred (x))
> >> + return true;
> >> + return false;
> >> +}
> >> +
> >> template<typename T>
> >> array_slice<T>
> >> make_array_slice (T *base, unsigned int size)
> >> --
> >> 2.54.0
> >>