53 template <
class ObjectClass,
class TypeOfCriticalSectionToUse = DummyCriticalSection>
69 values.addArray (other.begin(), other.size());
73 o->incReferenceCount();
78 : values (std::move (other.values))
83 template <
class OtherObjectClass,
class OtherCriticalSection>
87 values.addArray (other.begin(), other.size());
91 o->incReferenceCount();
100 auto otherCopy = other;
108 template <
class OtherObjectClass>
111 auto otherCopy = other;
120 values = std::move (other.values);
140 values.setAllocatedSize (0);
154 inline int size() const noexcept
156 return values.size();
200 return values.getValueWithDefault (index);
209 return values[index];
220 return values.getFirst();
231 return values.getLast();
240 return values.begin();
247 inline ObjectClass**
begin() const noexcept
249 return values.begin();
255 inline ObjectClass**
end() const noexcept
263 inline ObjectClass**
data() const noexcept
274 int indexOf (
const ObjectClass* objectToLookFor)
const noexcept
277 auto** e = values.begin();
278 auto** endPointer = values.end();
280 while (e != endPointer)
282 if (objectToLookFor == *e)
283 return static_cast<int> (e - values.begin());
303 bool contains (
const ObjectClass* objectToLookFor)
const noexcept
306 auto** e = values.begin();
307 auto** endPointer = values.end();
309 while (e != endPointer)
311 if (objectToLookFor == *e)
334 ObjectClass*
add (ObjectClass* newObject)
337 values.add (newObject);
339 if (newObject !=
nullptr)
340 newObject->incReferenceCount();
367 ObjectClass*
insert (
int indexToInsertAt, ObjectClass* newObject)
369 values.insert (indexToInsertAt, newObject, 1);
371 if (newObject !=
nullptr)
372 newObject->incReferenceCount();
433 void set (
int indexToChange, ObjectClass* newObject)
435 if (indexToChange >= 0)
439 if (newObject !=
nullptr)
440 newObject->incReferenceCount();
442 if (indexToChange < values.size())
444 releaseObject (values[indexToChange]);
445 values[indexToChange] = newObject;
449 values.add (newObject);
465 int numElementsToAdd = -1) noexcept
472 auto numElementsAdded = values.addArray (arrayToAddFrom.values, startIndex, numElementsToAdd);
473 auto** e = values.end();
475 for (
int i = 0; i < numElementsAdded; ++i)
476 (*(--e))->incReferenceCount();
492 template <
class ElementComparator>
493 int addSorted (ElementComparator& comparator, ObjectClass* newObject) noexcept
496 auto index = findInsertIndexInSortedArray (comparator, values.begin(), newObject, 0, values.size());
497 insert (index, newObject);
506 template <
class ElementComparator>
510 auto index = findInsertIndexInSortedArray (comparator, values.begin(), newObject, 0, values.size());
512 if (index > 0 && comparator.compareElements (newObject, values[index - 1]) == 0)
513 set (index - 1, newObject);
515 insert (index, newObject);
530 template <
class ElementComparator>
532 const ObjectClass* objectToLookFor)
const noexcept
534 ignoreUnused (comparator);
536 int s = 0, e = values.size();
540 if (comparator.compareElements (objectToLookFor, values[s]) == 0)
543 auto halfway = (s + e) / 2;
548 if (comparator.compareElements (objectToLookFor, values[halfway]) >= 0)
571 void remove (
int indexToRemove)
575 if (isPositiveAndBelow (indexToRemove, values.size()))
577 auto** e = values.begin() + indexToRemove;
579 values.removeElements (indexToRemove, 1);
581 if ((values.size() << 1) < values.capacity())
600 if (isPositiveAndBelow (indexToRemove, values.size()))
602 auto** e = values.begin() + indexToRemove;
605 values.removeElements (indexToRemove, 1);
607 if ((values.size() << 1) < values.capacity())
625 remove (
indexOf (objectToRemove));
657 startIndex = jlimit (0, values.size(), startIndex);
658 auto endIndex = jlimit (0, values.size(), startIndex + numberToRemove);
659 numberToRemove = endIndex - startIndex;
661 if (numberToRemove > 0)
663 for (
int i = startIndex; i < endIndex; ++i)
665 releaseObject (values[i]);
669 values.removeElements (startIndex, numberToRemove);
671 if ((values.size() << 1) < values.capacity())
688 if (howManyToRemove > values.size())
689 howManyToRemove = values.size();
691 while (--howManyToRemove >= 0)
692 remove (values.size() - 1);
700 void swap (
int index1,
int index2) noexcept
704 if (isPositiveAndBelow (index1, values.size())
705 && isPositiveAndBelow (index2, values.size()))
707 std::swap (values[index1], values[index2]);
724 void move (
int currentIndex,
int newIndex) noexcept
726 if (currentIndex != newIndex)
729 values.move (currentIndex, newIndex);
739 template <
class OtherArrayType>
740 void swapWith (OtherArrayType& otherArray) noexcept
743 const typename OtherArrayType::ScopedLockType lock2 (otherArray.getLock());
744 values.swapWith (otherArray.values);
756 return values == other.values;
795 template <
class ElementComparator>
796 void sort (ElementComparator& comparator,
797 bool retainOrderOfEquivalentItems =
false) const noexcept
801 ignoreUnused (comparator);
804 sortArray (comparator, values.begin(), 0, values.size() - 1, retainOrderOfEquivalentItems);
817 values.shrinkToNoMoreThan (values.size());
829 values.ensureAllocatedSize (minNumElements);
837 inline const TypeOfCriticalSectionToUse&
getLock() const noexcept {
return values; }
853 void releaseAllObjects()
855 for (
auto& v : values)
861 static void releaseObject (ObjectClass* o)
863 if (o !=
nullptr && o->decReferenceCountWithoutDeleting())
const TypeOfCriticalSectionToUse & getLock() const noexcept
Returns the CriticalSection that locks this array.
ObjectClass * getObjectPointerUnchecked(int index) const noexcept
Returns a raw pointer to the object at this index in the array, without checking whether the index is...
void swap(int index1, int index2) noexcept
Swaps a pair of objects in the array.
ObjectClassPtr removeAndReturn(int indexToRemove)
Removes and returns an object from the array.
ObjectClass ** data() const noexcept
Returns a pointer to the first element in the array.
int addSorted(ElementComparator &comparator, ObjectClass *newObject) noexcept
Inserts a new object into the array assuming that the array is sorted.
ObjectClass * add(ObjectClass *newObject)
Appends a new object to the end of the array.
void removeObject(ObjectClass *objectToRemove)
Removes the first occurrence of a specified object from the array.
~ReferenceCountedArray()
Destructor.
ReferenceCountedArray()=default
Creates an empty array.
void addOrReplaceSorted(ElementComparator &comparator, ObjectClass *newObject) noexcept
Inserts or replaces an object in the array, assuming it is sorted.
void swapWith(OtherArrayType &otherArray) noexcept
This swaps the contents of this array with those of another array.
bool addIfNotAlreadyThere(const ObjectClassPtr &newObject)
Appends a new object at the end of the array as long as the array doesn't already contain it...
ObjectClassPtr operator[](int index) const noexcept
Returns a pointer to the object at this index in the array.
ObjectClassPtr getUnchecked(int index) const noexcept
Returns a pointer to the object at this index in the array, without checking whether the index is in-...
ObjectClass * insert(int indexToInsertAt, ObjectClass *newObject)
Inserts a new object into the array at the given index.
bool addIfNotAlreadyThere(ObjectClass *newObject)
Appends a new object at the end of the array as long as the array doesn't already contain it...
ReferenceCountedArray(const ReferenceCountedArray< OtherObjectClass, OtherCriticalSection > &other) noexcept
Creates a copy of another array.
int indexOf(const ObjectClass *objectToLookFor) const noexcept
Finds the index of the first occurrence of an object in the array.
void sort(ElementComparator &comparator, bool retainOrderOfEquivalentItems=false) const noexcept
Sorts the elements in the array.
ObjectClassPtr getLast() const noexcept
Returns a pointer to the last object in the array.
ObjectClassPtr getFirst() const noexcept
Returns a pointer to the first object in the array.
bool operator==(const ReferenceCountedArray &other) const noexcept
Compares this array to another one.
void ensureStorageAllocated(const int minNumElements)
Increases the array's internal storage to hold a minimum number of elements.
bool contains(const ObjectClass *objectToLookFor) const noexcept
Returns true if the array contains a specified object.
void minimiseStorageOverheads() noexcept
Reduces the amount of storage being used by the array.
ReferenceCountedArray(ReferenceCountedArray &&other) noexcept
Moves from another array.
ObjectClass * insert(int indexToInsertAt, const ObjectClassPtr &newObject)
Inserts a new object into the array at the given index.
int size() const noexcept
Returns the current number of objects in the array.
typename DummyCriticalSection ::ScopedLockType ScopedLockType
Returns the type of scoped lock to use for locking this array.
bool isEmpty() const noexcept
Returns true if the array is empty, false otherwise.
void clear()
Removes all objects from the array.
ObjectClass * getObjectPointer(int index) const noexcept
Returns a raw pointer to the object at this index in the array.
void clearQuick()
Removes all objects from the array without freeing the array's allocated storage. ...
ObjectClass * add(const ObjectClassPtr &newObject)
Appends a new object to the end of the array.
ReferenceCountedArray & operator=(const ReferenceCountedArray &other) noexcept
Copies another array into this one.
ReferencedType * get() const noexcept
Returns the object that this pointer references.
Used by container classes as an indirect way to delete an object of a particular type.
void addArray(const ReferenceCountedArray &arrayToAddFrom, int startIndex=0, int numElementsToAdd=-1) noexcept
Adds elements from another array to the end of this array.
void removeRange(int startIndex, int numberToRemove)
Removes a range of objects from the array.
A smart-pointer class which points to a reference-counted object.
bool contains(const ObjectClassPtr &objectToLookFor) const noexcept
Returns true if the array contains a specified object.
bool operator!=(const ReferenceCountedArray< ObjectClass, TypeOfCriticalSectionToUse > &other) const noexcept
Compares this array to another one.
int indexOf(const ObjectClassPtr &objectToLookFor) const noexcept
Finds the index of the first occurrence of an object in the array.
ObjectClass ** getRawDataPointer() const noexcept
Returns a pointer to the actual array data.
ObjectClass ** begin() const noexcept
Returns a pointer to the first element in the array.
void removeLast(int howManyToRemove=1)
Removes the last n objects from the array.
void removeObject(const ObjectClassPtr &objectToRemove)
Removes the first occurrence of a specified object from the array.
int indexOfSorted(ElementComparator &comparator, const ObjectClass *objectToLookFor) const noexcept
Finds the index of an object in the array, assuming that the array is sorted.
ObjectClass ** end() const noexcept
Returns a pointer to the element which follows the last element in the array.
Holds a list of objects derived from ReferenceCountedObject, or which implement basic reference-count...
ReferenceCountedArray(const ReferenceCountedArray &other) noexcept
Creates a copy of another array.
void move(int currentIndex, int newIndex) noexcept
Moves one of the objects to a different position.