From 5a447502b539c10a399f9d6579efbae6ef5ca9f0 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Thu, 31 May 2012 12:35:39 +0200 Subject: [PATCH] Fix the QVector build with C++11 initialiser lists MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Initialiser lists were not tested before in the QVector rewrite, so the older malloc call was left behind. Also, std::initializer_list has const iterators returning const data and broke the build in a few places where const qualifiers were missing. Change-Id: I3c04e58361989aa7438621cda63c7df457d7dad8 Reviewed-by: Jędrzej Nowacki --- src/corelib/tools/qarraydata.h | 4 ++-- src/corelib/tools/qvector.h | 6 +++--- tests/auto/corelib/tools/qarraydata/simplevector.h | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/corelib/tools/qarraydata.h b/src/corelib/tools/qarraydata.h index 86ad762060..e9f70bcf27 100644 --- a/src/corelib/tools/qarraydata.h +++ b/src/corelib/tools/qarraydata.h @@ -190,9 +190,9 @@ struct QTypedArrayData inline bool operator>(const const_iterator& other) const { return i > other.i; } inline bool operator>=(const const_iterator& other) const { return i >= other.i; } inline const_iterator &operator++() { ++i; return *this; } - inline const_iterator operator++(int) { T *n = i; ++i; return n; } + inline const_iterator operator++(int) { const T *n = i; ++i; return n; } inline const_iterator &operator--() { i--; return *this; } - inline const_iterator operator--(int) { T *n = i; i--; return n; } + inline const_iterator operator--(int) { const T *n = i; i--; return n; } inline const_iterator &operator+=(int j) { i+=j; return *this; } inline const_iterator &operator-=(int j) { i-=j; return *this; } inline const_iterator operator+(int j) const { return const_iterator(i+j); } diff --git a/src/corelib/tools/qvector.h b/src/corelib/tools/qvector.h index 06c269b8dc..88a6744d11 100644 --- a/src/corelib/tools/qvector.h +++ b/src/corelib/tools/qvector.h @@ -223,7 +223,7 @@ private: void realloc(const int size, const int alloc, QArrayData::AllocationOptions options = QArrayData::Default); void free(Data *d); void defaultConstruct(T *from, T *to); - void copyConstruct(T *srcFrom, T *srcTo, T *dstFrom); + void copyConstruct(const T *srcFrom, const T *srcTo, T *dstFrom); void destruct(T *from, T *to); class AlignmentDummy { Data header; T array[1]; }; @@ -250,7 +250,7 @@ void QVector::defaultConstruct(T *from, T *to) #endif template -void QVector::copyConstruct(T *srcFrom, T *srcTo, T *dstFrom) +void QVector::copyConstruct(const T *srcFrom, const T *srcTo, T *dstFrom) { if (QTypeInfo::isComplex) { while (srcFrom != srcTo) @@ -412,7 +412,7 @@ QVector::QVector(int asize, const T &t) template QVector::QVector(std::initializer_list args) { - d = malloc(int(args.size())); + d = Data::allocate(args.size()); // std::initializer_list::iterator is guaranteed to be // const T* ([support.initlist]/1), so can be memcpy'ed away from by copyConstruct copyConstruct(args.begin(), args.end(), d->begin()); diff --git a/tests/auto/corelib/tools/qarraydata/simplevector.h b/tests/auto/corelib/tools/qarraydata/simplevector.h index 7e679704c8..f708fc12d1 100644 --- a/tests/auto/corelib/tools/qarraydata/simplevector.h +++ b/tests/auto/corelib/tools/qarraydata/simplevector.h @@ -111,8 +111,8 @@ public: iterator begin() { detach(); return d->begin(); } iterator end() { detach(); return d->end(); } - const_iterator begin() const { return d->begin(); } - const_iterator end() const { return d->end(); } + const_iterator begin() const { return d->constBegin(); } + const_iterator end() const { return d->constEnd(); } const_iterator constBegin() const { return begin(); } const_iterator constEnd() const { return end(); }