BitArray.bi
Code: Select all
#ifndef BitArray_bi
#define BitArray_bi
type BitArrayType
dim Array as ubyte ptr
dim Count as uinteger
dim BitSize as ubyte
declare constructor(inBitSize as ubyte, inCount as uinteger)
declare destructor()
declare sub Set(index as uinteger, inVal as ubyte)
declare function Get(index as uinteger) as uinteger
declare function SizeInBytes() as uinteger
declare function BitMask() as const ubyte
declare function GetUsedMemorySize() as uinteger
end type
#endif
Code: Select all
#ifndef BitArray_bas
#define BitArray_bas
#include once "BitArray.bi"
constructor BitArrayType(inBitSize as ubyte, inCount as uinteger)
this.BitSize = inBitSize
this.Count = inCount
'Guarantee minimum for a short int
dim byteSize as uinteger = this.SizeInBytes()
this.Array = new ubyte[byteSize]
end constructor
destructor BitArrayType()
delete [] this.Array
end destructor
function BitArrayType.BitMask() as const ubyte
return (1 SHL this.BitSize) - 1
end function
function BitArrayType.Get(index as uinteger) as uinteger
dim retVal as uinteger<16>
retVal = *cast(uinteger<16> ptr, @this.Array[(this.BitSize * index) SHR 3])
retVal SHR= ((this.BitSize * index) AND 7)
retVal AND= this.BitMask()
return retVal
end function
sub BitArrayType.Set(index as uinteger, inVal as ubyte)
dim setVal as uinteger<16> ptr = cast(uinteger<16> ptr, @this.Array[(this.BitSize * index) SHR 3])
*setVal AND= NOT (this.BitMask() SHL ((this.BitSize * index) AND 7))
*setVal OR= ((inVal AND this.BitMask()) SHL ((this.BitSize * index) AND 7))
end sub
function BitArrayType.SizeInBytes() as uinteger
return ((this.BitSize * this.Count) SHR 3) + 2
end function
function BitArrayType.GetUsedMemorySize() as uinteger
dim retVal as uinteger
retVal = sizeof(BitArrayType)
retVal += sizeof(ubyte) + this.SizeInBytes()
return retVal
end function
#endif
As an aside, I like how the errors are actually right there in the assembly code$ /mnt/c/Freebasic/FreeBASIC-1.10.0-win64/fbc.exe -c src/utilities/BitArray.bas -gen gas64
src/utilities/BitArray.asm: Assembler messages:
src/utilities/BitArray.asm:47: Error: no such instruction: `found AN ERROR:Memclear without an immediat as size'
...
mov -72[rbp], rax #Optim 2
cmp QWORD PTR -72[rbp], 0
je .L_0007
FOUND AN ERROR : Memclear without an immediat as size
.L_0007:
mov r11, 16[rbp]
mov rax, QWORD PTR -72[rbp]
mov QWORD PTR [r11], rax
...