Fix T72118: Enable Windows 10 Non-client DPI Scaling
[blender.git] / source / blender / blenlib / BLI_edgehash.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_EDGEHASH_H__
18 #define __BLI_EDGEHASH_H__
19
20 /** \file
21  * \ingroup bli
22  */
23
24 #include "BLI_compiler_attrs.h"
25
26 struct EdgeHash;
27 typedef struct EdgeHash EdgeHash;
28
29 struct _EdgeHash_Edge {
30   uint v_low, v_high;
31 };
32
33 struct _EdgeHash_Entry {
34   struct _EdgeHash_Edge edge;
35   void *value;
36 };
37
38 typedef struct EdgeHashIterator {
39   struct _EdgeHash_Entry *entries;
40   uint length;
41   uint index;
42 } EdgeHashIterator;
43
44 typedef void (*EdgeHashFreeFP)(void *key);
45
46 enum {
47   EDGEHASH_FLAG_ALLOW_DUPES = (1 << 0), /* only checked for in debug mode */
48 };
49
50 EdgeHash *BLI_edgehash_new_ex(const char *info, const unsigned int nentries_reserve);
51 EdgeHash *BLI_edgehash_new(const char *info) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT;
52 void BLI_edgehash_free(EdgeHash *eh, EdgeHashFreeFP valfreefp);
53 void BLI_edgehash_print(EdgeHash *eh);
54 void BLI_edgehash_insert(EdgeHash *eh, unsigned int v0, unsigned int v1, void *val);
55 bool BLI_edgehash_reinsert(EdgeHash *eh, unsigned int v0, unsigned int v1, void *val);
56 void *BLI_edgehash_lookup(EdgeHash *eh, unsigned int v0, unsigned int v1) ATTR_WARN_UNUSED_RESULT;
57 void *BLI_edgehash_lookup_default(EdgeHash *eh,
58                                   unsigned int v0,
59                                   unsigned int v1,
60                                   void *val_default) ATTR_WARN_UNUSED_RESULT;
61 void **BLI_edgehash_lookup_p(EdgeHash *eh,
62                              unsigned int v0,
63                              unsigned int v1) ATTR_WARN_UNUSED_RESULT;
64 bool BLI_edgehash_ensure_p(EdgeHash *eh, unsigned int v0, unsigned int v1, void ***r_val)
65     ATTR_WARN_UNUSED_RESULT;
66 bool BLI_edgehash_remove(EdgeHash *eh, unsigned int v0, unsigned int v1, EdgeHashFreeFP valfreefp);
67
68 void *BLI_edgehash_popkey(EdgeHash *eh, unsigned int v0, unsigned int v1) ATTR_WARN_UNUSED_RESULT;
69 bool BLI_edgehash_haskey(EdgeHash *eh, unsigned int v0, unsigned int v1) ATTR_WARN_UNUSED_RESULT;
70 int BLI_edgehash_len(EdgeHash *eh) ATTR_WARN_UNUSED_RESULT;
71 void BLI_edgehash_clear_ex(EdgeHash *eh,
72                            EdgeHashFreeFP valfreefp,
73                            const unsigned int nentries_reserve);
74 void BLI_edgehash_clear(EdgeHash *eh, EdgeHashFreeFP valfreefp);
75
76 EdgeHashIterator *BLI_edgehashIterator_new(EdgeHash *eh) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT;
77 void BLI_edgehashIterator_init(EdgeHashIterator *ehi, EdgeHash *eh);
78 void BLI_edgehashIterator_free(EdgeHashIterator *ehi);
79
80 BLI_INLINE void BLI_edgehashIterator_step(EdgeHashIterator *ehi)
81 {
82   ehi->index++;
83 }
84 BLI_INLINE bool BLI_edgehashIterator_isDone(EdgeHashIterator *ehi)
85 {
86   return ehi->index >= ehi->length;
87 }
88 BLI_INLINE void BLI_edgehashIterator_getKey(EdgeHashIterator *ehi,
89                                             unsigned int *r_v0,
90                                             unsigned int *r_v1)
91 {
92   struct _EdgeHash_Edge edge = ehi->entries[ehi->index].edge;
93   *r_v0 = edge.v_low;
94   *r_v1 = edge.v_high;
95 }
96 BLI_INLINE void *BLI_edgehashIterator_getValue(EdgeHashIterator *ehi)
97 {
98   return ehi->entries[ehi->index].value;
99 }
100 BLI_INLINE void **BLI_edgehashIterator_getValue_p(EdgeHashIterator *ehi)
101 {
102   return &ehi->entries[ehi->index].value;
103 }
104 BLI_INLINE void BLI_edgehashIterator_setValue(EdgeHashIterator *ehi, void *val)
105 {
106   ehi->entries[ehi->index].value = val;
107 }
108
109 #define BLI_EDGEHASH_SIZE_GUESS_FROM_LOOPS(totloop) ((totloop) / 2)
110 #define BLI_EDGEHASH_SIZE_GUESS_FROM_POLYS(totpoly) ((totpoly)*2)
111
112 /* *** EdgeSet *** */
113
114 struct EdgeSet;
115 typedef struct EdgeSet EdgeSet;
116
117 typedef struct EdgeSetIterator {
118   struct _EdgeHash_Edge *edges;
119   uint length;
120   uint index;
121 } EdgeSetIterator;
122
123 EdgeSet *BLI_edgeset_new_ex(const char *info, const unsigned int nentries_reserve)
124     ATTR_MALLOC ATTR_WARN_UNUSED_RESULT;
125 EdgeSet *BLI_edgeset_new(const char *info) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT;
126 int BLI_edgeset_len(EdgeSet *es) ATTR_WARN_UNUSED_RESULT;
127 bool BLI_edgeset_add(EdgeSet *es, unsigned int v0, unsigned int v1);
128 void BLI_edgeset_insert(EdgeSet *es, unsigned int v0, unsigned int v1);
129 bool BLI_edgeset_haskey(EdgeSet *es, unsigned int v0, unsigned int v1) ATTR_WARN_UNUSED_RESULT;
130 void BLI_edgeset_free(EdgeSet *es);
131
132 /* rely on inline api for now */
133 EdgeSetIterator *BLI_edgesetIterator_new(EdgeSet *gs);
134 void BLI_edgesetIterator_free(EdgeSetIterator *esi);
135
136 BLI_INLINE void BLI_edgesetIterator_getKey(EdgeSetIterator *esi,
137                                            unsigned int *r_v0,
138                                            unsigned int *r_v1)
139 {
140   struct _EdgeHash_Edge edge = esi->edges[esi->index];
141   *r_v0 = edge.v_low;
142   *r_v1 = edge.v_high;
143 }
144 BLI_INLINE void BLI_edgesetIterator_step(EdgeSetIterator *esi)
145 {
146   esi->index++;
147 }
148 BLI_INLINE bool BLI_edgesetIterator_isDone(EdgeSetIterator *esi)
149 {
150   return esi->index >= esi->length;
151 }
152
153 #endif /* __BLI_EDGEHASH_H__ */