doxygen: add newline after \file
[blender.git] / source / blender / blenlib / BLI_array_utils.h
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  */
16
17 #ifndef __BLI_ARRAY_UTILS_H__
18 #define __BLI_ARRAY_UTILS_H__
19
20 /** \file
21  * \ingroup bli
22  * \brief Generic array manipulation API.
23  */
24
25 #include "BLI_compiler_typecheck.h"
26
27 void _bli_array_reverse(void *arr, unsigned int arr_len, size_t arr_stride);
28 #define BLI_array_reverse(arr, arr_len) \
29         _bli_array_reverse(arr, arr_len, sizeof(*(arr)))
30
31 void _bli_array_wrap(void *arr, unsigned int arr_len, size_t arr_stride, int dir);
32 #define BLI_array_wrap(arr, arr_len, dir) \
33         _bli_array_wrap(arr, arr_len, sizeof(*(arr)), dir)
34
35 void _bli_array_permute(
36         void *arr, const unsigned int arr_len, const size_t arr_stride,
37         const unsigned int *index, void *arr_temp);
38 #define BLI_array_permute(arr, arr_len, order) \
39         _bli_array_permute(arr, arr_len, sizeof(*(arr)), order, NULL)
40 #define BLI_array_permute_ex(arr, arr_len, order, arr_temp) \
41         _bli_array_permute(arr, arr_len, sizeof(*(arr)), order, arr_temp)
42
43 int _bli_array_findindex(const void *arr, unsigned int arr_len, size_t arr_stride, const void *p);
44 #define BLI_array_findindex(arr, arr_len, p) \
45         _bli_array_findindex(arr, arr_len, sizeof(*(arr)), p)
46
47 int _bli_array_rfindindex(const void *arr, unsigned int arr_len, size_t arr_stride, const void *p);
48 #define BLI_array_rfindindex(arr, arr_len, p) \
49         _bli_array_rfindindex(arr, arr_len, sizeof(*(arr)), p)
50
51 void _bli_array_binary_and(
52         void *arr, const void *arr_a, const void *arr_b,
53         unsigned int arr_len, size_t arr_stride);
54 #define BLI_array_binary_and(arr, arr_a, arr_b, arr_len) \
55         (CHECK_TYPE_PAIR_INLINE(*(arr), *(arr_a)), \
56          CHECK_TYPE_PAIR_INLINE(*(arr), *(arr_b)), \
57          _bli_array_binary_and(arr, arr_a, arr_b, arr_len, sizeof(*(arr))))
58
59 void _bli_array_binary_or(
60         void *arr, const void *arr_a, const void *arr_b,
61         unsigned int arr_len, size_t arr_stride);
62 #define BLI_array_binary_or(arr, arr_a, arr_b, arr_len) \
63         (CHECK_TYPE_PAIR_INLINE(*(arr), *(arr_a)), \
64          CHECK_TYPE_PAIR_INLINE(*(arr), *(arr_b)), \
65          _bli_array_binary_or(arr, arr_a, arr_b, arr_len, sizeof(*(arr))))
66
67 bool _bli_array_iter_span(
68         const void *arr,
69         unsigned int arr_len, size_t arr_stride,
70         bool use_wrap, bool use_delimit_bounds,
71         bool (*test_fn)(const void *arr_item, void *user_data), void *user_data,
72         unsigned int span_step[2], unsigned int *r_span_len);
73 #define BLI_array_iter_span( \
74         arr, arr_len, use_wrap, use_delimit_bounds, test_fn, user_data, \
75         span_step, r_span_len) \
76         _bli_array_iter_span( \
77                 arr, arr_len, sizeof(*(arr)), use_wrap, use_delimit_bounds, test_fn, user_data, \
78                 span_step, r_span_len)
79
80 bool _bli_array_is_zeroed(
81         const void *arr,
82         unsigned int arr_len, size_t arr_stride);
83 #define BLI_array_is_zeroed(arr, arr_len) \
84         _bli_array_is_zeroed( \
85                 arr, arr_len, sizeof(*(arr)))
86
87 #endif  /* __BLI_ARRAY_UTILS_H__ */