49 template <
class ObjectClass,
class TypeOfCriticalSectionToUse = DummyCriticalSection>
65 values.addArray (other.begin(), other.size());
69 o->incReferenceCount();
74 : values (std::move (other.values))
79 template <
class OtherObjectClass,
class OtherCriticalSection>
83 values.addArray (other.begin(), other.size());
87 o->incReferenceCount();
96 auto otherCopy = other;
104 template <
class OtherObjectClass>
107 auto otherCopy = other;
116 values = std::move (other.values);
136 values.setAllocatedSize (0);
150 inline int size() const noexcept
152 return values.size();
196 return values.getValueWithDefault (index);
205 return values[index];
216 return values.getFirst();
227 return values.getLast();
236 return values.begin();
243 inline ObjectClass**
begin() noexcept
245 return values.begin();
251 inline ObjectClass*
const*
begin() const noexcept
253 return values.begin();
259 inline ObjectClass**
end() noexcept
267 inline ObjectClass*
const*
end() const noexcept
275 inline ObjectClass**
data() noexcept
283 inline ObjectClass*
const*
data() const noexcept
294 int indexOf (
const ObjectClass* objectToLookFor)
const noexcept
297 auto* e = values.begin();
298 auto* endPointer = values.end();
300 while (e != endPointer)
302 if (objectToLookFor == *e)
303 return static_cast<int> (e - values.begin());
323 bool contains (
const ObjectClass* objectToLookFor)
const noexcept
326 auto* e = values.begin();
327 auto* endPointer = values.end();
329 while (e != endPointer)
331 if (objectToLookFor == *e)
354 ObjectClass*
add (ObjectClass* newObject)
357 values.add (newObject);
359 if (newObject !=
nullptr)
360 newObject->incReferenceCount();
387 ObjectClass*
insert (
int indexToInsertAt, ObjectClass* newObject)
389 values.insert (indexToInsertAt, newObject, 1);
391 if (newObject !=
nullptr)
392 newObject->incReferenceCount();
453 void set (
int indexToChange, ObjectClass* newObject)
455 if (indexToChange >= 0)
459 if (newObject !=
nullptr)
460 newObject->incReferenceCount();
462 if (indexToChange < values.size())
464 auto* e = values[indexToChange];
465 values[indexToChange] = newObject;
470 values.add (newObject);
500 int numElementsToAdd = -1) noexcept
507 auto numElementsAdded = values.addArray (arrayToAddFrom.values, startIndex, numElementsToAdd);
508 auto** e = values.end();
510 for (
int i = 0; i < numElementsAdded; ++i)
511 (*(--e))->incReferenceCount();
527 template <
class ElementComparator>
528 int addSorted (ElementComparator& comparator, ObjectClass* newObject) noexcept
531 auto index = findInsertIndexInSortedArray (comparator, values.begin(), newObject, 0, values.size());
532 insert (index, newObject);
541 template <
class ElementComparator>
545 auto index = findInsertIndexInSortedArray (comparator, values.begin(), newObject, 0, values.size());
547 if (index > 0 && comparator.compareElements (newObject, values[index - 1]) == 0)
548 set (index - 1, newObject);
550 insert (index, newObject);
565 template <
class ElementComparator>
567 const ObjectClass* objectToLookFor)
const noexcept
569 ignoreUnused (comparator);
571 int s = 0, e = values.size();
575 if (comparator.compareElements (objectToLookFor, values[s]) == 0)
578 auto halfway = (s + e) / 2;
583 if (comparator.compareElements (objectToLookFor, values[halfway]) >= 0)
610 if (isPositiveAndBelow (indexToRemove, values.size()))
612 auto* e = *(values.begin() + indexToRemove);
613 values.removeElements (indexToRemove, 1);
616 if ((values.size() << 1) < values.capacity())
635 if (isPositiveAndBelow (indexToRemove, values.size()))
637 auto* e = *(values.begin() + indexToRemove);
639 values.removeElements (indexToRemove, 1);
642 if ((values.size() << 1) < values.capacity())
692 startIndex = jlimit (0, values.size(), startIndex);
693 auto endIndex = jlimit (0, values.size(), startIndex + numberToRemove);
694 numberToRemove = endIndex - startIndex;
696 if (numberToRemove > 0)
699 objectsToRemove.
addArray (values.begin() + startIndex, numberToRemove);
701 values.removeElements (startIndex, numberToRemove);
703 for (
auto& o : objectsToRemove)
706 if ((values.size() << 1) < values.capacity())
723 if (howManyToRemove > values.size())
724 howManyToRemove = values.size();
726 while (--howManyToRemove >= 0)
727 remove (values.size() - 1);
735 void swap (
int index1,
int index2) noexcept
739 if (isPositiveAndBelow (index1, values.size())
740 && isPositiveAndBelow (index2, values.size()))
742 std::swap (values[index1], values[index2]);
759 void move (
int currentIndex,
int newIndex) noexcept
761 if (currentIndex != newIndex)
764 values.move (currentIndex, newIndex);
774 template <
class OtherArrayType>
775 void swapWith (OtherArrayType& otherArray) noexcept
778 const typename OtherArrayType::ScopedLockType lock2 (otherArray.getLock());
779 values.swapWith (otherArray.values);
791 return values == other.values;
830 template <
class ElementComparator>
831 void sort (ElementComparator& comparator,
832 bool retainOrderOfEquivalentItems =
false) noexcept
836 ignoreUnused (comparator);
839 sortArray (comparator, values.begin(), 0, values.size() - 1, retainOrderOfEquivalentItems);
852 values.shrinkToNoMoreThan (values.size());
864 values.ensureAllocatedSize (minNumElements);
872 inline const TypeOfCriticalSectionToUse&
getLock() const noexcept {
return values; }
888 void releaseAllObjects()
890 auto i = values.size();
895 values.removeElements (i, 1);
900 static void releaseObject (ObjectClass* o)
902 if (o !=
nullptr && o->decReferenceCountWithoutDeleting())
903 ContainerDeletePolicy<ObjectClass>::destroy (o);
void addArray(const Type *elementsToAdd, int numElementsToAdd)
ObjectClass ** data() noexcept
ReferenceCountedArray(ReferenceCountedArray &&other) noexcept
ObjectClass *const * end() const noexcept
bool isEmpty() const noexcept
int indexOf(const ObjectClass *objectToLookFor) const noexcept
ReferenceCountedArray(const ReferenceCountedArray &other) noexcept
int size() const noexcept
void removeLast(int howManyToRemove=1)
void minimiseStorageOverheads() noexcept
void set(int indexToChange, ObjectClass *newObject)
ObjectClass *const * begin() const noexcept
ReferenceCountedArray()=default
ObjectClass * add(ObjectClass *newObject)
ObjectClass * add(const ObjectClassPtr &newObject)
bool operator!=(const ReferenceCountedArray< ObjectClass, TypeOfCriticalSectionToUse > &other) const noexcept
const TypeOfCriticalSectionToUse & getLock() const noexcept
int indexOfSorted(ElementComparator &comparator, const ObjectClass *objectToLookFor) const noexcept
typename TypeOfCriticalSectionToUse::ScopedLockType ScopedLockType
bool addIfNotAlreadyThere(ObjectClass *newObject)
ObjectClassPtr operator[](int index) const noexcept
void remove(int indexToRemove)
void sort(ElementComparator &comparator, bool retainOrderOfEquivalentItems=false) noexcept
ObjectClass ** begin() noexcept
ReferenceCountedArray(const ReferenceCountedArray< OtherObjectClass, OtherCriticalSection > &other) noexcept
ObjectClass ** getRawDataPointer() const noexcept
bool operator==(const ReferenceCountedArray &other) const noexcept
void removeObject(ObjectClass *objectToRemove)
ObjectClass * getObjectPointerUnchecked(int index) const noexcept
ObjectClass * getObjectPointer(int index) const noexcept
void swap(int index1, int index2) noexcept
ObjectClassPtr getFirst() const noexcept
void ensureStorageAllocated(const int minNumElements)
void set(int indexToChange, const ObjectClassPtr &newObject)
ObjectClassPtr getUnchecked(int index) const noexcept
void addOrReplaceSorted(ElementComparator &comparator, ObjectClass *newObject) noexcept
bool contains(const ObjectClass *objectToLookFor) const noexcept
void removeRange(int startIndex, int numberToRemove)
void move(int currentIndex, int newIndex) noexcept
ObjectClassPtr removeAndReturn(int indexToRemove)
ObjectClass ** end() noexcept
bool contains(const ObjectClassPtr &objectToLookFor) const noexcept
ObjectClass * insert(int indexToInsertAt, ObjectClass *newObject)
ObjectClass * insert(int indexToInsertAt, const ObjectClassPtr &newObject)
void swapWith(OtherArrayType &otherArray) noexcept
bool addIfNotAlreadyThere(const ObjectClassPtr &newObject)
ReferenceCountedArray & operator=(const ReferenceCountedArray &other) noexcept
int addSorted(ElementComparator &comparator, ObjectClass *newObject) noexcept
int indexOf(const ObjectClassPtr &objectToLookFor) const noexcept
ObjectClassPtr getLast() const noexcept
void addArray(const ReferenceCountedArray &arrayToAddFrom, int startIndex=0, int numElementsToAdd=-1) noexcept
ObjectClass *const * data() const noexcept
void removeObject(const ObjectClassPtr &objectToRemove)
ReferencedType * get() const noexcept