45 const unsigned int arr_stride_uint = (
unsigned int)arr_stride;
46 const unsigned int arr_half_stride = (arr_len / 2) * arr_stride_uint;
47 unsigned int i, i_end;
51 for (i = 0, i_end = (arr_len - 1) * arr_stride_uint; i < arr_half_stride;
52 i += arr_stride_uint, i_end -= arr_stride_uint) {
53 memcpy(buf, &arr[i], arr_stride);
54 memcpy(&arr[i], &arr[i_end], arr_stride);
55 memcpy(&arr[i_end], buf, arr_stride);
65 void _bli_array_wrap(
void *arr_v,
unsigned int arr_len,
size_t arr_stride,
int dir)
71 memcpy(buf, arr, arr_stride);
72 memmove(arr, arr + arr_stride, arr_stride * (arr_len - 1));
73 memcpy(arr + (arr_stride * (arr_len - 1)), buf, arr_stride);
76 memcpy(buf, arr + (arr_stride * (arr_len - 1)), arr_stride);
77 memmove(arr + arr_stride, arr, arr_stride * (arr_len - 1));
78 memcpy(arr, buf, arr_stride);
92 const unsigned int arr_len,
93 const size_t arr_stride,
94 const unsigned int *
order,
97 const size_t len = arr_len * arr_stride;
98 const unsigned int arr_stride_uint = (
unsigned int)arr_stride;
102 if (arr_temp ==
NULL) {
109 memcpy(arr_orig, arr,
len);
111 for (i = 0; i < arr_len; i++) {
118 if (arr_temp ==
NULL) {
132 const char *arr_step = (
const char *)arr;
133 for (
unsigned int i = 0; i < arr_len; i++, arr_step += arr_stride) {
134 if (memcmp(arr_step, p, arr_stride) == 0) {
146 const char *arr_step = (
const char *)arr + (arr_stride * arr_len);
147 for (
unsigned int i = arr_len; i-- != 0;) {
148 arr_step -= arr_stride;
149 if (memcmp(arr_step, p, arr_stride) == 0) {
157 void *arr,
const void *arr_a,
const void *arr_b,
unsigned int arr_len,
size_t arr_stride)
160 const char *src_a = arr_a;
161 const char *src_b = arr_b;
163 size_t i = arr_stride * arr_len;
165 *(dst++) = *(src_a++) & *(src_b++);
170 void *arr,
const void *arr_a,
const void *arr_b,
unsigned int arr_len,
size_t arr_stride)
173 const char *src_a = arr_a;
174 const char *src_b = arr_b;
176 size_t i = arr_stride * arr_len;
178 *(dst++) = *(src_a++) | *(src_b++);
199 unsigned int arr_len,
202 bool use_delimit_bounds,
203 bool (*test_fn)(
const void *arr_item,
void *
user_data),
205 unsigned int span_step[2],
206 unsigned int *r_span_len)
211 if (use_wrap && (span_step[0] != arr_len) && (span_step[0] > span_step[1])) {
215 const unsigned int arr_stride_uint = (
unsigned int)arr_stride;
216 const void *item_prev;
221 if ((span_step[0] == arr_len) && (span_step[1] == arr_len)) {
225 test_prev = test_fn(item_prev,
user_data);
227 else if (use_delimit_bounds ==
false) {
230 test_prev = test_fn(item_prev,
user_data);
238 else if ((i_curr = span_step[1] + 2) < arr_len) {
239 item_prev =
POINTER_OFFSET(arr, (span_step[1] + 1) * arr_stride_uint);
240 test_prev = test_fn(item_prev,
user_data);
247 const void *item_curr =
POINTER_OFFSET(arr, i_curr * arr_stride_uint);
249 while (i_curr < arr_len) {
250 bool test_curr = test_fn(item_curr,
user_data);
251 if ((test_prev ==
false) && (test_curr ==
true)) {
252 unsigned int span_len;
253 unsigned int i_step_prev = i_curr;
256 unsigned int i_step = i_curr + 1;
261 i_step_prev = i_step;
268 if (i_step_prev < i_curr) {
269 span_len = (i_step_prev + (arr_len - i_curr)) + 1;
272 span_len = (i_step_prev - i_curr) + 1;
276 unsigned int i_step = i_curr + 1;
277 while ((i_step != arr_len) &&
279 i_step_prev = i_step;
283 span_len = (i_step_prev - i_curr) + 1;
285 if ((use_delimit_bounds ==
false) && (i_step_prev == arr_len - 1)) {
290 span_step[0] = i_curr;
291 span_step[1] = i_step_prev;
292 *r_span_len = span_len;
297 test_prev = test_curr;
299 item_prev = item_curr;
312 const char *arr_step = (
const char *)arr_v;
313 size_t i = arr_stride * arr_len;
330 const int arr_shape[2],
333 bool (*test_fn)(
const void *arr_item,
void *
user_data),
337 center[1] < arr_shape[1]);
339 const char *arr = arr_v;
340 const int stride[2] = {arr_shape[0] * (int)elem_size, (
int)elem_size};
344 if (test_fn(arr + ofs[0] + ofs[1],
user_data)) {
350 int steps_in, steps_out;
353 int x_plus = arr_shape[0] -
center[0] - 1;
355 int y_plus = arr_shape[1] -
center[1] - 1;
357 steps_in = 2 *
min_iiii(x_minus, x_plus, y_minus, y_plus);
358 steps_out = 2 *
max_iiii(x_minus, x_plus, y_minus, y_plus);
365 while (
steps < steps_out) {
372 bool check_bounds =
steps > steps_in;
377 for (
int axis = 2; axis--;) {
378 int ofs_step =
stride[axis];
383 int ofs_iter = ofs[axis] + ofs_step;
384 int ofs_dest = ofs[axis] +
steps * ofs_step;
385 int ofs_other = ofs[!axis];
387 ofs[axis] = ofs_dest;
389 if (ofs_other < 0 || ofs_other > limits[!axis]) {
394 CLAMP(ofs_iter, 0, limits[axis]);
395 CLAMP(ofs_dest, 0, limits[axis]);
399 if (test_fn(arr + ofs_other + ofs_iter,
user_data)) {
402 if (ofs_iter == ofs_dest) {
405 ofs_iter += ofs_step;
#define BLI_array_alloca(arr, realsize)
Generic array manipulation API.
MINLINE int max_iiii(int a, int b, int c, int d)
MINLINE int min_iiii(int a, int b, int c, int d)
Strict compiler flags for areas of code we want to ensure don't do conversions without us knowing abo...
#define POINTER_OFFSET(v, ofs)
NSNotificationCenter * center
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei stride
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint order
Read Guarded memory(de)allocation.
Group RGB to Bright Vector Camera CLAMP
bool _bli_array_iter_span(const void *arr, unsigned int 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, unsigned int span_step[2], unsigned int *r_span_len)
bool _bli_array_is_zeroed(const void *arr_v, unsigned int arr_len, size_t arr_stride)
void _bli_array_reverse(void *arr_v, unsigned int arr_len, size_t arr_stride)
int _bli_array_rfindindex(const void *arr, unsigned int arr_len, size_t arr_stride, const void *p)
void _bli_array_wrap(void *arr_v, unsigned int arr_len, size_t arr_stride, int dir)
void _bli_array_permute(void *arr, const unsigned int arr_len, const size_t arr_stride, const unsigned int *order, void *arr_temp)
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)
void _bli_array_binary_and(void *arr, const void *arr_a, const void *arr_b, unsigned int arr_len, size_t arr_stride)
int _bli_array_findindex(const void *arr, unsigned int arr_len, size_t arr_stride, const void *p)
void _bli_array_binary_or(void *arr, const void *arr_a, const void *arr_b, unsigned int arr_len, size_t arr_stride)
void(* MEM_freeN)(void *vmemh)
void *(* MEM_mallocN)(size_t len, const char *str)