diff options
author | Campbell Barton <ideasman42@gmail.com> | 2021-07-09 06:33:36 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2021-07-09 06:35:54 +0300 |
commit | 7592a5097c8b997b308f5414434bca8e66376af1 (patch) | |
tree | 129b78c2943eea24421d2a87c7700f8bace71c0b /source/blender/blenlib/intern/array_utils.c | |
parent | ab70133db0ba3b92d0f10837e5c615a6460910ef (diff) |
BLI_array: add BLI_array_deduplicate_ordered utility & tests
Diffstat (limited to 'source/blender/blenlib/intern/array_utils.c')
-rw-r--r-- | source/blender/blenlib/intern/array_utils.c | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/source/blender/blenlib/intern/array_utils.c b/source/blender/blenlib/intern/array_utils.c index 25261e82cc9..085f51ac451 100644 --- a/source/blender/blenlib/intern/array_utils.c +++ b/source/blender/blenlib/intern/array_utils.c @@ -121,6 +121,35 @@ void _bli_array_permute(void *arr, } /** + * In-place array de-duplication of an ordered array. + * + * \return The new length of the array. + * + * Access via #BLI_array_deduplicate_ordered + */ +unsigned int _bli_array_deduplicate_ordered(void *arr, unsigned int arr_len, size_t arr_stride) +{ + if (UNLIKELY(arr_len <= 1)) { + return arr_len; + } + + const unsigned int arr_stride_uint = (unsigned int)arr_stride; + uint j = 0; + for (uint i = 0; i < arr_len; i++) { + if ((i == j) || (memcmp(POINTER_OFFSET(arr, arr_stride_uint * i), + POINTER_OFFSET(arr, arr_stride_uint * j), + arr_stride) == 0)) { + continue; + } + j += 1; + memcpy(POINTER_OFFSET(arr, arr_stride_uint * j), + POINTER_OFFSET(arr, arr_stride_uint * i), + arr_stride); + } + return j + 1; +} + +/** * Find the first index of an item in an array. * * Access via #BLI_array_findindex |