diff options
Diffstat (limited to 'src/corelib/tools/qarraydatapointer.h')
-rw-r--r-- | src/corelib/tools/qarraydatapointer.h | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/src/corelib/tools/qarraydatapointer.h b/src/corelib/tools/qarraydatapointer.h index 0d072a510e..f1cd1dc4b1 100644 --- a/src/corelib/tools/qarraydatapointer.h +++ b/src/corelib/tools/qarraydatapointer.h @@ -121,7 +121,31 @@ public: d = Data::sharedEmpty(); } + bool detach() + { + if (d->ref.isShared()) { + Data *copy = clone(); + QArrayDataPointer old(d); + d = copy; + return true; + } + + return false; + } + private: + Data *clone() const Q_REQUIRED_RESULT + { + QArrayDataPointer copy(Data::allocate(d->alloc ? d->alloc : d->size, + d->capacityReserved)); + if (d->size) + copy->copyAppend(d->begin(), d->end()); + + Data *result = copy.d; + copy.d = Data::sharedNull(); + return result; + } + Data *d; }; |