@@ -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}
0 commit comments