Blender  V3.3
Macros | Functions
BLI_array_utils.h File Reference

Generic array manipulation API. More...

#include "BLI_compiler_typecheck.h"
#include "BLI_sys_types.h"

Go to the source code of this file.

Macros

#define BLI_array_reverse(arr, arr_len)   _bli_array_reverse(arr, arr_len, sizeof(*(arr)))
 
#define BLI_array_wrap(arr, arr_len, dir)   _bli_array_wrap(arr, arr_len, sizeof(*(arr)), dir)
 
#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, order, arr_temp)    _bli_array_permute(arr, arr_len, sizeof(*(arr)), order, arr_temp)
 
#define BLI_array_deduplicate_ordered(arr, arr_len)    _bli_array_deduplicate_ordered(arr, arr_len, sizeof(*(arr)))
 
#define BLI_array_findindex(arr, arr_len, p)   _bli_array_findindex(arr, arr_len, sizeof(*(arr)), p)
 
#define BLI_array_rfindindex(arr, arr_len, p)    _bli_array_rfindindex(arr, arr_len, sizeof(*(arr)), p)
 
#define BLI_array_binary_and(arr, arr_a, arr_b, arr_len)
 
#define BLI_array_binary_or(arr, arr_a, arr_b, arr_len)
 
#define BLI_array_iter_span(arr, arr_len, use_wrap, use_delimit_bounds, test_fn, user_data, span_step, r_span_len)
 
#define BLI_array_is_zeroed(arr, arr_len)   _bli_array_is_zeroed(arr, arr_len, sizeof(*(arr)))
 
#define BLI_array_iter_spiral_square(arr, arr_shape, center, test_fn, user_data)    _bli_array_iter_spiral_square(arr, arr_shape, sizeof(*(arr)), center, test_fn, user_data)
 

Functions

void _bli_array_reverse (void *arr, uint arr_len, size_t arr_stride)
 
void _bli_array_wrap (void *arr, uint arr_len, size_t arr_stride, int dir)
 
void _bli_array_permute (void *arr, uint arr_len, size_t arr_stride, const uint *order, void *arr_temp)
 
uint _bli_array_deduplicate_ordered (void *arr, uint arr_len, size_t arr_stride)
 
int _bli_array_findindex (const void *arr, uint arr_len, size_t arr_stride, const void *p)
 
int _bli_array_rfindindex (const void *arr, uint arr_len, size_t arr_stride, const void *p)
 
void _bli_array_binary_and (void *arr, const void *arr_a, const void *arr_b, uint arr_len, size_t arr_stride)
 
void _bli_array_binary_or (void *arr, const void *arr_a, const void *arr_b, uint arr_len, size_t arr_stride)
 
bool _bli_array_iter_span (const void *arr, uint arr_len, size_t arr_stride, bool use_wrap, bool use_delimit_bounds, bool(*test_fn)(const void *arr_item, void *user_data), void *user_data, uint span_step[2], uint *r_span_len)
 
bool _bli_array_is_zeroed (const void *arr, uint arr_len, size_t arr_stride)
 
bool _bli_array_iter_spiral_square (const void *arr_v, const int arr_shape[2], size_t elem_size, const int center[2], bool(*test_fn)(const void *arr_item, void *user_data), void *user_data)
 

Detailed Description

Generic array manipulation API.

Definition in file BLI_array_utils.h.

Macro Definition Documentation

◆ BLI_array_binary_and

#define BLI_array_binary_and (   arr,
  arr_a,
  arr_b,
  arr_len 
)
Value:
(CHECK_TYPE_PAIR_INLINE(*(arr), *(arr_a)), \
CHECK_TYPE_PAIR_INLINE(*(arr), *(arr_b)), \
_bli_array_binary_and(arr, arr_a, arr_b, arr_len, sizeof(*(arr))))
#define CHECK_TYPE_PAIR_INLINE(var_a, var_b)

Definition at line 77 of file BLI_array_utils.h.

◆ BLI_array_binary_or

