26#ifndef WATER_REFERENCECOUNTEDARRAY_H_INCLUDED
27#define WATER_REFERENCECOUNTEDARRAY_H_INCLUDED
54template <
class ObjectClass>
74 memcpy (
data.elements, other.getRawDataPointer(), (
size_t)
numUsed * sizeof (ObjectClass*));
77 if (ObjectClass* o =
data.elements[
i])
78 o->incReferenceCount();
82 template <
class OtherObjectClass>
87 memcpy (
data.elements, other.getRawDataPointer(),
numUsed * sizeof (ObjectClass*));
90 if (ObjectClass* o =
data.elements[
i])
91 o->incReferenceCount();
107 template <
class OtherObjectClass>
130 data.setAllocatedSize (0);
191 return data.elements [index];
203 return data.elements [index];
216 return data.elements [0];
244 return data.elements;
253 return data.elements;
270 int indexOf (
const ObjectClass*
const objectToLookFor)
const noexcept
272 ObjectClass**
e =
data.elements.getData();
273 ObjectClass**
const endPointer =
e +
numUsed;
275 while (
e != endPointer)
277 if (objectToLookFor == *
e)
278 return static_cast<int> (
e -
data.elements.getData());
291 bool contains (
const ObjectClass*
const objectToLookFor)
const noexcept
293 ObjectClass**
e =
data.elements.getData();
294 ObjectClass**
const endPointer =
e +
numUsed;
296 while (
e != endPointer)
298 if (objectToLookFor == *
e)
314 ObjectClass*
add (ObjectClass*
const newObject)
noexcept
320 if (newObject !=
nullptr)
321 newObject->incReferenceCount();
339 ObjectClass*
insert (
int indexToInsertAt,
340 ObjectClass*
const newObject)
noexcept
342 if (indexToInsertAt < 0)
343 return add (newObject);
351 ObjectClass**
const e =
data.elements + indexToInsertAt;
352 const int numToMove =
numUsed - indexToInsertAt;
355 memmove (
e + 1,
e,
sizeof (ObjectClass*) * (
size_t) numToMove);
359 if (newObject !=
nullptr)
360 newObject->incReferenceCount();
396 void set (
const int indexToChange,
397 ObjectClass*
const newObject)
399 if (indexToChange >= 0)
401 if (newObject !=
nullptr)
402 newObject->incReferenceCount();
406 if (ObjectClass* o =
data.elements [indexToChange])
409 data.elements [indexToChange] = newObject;
439 if (numElementsToAdd < 0 || startIndex + numElementsToAdd > arrayToAddFrom.
size())
440 numElementsToAdd = arrayToAddFrom.
size() - startIndex;
442 if (numElementsToAdd > 0)
444 data.ensureAllocatedSize (
numUsed + numElementsToAdd);
446 while (--numElementsToAdd >= 0)
463 template <
class ElementComparator>
464 int addSorted (ElementComparator& comparator, ObjectClass* newObject)
noexcept
467 insert (index, newObject);
476 template <
class ElementComparator>
478 ObjectClass* newObject)
noexcept
482 if (index > 0 && comparator.compareElements (newObject,
data.elements [index - 1]) == 0)
483 set (index - 1, newObject);
485 insert (index, newObject);
500 template <
class ElementComparator>
502 const ObjectClass*
const objectToLookFor)
const noexcept
509 if (comparator.compareElements (objectToLookFor,
data.elements [
s]) == 0)
512 const int halfway = (
s +
e) / 2;
516 if (comparator.compareElements (objectToLookFor,
data.elements [halfway]) >= 0)
543 ObjectClass**
const e =
data.elements + indexToRemove;
545 if (ObjectClass* o = *
e)
549 const int numberToShift =
numUsed - indexToRemove;
551 if (numberToShift > 0)
552 std::memmove (
e,
e + 1,
sizeof (ObjectClass*) * (
size_t) numberToShift);
554 if ((
numUsed << 1) <
static_cast<int>(
data.numAllocated))
574 ObjectClass**
const e =
data.elements + indexToRemove;
576 if (ObjectClass* o = *
e)
583 const int numberToShift =
numUsed - indexToRemove;
585 if (numberToShift > 0)
586 memmove (
e,
e + 1,
sizeof (ObjectClass*) * (
size_t) numberToShift);
624 const int numberToRemove)
627 const int endIndex =
jlimit (0,
numUsed, startIndex + numberToRemove);
629 if (endIndex >
start)
634 if (ObjectClass* o =
data.elements[
i])
637 data.elements[
i] =
nullptr;
641 const int rangeSize = endIndex -
start;
670 while (--howManyToRemove >= 0)
680 const int index2)
noexcept
685 std::swap (
data.elements [index1],
686 data.elements [index2]);
703 void move (
const int currentIndex,
704 int newIndex)
noexcept
706 if (currentIndex != newIndex)
713 ObjectClass*
const value =
data.elements [currentIndex];
715 if (newIndex > currentIndex)
717 memmove (
data.elements + currentIndex,
718 data.elements + currentIndex + 1,
719 sizeof (ObjectClass*) * (
size_t) (newIndex - currentIndex));
723 memmove (
data.elements + newIndex + 1,
724 data.elements + newIndex,
725 sizeof (ObjectClass*) * (
size_t) (currentIndex - newIndex));
739 template <
class OtherArrayType>
740 void swapWith (OtherArrayType& otherArray)
noexcept
742 data.swapWith (otherArray.data);
743 std::swap (
numUsed, otherArray.numUsed);
757 if (
data.elements [
i] != other.data.elements [
i])
799 template <
class ElementComparator>
800 void sort (ElementComparator& comparator,
801 const bool retainOrderOfEquivalentItems =
false)
const noexcept
806 sortArray (comparator,
data.elements.getData(), 0,
size() - 1, retainOrderOfEquivalentItems);
829 data.ensureAllocatedSize (minNumElements);
834 ArrayAllocationBase <ObjectClass*>
data;
848 if (o->decReferenceCountWithoutDeleting())
#define noexcept
Definition DistrhoDefines.h:72
ObjectClass ** begin() const noexcept
Definition ReferenceCountedArray.h:251
void minimiseStorageOverheads() noexcept
Definition ReferenceCountedArray.h:816
ObjectClass ** end() const noexcept
Definition ReferenceCountedArray.h:259
ObjectClassPtr getLast() const noexcept
Definition ReferenceCountedArray.h:227
bool operator==(const ReferenceCountedArray &other) const noexcept
Definition ReferenceCountedArray.h:751
void addArray(const ReferenceCountedArray< ObjectClass > &arrayToAddFrom, int startIndex=0, int numElementsToAdd=-1) noexcept
Definition ReferenceCountedArray.h:429
void remove(const int indexToRemove)
Definition ReferenceCountedArray.h:539
ObjectClass * add(ObjectClass *const newObject) noexcept
Definition ReferenceCountedArray.h:314
int addSorted(ElementComparator &comparator, ObjectClass *newObject) noexcept
Definition ReferenceCountedArray.h:464
bool isEmpty() const noexcept
Definition ReferenceCountedArray.h:149
void releaseAllObjects()
Definition ReferenceCountedArray.h:837
ReferenceCountedObjectPtr< ObjectClass > ObjectClassPtr
Definition ReferenceCountedArray.h:58
ObjectClass * getObjectPointerUnchecked(const int index) const noexcept
Definition ReferenceCountedArray.h:200
void swapWith(OtherArrayType &otherArray) noexcept
Definition ReferenceCountedArray.h:740
void set(const int indexToChange, ObjectClass *const newObject)
Definition ReferenceCountedArray.h:396
void sort(ElementComparator &comparator, const bool retainOrderOfEquivalentItems=false) const noexcept
Definition ReferenceCountedArray.h:800
void ensureStorageAllocated(const int minNumElements)
Definition ReferenceCountedArray.h:827
int indexOf(const ObjectClass *const objectToLookFor) const noexcept
Definition ReferenceCountedArray.h:270
void clearQuick()
Definition ReferenceCountedArray.h:137
bool addIfNotAlreadyThere(ObjectClass *const newObject) noexcept
Definition ReferenceCountedArray.h:375
ArrayAllocationBase< ObjectClass * > data
Definition ReferenceCountedArray.h:834
ReferenceCountedArray(const ReferenceCountedArray< OtherObjectClass > &other) noexcept
Definition ReferenceCountedArray.h:83
ReferenceCountedArray() noexcept
Definition ReferenceCountedArray.h:64
void addOrReplaceSorted(ElementComparator &comparator, ObjectClass *newObject) noexcept
Definition ReferenceCountedArray.h:477
bool operator!=(const ReferenceCountedArray< ObjectClass > &other) const noexcept
Definition ReferenceCountedArray.h:767
ObjectClass * getObjectPointer(const int index) const noexcept
Definition ReferenceCountedArray.h:186
ObjectClass ** getRawDataPointer() const noexcept
Definition ReferenceCountedArray.h:242
void removeLast(int howManyToRemove=1)
Definition ReferenceCountedArray.h:665
bool contains(const ObjectClass *const objectToLookFor) const noexcept
Definition ReferenceCountedArray.h:291
ObjectClassPtr operator[](const int index) const noexcept
Definition ReferenceCountedArray.h:162
ObjectClassPtr getUnchecked(const int index) const noexcept
Definition ReferenceCountedArray.h:173
~ReferenceCountedArray()
Definition ReferenceCountedArray.h:118
ObjectClassPtr removeAndReturn(const int indexToRemove)
Definition ReferenceCountedArray.h:568
ObjectClassPtr getFirst() const noexcept
Definition ReferenceCountedArray.h:211
void swap(const int index1, const int index2) noexcept
Definition ReferenceCountedArray.h:679
int indexOfSorted(ElementComparator &comparator, const ObjectClass *const objectToLookFor) const noexcept
Definition ReferenceCountedArray.h:501
void removeObject(ObjectClass *const objectToRemove)
Definition ReferenceCountedArray.h:603
void removeRange(const int startIndex, const int numberToRemove)
Definition ReferenceCountedArray.h:623
void move(const int currentIndex, int newIndex) noexcept
Definition ReferenceCountedArray.h:703
static void releaseObject(ObjectClass *o)
Definition ReferenceCountedArray.h:846
int numUsed
Definition ReferenceCountedArray.h:835
int size() const noexcept
Definition ReferenceCountedArray.h:143
void clear()
Definition ReferenceCountedArray.h:127
ObjectClass * insert(int indexToInsertAt, ObjectClass *const newObject) noexcept
Definition ReferenceCountedArray.h:339
ReferenceCountedArray & operator=(const ReferenceCountedArray &other) noexcept
Definition ReferenceCountedArray.h:97
ReferenceCountedArray(const ReferenceCountedArray &other) noexcept
Definition ReferenceCountedArray.h:70
Definition ReferenceCountedObject.h:227
* e
Definition inflate.c:1404
register unsigned i
Definition inflate.c:1575
unsigned s
Definition inflate.c:1555
static PuglViewHint int value
Definition pugl.h:1708
virtual ASIOError start()=0
#define wassert(expression)
Definition AudioSampleBuffer.h:33
static int findInsertIndexInSortedArray(ElementComparator &comparator, ElementType *const array, const ElementType newElement, int firstElement, int lastElement)
Definition ElementComparator.h:119
bool isPositiveAndBelow(Type valueToTest, Type upperLimit) noexcept
Definition MathsFunctions.h:187
void ignoreUnused(const Type1 &) noexcept
Definition MathsFunctions.h:237
Type jlimit(const Type lowerLimit, const Type upperLimit, const Type valueToConstrain) noexcept
Definition MathsFunctions.h:169
static void sortArray(ElementComparator &comparator, ElementType *const array, int firstElement, int lastElement, const bool retainOrderOfEquivalentItems)
Definition ElementComparator.h:79
memcpy(hh, h, RAND_HEAD_LEN)
#define const
Definition zconf.h:137