106 static_cast<char*
>(inlineBuffer) -
107 static_cast<char*
>(
static_cast<void*
>(
this))))
150 return static_cast<char*
>(
static_cast<void*
>(
this)) +
mInlineOffset;
153 return static_cast<const char*
>(
static_cast<const void*
>(
this)) +
mInlineOffset;
193template <
typename T,
typename =
void>
200template <
typename T,
typename =
void>
210 return [](
void* ptr)
FL_NOEXCEPT {
new (ptr) T(); };
224 return [](
void* dst,
const void* src)
FL_NOEXCEPT {
225 new (dst) T(*
static_cast<const T*
>(src));
237template <
typename T,
typename =
void>
244template <
typename T,
typename =
void>
257 new (dst) T(
static_cast<T&&
>(*
static_cast<T*
>(src)));
272 T& ta = *
static_cast<T*
>(a);
273 T& tb = *
static_cast<T*
>(b);
274 T tmp(
static_cast<T&&
>(ta));
275 ta =
static_cast<T&&
>(tb);
276 tb =
static_cast<T&&
>(tmp);
290 return [](
void* dst,
void* src, fl::size count)
FL_NOEXCEPT {
291 T* d =
static_cast<T*
>(dst);
292 T* s =
static_cast<T*
>(src);
293 for (fl::size i = 0; i < count; ++i) {
294 new (&d[i]) T(
static_cast<T&&
>(s[i]));
321 [](
void* ptr) {
static_cast<T*
>(ptr)->~T(); },
327 T* p =
static_cast<T*
>(first);
328 for (fl::size i = 0; i < count; ++i) {
Polymorphic memory resource base class (PMR-style).
void resize_value_impl(fl::size n, const void *value) FL_NOEXCEPT
Resize to n elements. New elements are copy-constructed from value.
void resize_impl(fl::size n) FL_NOEXCEPT
Resize to n elements. New elements are default-constructed (zeroed for trivial).
void grow_to(fl::size new_capacity) FL_NOEXCEPT
Grow to new_capacity. Moves existing elements.
const void * element_ptr(fl::size index) const FL_NOEXCEPT
const void * inlineBufferPtr() const FL_NOEXCEPT
void erase_impl(fl::size index) FL_NOEXCEPT
Erase element at index. Shifts subsequent elements left.
const vector_element_ops * mOps
void reserve_impl(fl::size n) FL_NOEXCEPT
bool hasInlineBuffer() const FL_NOEXCEPT
Does this vector have an inline buffer at all?
void trivial_default_construct(void *ptr, fl::size count) const FL_NOEXCEPT
void push_back_move_impl(void *element) FL_NOEXCEPT
void shrink_to_fit_impl() FL_NOEXCEPT
bool isInline() const FL_NOEXCEPT
Is data currently in the inline buffer?
void insert_move_impl(fl::size index, void *element) FL_NOEXCEPT
Insert element at index by move. Shifts subsequent elements right.
vector_basic(void *inlineBuffer, fl::size inlineCapacity, fl::size elementSize, memory_resource *resource, const vector_element_ops *ops) FL_NOEXCEPT
Vector with inline buffer (for VectorN).
memory_resource * mResource
void trivial_swap(void *a, void *b) const FL_NOEXCEPT
void move_from(vector_basic &other) FL_NOEXCEPT
Move-steal contents from another vector_basic.
void trivial_copy(void *dst, const void *src, fl::size count) const FL_NOEXCEPT
vector_basic(fl::size elementSize, memory_resource *resource, const vector_element_ops *ops) FL_NOEXCEPT
Heap-only vector (no inline buffer).
const void * data_raw() const FL_NOEXCEPT
fl::size size() const FL_NOEXCEPT
void ensure_capacity(fl::size n) FL_NOEXCEPT
Ensure capacity for at least n elements. Grows if needed.
void insert_copy_impl(fl::size index, const void *element) FL_NOEXCEPT
Insert element at index by copy. Shifts subsequent elements right.
void move_assign(vector_basic &other) FL_NOEXCEPT
Move-assign from another vector_basic (clears this first).
void * element_ptr(fl::size index) FL_NOEXCEPT
Pointer to element at index (byte arithmetic).
vector_basic(vector_basic &&) FL_NOEXCEPT=delete
bool full() const FL_NOEXCEPT
void * inlineBufferPtr() FL_NOEXCEPT
Compute inline buffer pointer from offset.
void * data_raw() FL_NOEXCEPT
void copy_from(const vector_basic &other) FL_NOEXCEPT
Copy all elements from another vector_basic.
fl::size element_size() const FL_NOEXCEPT
void clear_impl() FL_NOEXCEPT
void trivial_move_left(void *dst, const void *src, fl::size count) const FL_NOEXCEPT
bool empty() const FL_NOEXCEPT
fl::size capacity() const FL_NOEXCEPT
vector_basic(const vector_basic &) FL_NOEXCEPT=delete
void pop_back_impl() FL_NOEXCEPT
void push_back_copy_impl(const void *element) FL_NOEXCEPT
void erase_range_impl(fl::size first_index, fl::size count) FL_NOEXCEPT
Erase range [first_index, first_index + count).
Type-erased vector base class.
PMR-style polymorphic memory resource for type-erased allocation.
fl::enable_if< is_swappable< T >::value, void(*)(void *, void *) FL_NOEXCEPT >::type get_swap_fn() FL_NOEXCEPT
fl::enable_if< has_move_ctor< T >::value, void(*)(void *, void *) FL_NOEXCEPT >::type get_move_construct_fn() FL_NOEXCEPT
fl::enable_if< has_copy_ctor< T >::value, void(*)(void *, constvoid *) FL_NOEXCEPT >::type get_copy_construct_fn() FL_NOEXCEPT
fl::enable_if< has_default_ctor< T >::value, void(*)(void *) FL_NOEXCEPT >::type get_default_construct_fn() FL_NOEXCEPT
fl::enable_if< has_move_ctor< T >::value, void(*)(void *, void *, fl::size) FL_NOEXCEPT >::type get_uninitialized_move_n_fn() FL_NOEXCEPT
integral_constant< bool, true > true_type
add_rvalue_reference< T >::type declval() FL_NOEXCEPT
integral_constant< bool, false > false_type
constexpr int type_rank< T >::value
add_rvalue_reference< T >::type declval() FL_NOEXCEPT
const vector_element_ops * vector_element_ops_for() FL_NOEXCEPT
Generate a static ops table for type T.
Base definition for an LED controller.
void(* default_construct)(void *ptr)
void(* destroy)(void *ptr)
void(* swap_elements)(void *a, void *b)
void(* uninitialized_move_n)(void *dst, void *src, fl::size count)
Move-construct count elements from src to dst (non-overlapping, dst uninitialized).
void(* copy_construct)(void *dst, const void *src)
void(* move_construct)(void *dst, void *src)
void(* destroy_n)(void *first, fl::size count)
Destroy count elements starting at first.
Function pointer table for type-specific element operations.