#define BLI_array_binary_or (   arr,
  arr_a,
  arr_b,
  arr_len 
)
Value:
(CHECK_TYPE_PAIR_INLINE(*(arr), *(arr_a)), \
CHECK_TYPE_PAIR_INLINE(*(arr), *(arr_b)), \
_bli_array_binary_or(arr, arr_a, arr_b, arr_len, sizeof(*(arr))))

Definition at line 84 of file BLI_array_utils.h.

◆ BLI_array_deduplicate_ordered

#define BLI_array_deduplicate_ordered (   arr,
  arr_len 
)     _bli_array_deduplicate_ordered(arr, arr_len, sizeof(*(arr)))

Definition at line 55 of file BLI_array_utils.h.

◆ BLI_array_findindex

#define BLI_array_findindex (   arr,
  arr_len,
 
)    _bli_array_findindex(arr, arr_len, sizeof(*(arr)), p)

Definition at line 66 of file BLI_array_utils.h.

◆ BLI_array_is_zeroed

#define BLI_array_is_zeroed (   arr,
  arr_len 
)    _bli_array_is_zeroed(arr, arr_len, sizeof(*(arr)))

Definition at line 130 of file BLI_array_utils.h.

◆ BLI_array_iter_span

#define BLI_array_iter_span (   arr,
  arr_len,
  use_wrap,
  use_delimit_bounds,
  test_fn,
  user_data,
  span_step,
  r_span_len 
)
Value:
arr_len, \
sizeof(*(arr)), \
use_wrap, \
use_delimit_bounds, \
test_fn, \
span_step, \
r_span_len)
bool _bli_array_iter_span(const void *arr, uint arr_len, size_t arr_stride, bool use_wrap, bool use_delimit_bounds, bool(*test_fn)(const void *arr_item, void *user_data), void *user_data, uint span_step[2], uint *r_span_len)
Definition: array_utils.c:160
void * user_data

Definition at line 114 of file BLI_array_utils.h.

◆ BLI_array_iter_spiral_square

#define BLI_array_iter_spiral_square (   arr,
  arr_shape,
  center,
  test_fn,
  user_data 
)     _bli_array_iter_spiral_square(arr, arr_shape, sizeof(*(arr)), center, test_fn, user_data)

Definition at line 145 of file BLI_array_utils.h.

◆ BLI_array_permute

#define BLI_array_permute (   arr,
  arr_len,
  order 
)     _bli_array_permute(arr, arr_len, sizeof(*(arr)), order, NULL)

Definition at line 42 of file BLI_array_utils.h.

◆ BLI_array_permute_ex

#define BLI_array_permute_ex (   arr,
  arr_len,
  order,
  arr_temp 
)     _bli_array_permute(arr, arr_len, sizeof(*(arr)), order, arr_temp)

Definition at line 44 of file BLI_array_utils.h.

◆ BLI_array_reverse

#define BLI_array_reverse (   arr,
  arr_len 
)    _bli_array_reverse(arr, arr_len, sizeof(*(arr)))

Definition at line 23 of file BLI_array_utils.h.

◆ BLI_array_rfindindex

#define BLI_array_rfindindex (   arr,
  arr_len,
 
)     _bli_array_rfindindex(arr, arr_len, sizeof(*(arr)), p)

Definition at line 72 of file BLI_array_utils.h.

◆ BLI_array_wrap

#define BLI_array_wrap (   arr,
  arr_len,
  dir 
)    _bli_array_wrap(arr, arr_len, sizeof(*(arr)), dir)

Definition at line 32 of file BLI_array_utils.h.

Function Documentation

◆ _bli_array_binary_and()

void _bli_array_binary_and ( void arr,
const void arr_a,
const void arr_b,
uint  arr_len,
size_t  arr_stride 
)

Definition at line 134 of file array_utils.c.

◆ _bli_array_binary_or()

void _bli_array_binary_or ( void arr,
const void arr_a,
const void arr_b,
uint  arr_len,
size_t  arr_stride 
)

