diff options
author | hjk <hjk121@nokiamail.com> | 2013-12-04 14:11:39 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2014-01-09 17:42:22 +0100 |
commit | 48f1ebc0404983381ddd2cc2a3b5ecc1a12785c3 (patch) | |
tree | c4ce914047d693e3b292f7f16a336dfb7193dfd9 /src/corelib/tools/qvarlengtharray.h | |
parent | 3867bc5a10f0b798154025265efacd2f53ace06e (diff) |
Add QVarLengthArray::{indexOf,lastIndexOf,contains} functions
[ChangeLog][QtCore][QVarLengthArray] Added the indexOf, lastIndexOf and
contains functions to QVarLengthArray. These functions make the class
more similar to QVector.
Change-Id: I9bd2b22bd8b7151c2d17aede36e5f2126570600b
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@digia.com>
Reviewed-by: Olivier Goffart <ogoffart@woboq.com>
Diffstat (limited to 'src/corelib/tools/qvarlengtharray.h')
-rw-r--r-- | src/corelib/tools/qvarlengtharray.h | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/src/corelib/tools/qvarlengtharray.h b/src/corelib/tools/qvarlengtharray.h index 309d2a2dca..bfa0bbbbb1 100644 --- a/src/corelib/tools/qvarlengtharray.h +++ b/src/corelib/tools/qvarlengtharray.h @@ -107,6 +107,10 @@ public: inline int capacity() const { return a; } inline void reserve(int size); + inline int indexOf(const T &t, int from = 0) const; + inline int lastIndexOf(const T &t, int from = -1) const; + inline bool contains(const T &t) const; + inline T &operator[](int idx) { Q_ASSERT(idx >= 0 && idx < s); return ptr[idx]; @@ -229,6 +233,51 @@ Q_INLINE_TEMPLATE void QVarLengthArray<T, Prealloc>::reserve(int asize) { if (asize > a) realloc(s, asize); } template <class T, int Prealloc> +Q_INLINE_TEMPLATE int QVarLengthArray<T, Prealloc>::indexOf(const T &t, int from) const +{ + if (from < 0) + from = qMax(from + s, 0); + if (from < s) { + T *n = ptr + from - 1; + T *e = ptr + s; + while (++n != e) + if (*n == t) + return n - ptr; + } + return -1; +} + +template <class T, int Prealloc> +Q_INLINE_TEMPLATE int QVarLengthArray<T, Prealloc>::lastIndexOf(const T &t, int from) const +{ + if (from < 0) + from += s; + else if (from >= s) + from = s - 1; + if (from >= 0) { + T *b = ptr; + T *n = ptr + from + 1; + while (n != b) { + if (*--n == t) + return n - b; + } + } + return -1; +} + +template <class T, int Prealloc> +Q_INLINE_TEMPLATE bool QVarLengthArray<T, Prealloc>::contains(const T &t) const +{ + T *b = ptr; + T *i = ptr + s; + while (i != b) { + if (*--i == t) + return true; + } + return false; +} + +template <class T, int Prealloc> Q_OUTOFLINE_TEMPLATE void QVarLengthArray<T, Prealloc>::append(const T *abuf, int increment) { Q_ASSERT(abuf); |