summaryrefslogtreecommitdiff
path: root/includes/compiler/BitVector.h
blob: a6830d6b820e3907b7ede2c3c64b7e07906d6db5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#ifndef COMPILER_IROBITVECT_H
#define COMPILER_IROBITVECT_H

#include "compiler/common.h"
#include "compiler/CError.h"

typedef struct BitVector {
    UInt32 size;
    UInt32 data[0];
} BitVector;

extern void Bv_AllocVector(BitVector **bv, UInt32 size);
extern void Bv_AllocVectorLocal(BitVector **bv, UInt32 size);
extern void Bv_ClearBit(UInt32 bit, BitVector *bv);
extern void Bv_And(const BitVector *a, BitVector *b);
extern void Bv_Or(const BitVector *a, BitVector *b);
extern Boolean Bv_BitsInCommon(const BitVector *a, const BitVector *b);
extern Boolean Bv_Compare(const BitVector *a, const BitVector *b);
extern void Bv_Minus(const BitVector *a, BitVector *b);
extern void Bv_Copy(const BitVector *src, BitVector *dst);
extern void Bv_Clear(BitVector *bv);
extern void Bv_Set(BitVector *bv);
extern Boolean Bv_IsSubset(const BitVector *a, const BitVector *b);
extern Boolean Bv_IsEmpty(const BitVector *bv);

CW_INLINE void Bv_SetBit(UInt32 bit, BitVector *bv) {
    if ((bit / 32) < bv->size) {
        bv->data[bit / 32] |= 1 << (bit & 31);
    } else {
        CError_FATAL(56);
    }
}

#define Bv_IsBitSet(_bit, _bv) ( (((_bit) >> 5) < (_bv)->size) && ((_bv)->data[(_bit) >> 5] & (1 << ((_bit) & 31))) )

#endif