ClangFormat: apply to source, most of intern
[blender.git] / source / blender / blenlib / BLI_buffer.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_BUFFER_H__
18 #define __BLI_BUFFER_H__
19
20 /** \file
21  * \ingroup bli
22  */
23
24 typedef struct {
25   void *data;
26   const size_t elem_size;
27   size_t count, alloc_count;
28   int flag;
29 } BLI_Buffer;
30
31 enum {
32   BLI_BUFFER_NOP = 0,
33   BLI_BUFFER_USE_STATIC = (1 << 0),
34 };
35
36 #define BLI_buffer_declare_static(type_, name_, flag_, static_count_) \
37   char name_##user; /* warn for free only */ \
38   type_ name_##_static_[static_count_]; \
39   BLI_Buffer name_ = { \
40       (name_##_static_), sizeof(type_), 0, static_count_, BLI_BUFFER_USE_STATIC | (flag_)}
41
42 /* never use static*/
43 #define BLI_buffer_declare(type_, name_, flag_) \
44   bool name_##user; /* warn for free only */ \
45   BLI_Buffer name_ = {NULL, sizeof(type_), 0, 0, (flag_)}
46
47 #define BLI_buffer_at(buffer_, type_, index_) \
48   ((((type_ *)(buffer_) \
49          ->data)[(BLI_assert(sizeof(type_) == (buffer_)->elem_size)), \
50                  (BLI_assert((int)(index_) >= 0 && (size_t)(index_) < (buffer_)->count)), \
51                  index_]))
52
53 #define BLI_buffer_array(buffer_, type_) (&(BLI_buffer_at(buffer_, type_, 0)))
54
55 #define BLI_buffer_resize_data(buffer_, type_, new_count_) \
56   ((BLI_buffer_resize(buffer_, new_count_), new_count_ ? BLI_buffer_array(buffer_, type_) : NULL))
57
58 #define BLI_buffer_reinit_data(buffer_, type_, new_count_) \
59   ((BLI_buffer_reinit(buffer_, new_count_), new_count_ ? BLI_buffer_array(buffer_, type_) : NULL))
60
61 #define BLI_buffer_append(buffer_, type_, val_) \
62   (BLI_buffer_resize(buffer_, (buffer_)->count + 1), \
63    (BLI_buffer_at(buffer_, type_, (buffer_)->count - 1) = val_))
64
65 #define BLI_buffer_clear(buffer_) \
66   { \
67     (buffer_)->count = 0; \
68   } \
69   (void)0
70
71 /* Never decreases the amount of memory allocated */
72 void BLI_buffer_resize(BLI_Buffer *buffer, const size_t new_count);
73
74 /* Ensure size, throwing away old data, respecting BLI_BUFFER_USE_CALLOC */
75 void BLI_buffer_reinit(BLI_Buffer *buffer, const size_t new_count);
76
77 /* Does not free the buffer structure itself */
78 void _bli_buffer_free(BLI_Buffer *buffer);
79 #define BLI_buffer_free(name_) \
80   { \
81     _bli_buffer_free(name_); \
82     (void)name_##user; /* ensure we free */ \
83   } \
84   (void)0
85
86 #endif /* __BLI_BUFFER_H__ */