49 return reinterpret_cast<T *
>(raw);
54 const uintptr_t shift_up =
57 return reinterpret_cast<const T *
>(raw);
98 static_assert(M <= N,
"Too many elements for FixedVector");
103 if (
this != &other) {
118 const T *out =
nullptr;
159 for (
size_t i = 0; i < count; ++i) {
245 void *vp =
static_cast<void *
>(
p);
246 memset(vp, 0,
sizeof(T));
271 bool has(
const T &value)
const {
return find(value) !=
end(); }
289 if (
this != &other) {
291 for (
int i = 0; i <
max_size; ++i) {
305template <
typename T,
typename Allocator = fl::allocator<T>>
class HeapVector {
325 return it != other.
it;
334 for (
size_t i = 0; i <
size; ++i) {
349 if (
this != &other) {
356 T *
begin = &values[0];
365 for (
size_t i = 0; i <
mSize; ++i) {
375 size_t new_capacity = (3 *
mCapacity) / 2;
376 if (new_capacity < n) {
380 T* new_array =
mAlloc.allocate(new_capacity);
383 for (
size_t i = 0; i <
mSize; ++i) {
389 for (
size_t i = 0; i <
mSize; ++i) {
424 T* new_array =
mAlloc.allocate(n);
427 for (
size_t i = 0; i <
mSize; ++i) {
432 for (
size_t i =
mSize; i < n; ++i) {
433 mAlloc.construct(&new_array[i], value);
438 for (
size_t i = 0; i <
mSize; ++i) {
447 }
else if (n >
mSize) {
449 for (
size_t i =
mSize; i < n; ++i) {
453 }
else if (n <
mSize) {
455 for (
size_t i = n; i <
mSize; ++i) {
462 template <
typename InputIt,
467 for (InputIt it =
begin; it !=
end; ++it) {
472 void assign(
size_t new_cap,
const T &value) {
475 while (
size() < new_cap) {
509 for (
size_t i = 0; i <
mSize; ++i) {
521 reverse_iterator
rbegin() {
return reverse_iterator(
end()); }
523 reverse_iterator
rend() {
return reverse_iterator(
begin()); }
562 bool has(
const T &value)
const {
return find(value) !=
end(); }
571 while (
pos !=
end() - 1) {
607 auto last =
end() - 1;
608 for (
size_t curr_idx = last -
begin(); curr_idx > target_idx;
610 auto first =
begin() + curr_idx - 1;
611 auto second =
begin() + curr_idx;
654 for (
size_t i = 0; i <
size(); ++i) {
663 return !(*
this == other);
685 if (needs_adjustment) {
730 while (first != last) {
731 iterator mid = first + (last - first) / 2;
733 if (
mLess(*mid, value)) {
761 bool has(
const T &value)
const {
return find(value) !=
end(); }
829 if (
size > INLINED_SIZE) {
838 if (
this != &other) {
846 if (
this != &other) {
847 if (other.mUsingHeap) {
848 mHeap.swap(other.mHeap);
851 mFixed.swap(other.mFixed);
860 if (
size > INLINED_SIZE) {
874 for (
auto &v :
mHeap) {
886 if (
size > INLINED_SIZE) {
900 for (
auto &v :
mHeap) {
917 void assign(
size_t new_cap,
const T &value) {
919 if (INLINED_SIZE > new_cap) {
921 while (
size() < new_cap) {
927 mHeap.reserve(new_cap);
929 while (
size() < new_cap) {
930 mHeap.push_back(value);
934 template <
typename InputIt,
938 if (uint32_t(
end -
begin) <= INLINED_SIZE) {
962 bool full()
const {
return INLINED_SIZE ==
size(); }
967 if (
mFixed.size() < INLINED_SIZE) {
972 mHeap.reserve(INLINED_SIZE * 2);
979 mHeap.push_back(value);
1024 if (
mFixed.size() < INLINED_SIZE) {
1033 mHeap.reserve(INLINED_SIZE * 2);
1038 return mHeap.insert(
mHeap.begin() + idx, value);
1061 if (
this != &other) {
1076template <
typename T,
size_t INLINED_SIZE>
1079template <
typename T,
size_t INLINED_SIZE = 64>
const PairKV * const_iterator
FixedVector(const FixedVector &other)
constexpr size_t size() const
iterator find_if(Predicate pred)
InlinedMemoryBlock< PairKV, N > mMemoryBlock
FixedVector & operator=(const FixedVector &other)
FixedVector(FixedVector &&other)
void assign(const_iterator begin, const_iterator end)
T & operator[](size_t index)
const_iterator find(const T &value) const
bool has(const T &value) const
iterator erase(const T &value)
void swap(FixedVector< T, N > &other)
const_iterator data() const
constexpr bool empty() const
const T & operator[](size_t index) const
const_iterator end() const
const_iterator begin() const
FixedVector(const T(&values)[M])
void push_back(const T &value)
FixedVector(const T(&values)[N])
iterator erase(iterator pos)
constexpr size_t capacity() const
void assign_array(const T *values, size_t count)
bool insert(iterator pos, const T &value)
iterator find(const T &value)
T & operator[](size_t index)
HeapVector(T(&values)[N])
fl::allocator< DrawItem > mAlloc
reverse_iterator rbegin()
HeapVector(HeapVector< T > &&other)
bool insert(iterator pos, const T &value)
void assign(InputIt begin, InputIt end)
void assign(size_t new_cap, const T &value)
HeapVector(const HeapVector< T > &other)
const DrawItem * const_iterator
bool erase(iterator pos, T *out_value=nullptr)
void ensure_size(size_t n)
void swap(HeapVector< T > &other)
const T & operator[](size_t index) const
const_iterator end() const
bool operator==(const HeapVector< T > &other) const
const_iterator begin() const
void swap(iterator a, iterator b)
iterator find(const T &value)
HeapVector(size_t size=0, const T &value=T())
HeapVector & operator=(const HeapVector< T > &other)
iterator find_if(Predicate pred)
void resize(size_t n, const T &value)
bool has(const T &value) const
const_iterator find(const T &value) const
void push_back(const T &value)
void erase(const T &value)
bool operator!=(const HeapVector< T > &other) const
const_iterator begin() const
InlinedVector(size_t size)
void swap(InlinedVector &other)
void reserve(size_t size)
iterator find_if(Predicate pred)
void push_back(const T &value)
FixedVector< T, INLINED_SIZE > mFixed
const T & operator[](size_t idx) const
InlinedVector & operator=(const InlinedVector &other)
const_iterator end() const
InlinedVector(InlinedVector &&other)
void assign(size_t new_cap, const T &value)
InlinedVector(const InlinedVector &other)
typename FixedVector< T, INLINED_SIZE >::iterator iterator
bool insert(iterator pos, const T &value)
void assign(InputIt begin, InputIt end)
typename FixedVector< T, INLINED_SIZE >::const_iterator const_iterator
T & operator[](size_t idx)
InlinedVector & operator=(InlinedVector &&other)
SortedHeapVector(LessThan less=LessThan())
iterator lower_bound(const T &value)
HeapVector< Pair > mArray
bool erase(const T &value)
bool has(const T &value) const
void swap(SortedHeapVector &other)
const_iterator end() const
void setMaxSize(size_t n)
HeapVector< Pair >::const_iterator const_iterator
const_iterator begin() const
T & operator[](size_t index)
bool insert(const T &value, InsertResult *result=nullptr)
const_iterator lower_bound(const T &value) const
HeapVector< Pair >::iterator iterator
const T & operator[](size_t index) const
const_iterator find(const T &value) const
iterator find(const T &value)
Implements the FastLED namespace macros.
void swap(array< T, N > &lhs, array< T, N > &rhs) noexcept(noexcept(lhs.swap(rhs)))
InlinedVector< T, INLINED_SIZE > vector_inlined
constexpr T * begin(T(&array)[N]) noexcept
HeapVector< T, Allocator > vector
typename enable_if< Condition, T >::type enable_if_t
FixedVector< T, INLINED_SIZE > vector_fixed
Implements a simple red square effect for 2D LED grids.
static FASTLED_NAMESPACE_BEGIN uint8_t const p[]
reverse_iterator & operator++()
bool operator!=(const reverse_iterator &other) const
reverse_iterator(iterator i)
InlinedMemoryBlock(InlinedMemoryBlock &&other)=default
InlinedMemoryBlock(const InlinedMemoryBlock &other)=default
MemoryType mMemoryBlock[kBlockSize]
Binary function object that returns whether the first argument is less than the second.