BLI_memblock: Refactor for faster iteration and allocation
[blender.git] / source / blender / blenlib / BLI_memblock.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  * The Original Code is Copyright (C) 2008 Blender Foundation.
17  * All rights reserved.
18  */
19
20 #ifndef __BLI_MEMBLOCK_H__
21 #define __BLI_MEMBLOCK_H__
22
23 /** \file
24  * \ingroup bli
25  */
26
27 #ifdef __cplusplus
28 extern "C" {
29 #endif
30
31 #include "BLI_compiler_attrs.h"
32
33 struct BLI_memblock;
34
35 typedef struct BLI_memblock BLI_memblock;
36 typedef void (*MemblockValFreeFP)(void *val);
37
38 BLI_memblock *BLI_memblock_create(uint elem_size) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT;
39 void *BLI_memblock_alloc(BLI_memblock *mblk) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1);
40 void BLI_memblock_clear(BLI_memblock *mblk, MemblockValFreeFP valfreefp) ATTR_NONNULL(1);
41 void BLI_memblock_destroy(BLI_memblock *mblk, MemblockValFreeFP free_callback) ATTR_NONNULL(1);
42
43 typedef struct BLI_memblock_iter {
44   void **chunk_list;
45   int cur_index;
46   int end_index;
47   int chunk_max_ofs;
48   int chunk_idx;
49   int elem_size;
50   int elem_ofs;
51 } BLI_memblock_iter;
52
53 void BLI_memblock_iternew(BLI_memblock *pool, BLI_memblock_iter *iter) ATTR_NONNULL();
54 void *BLI_memblock_iterstep(BLI_memblock_iter *iter) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL();
55
56 #ifdef __cplusplus
57 }
58 #endif
59
60 #endif /* __BLI_MEMBLOCK_H__ */