26 T **items,
int *items_num,
int *active_index,
const int index,
void (*destruct_item)(
T *))
28 static_assert(std::is_trivial_v<T>);
32 const int old_items_num = *items_num;
33 const int new_items_num = old_items_num - 1;
35 T *old_items = *items;
38 std::copy_n(old_items, index, new_items);
39 std::copy_n(old_items + index + 1, old_items_num - index - 1, new_items + index);
41 destruct_item(&old_items[index]);
45 *items_num = new_items_num;
48 const int old_active_index = active_index ? *active_index : 0;
49 const int new_active_index = std::max(
50 0, old_active_index == new_items_num ? new_items_num - 1 : old_active_index);
51 *active_index = new_active_index;
63 void (*destruct_item)(
T *))
65 static_assert(std::is_trivial_v<T>);
67 const int remaining = std::stable_partition(*items,
69 [&](
const T &value) {
return !predicate(value); }) -
72 destruct_item(&(*items)[
i]);
74 *items_num = remaining;
81inline void clear(
T **items,
int *items_num,
int *active_index,
void (*destruct_item)(
T *))
83 static_assert(std::is_trivial_v<T>);
85 destruct_item(&(*items)[
i]);
98inline void move_index(
T *items,
const int items_num,
const int from_index,
const int to_index)
100 static_assert(std::is_trivial_v<T>);
107 if (from_index == to_index) {
111 if (from_index < to_index) {
112 const T tmp = items[from_index];
113 for (
int i = from_index;
i < to_index;
i++) {
114 items[
i] = items[
i + 1];
116 items[to_index] = tmp;
118 else if (from_index > to_index) {
119 const T tmp = items[from_index];
120 for (
int i = from_index;
i > to_index;
i--) {
121 items[
i] = items[
i - 1];
123 items[to_index] = tmp;
#define UNUSED_VARS_NDEBUG(...)
Read Guarded memory(de)allocation.
static constexpr IndexRange from_begin_end(const int64_t begin, const int64_t end)
constexpr IndexRange()=default
void * MEM_calloc_arrayN(size_t len, size_t size, const char *str)
void MEM_freeN(void *vmemh)
void remove_if(T **items, int *items_num, FunctionRef< bool(const T &)> predicate, void(*destruct_item)(T *))
void remove_index(T **items, int *items_num, int *active_index, const int index, void(*destruct_item)(T *))
void clear(T **items, int *items_num, int *active_index, void(*destruct_item)(T *))
void move_index(T *items, const int items_num, const int from_index, const int to_index)