52template <
typename ElementType,
53 typename TypeOfCriticalSectionToUse = DummyCriticalSection,
54 int minimumAllocatedSize = 0>
58 using ParameterType =
typename TypeHelpers::ParameterType<ElementType>::type;
71 values.addArray (other.values.begin(), other.values.size());
75 : values (std::move (other.values))
82 template <
typename TypeToCreateFrom>
93 template <
typename TypeToCreateFrom>
125 template <
typename TypeToCreateFrom>
126 Array (
const std::initializer_list<TypeToCreateFrom>& items)
151 values = std::move (other.values);
161 template <
class OtherArrayType>
165 const typename OtherArrayType::ScopedLockType
lock2 (other.getLock());
166 return values == other;
174 template <
class OtherArrayType>
192 values.setAllocatedSize (0);
205 void fill (
const ParameterType& newValue)
noexcept
209 for (
auto& e : *
this)
218 return values.size();
240 return values.getValueWithDefault (index);
255 return values[index];
270 return values[index];
284 return values[index];
293 return values.getFirst();
303 return values.getLast();
312 return values.begin();
321 return values.begin();
330 return values.begin();
338 return values.begin();
385 auto e = values.begin();
386 auto endPtr = values.end();
390 return static_cast<int> (e - values.begin());
403 auto e = values.begin();
404 auto endPtr = values.end();
551 values.add (newValue);
582 template <
typename Type>
591 template <
typename TypeToCreateFrom>
592 void addArray (
const std::initializer_list<TypeToCreateFrom>& items)
595 values.addArray (items);
604 template <
typename Type>
620 template <
class OtherArrayType>
624 const typename OtherArrayType::ScopedLockType
lock2 (
otherArray.getLock());
633 template <
class OtherArrayType>
651 template <
class OtherArrayType>
652 std::enable_if_t<! std::is_pointer_v<OtherArrayType>,
void>
693 template <
class ElementComparator>
697 auto index = findInsertIndexInSortedArray (comparator, values.begin(),
newElement, 0, values.size());
729 template <
typename ElementComparator,
typename TargetValueType>
771 return ElementType();
789 jassert (values.begin() !=
nullptr);
813 auto* e = values.begin();
815 for (
int i = 0; i < values.size(); ++i)
841 for (
int i = values.size(); --i >= 0;)
864 template <
typename PredicateType>
870 for (
int i = values.size(); --i >= 0;)
898 auto endIndex = jlimit (0, values.size(), startIndex +
numberToRemove);
899 startIndex = jlimit (0, values.size(), startIndex);
905 minimiseStorageAfterRemoval();
926 minimiseStorageAfterRemoval();
935 template <
class OtherArrayType>
938 const typename OtherArrayType::ScopedLockType
lock1 (
otherArray.getLock());
949 for (
int i = values.size(); --i >= 0;)
963 template <
class OtherArrayType>
966 const typename OtherArrayType::ScopedLockType
lock1 (
otherArray.getLock());
977 for (
int i = values.size(); --i >= 0;)
1031 values.shrinkToNoMoreThan (values.size());
1083 template <
class ElementComparator>
1099 [[
deprecated (
"This method has been replaced by a more flexible templated version and renamed "
1100 "to swapWith to be more consistent with the names used in other classes.")]]
1101 void swapWithArray (
Array& other)
noexcept {
swapWith (other); }
1111 minimiseStorageAfterRemoval();
1114 void minimiseStorageAfterRemoval()
1116 if (values.capacity() > jmax (minimumAllocatedSize, values.size() * 2))
1117 values.shrinkToNoMoreThan (jmax (values.size(), jmax (minimumAllocatedSize, 64 / (
int)
sizeof (ElementType))));
1122template <
typename ElementType,
typename TypeOfCriticalSectionToUse,
int minimumAllocatedSize>
1123template <
typename ElementComparator,
typename TargetValueType>
1130 for (
int s = 0, e = values.size();;)
1150template <
typename ElementType,
typename TypeOfCriticalSectionToUse,
int minimumAllocatedSize>
1151template <
class ElementComparator>
int removeIf(PredicateType &&predicate)
bool operator==(const OtherArrayType &other) const
void swapWith(OtherArrayType &otherArray) noexcept
void add(ElementType &&newElement)
void setUnchecked(int indexToChange, ParameterType newValue)
bool operator!=(const OtherArrayType &other) const
typename TypeOfCriticalSectionToUse::ScopedLockType ScopedLockType
void addNullTerminatedArray(const Type *const *elementsToAdd)
ElementType getUnchecked(int index) const
void insertArray(int indexToInsertAt, const ElementType *newElements, int numberOfElements)
bool isEmpty() const noexcept
void removeLast(int howManyToRemove=1)
Array(const ElementType &firstNewElement, OtherElements &&... otherElements)
void ensureStorageAllocated(int minNumElements)
std::enable_if_t<! std::is_pointer_v< OtherArrayType >, void > addArray(const OtherArrayType &arrayToAddFrom, int startIndex, int numElementsToAdd=-1)
void remove(const ElementType *elementToRemove)
const TypeOfCriticalSectionToUse & getLock() const noexcept
void addArray(const Type *elementsToAdd, int numElementsToAdd)
Array(const TypeToCreateFrom *data)
int removeAllInstancesOf(ParameterType valueToRemove)
Array(const TypeToCreateFrom *data, int numValues)
int size() const noexcept
int removeFirstMatchingValue(ParameterType valueToRemove)
void fill(const ParameterType &newValue) noexcept
void removeRange(int startIndex, int numberToRemove)
void removeValuesIn(const OtherArrayType &otherArray)
const ElementType * end() const noexcept
void remove(int indexToRemove)
void insert(int indexToInsertAt, ParameterType newElement)
int indexOfSorted(ElementComparator &comparator, TargetValueType elementToLookFor) const
ElementType getFirst() const noexcept
ElementType * begin() noexcept
ElementType * end() noexcept
ElementType * getRawDataPointer() noexcept
Array(ElementType &&singleElementToAdd)
void addUsingDefaultSort(ParameterType newElement)
int indexOf(ParameterType elementToLookFor) const
void add(const ElementType &newElement)
Array(ElementType &&firstNewElement, OtherElements &&... otherElements)
ElementType removeAndReturn(int indexToRemove)
ElementType operator[](int index) const
Array(const ElementType &singleElementToAdd)
void set(int indexToChange, ParameterType newValue)
int addSorted(ElementComparator &comparator, ParameterType newElement)
bool contains(ParameterType elementToLookFor) const
void insertMultiple(int indexToInsertAt, ParameterType newElement, int numberOfTimesToInsertIt)
void sort(ElementComparator &comparator, bool retainOrderOfEquivalentItems=false)
void add(ElementType &&firstNewElement, OtherElements &&... otherElements)
const ElementType * data() const noexcept
void resize(int targetNumItems)
void move(int currentIndex, int newIndex) noexcept
void swap(int index1, int index2)
ElementType * data() noexcept
void add(const ElementType &firstNewElement, OtherElements &&... otherElements)
void removeValuesNotIn(const OtherArrayType &otherArray)
const ElementType * begin() const noexcept
const ElementType & getReference(int index) const noexcept
bool addIfNotAlreadyThere(ParameterType newElement)
Array(const Array &other)
void minimiseStorageOverheads()
void addArray(const OtherArrayType &arrayToAddFrom)
Array & operator=(const Array &other)
ElementType & getReference(int index) noexcept
ElementType getLast() const noexcept
const ElementType * getRawDataPointer() const noexcept