BLI_array: add permute utility function

This commit is contained in:
Campbell Barton
2015-04-28 04:10:31 +10:00
parent 6ada7a1a0b
commit 278ff15c7f
2 changed files with 40 additions and 0 deletions

View File

@@ -34,6 +34,14 @@ void _bli_array_wrap(void *arr, unsigned int arr_len, size_t arr_stride, int dir
#define BLI_array_wrap(arr, arr_len, dir) \
_bli_array_wrap(arr, arr_len, sizeof(*(arr)), dir)
void _bli_array_permute(
void *arr, const unsigned int arr_len, const size_t arr_stride,
const unsigned int *index, void *arr_temp);
#define BLI_array_permute(arr, arr_len, order) \
_bli_array_permute(arr, arr_len, sizeof(*(arr)), order, NULL)
#define BLI_array_permute_ex(arr, arr_len, index, arr_temp) \
_bli_array_permute(arr, arr_len, sizeof(*(arr)), order, arr_temp)
int _bli_array_findindex(const void *arr, unsigned int arr_len, size_t arr_stride, const void *p);
#define BLI_array_findindex(arr, arr_len, p) \
_bli_array_findindex(arr, arr_len, sizeof(*(arr)), p)

View File

@@ -25,6 +25,8 @@
#include <string.h>
#include <stdlib.h>
#include "MEM_guardedalloc.h"
#include "BLI_array_utils.h"
#include "BLI_sys_types.h"
@@ -69,6 +71,36 @@ void _bli_array_wrap(void *arr_v, unsigned int arr_len, size_t arr_stride, int d
}
}
void _bli_array_permute(
void *arr_v, const unsigned int arr_len, const size_t arr_stride,
const unsigned int *order, void *arr_temp)
{
const size_t len = arr_len * arr_stride;
const unsigned int arr_stride_uint = arr_stride;
void *arr_orig;
unsigned int i;
if (arr_temp == NULL) {
arr_orig = MEM_mallocN(len, __func__);
}
else {
arr_orig = arr_temp;
}
memcpy(arr_orig, arr_v, len);
for (i = 0; i < arr_len; i++) {
BLI_assert(order[i] < arr_len);
memcpy(POINTER_OFFSET(arr_v, arr_stride_uint * i),
POINTER_OFFSET(arr_orig, arr_stride_uint * order[i]),
arr_stride);
}
if (arr_temp == NULL) {
MEM_freeN(arr_orig);
}
}
/**
* \note Not efficient, use for error checks/asserts.
*/