29 #ifndef JUCE_REFERENCECOUNTEDARRAY_H_INCLUDED 30 #define JUCE_REFERENCECOUNTEDARRAY_H_INCLUDED 54 template <
class ObjectClass,
class TypeOfCriticalSectionToUse = DummyCriticalSection>
74 data.setAllocatedSize (numUsed);
75 memcpy (
data.elements, other.getRawDataPointer(), (size_t) numUsed *
sizeof (ObjectClass*));
77 for (
int i = numUsed; --i >= 0;)
78 if (ObjectClass* o =
data.elements[i])
79 o->incReferenceCount();
83 template <
class OtherObjectClass,
class OtherCriticalSection>
88 data.setAllocatedSize (numUsed);
89 memcpy (
data.elements, other.getRawDataPointer(), numUsed *
sizeof (ObjectClass*));
91 for (
int i = numUsed; --i >= 0;)
92 if (ObjectClass* o =
data.elements[i])
93 o->incReferenceCount();
109 template <
class OtherObjectClass>
133 data.setAllocatedSize (0);
191 return data.elements [index];
204 return data.elements [index];
219 return data.elements [0];
249 return data.elements;
258 return data.elements;
278 ObjectClass** e =
data.elements.getData();
279 ObjectClass**
const endPointer = e +
numUsed;
281 while (e != endPointer)
283 if (objectToLookFor == *e)
284 return static_cast <
int> (e -
data.elements.getData());
300 ObjectClass** e =
data.elements.getData();
301 ObjectClass**
const endPointer = e +
numUsed;
303 while (e != endPointer)
305 if (objectToLookFor == *e)
328 if (newObject !=
nullptr)
329 newObject->incReferenceCount();
347 ObjectClass*
insert (
int indexToInsertAt,
348 ObjectClass*
const newObject)
noexcept 350 if (indexToInsertAt < 0)
351 return add (newObject);
361 ObjectClass**
const e =
data.elements + indexToInsertAt;
362 const int numToMove =
numUsed - indexToInsertAt;
365 memmove (e + 1, e,
sizeof (ObjectClass*) * (
size_t) numToMove);
369 if (newObject !=
nullptr)
370 newObject->incReferenceCount();
403 void set (
const int indexToChange,
404 ObjectClass*
const newObject)
406 if (indexToChange >= 0)
410 if (newObject !=
nullptr)
411 newObject->incReferenceCount();
415 if (ObjectClass* o =
data.elements [indexToChange])
418 data.elements [indexToChange] = newObject;
453 if (numElementsToAdd < 0 || startIndex + numElementsToAdd > arrayToAddFrom.
size())
454 numElementsToAdd = arrayToAddFrom.
size() - startIndex;
456 if (numElementsToAdd > 0)
458 data.ensureAllocatedSize (
numUsed + numElementsToAdd);
460 while (--numElementsToAdd >= 0)
478 template <
class ElementComparator>
482 const int index = findInsertIndexInSortedArray (comparator,
data.elements.getData(), newObject, 0,
numUsed);
483 insert (index, newObject);
492 template <
class ElementComparator>
497 const int index = findInsertIndexInSortedArray (comparator,
data.elements.getData(), newObject, 0,
numUsed);
499 if (index > 0 && comparator.compareElements (newObject,
data.elements [index - 1]) == 0)
500 set (index - 1, newObject);
502 insert (index, newObject);
517 template <
class ElementComparator>
519 const ObjectClass*
const objectToLookFor)
const noexcept 527 if (comparator.compareElements (objectToLookFor,
data.elements [s]) == 0)
530 const int halfway = (s + e) / 2;
534 if (comparator.compareElements (objectToLookFor,
data.elements [halfway]) >= 0)
557 void remove (
const int indexToRemove)
563 ObjectClass**
const e =
data.elements + indexToRemove;
565 if (ObjectClass* o = *e)
569 const int numberToShift =
numUsed - indexToRemove;
571 if (numberToShift > 0)
572 memmove (e, e + 1,
sizeof (ObjectClass*) * (
size_t) numberToShift);
590 ObjectClassPtr removedItem;
595 ObjectClass**
const e =
data.elements + indexToRemove;
597 if (ObjectClass* o = *e)
604 const int numberToShift =
numUsed - indexToRemove;
606 if (numberToShift > 0)
607 memmove (e, e + 1,
sizeof (ObjectClass*) * (
size_t) numberToShift);
627 remove (
indexOf (objectToRemove));
646 const int numberToRemove)
651 const int endIndex =
jlimit (0,
numUsed, startIndex + numberToRemove);
653 if (endIndex > start)
656 for (i = start; i < endIndex; ++i)
658 if (ObjectClass* o =
data.elements[i])
661 data.elements[i] =
nullptr;
665 const int rangeSize = endIndex - start;
666 ObjectClass** e =
data.elements + start;
696 while (--howManyToRemove >= 0)
713 std::swap (
data.elements [index1],
714 data.elements [index2]);
731 void move (
const int currentIndex,
734 if (currentIndex != newIndex)
743 ObjectClass*
const value =
data.elements [currentIndex];
745 if (newIndex > currentIndex)
747 memmove (
data.elements + currentIndex,
748 data.elements + currentIndex + 1,
749 sizeof (ObjectClass*) * (
size_t) (newIndex - currentIndex));
753 memmove (
data.elements + newIndex + 1,
754 data.elements + newIndex,
755 sizeof (ObjectClass*) * (
size_t) (currentIndex - newIndex));
758 data.elements [newIndex] = value;
769 template <
class OtherArrayType>
773 const typename OtherArrayType::ScopedLockType lock2 (otherArray.getLock());
774 data.swapWith (otherArray.data);
791 for (
int i =
numUsed; --i >= 0;)
792 if (
data.elements [i] != other.data.elements [i])
834 template <
class ElementComparator>
835 void sort (ElementComparator& comparator,
836 const bool retainOrderOfEquivalentItems =
false)
const noexcept 842 sortArray (comparator,
data.elements.getData(), 0,
size() - 1, retainOrderOfEquivalentItems);
867 data.ensureAllocatedSize (minNumElements);
896 if (ObjectClass* o =
data.elements [--numUsed])
904 if (o->decReferenceCountWithoutDeleting())
910 #endif // JUCE_REFERENCECOUNTEDARRAY_H_INCLUDED int addSorted(ElementComparator &comparator, ObjectClass *newObject) noexcept
Definition: juce_ReferenceCountedArray.h:479
void swapWith(OtherArrayType &otherArray) noexcept
Definition: juce_ReferenceCountedArray.h:770
ReferenceCountedArray & operator=(const ReferenceCountedArray &other) noexcept
Definition: juce_ReferenceCountedArray.h:99
ReferenceCountedArray() noexcept
Definition: juce_ReferenceCountedArray.h:64
void releaseAllObjects()
Definition: juce_ReferenceCountedArray.h:893
#define noexcept
Definition: juce_CompilerSupport.h:141
ObjectClass ** end() const noexcept
Definition: juce_ReferenceCountedArray.h:264
void clearQuick()
Definition: juce_ReferenceCountedArray.h:140
ObjectClass ** begin() const noexcept
Definition: juce_ReferenceCountedArray.h:256
bool isPositiveAndBelow(Type valueToTest, Type upperLimit) noexcept
Definition: juce_core.h:238
Definition: juce_ArrayAllocationBase.h:46
ObjectClassPtr getUnchecked(const int index) const noexcept
Definition: juce_ReferenceCountedArray.h:171
void sort(ElementComparator &comparator, const bool retainOrderOfEquivalentItems=false) const noexcept
Definition: juce_ReferenceCountedArray.h:835
bool operator!=(const ReferenceCountedArray< ObjectClass, TypeOfCriticalSectionToUse > &other) const noexcept
Definition: juce_ReferenceCountedArray.h:802
void addIfNotAlreadyThere(ObjectClass *const newObject) noexcept
Definition: juce_ReferenceCountedArray.h:384
int size() const noexcept
Definition: juce_ReferenceCountedArray.h:147
int indexOfSorted(ElementComparator &comparator, const ObjectClass *const objectToLookFor) const noexcept
Definition: juce_ReferenceCountedArray.h:518
~ReferenceCountedArray()
Definition: juce_ReferenceCountedArray.h:120
ObjectClass * insert(int indexToInsertAt, ObjectClass *const newObject) noexcept
Definition: juce_ReferenceCountedArray.h:347
void removeLast(int howManyToRemove=1)
Definition: juce_ReferenceCountedArray.h:689
ObjectClassPtr getLast() const noexcept
Definition: juce_ReferenceCountedArray.h:230
TypeOfCriticalSectionToUse::ScopedLockType ScopedLockType
Definition: juce_ReferenceCountedArray.h:878
Definition: juce_ReferenceCountedArray.h:55
static void releaseObject(ObjectClass *o)
Definition: juce_ReferenceCountedArray.h:902
void removeRange(const int startIndex, const int numberToRemove)
Definition: juce_ReferenceCountedArray.h:645
void addArray(const ReferenceCountedArray< ObjectClass, TypeOfCriticalSectionToUse > &arrayToAddFrom, int startIndex=0, int numElementsToAdd=-1) noexcept
Definition: juce_ReferenceCountedArray.h:438
ReferenceCountedObjectPtr< ObjectClass > ObjectClassPtr
Definition: juce_ReferenceCountedArray.h:58
void clear()
Definition: juce_ReferenceCountedArray.h:129
Definition: juce_ReferenceCountedObject.h:227
const TypeOfCriticalSectionToUse & getLock() const noexcept
Definition: juce_ReferenceCountedArray.h:875
bool operator==(const ReferenceCountedArray &other) const noexcept
Definition: juce_ReferenceCountedArray.h:783
void ensureStorageAllocated(const int minNumElements)
Definition: juce_ReferenceCountedArray.h:864
void minimiseStorageOverheads() noexcept
Definition: juce_ReferenceCountedArray.h:852
Definition: juce_CriticalSection.h:148
ObjectClassPtr getFirst() const noexcept
Definition: juce_ReferenceCountedArray.h:212
Definition: juce_ContainerDeletePolicy.h:44
Type jlimit(const Type lowerLimit, const Type upperLimit, const Type valueToConstrain) noexcept
Definition: juce_MathsFunctions.h:220
JUCE_DEPRECATED_WITH_BODY(void swapWithArray(ReferenceCountedArray &other) noexcept,{swapWith(other);}) private int numUsed
Definition: juce_ReferenceCountedArray.h:885
ObjectClass ** getRawDataPointer() const noexcept
Definition: juce_ReferenceCountedArray.h:247
ObjectClass * getObjectPointer(const int index) const noexcept
Definition: juce_ReferenceCountedArray.h:184
ObjectClassPtr operator[](const int index) const noexcept
Definition: juce_ReferenceCountedArray.h:160
void swap(const int index1, const int index2) noexcept
Definition: juce_ReferenceCountedArray.h:705
void
Definition: juce_PNGLoader.cpp:1173
void addOrReplaceSorted(ElementComparator &comparator, ObjectClass *newObject) noexcept
Definition: juce_ReferenceCountedArray.h:493
ObjectClassPtr removeAndReturn(const int indexToRemove)
Definition: juce_ReferenceCountedArray.h:588
JSAMPIMAGE data
Definition: jpeglib.h:945
ReferenceCountedArray(const ReferenceCountedArray< OtherObjectClass, OtherCriticalSection > &other) noexcept
Definition: juce_ReferenceCountedArray.h:84
ObjectClass * getObjectPointerUnchecked(const int index) const noexcept
Definition: juce_ReferenceCountedArray.h:200
void move(const int currentIndex, int newIndex) noexcept
Definition: juce_ReferenceCountedArray.h:731
bool contains(const ObjectClass *const objectToLookFor) const noexcept
Definition: juce_ReferenceCountedArray.h:297
ReferenceCountedArray(const ReferenceCountedArray &other) noexcept
Definition: juce_ReferenceCountedArray.h:70
ObjectClass * add(ObjectClass *const newObject) noexcept
Definition: juce_ReferenceCountedArray.h:321
int indexOf(const ObjectClass *const objectToLookFor) const noexcept
Definition: juce_ReferenceCountedArray.h:275
void removeObject(ObjectClass *const objectToRemove)
Definition: juce_ReferenceCountedArray.h:624