#ifndef CORE_BIT_ARRAY_H
#define CORE_BIT_ARRAY_H

#include "core/Types.h"

struct CoreBitArrayT {
    u64 length : 56;
    u64 bits : 8;
    u64* data;
};
typedef struct CoreBitArrayT CoreBitArray;
static_assert(sizeof(CoreBitArray) == 16, "invalid bit array size");

void coreInitBitArray(CoreBitArray* a, size_t length, size_t bits);
void coreDestroyBitArray(CoreBitArray* a);
void coreSetBits(CoreBitArray* a, size_t index, u64 value);
void coreSetAllBits(CoreBitArray* a, u64 value);
u64 coreGetBits(const CoreBitArray* a, size_t index);
i64 coreSelectBits(const CoreBitArray* a, size_t index);
void coreSetBitLength(CoreBitArray* a, size_t newLength, size_t newBits);

#ifdef IMPORT_CORE
#define BitArray CoreBitArray
#define initBitArray coreInitBitArray
#define destroyBitArray coreDestroyBitArray
#define setBits coreSetBits
#define setAllBits coreSetAllBits
#define getBits coreGetBits
#define selectBits coreSelectBits
#define setBitLength coreSetBitLength
#endif

#endif