#ifndef CORE_BIT_ARRAY_H
#define CORE_BIT_ARRAY_H

#include "core/Types.h"

typedef struct {
    u64 length : 56;
    u64 bits : 8;
    u64* data;
} CoreBitArray;

static_assert(sizeof(CoreBitArray) == 16, "invalid bit array size");

#define CORE_BIT_ARRAY ((CoreBitArray){0, 0, nullptr})
void coreCopyBitArray(CoreBitArray* a, const CoreBitArray* other);
void coreMoveBitArray(CoreBitArray* a, CoreBitArray* other);
void coreDestroyBitArray(CoreBitArray* a);
CoreBitArray* coreSetBitsBitArray(CoreBitArray* a, size_t index, u64 value);
u64 coreGetBitsBitArray(const CoreBitArray* a, size_t index);
size_t coreGetBytesBitArray(const CoreBitArray* a);
i64 coreSelectBitsBitArray(const CoreBitArray* a, size_t index);
void coreResizeBitArray(CoreBitArray* a, size_t newLength, size_t newBits);
void coreFillBitArray(CoreBitArray* a, u64 value);
size_t coreToStringBitArray(const CoreBitArray* a, char* buffer, size_t n);
void coreSwapBitArray(CoreBitArray* a, CoreBitArray* b);

#ifdef IMPORT_CORE
#define BitArray CoreBitArray
#define BIT_ARRAY CORE_BIT_ARRAY
#define copyBitArray coreCopyBitArray
#define moveBitArray coreMoveBitArray
#define destroyBitArray coreDestroyBitArray
#define setBitsBitArray coreSetBitsBitArray
#define getBitsBitArray coreGetBitsBitArray
#define getBytesBitArray coreGetBytesBitArray
#define selectBitsBitArray coreSelectBitsBitArray
#define resizeBitArray coreResizeBitArray
#define fillBitArray coreFillBitArray
#define toStringBitArray coreToStringBitArray
#define swapBitArray coreSwapBitArray
#endif

#endif