Commit 12e109d1 by Trevor Saunders Committed by Trevor Saunders

add some utility methods to vec

gcc/ChangeLog:

2016-04-24  Trevor Saunders  <tbsaunde+gcc@tbsaunde.org>

	* vec.h (vec_safe_contains): New function.
	(vec::contains): Likewise.
	(vec::begin): Likewise.
	(vec::end): Likewise.

From-SVN: r235392
parent dc3d45f2
2016-04-24 Trevor Saunders <tbsaunde+gcc@tbsaunde.org>
* vec.h (vec_safe_contains): New function.
(vec::contains): Likewise.
(vec::begin): Likewise.
(vec::end): Likewise.
2016-04-23 Jakub Jelinek <jakub@redhat.com> 2016-04-23 Jakub Jelinek <jakub@redhat.com>
PR sanitizer/70712 PR sanitizer/70712
......
...@@ -454,6 +454,10 @@ public: ...@@ -454,6 +454,10 @@ public:
bool is_empty (void) const { return m_vecpfx.m_num == 0; } bool is_empty (void) const { return m_vecpfx.m_num == 0; }
T *address (void) { return m_vecdata; } T *address (void) { return m_vecdata; }
const T *address (void) const { return m_vecdata; } const T *address (void) const { return m_vecdata; }
T *begin () { return address (); }
const T *begin () const { return address (); }
T *end () { return address () + length (); }
const T *end () const { return address () + length (); }
const T &operator[] (unsigned) const; const T &operator[] (unsigned) const;
T &operator[] (unsigned); T &operator[] (unsigned);
T &last (void); T &last (void);
...@@ -473,6 +477,7 @@ public: ...@@ -473,6 +477,7 @@ public:
void qsort (int (*) (const void *, const void *)); void qsort (int (*) (const void *, const void *));
T *bsearch (const void *key, int (*compar)(const void *, const void *)); T *bsearch (const void *key, int (*compar)(const void *, const void *));
unsigned lower_bound (T, bool (*)(const T &, const T &)) const; unsigned lower_bound (T, bool (*)(const T &, const T &)) const;
bool contains (const T &search) const;
static size_t embedded_size (unsigned); static size_t embedded_size (unsigned);
void embedded_init (unsigned, unsigned = 0, unsigned = 0); void embedded_init (unsigned, unsigned = 0, unsigned = 0);
void quick_grow (unsigned len); void quick_grow (unsigned len);
...@@ -542,7 +547,6 @@ vec_safe_is_empty (vec<T, A, vl_embed> *v) ...@@ -542,7 +547,6 @@ vec_safe_is_empty (vec<T, A, vl_embed> *v)
return v ? v->is_empty () : true; return v ? v->is_empty () : true;
} }
/* If V does not have space for NELEMS elements, call /* If V does not have space for NELEMS elements, call
V->reserve(NELEMS, EXACT). */ V->reserve(NELEMS, EXACT). */
template<typename T, typename A> template<typename T, typename A>
...@@ -695,6 +699,15 @@ vec_safe_splice (vec<T, A, vl_embed> *&dst, const vec<T, A, vl_embed> *src ...@@ -695,6 +699,15 @@ vec_safe_splice (vec<T, A, vl_embed> *&dst, const vec<T, A, vl_embed> *src
} }
} }
/* Return true if SEARCH is an element of V. Note that this is O(N) in the
size of the vector and so should be used with care. */
template<typename T, typename A>
inline bool
vec_safe_contains (vec<T, A, vl_embed> *v, const T &search)
{
return v ? v->contains (search) : false;
}
/* Index into vector. Return the IX'th element. IX must be in the /* Index into vector. Return the IX'th element. IX must be in the
domain of the vector. */ domain of the vector. */
...@@ -973,6 +986,20 @@ vec<T, A, vl_embed>::bsearch (const void *key, ...@@ -973,6 +986,20 @@ vec<T, A, vl_embed>::bsearch (const void *key,
return NULL; return NULL;
} }
/* Return true if SEARCH is an element of V. Note that this is O(N) in the
size of the vector and so should be used with care. */
template<typename T, typename A>
inline bool
vec<T, A, vl_embed>::contains (const T &search) const
{
unsigned int len = length ();
for (unsigned int i = 0; i < len; i++)
if ((*this)[i] == search)
return true;
return false;
}
/* Find and return the first position in which OBJ could be inserted /* Find and return the first position in which OBJ could be inserted
without changing the ordering of this vector. LESSTHAN is a without changing the ordering of this vector. LESSTHAN is a
...@@ -1167,6 +1194,10 @@ public: ...@@ -1167,6 +1194,10 @@ public:
const T *address (void) const const T *address (void) const
{ return m_vec ? m_vec->m_vecdata : NULL; } { return m_vec ? m_vec->m_vecdata : NULL; }
T *begin () { return address (); }
const T *begin () const { return address (); }
T *end () { return begin () + length (); }
const T *end () const { return begin () + length (); }
const T &operator[] (unsigned ix) const const T &operator[] (unsigned ix) const
{ return (*m_vec)[ix]; } { return (*m_vec)[ix]; }
...@@ -1208,6 +1239,7 @@ public: ...@@ -1208,6 +1239,7 @@ public:
void qsort (int (*) (const void *, const void *)); void qsort (int (*) (const void *, const void *));
T *bsearch (const void *key, int (*compar)(const void *, const void *)); T *bsearch (const void *key, int (*compar)(const void *, const void *));
unsigned lower_bound (T, bool (*)(const T &, const T &)) const; unsigned lower_bound (T, bool (*)(const T &, const T &)) const;
bool contains (const T &search) const;
bool using_auto_storage () const; bool using_auto_storage () const;
...@@ -1695,6 +1727,16 @@ vec<T, va_heap, vl_ptr>::lower_bound (T obj, ...@@ -1695,6 +1727,16 @@ vec<T, va_heap, vl_ptr>::lower_bound (T obj,
return m_vec ? m_vec->lower_bound (obj, lessthan) : 0; return m_vec ? m_vec->lower_bound (obj, lessthan) : 0;
} }
/* Return true if SEARCH is an element of V. Note that this is O(N) in the
size of the vector and so should be used with care. */
template<typename T>
inline bool
vec<T, va_heap, vl_ptr>::contains (const T &search) const
{
return m_vec ? m_vec->contains (search) : false;
}
template<typename T> template<typename T>
inline bool inline bool
vec<T, va_heap, vl_ptr>::using_auto_storage () const vec<T, va_heap, vl_ptr>::using_auto_storage () const
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment