[sgen] Add debug option for valloc limit
[mono-project.git] / mono / utils / monobitset.h
blobfbeedeefbe1a6fcb66543c8b43dfc9ebff8db83a
1 /**
2 * \file
3 */
5 #ifndef __MONO_BITSET_H__
6 #define __MONO_BITSET_H__
8 #include <glib.h>
9 #include <mono/utils/mono-publib.h>
11 #define MONO_BITSET_BITS_PER_CHUNK (8 * sizeof (gsize))
13 typedef struct {
14 gsize size;
15 gsize flags;
16 gsize data [MONO_ZERO_LEN_ARRAY];
17 } MonoBitSet;
19 typedef void (*MonoBitSetFunc) (guint idx, gpointer data);
21 enum {
22 MONO_BITSET_DONT_FREE = 1
25 /* Fast access to bits which depends on the implementation of the bitset */
26 #define mono_bitset_test_fast(set,n) ((set)->data [(n)/MONO_BITSET_BITS_PER_CHUNK] & ((gsize)1 << ((n) % MONO_BITSET_BITS_PER_CHUNK)))
27 #define mono_bitset_set_fast(set,n) do { (set)->data [(n)/MONO_BITSET_BITS_PER_CHUNK] |= ((gsize)1 << ((n) % MONO_BITSET_BITS_PER_CHUNK)); } while (0)
28 #define mono_bitset_clear_fast(set,n) do { (set)->data [(n)/MONO_BITSET_BITS_PER_CHUNK] &= ~((gsize)1 << ((n) % MONO_BITSET_BITS_PER_CHUNK)); } while (0)
29 #define mono_bitset_get_fast(set,n) ((set)->data[(n)])
31 #define mono_bitset_copyto_fast(src,dest) do { memcpy (&(dest)->data, &(src)->data, (dest)->size / 8); } while (0)
33 #define MONO_BITSET_FOREACH(set,idx,/*stmt*/...) \
34 do \
35 { \
36 MonoBitSet *set__ = (set); \
37 for (int i__ = 0; i__ < set__->size / MONO_BITSET_BITS_PER_CHUNK; i__++) { \
38 if (set__->data [i__]) { \
39 for (int j__ = 0; j__ < MONO_BITSET_BITS_PER_CHUNK; j__++) { \
40 if (set__->data [i__] & ((gsize) 1 << j__)) { \
41 guint idx = j__ + i__ * MONO_BITSET_BITS_PER_CHUNK; \
42 __VA_ARGS__; \
43 } \
44 } \
45 } \
46 } \
47 } while (0)
49 #define mono_bitset_union_fast(dest,src) do { \
50 MonoBitSet *tmp_src = (src); \
51 MonoBitSet *tmp_dest = (dest); \
52 int i, size; \
53 size = tmp_dest->size / MONO_BITSET_BITS_PER_CHUNK; \
54 for (i = 0; i < size; ++i) \
55 tmp_dest->data [i] |= tmp_src->data [i]; \
56 } while (0)
58 #define mono_bitset_sub_fast(dest,src) do { \
59 MonoBitSet *tmp_src = (src); \
60 MonoBitSet *tmp_dest = (dest); \
61 int i, size; \
62 size = tmp_dest->size / MONO_BITSET_BITS_PER_CHUNK; \
63 for (i = 0; i < size; ++i) \
64 tmp_dest->data [i] &= ~tmp_src->data [i]; \
65 } while (0)
68 * Interface documentation can be found in the c-file.
69 * Interface documentation by Dennis Haney.
72 MONO_API guint32 mono_bitset_alloc_size (guint32 max_size, guint32 flags);
74 MONO_API MonoBitSet* mono_bitset_new (guint32 max_size, guint32 flags);
76 MONO_API MonoBitSet* mono_bitset_mem_new (gpointer mem, guint32 max_size, guint32 flags);
78 MONO_API void mono_bitset_free (MonoBitSet *set);
80 MONO_API void mono_bitset_set (MonoBitSet *set, guint32 pos);
82 MONO_API void mono_bitset_set_all (MonoBitSet *set);
84 MONO_API int mono_bitset_test (const MonoBitSet *set, guint32 pos);
86 MONO_API gsize mono_bitset_test_bulk (const MonoBitSet *set, guint32 pos);
88 MONO_API void mono_bitset_clear (MonoBitSet *set, guint32 pos);
90 MONO_API void mono_bitset_clear_all (MonoBitSet *set);
92 MONO_API void mono_bitset_invert (MonoBitSet *set);
94 MONO_API guint32 mono_bitset_size (const MonoBitSet *set);
96 MONO_API guint32 mono_bitset_count (const MonoBitSet *set);
98 MONO_API void mono_bitset_low_high (const MonoBitSet *set, guint32 *low, guint32 *high);
100 MONO_API int mono_bitset_find_start (const MonoBitSet *set);
102 MONO_API int mono_bitset_find_first (const MonoBitSet *set, gint pos);
104 MONO_API int mono_bitset_find_last (const MonoBitSet *set, gint pos);
106 MONO_API int mono_bitset_find_first_unset (const MonoBitSet *set, gint pos);
108 MONO_API MonoBitSet* mono_bitset_clone (const MonoBitSet *set, guint32 new_size);
110 MONO_API void mono_bitset_copyto (const MonoBitSet *src, MonoBitSet *dest);
112 MONO_API void mono_bitset_union (MonoBitSet *dest, const MonoBitSet *src);
114 MONO_API void mono_bitset_intersection (MonoBitSet *dest, const MonoBitSet *src);
116 MONO_API void mono_bitset_sub (MonoBitSet *dest, const MonoBitSet *src);
118 MONO_API gboolean mono_bitset_equal (const MonoBitSet *src, const MonoBitSet *src1);
120 MONO_API void mono_bitset_foreach (MonoBitSet *set, MonoBitSetFunc func, gpointer data);
122 MONO_API void mono_bitset_intersection_2 (MonoBitSet *dest, const MonoBitSet *src1, const MonoBitSet *src2);
124 #endif /* __MONO_BITSET_H__ */