26#ifndef WATER_OWNEDARRAY_H_INCLUDED
27#define WATER_OWNEDARRAY_H_INCLUDED
31#include "CarlaScopeUtils.hpp"
54template <
class ObjectClass>
78 void clear (
bool deleteObjects =
true)
83 data.setAllocatedSize (0);
120 inline ObjectClass*
operator[] (
const size_t index)
const noexcept
125 return data.elements [index];
138 return data.elements [index];
151 return data.elements [0];
179 return data.elements;
188 return data.elements;
198 return data.elements;
210 int indexOf (
const ObjectClass* objectToLookFor)
const noexcept
212 ObjectClass*
const*
e =
data.elements.getData();
213 ObjectClass*
const*
const end_ =
e +
numUsed;
215 for (;
e != end_; ++
e)
216 if (objectToLookFor == *
e)
217 return static_cast<int> (
e -
data.elements.getData());
227 bool contains (
const ObjectClass* objectToLookFor)
const noexcept
229 ObjectClass*
const*
e =
data.elements.getData();
230 ObjectClass*
const*
const end_ =
e +
numUsed;
232 for (;
e != end_; ++
e)
233 if (objectToLookFor == *
e)
252 ObjectClass*
add (ObjectClass* newObject)
noexcept
279 ObjectClass*
insert (
int indexToInsertAt, ObjectClass* newObject)
noexcept
281 if (indexToInsertAt < 0)
282 return add (newObject);
284 size_t uindexToInsertAt =
static_cast<size_t>(indexToInsertAt);
286 if (uindexToInsertAt >
numUsed)
292 ObjectClass**
const e =
data.elements + uindexToInsertAt;
293 const int numToMove =
numUsed - uindexToInsertAt;
296 std::memmove (
e + 1,
e,
sizeof (ObjectClass*) * (
size_t) numToMove);
316 ObjectClass*
const* newObjects,
317 const size_t numberOfElements)
319 if (numberOfElements > 0)
321 data.ensureAllocatedSize (
numUsed + numberOfElements);
322 ObjectClass** insertPos =
data.elements;
326 insertPos += indexToInsertAt;
327 const size_t numberToMove =
numUsed - indexToInsertAt;
328 std::memmove (insertPos + numberOfElements, insertPos, numberToMove *
sizeof (ObjectClass*));
337 for (
size_t i=0;
i < numberOfElements; ++
i)
338 *insertPos++ = *newObjects++;
355 return add (newObject) !=
nullptr;
371 ObjectClass*
set (
int indexToChange, ObjectClass* newObject,
bool deleteOldElement =
true)
373 if (indexToChange >= 0)
375 CarlaScopedPointer<ObjectClass> toDelete;
380 if (deleteOldElement)
382 toDelete =
data.elements [indexToChange];
384 if (toDelete == newObject)
388 data.elements [indexToChange] = newObject;
415 template <
class OtherArrayType>
416 void addArray (
const OtherArrayType& arrayToAddFrom,
418 int numElementsToAdd = -1)
426 if (numElementsToAdd < 0 || startIndex + numElementsToAdd > arrayToAddFrom.size())
427 numElementsToAdd = arrayToAddFrom.size() - startIndex;
429 data.ensureAllocatedSize (
numUsed + numElementsToAdd);
430 wassert (numElementsToAdd <= 0 ||
data.elements !=
nullptr);
432 while (--numElementsToAdd >= 0)
434 data.elements [
numUsed] = arrayToAddFrom.getUnchecked (startIndex++);
453 template <
class OtherArrayType>
455 size_t startIndex = 0,
456 int numElementsToAdd = -1)
458 if (numElementsToAdd < 0 || startIndex + numElementsToAdd > arrayToAddFrom.size())
459 numElementsToAdd = arrayToAddFrom.size() - startIndex;
461 data.ensureAllocatedSize (
numUsed + numElementsToAdd);
462 wassert (numElementsToAdd <= 0 ||
data.elements !=
nullptr);
464 while (--numElementsToAdd >= 0)
480 template <
class ElementComparator>
481 int addSorted (ElementComparator& comparator, ObjectClass*
const newObject)
noexcept
486 insert (index, newObject);
502 template <
typename ElementComparator>
503 int indexOfSorted (ElementComparator& comparator,
const ObjectClass*
const objectToLookFor)
const noexcept
510 if (comparator.compareElements (objectToLookFor,
data.elements [
s]) == 0)
513 const int halfway = (
s +
e) / 2;
517 if (comparator.compareElements (objectToLookFor,
data.elements [halfway]) >= 0)
537 void remove (
const size_t indexToRemove,
bool deleteObject =
true)
539 CarlaScopedPointer<ObjectClass> toDelete;
543 ObjectClass**
const e =
data.elements + indexToRemove;
549 const size_t numToShift =
numUsed - indexToRemove;
552 std::memmove (
e,
e + 1,
sizeof (ObjectClass*) * numToShift);
570 ObjectClass* removedItem =
nullptr;
573 ObjectClass**
const e =
data.elements + indexToRemove;
577 const size_t numToShift =
numUsed - indexToRemove;
580 std::memmove (
e,
e + 1,
sizeof (ObjectClass*) * (
size_t) numToShift);
597 void removeObject (
const ObjectClass* objectToRemove,
bool deleteObject =
true)
599 ObjectClass**
const e =
data.elements.getData();
603 if (objectToRemove ==
e[
i])
624 void removeRange (
size_t startIndex,
const size_t numberToRemove,
bool deleteObjects =
true)
626 const size_t endIndex =
jlimit ((
size_t)0
U,
numUsed, startIndex + numberToRemove);
629 if (endIndex > startIndex)
633 for (
int i = startIndex;
i < endIndex; ++
i)
635 delete data.elements [
i];
636 data.elements [
i] =
nullptr;
640 const size_t rangeSize = endIndex - startIndex;
641 ObjectClass**
e =
data.elements + startIndex;
642 size_t numToShift =
numUsed - endIndex;
645 for (
size_t i=0;
i < numToShift; ++
i)
663 bool deleteObjects =
true)
665 if (howManyToRemove >=
numUsed)
666 clear (deleteObjects);
676 void swap (
const size_t index1,
677 const size_t index2)
noexcept
681 std::swap (
data.elements [index1],
682 data.elements [index2]);
699 void move (
const size_t currentIndex,
size_t newIndex)
noexcept
701 if (currentIndex != newIndex)
708 ObjectClass*
const value =
data.elements [currentIndex];
710 if (newIndex > currentIndex)
712 std::memmove (
data.elements + currentIndex,
713 data.elements + currentIndex + 1,
714 sizeof (ObjectClass*) * (
size_t) (newIndex - currentIndex));
718 std::memmove (
data.elements + newIndex + 1,
719 data.elements + newIndex,
720 sizeof (ObjectClass*) * (
size_t) (currentIndex - newIndex));
733 template <
class OtherArrayType>
734 void swapWith (OtherArrayType& otherArray)
noexcept
736 data.swapWith (otherArray.data);
737 std::swap (
numUsed, otherArray.numUsed);
760 return data.ensureAllocatedSize (minNumElements);
789 template <
class ElementComparator>
790 void sort (ElementComparator& comparator,
796 sortArray (comparator,
data.elements.getData(), 0,
size() - 1, retainOrderOfEquivalentItems);
801 ArrayAllocationBase <ObjectClass*>
data;
#define CARLA_SAFE_ASSERT_RETURN(cond, ret)
Definition CarlaDefines.h:190
#define CARLA_DECLARE_NON_COPYABLE(ClassName)
Definition CarlaDefines.h:242
#define noexcept
Definition DistrhoDefines.h:72
Definition OwnedArray.h:57
ArrayAllocationBase< ObjectClass * > data
Definition OwnedArray.h:801
bool contains(const ObjectClass *objectToLookFor) const noexcept
Definition OwnedArray.h:227
size_t numUsed
Definition OwnedArray.h:802
void clear(bool deleteObjects=true)
Definition OwnedArray.h:78
ObjectClass * getUnchecked(const int index) const noexcept
Definition OwnedArray.h:136
void clearQuick(bool deleteObjects)
Definition OwnedArray.h:89
ObjectClass * getFirst() const noexcept
Definition OwnedArray.h:146
ObjectClass * set(int indexToChange, ObjectClass *newObject, bool deleteOldElement=true)
Definition OwnedArray.h:371
void removeLast(int howManyToRemove=1, bool deleteObjects=true)
Definition OwnedArray.h:662
ObjectClass ** end() const noexcept
Definition OwnedArray.h:194
bool ensureStorageAllocated(const int minNumElements) noexcept
Definition OwnedArray.h:758
ObjectClass * removeAndReturn(const size_t indexToRemove)
Definition OwnedArray.h:568
ObjectClass ** getRawDataPointer() noexcept
Definition OwnedArray.h:177
ObjectClass * operator[](const size_t index) const noexcept
Definition OwnedArray.h:120
int indexOf(const ObjectClass *objectToLookFor) const noexcept
Definition OwnedArray.h:210
ObjectClass ** begin() const noexcept
Definition OwnedArray.h:186
void addCopiesOf(const OtherArrayType &arrayToAddFrom, size_t startIndex=0, int numElementsToAdd=-1)
Definition OwnedArray.h:454
bool isEmpty() const noexcept
Definition OwnedArray.h:107
void removeRange(size_t startIndex, const size_t numberToRemove, bool deleteObjects=true)
Definition OwnedArray.h:624
void sort(ElementComparator &comparator, bool retainOrderOfEquivalentItems=false) const noexcept
Definition OwnedArray.h:790
ObjectClass * insert(int indexToInsertAt, ObjectClass *newObject) noexcept
Definition OwnedArray.h:279
void deleteAllObjects()
Definition OwnedArray.h:804
void remove(const size_t indexToRemove, bool deleteObject=true)
Definition OwnedArray.h:537
size_t size() const noexcept
Definition OwnedArray.h:101
void insertArray(const size_t indexToInsertAt, ObjectClass *const *newObjects, const size_t numberOfElements)
Definition OwnedArray.h:315
OwnedArray() noexcept
Definition OwnedArray.h:61
int indexOfSorted(ElementComparator &comparator, const ObjectClass *const objectToLookFor) const noexcept
Definition OwnedArray.h:503
ObjectClass * getLast() const noexcept
Definition OwnedArray.h:162
int addSorted(ElementComparator &comparator, ObjectClass *const newObject) noexcept
Definition OwnedArray.h:481
void addArray(const OtherArrayType &arrayToAddFrom, int startIndex=0, int numElementsToAdd=-1)
Definition OwnedArray.h:416
void removeObject(const ObjectClass *objectToRemove, bool deleteObject=true)
Definition OwnedArray.h:597
void swapWith(OtherArrayType &otherArray) noexcept
Definition OwnedArray.h:734
bool minimiseStorageOverheads() noexcept
Definition OwnedArray.h:747
ObjectClass * add(ObjectClass *newObject) noexcept
Definition OwnedArray.h:252
void move(const size_t currentIndex, size_t newIndex) noexcept
Definition OwnedArray.h:699
~OwnedArray()
Definition OwnedArray.h:71
bool addIfNotAlreadyThere(ObjectClass *newObject) noexcept
Definition OwnedArray.h:350
void swap(const size_t index1, const size_t index2) noexcept
Definition OwnedArray.h:676
* e
Definition inflate.c:1404
register unsigned i
Definition inflate.c:1575
unsigned s
Definition inflate.c:1555
#define U(x)
Definition fmopl.c:132
static PuglViewHint int value
Definition pugl.h:1708
#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
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
Type * createCopyIfNotNull(const Type *objectToCopy)
Definition Memory.h:68
static void sortArray(ElementComparator &comparator, ElementType *const array, int firstElement, int lastElement, const bool retainOrderOfEquivalentItems)
Definition ElementComparator.h:79
#define const
Definition zconf.h:137