Blender V4.3
DNA_array_utils.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2024 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
13#include "MEM_guardedalloc.h"
14
15#include "BLI_index_range.hh"
16#include "BLI_utildefines.h"
17
19
23template<typename T>
24inline void remove_index(
25 T **items, int *items_num, int *active_index, const int index, void (*destruct_item)(T *))
26{
27 static_assert(std::is_trivial_v<T>);
28 BLI_assert(index >= 0);
29 BLI_assert(index < *items_num);
30
31 const int old_items_num = *items_num;
32 const int new_items_num = old_items_num - 1;
33
34 T *old_items = *items;
35 T *new_items = MEM_cnew_array<T>(new_items_num, __func__);
36
37 std::copy_n(old_items, index, new_items);
38 std::copy_n(old_items + index + 1, old_items_num - index - 1, new_items + index);
39
40 destruct_item(&old_items[index]);
41 MEM_freeN(old_items);
42
43 *items = new_items;
44 *items_num = new_items_num;
45
46 if (active_index) {
47 const int old_active_index = active_index ? *active_index : 0;
48 const int new_active_index = std::max(
49 0, old_active_index == new_items_num ? new_items_num - 1 : old_active_index);
50 *active_index = new_active_index;
51 }
52}
53
57template<typename T>
58inline void clear(T **items, int *items_num, int *active_index, void (*destruct_item)(T *))
59{
60 static_assert(std::is_trivial_v<T>);
61 for (const int i : IndexRange(*items_num)) {
62 destruct_item(&(*items)[i]);
63 }
64 MEM_SAFE_FREE(*items);
65 *items_num = 0;
66 if (active_index) {
67 *active_index = 0;
68 }
69}
70
74template<typename T>
75inline void move_index(T *items, const int items_num, const int from_index, const int to_index)
76{
77 static_assert(std::is_trivial_v<T>);
78 BLI_assert(from_index >= 0);
79 BLI_assert(from_index < items_num);
80 BLI_assert(to_index >= 0);
81 BLI_assert(to_index < items_num);
82 UNUSED_VARS_NDEBUG(items_num);
83
84 if (from_index == to_index) {
85 return;
86 }
87
88 if (from_index < to_index) {
89 const T tmp = items[from_index];
90 for (int i = from_index; i < to_index; i++) {
91 items[i] = items[i + 1];
92 }
93 items[to_index] = tmp;
94 }
95 else if (from_index > to_index) {
96 const T tmp = items[from_index];
97 for (int i = from_index; i > to_index; i--) {
98 items[i] = items[i - 1];
99 }
100 items[to_index] = tmp;
101 }
102}
103
104} // namespace blender::dna::array
#define BLI_assert(a)
Definition BLI_assert.h:50
#define UNUSED_VARS_NDEBUG(...)
Read Guarded memory(de)allocation.
#define MEM_SAFE_FREE(v)
void MEM_freeN(void *vmemh)
Definition mallocn.cc:105
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)