-#define mono_bitset_test_fast(set,n) (((gsize*)set)[2+(n)/MONO_BITSET_BITS_PER_CHUNK] & ((gsize)1 << ((n) % MONO_BITSET_BITS_PER_CHUNK)))
-#define mono_bitset_set_fast(set,n) do { ((gsize*)set)[2+(n)/MONO_BITSET_BITS_PER_CHUNK] |= ((gsize)1 << ((n) % MONO_BITSET_BITS_PER_CHUNK)); } while (0)
-#define mono_bitset_clear_fast(set,n) do { ((gsize*)set)[2+(n)/MONO_BITSET_BITS_PER_CHUNK] &= ~((gsize)1 << ((n) % MONO_BITSET_BITS_PER_CHUNK)); } while (0)
-#define mono_bitset_get_fast(set,n) (((gsize*)set)[2+(n)])
+#define mono_bitset_test_fast(set,n) ((set)->data [(n)/MONO_BITSET_BITS_PER_CHUNK] & ((gsize)1 << ((n) % MONO_BITSET_BITS_PER_CHUNK)))
+#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)
+#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)
+#define mono_bitset_get_fast(set,n) ((set)->data[(n)])
+
+#define mono_bitset_copyto_fast(src,dest) do { memcpy (&(dest)->data, &(src)->data, (dest)->size / 8); } while (0)
+
+#define MONO_BITSET_FOREACH(set,idx,/*stmt*/...) \
+ do \
+ { \
+ MonoBitSet *set__ = (set); \
+ for (int i__ = 0; i__ < set__->size / MONO_BITSET_BITS_PER_CHUNK; i__++) { \
+ if (set__->data [i__]) { \
+ for (int j__ = 0; j__ < MONO_BITSET_BITS_PER_CHUNK; j__++) { \
+ if (set__->data [i__] & ((gsize) 1 << j__)) { \
+ guint idx = j__ + i__ * MONO_BITSET_BITS_PER_CHUNK; \
+ __VA_ARGS__; \
+ } \
+ } \
+ } \
+ } \
+ } while (0)
+
+#define mono_bitset_union_fast(dest,src) do { \
+ MonoBitSet *tmp_src = (src); \
+ MonoBitSet *tmp_dest = (dest); \
+ int i, size; \
+ size = tmp_dest->size / MONO_BITSET_BITS_PER_CHUNK; \
+ for (i = 0; i < size; ++i) \
+ tmp_dest->data [i] |= tmp_src->data [i]; \
+} while (0)
+
+#define mono_bitset_sub_fast(dest,src) do { \
+ MonoBitSet *tmp_src = (src); \
+ MonoBitSet *tmp_dest = (dest); \
+ int i, size; \
+ size = tmp_dest->size / MONO_BITSET_BITS_PER_CHUNK; \
+ for (i = 0; i < size; ++i) \
+ tmp_dest->data [i] &= ~tmp_src->data [i]; \
+} while (0)