Definition at line 147 of file array_utils.c.

◆ _bli_array_deduplicate_ordered()

uint _bli_array_deduplicate_ordered ( void arr,
uint  arr_len,
size_t  arr_stride 
)

In-place array de-duplication of an ordered array.

Returns
The new length of the array.

Access via BLI_array_deduplicate_ordered

Definition at line 89 of file array_utils.c.

References POINTER_OFFSET, and UNLIKELY.

◆ _bli_array_findindex()

int _bli_array_findindex ( const void arr,
uint  arr_len,
size_t  arr_stride,
const void p 
)

Find the first index of an item in an array.

Access via BLI_array_findindex

Note
Not efficient, use for error checks/asserts.

Definition at line 111 of file array_utils.c.

◆ _bli_array_is_zeroed()

bool _bli_array_is_zeroed ( const void arr,
uint  arr_len,
size_t  arr_stride 
)

Simple utility to check memory is zeroed.

Definition at line 269 of file array_utils.c.

◆ _bli_array_iter_span()

bool _bli_array_iter_span ( const void arr,
uint  arr_len,
size_t  arr_stride,
bool  use_wrap,
bool  use_delimit_bounds,
bool(*)(const void *arr_item, void *user_data test_fn,
void user_data,
uint  span_step[2],
uint r_span_len 
)

Utility function to iterate over contiguous items in an array.

Parameters
use_wrapDetect contiguous ranges across the first/last points. In this case the second index of span_step may be lower than the first, which indicates the values are wrapped.
use_delimit_boundsWhen false, ranges that defined by the start/end indices are excluded. This option has no effect when use_wrap is enabled.
test_fnFunction to test if the item should be included in the range.
user_dataUser data for test_fn.
span_stepIndices to iterate over, initialize both values to the array length to initialize iteration.
r_span_lenThe length of the span, useful when use_wrap is enabled, where calculating the length isn't a simple subtraction.

Definition at line 160 of file array_utils.c.

References BLI_assert, NULL, POINTER_OFFSET, UNLIKELY, and user_data.

◆ _bli_array_iter_spiral_square()

bool _bli_array_iter_spiral_square ( const void arr_v,
const int  arr_shape[2],
size_t  elem_size,
const int  center[2],
bool(*)(const void *arr_item, void *user_data test_fn,
void user_data 
)

Smart function to sample a rectangle spiraling outside. Nice for selection ID.

Parameters
arr_shapedimensions [w, h].
centercoordinates [x, y] indicating where to start traversing.

Definition at line 281 of file array_utils.c.

References BLI_assert, center, CLAMP, max_iiii(), min_iiii(), KDL::sign(), steps, stride, and user_data.

◆ _bli_array_permute()

void _bli_array_permute ( void arr,
uint  arr_len,
size_t  arr_stride,
const uint order,
void arr_temp 
)

In-place array permute. (re-arrange elements based on an array of indices).

Access via BLI_array_wrap

Definition at line 60 of file array_utils.c.

References BLI_assert, len, MEM_freeN, MEM_mallocN, NULL, order, and POINTER_OFFSET.

◆ _bli_array_reverse()

void _bli_array_reverse ( void arr,
uint  arr_len,
size_t  arr_stride 
)

In-place array reverse.

Access via BLI_array_reverse

Definition at line 24 of file array_utils.c.

References BLI_array_alloca.

◆ _bli_array_rfindindex()

int _bli_array_rfindindex ( const void arr,
uint  arr_len,
size_t  arr_stride,
const void p 
)

A version of BLI_array_findindex that searches from the end of the list.

Definition at line 122 of file array_utils.c.

◆ _bli_array_wrap()

void _bli_array_wrap ( void arr,
uint  arr_len,
size_t  arr_stride,
int  dir 
)

In-place array wrap. (rotate the array one step forward or backwards).

Access via BLI_array_wrap

Definition at line 40 of file array_utils.c.

References BLI_array_alloca, and BLI_assert_unreachable.

Referenced by testbuffer_list_state_random_data().