Add setSharable support to SimpleVector
Change-Id: I606064d86b58be1a6a57f64f4eb55a4a751a0811 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
This commit is contained in:
parent
cb0cdf6c08
commit
25b8b2437c
@ -89,6 +89,9 @@ public:
|
|||||||
bool isStatic() const { return d->ref.isStatic(); }
|
bool isStatic() const { return d->ref.isStatic(); }
|
||||||
bool isShared() const { return d->ref.isShared(); }
|
bool isShared() const { return d->ref.isShared(); }
|
||||||
bool isSharedWith(const SimpleVector &other) const { return d == other.d; }
|
bool isSharedWith(const SimpleVector &other) const { return d == other.d; }
|
||||||
|
bool isSharable() const { return d->ref.isSharable(); }
|
||||||
|
|
||||||
|
void setSharable(bool sharable) { d.setSharable(sharable); }
|
||||||
|
|
||||||
size_t size() const { return d->size; }
|
size_t size() const { return d->size; }
|
||||||
size_t capacity() const { return d->alloc; }
|
size_t capacity() const { return d->alloc; }
|
||||||
@ -139,7 +142,7 @@ public:
|
|||||||
if (n > capacity()
|
if (n > capacity()
|
||||||
|| (n
|
|| (n
|
||||||
&& !d->capacityReserved
|
&& !d->capacityReserved
|
||||||
&& (d->ref != 1 || (d->capacityReserved = 1, false)))) {
|
&& (d->ref.isShared() || (d->capacityReserved = 1, false)))) {
|
||||||
SimpleVector detached(Data::allocate(n,
|
SimpleVector detached(Data::allocate(n,
|
||||||
d->detachFlags() | Data::CapacityReserved));
|
d->detachFlags() | Data::CapacityReserved));
|
||||||
detached.d->copyAppend(constBegin(), constEnd());
|
detached.d->copyAppend(constBegin(), constEnd());
|
||||||
@ -158,7 +161,7 @@ public:
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
T *const begin = d->begin();
|
T *const begin = d->begin();
|
||||||
if (d->ref != 1
|
if (d->ref.isShared()
|
||||||
|| capacity() - size() < size_t(last - first)) {
|
|| capacity() - size() < size_t(last - first)) {
|
||||||
SimpleVector detached(Data::allocate(
|
SimpleVector detached(Data::allocate(
|
||||||
qMax(capacity(), size() + (last - first)),
|
qMax(capacity(), size() + (last - first)),
|
||||||
@ -179,7 +182,7 @@ public:
|
|||||||
if (first == last)
|
if (first == last)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (d->ref != 1
|
if (d->ref.isShared()
|
||||||
|| capacity() - size() < size_t(last - first)) {
|
|| capacity() - size() < size_t(last - first)) {
|
||||||
SimpleVector detached(Data::allocate(
|
SimpleVector detached(Data::allocate(
|
||||||
qMax(capacity(), size() + (last - first)),
|
qMax(capacity(), size() + (last - first)),
|
||||||
@ -219,7 +222,7 @@ public:
|
|||||||
T *const begin = d->begin();
|
T *const begin = d->begin();
|
||||||
T *const where = begin + position;
|
T *const where = begin + position;
|
||||||
const T *const end = begin + d->size;
|
const T *const end = begin + d->size;
|
||||||
if (d->ref != 1
|
if (d->ref.isShared()
|
||||||
|| capacity() - size() < size_t(last - first)) {
|
|| capacity() - size() < size_t(last - first)) {
|
||||||
SimpleVector detached(Data::allocate(
|
SimpleVector detached(Data::allocate(
|
||||||
qMax(capacity(), size() + (last - first)),
|
qMax(capacity(), size() + (last - first)),
|
||||||
|
@ -292,6 +292,15 @@ void tst_QArrayData::simpleVector()
|
|||||||
QVERIFY(!v7.isShared());
|
QVERIFY(!v7.isShared());
|
||||||
QVERIFY(!v8.isShared());
|
QVERIFY(!v8.isShared());
|
||||||
|
|
||||||
|
QVERIFY(v1.isSharable());
|
||||||
|
QVERIFY(v2.isSharable());
|
||||||
|
QVERIFY(v3.isSharable());
|
||||||
|
QVERIFY(v4.isSharable());
|
||||||
|
QVERIFY(v5.isSharable());
|
||||||
|
QVERIFY(v6.isSharable());
|
||||||
|
QVERIFY(v7.isSharable());
|
||||||
|
QVERIFY(v8.isSharable());
|
||||||
|
|
||||||
QVERIFY(v1.isSharedWith(v2));
|
QVERIFY(v1.isSharedWith(v2));
|
||||||
QVERIFY(v1.isSharedWith(v3));
|
QVERIFY(v1.isSharedWith(v3));
|
||||||
QVERIFY(!v1.isSharedWith(v4));
|
QVERIFY(!v1.isSharedWith(v4));
|
||||||
@ -451,6 +460,69 @@ void tst_QArrayData::simpleVector()
|
|||||||
|
|
||||||
for (int i = 0; i < 120; ++i)
|
for (int i = 0; i < 120; ++i)
|
||||||
QCOMPARE(v1[i], v8[i % 10]);
|
QCOMPARE(v1[i], v8[i % 10]);
|
||||||
|
|
||||||
|
{
|
||||||
|
v7.setSharable(true);
|
||||||
|
QVERIFY(v7.isSharable());
|
||||||
|
|
||||||
|
SimpleVector<int> copy1(v7);
|
||||||
|
QVERIFY(copy1.isSharedWith(v7));
|
||||||
|
|
||||||
|
v7.setSharable(false);
|
||||||
|
QVERIFY(!v7.isSharable());
|
||||||
|
|
||||||
|
QVERIFY(!copy1.isSharedWith(v7));
|
||||||
|
QCOMPARE(v7.size(), copy1.size());
|
||||||
|
for (size_t i = 0; i < copy1.size(); ++i)
|
||||||
|
QCOMPARE(v7[i], copy1[i]);
|
||||||
|
|
||||||
|
SimpleVector<int> clone(v7);
|
||||||
|
QVERIFY(!clone.isSharedWith(v7));
|
||||||
|
QCOMPARE(clone.size(), copy1.size());
|
||||||
|
for (size_t i = 0; i < copy1.size(); ++i)
|
||||||
|
QCOMPARE(clone[i], copy1[i]);
|
||||||
|
|
||||||
|
v7.setSharable(true);
|
||||||
|
QVERIFY(v7.isSharable());
|
||||||
|
|
||||||
|
SimpleVector<int> copy2(v7);
|
||||||
|
QVERIFY(copy2.isSharedWith(v7));
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
SimpleVector<int> null;
|
||||||
|
SimpleVector<int> empty(0, 5);
|
||||||
|
|
||||||
|
QVERIFY(null.isSharable());
|
||||||
|
QVERIFY(empty.isSharable());
|
||||||
|
|
||||||
|
null.setSharable(true);
|
||||||
|
empty.setSharable(true);
|
||||||
|
|
||||||
|
QVERIFY(null.isSharable());
|
||||||
|
QVERIFY(empty.isSharable());
|
||||||
|
|
||||||
|
QVERIFY(null.isEmpty());
|
||||||
|
QVERIFY(empty.isEmpty());
|
||||||
|
|
||||||
|
null.setSharable(false);
|
||||||
|
empty.setSharable(false);
|
||||||
|
|
||||||
|
QVERIFY(!null.isSharable());
|
||||||
|
QVERIFY(!empty.isSharable());
|
||||||
|
|
||||||
|
QVERIFY(null.isEmpty());
|
||||||
|
QVERIFY(empty.isEmpty());
|
||||||
|
|
||||||
|
null.setSharable(true);
|
||||||
|
empty.setSharable(true);
|
||||||
|
|
||||||
|
QVERIFY(null.isSharable());
|
||||||
|
QVERIFY(empty.isSharable());
|
||||||
|
|
||||||
|
QVERIFY(null.isEmpty());
|
||||||
|
QVERIFY(empty.isEmpty());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Deallocator
|
struct Deallocator
|
||||||
|
Loading…
x
Reference in New Issue
Block a user