1 #ifndef __MONO_BITSET_H__
2 #define __MONO_BITSET_H__
7 * When embedding, you have to define MONO_ZERO_LEN_ARRAY before including any
8 * other Mono header file if you use a different compiler from the one used to
11 #ifndef MONO_ZERO_LEN_ARRAY
13 #define MONO_ZERO_LEN_ARRAY 0
15 #define MONO_ZERO_LEN_ARRAY 1
19 #define MONO_BITSET_BITS_PER_CHUNK (8 * sizeof (gsize))
24 gsize data
[MONO_ZERO_LEN_ARRAY
];
27 typedef void (*MonoBitSetFunc
) (guint idx
, gpointer data
);
30 MONO_BITSET_DONT_FREE
= 1
33 /* Fast access to bits which depends on the implementation of the bitset */
34 #define mono_bitset_test_fast(set,n) ((set)->data [(n)/MONO_BITSET_BITS_PER_CHUNK] & ((gsize)1 << ((n) % MONO_BITSET_BITS_PER_CHUNK)))
35 #define mono_bitset_test_fast(set,n) ((set)->data [(n)/MONO_BITSET_BITS_PER_CHUNK] & ((gsize)1 << ((n) % MONO_BITSET_BITS_PER_CHUNK)))
36 #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)
37 #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)
38 #define mono_bitset_get_fast(set,n) ((set)->data[(n)])
40 #define mono_bitset_copyto_fast(src,dest) do { memcpy (&(dest)->data, &(src)->data, (dest)->size / 8); } while (0)
42 #define mono_bitset_union_fast(dest,src) do { \
43 MonoBitSet *tmp_src = (src); \
44 MonoBitSet *tmp_dest = (dest); \
46 size = tmp_dest->size / MONO_BITSET_BITS_PER_CHUNK; \
47 for (i = 0; i < size; ++i) \
48 tmp_dest->data [i] |= tmp_src->data [i]; \
51 #define mono_bitset_sub_fast(dest,src) do { \
52 MonoBitSet *tmp_src = (src); \
53 MonoBitSet *tmp_dest = (dest); \
55 size = tmp_dest->size / MONO_BITSET_BITS_PER_CHUNK; \
56 for (i = 0; i < size; ++i) \
57 tmp_dest->data [i] &= ~tmp_src->data [i]; \
61 * Interface documentation can be found in the c-file.
62 * Interface documentation by Dennis Haney.
65 guint32
mono_bitset_alloc_size (guint32 max_size
, guint32 flags
);
67 MonoBitSet
* mono_bitset_new (guint32 max_size
, guint32 flags
);
69 MonoBitSet
* mono_bitset_mem_new (gpointer mem
, guint32 max_size
, guint32 flags
);
71 void mono_bitset_free (MonoBitSet
*set
);
73 void mono_bitset_set (MonoBitSet
*set
, guint32 pos
);
75 void mono_bitset_set_all (MonoBitSet
*set
);
77 int mono_bitset_test (const MonoBitSet
*set
, guint32 pos
);
79 gsize
mono_bitset_test_bulk (const MonoBitSet
*set
, guint32 pos
);
81 void mono_bitset_clear (MonoBitSet
*set
, guint32 pos
);
83 void mono_bitset_clear_all (MonoBitSet
*set
);
85 void mono_bitset_invert (MonoBitSet
*set
);
87 guint32
mono_bitset_size (const MonoBitSet
*set
);
89 guint32
mono_bitset_count (const MonoBitSet
*set
);
91 void mono_bitset_low_high (const MonoBitSet
*set
, guint32
*low
, guint32
*high
);
93 int mono_bitset_find_start (const MonoBitSet
*set
);
95 int mono_bitset_find_first (const MonoBitSet
*set
, gint pos
);
97 int mono_bitset_find_last (const MonoBitSet
*set
, gint pos
);
99 int mono_bitset_find_first_unset (const MonoBitSet
*set
, gint pos
);
101 MonoBitSet
* mono_bitset_clone (const MonoBitSet
*set
, guint32 new_size
);
103 void mono_bitset_copyto (const MonoBitSet
*src
, MonoBitSet
*dest
);
105 void mono_bitset_union (MonoBitSet
*dest
, const MonoBitSet
*src
);
107 void mono_bitset_intersection (MonoBitSet
*dest
, const MonoBitSet
*src
);
109 void mono_bitset_sub (MonoBitSet
*dest
, const MonoBitSet
*src
);
111 gboolean
mono_bitset_equal (const MonoBitSet
*src
, const MonoBitSet
*src1
);
113 void mono_bitset_foreach (MonoBitSet
*set
, MonoBitSetFunc func
, gpointer data
);
115 void mono_bitset_intersection_2 (MonoBitSet
*dest
, const MonoBitSet
*src1
, const MonoBitSet
*src2
);
117 #endif /* __MONO_BITSET_H__ */