Something went wrong. Try again.
🌱 A minimal programming language and compiler. git.urbach.dev/cli/q
high-performance programming-language compiler
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748package exe
import ( "bytes")
// Align calculates the next aligned address (alignment must be a power of 2).func Align[T Integer](n T, alignment T) T { return (n + (alignment - 1)) & ^(alignment - 1)}
// AlignPad calculates the next aligned address and the padding needed (alignment must be a power of 2).func AlignPad[T Integer](n T, alignment T) (T, T) { aligned := Align(n, alignment) return aligned, aligned - n}
// Pad calculates the padding (alignment must be a power of 2).func Pad[T Integer](n T, alignment T) T { return -n & (alignment - 1)}
// PadBuffer pads the buffer to the given alignment (alignment must be a power of 2).func PadBuffer[T Integer](b *bytes.Buffer, alignment T) { padding := Pad(T(b.Len()), alignment)
if padding > 0 { b.Write(make([]byte, padding)) }}
// PadSlice pads the slice to the given alignment (alignment must be a power of 2).func PadSlice[E any, T Integer](slice []E, alignment T) []E { pad := Pad(T(len(slice)), alignment)
if pad == 0 { return slice }
if T(cap(slice)) >= T(len(slice))+pad { old := T(len(slice)) slice = slice[:old+pad] clear(slice[old:]) return slice }
return append(slice, make([]E, pad)...)}