Skip to content

Commit e839106

Browse files
added missing packables(from experimental) for int float arrays and slight modifications
1 parent 59bc662 commit e839106

2 files changed

Lines changed: 96 additions & 16 deletions

File tree

access/put.go

Lines changed: 29 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -743,14 +743,14 @@ func (p *PutAccess) AddIntegerArray(values []int64) {
743743
}
744744

745745
// Determine the minimal element size that can store all values
746-
elementSize := determineIntegerSize(values)
746+
elementSize := DetermineIntegerSize(values)
747747

748748
// Create buffer: [elementSize] + [values...]
749749
buf := make([]byte, 1+len(values)*elementSize)
750750
buf[0] = byte(elementSize)
751751

752752
// Encode values
753-
encodeIntegers(buf[1:], values, elementSize)
753+
EncodeIntegers(buf[1:], values, elementSize)
754754

755755
p.offsets = binary.LittleEndian.AppendUint16(p.offsets,
756756
typetags.EncodeHeader(p.position, typetags.TypeInteger))
@@ -770,19 +770,16 @@ func (p *PutAccess) AddFloatArray(values []float64) {
770770
buf := make([]byte, 1+len(values)*elementSize)
771771
buf[0] = byte(elementSize)
772772

773-
for i, v := range values {
774-
bits := math.Float64bits(v)
775-
binary.LittleEndian.PutUint64(buf[1+i*elementSize:], bits)
776-
}
773+
EncodeFloatingArray(buf, values)
777774

778775
p.offsets = binary.LittleEndian.AppendUint16(p.offsets,
779776
typetags.EncodeHeader(p.position, typetags.TypeFloating))
780777
p.buf = append(p.buf, buf...)
781778
p.position = len(p.buf)
782779
}
783780

784-
// determineIntegerSize determines the minimal element size that can store all integers
785-
func determineIntegerSize(values []int64) int {
781+
// DetermineIntegerSize determines the minimal element size that can store all integers
782+
func DetermineIntegerSize(values []int64) int {
786783
maxVal := int64(0)
787784
minVal := int64(0)
788785
for _, v := range values {
@@ -806,18 +803,34 @@ func determineIntegerSize(values []int64) int {
806803
}
807804
}
808805

809-
// encodeIntegers encodes integers into the buffer with the given element size
810-
func encodeIntegers(buf []byte, values []int64, elementSize int) {
811-
for i, v := range values {
812-
switch elementSize {
813-
case 1:
806+
// EncodeIntegers encodes an int64 slice into buf using the given element size.
807+
func EncodeIntegers(buf []byte, values []int64, elementSize int) {
808+
switch elementSize {
809+
case 1:
810+
for i, v := range values {
814811
buf[i] = byte(v)
815-
case 2:
812+
}
813+
case 2:
814+
for i, v := range values {
816815
binary.LittleEndian.PutUint16(buf[i*2:], uint16(v))
817-
case 4:
816+
}
817+
case 4:
818+
for i, v := range values {
818819
binary.LittleEndian.PutUint32(buf[i*4:], uint32(v))
819-
case 8:
820+
}
821+
case 8:
822+
for i, v := range values {
820823
binary.LittleEndian.PutUint64(buf[i*8:], uint64(v))
821824
}
825+
default:
826+
panic("unsupported element size")
827+
}
828+
}
829+
830+
// EncodeFloatingArray encodes a float64 slice into buf with element size fixed at 8.
831+
func EncodeFloatingArray(buf []byte, values []float64) {
832+
for i, v := range values {
833+
bits := math.Float64bits(v)
834+
binary.LittleEndian.PutUint64(buf[i*8:], bits)
822835
}
823836
}

packable/packable_primitives.go

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,3 +184,70 @@ func PackFlags(flags ...bool) PackByteArrayRef {
184184

185185
return PackByteArrayRef{ref: &buf}
186186
}
187+
188+
// PackIntegerArrayRef implements the Packable interface for *[]int64.
189+
type PackIntegerArrayRef struct {
190+
ref *[]int64
191+
elementSize int
192+
}
193+
194+
func (p PackIntegerArrayRef) HeaderType() typetags.Type { return typetags.TypeFloating }
195+
func (p PackIntegerArrayRef) ValueSize() int {
196+
197+
return len(*p.ref)*p.elementSize + 1
198+
}
199+
200+
func (p PackIntegerArrayRef) Write(buf []byte, pos int) int {
201+
// Write prefix byte for element size
202+
buf[pos] = byte(p.elementSize)
203+
pos++
204+
205+
// Encode values directly after the prefix
206+
access.EncodeIntegers(buf[pos:], *p.ref, p.elementSize)
207+
208+
// Return new position after writing all values
209+
return pos + len(*p.ref)*p.elementSize
210+
}
211+
212+
func (v PackIntegerArrayRef) PackInto(p *access.PutAccess) {
213+
p.AddIntegerArray(*v.ref)
214+
}
215+
216+
func PackIntegerArray(values []int64) PackIntegerArrayRef {
217+
elementSize := access.DetermineIntegerSize(values)
218+
return PackIntegerArrayRef{ref: &values, elementSize: elementSize}
219+
}
220+
221+
// PackFloatArrayRef implements the Packable interface for *[]float64.
222+
type PackFloatArrayRef struct {
223+
ref *[]float64
224+
}
225+
226+
func (p PackFloatArrayRef) HeaderType() typetags.Type {
227+
return typetags.TypeFloating
228+
}
229+
230+
func (p PackFloatArrayRef) ValueSize() int {
231+
// +1 for the elementSize prefix byte (always 8)
232+
return len(*p.ref)*8 + 1
233+
}
234+
235+
func (p PackFloatArrayRef) Write(buf []byte, pos int) int {
236+
// First byte indicates the element size (always 8)
237+
buf[pos] = 8
238+
pos++
239+
240+
// Write the float array
241+
access.EncodeFloatingArray(buf[pos:], *p.ref)
242+
243+
return pos + len(*p.ref)*8
244+
}
245+
246+
func (v PackFloatArrayRef) PackInto(p *access.PutAccess) {
247+
p.AddFloatArray(*v.ref)
248+
}
249+
250+
func PackFloatArray(values []float64) PackFloatArrayRef {
251+
// No need to determine element size, always 8
252+
return PackFloatArrayRef{ref: &values}
253+
}

0 commit comments

Comments
 (0)