svn merge -r40140:r40148 https://svn.blender.org/svnroot/bf-blender/trunk/blender
[blender.git] / source / blender / blenlib / BLI_sparsemap.h
1 #if 0
2 /**
3  * $Id:
4  *
5  * ***** BEGIN GPL LICENSE BLOCK *****
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version 2
10  * of the License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software Foundation,
19  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20  *
21  * The Original Code is Copyright (C) 2009 Blender Foundation, Joshua Leung
22  * All rights reserved.
23  *
24  * Contributor(s): Joseph Eagar (original author)
25  *
26  * ***** END GPL LICENSE BLOCK *****
27  */
28
29 #include "BLI_math_inline.h"
30
31 typedef struct SparseMap {
32         int max;
33         int blocksize;
34         void **blocks;
35         int totblock;
36 } SparseMap;
37
38 MALWAYS_INLINE SparseMap *BLI_sparsemap_new(int blocksize, char *name)
39 {
40         SparseMap *sm = MEM_callocN(sizeof(SparseMap), name);
41
42         sm->blocksize = blocksize;
43         return sm;
44 }
45
46 MALWAYS_INLINE void BLI_sparsemap_free(SparseMap *sm)
47 {
48         if (sm->blocks)
49                 MEM_freeN(sm->blocks);
50         
51         MEM_freeN(sm);
52 }
53
54 MALWAYS_INLINE void BLI_sparsemap_set(SparseMap *sm, int index, void *ptr)
55 {
56         if (index >= sm->max || (sm->blocks && !sm->blocks[index/sm->blocksize])) {
57                 int totblock = MAX2((index+1)/sm->blocksize, 2);
58                 void *blocks = MEM_callocN(sizeof(void*)*totblock);
59                 
60                 if (sm->blocks)
61                         memcpy(blocks, sm->blocks, sizeof(void*)*sm->totblock);
62                 sm->totblock = totblock;
63                 MEM_freeN(sm->blocks);
64                 sm->blocks = blocks;
65         }
66         
67         if (!sm->blocks[index/sm->blocksize]) {
68                 sm->blocks[index/sm->blocksize] = MEM_mallocN(sizeof(void*)*sm->blocksize);
69         }
70         
71         sm->blocks[index/sm->blocksize] = ptr;
72 }
73 #endif