in kll/items_sketch.go [472:547]
func (s *ItemsSketch[C]) ToSlice() ([]byte, error) {
if s.serde == nil {
return nil, fmt.Errorf("no SerDe provided")
}
srcN := s.n
var tgtStructure = _COMPACT_FULL
if srcN == 0 {
tgtStructure = _COMPACT_EMPTY
} else if srcN == 1 {
tgtStructure = _COMPACT_SINGLE
}
totalBytes, err := s.currentSerializedSizeBytes()
if err != nil {
return nil, err
}
bytesOut := make([]byte, totalBytes)
//ints 0,1
preInts := byte(tgtStructure.getPreInts())
serVer := byte(tgtStructure.getSerVer())
famId := byte(internal.FamilyEnum.Kll.Id)
flags := byte(0)
if s.IsEmpty() {
flags |= _EMPTY_BIT_MASK
}
if s.isLevelZeroSorted {
flags |= _LEVEL_ZERO_SORTED_BIT_MASK
}
if s.n == 1 {
flags |= _SINGLE_ITEM_BIT_MASK
}
k := uint16(s.k)
m := uint8(s.m)
bytesOut[0] = preInts
bytesOut[1] = serVer
bytesOut[2] = famId
bytesOut[3] = flags
binary.LittleEndian.PutUint16(bytesOut[4:6], k)
bytesOut[6] = m
if tgtStructure == _COMPACT_EMPTY {
return bytesOut, nil
}
if tgtStructure == _COMPACT_SINGLE {
siByteArr, err := s.getSingleItemByteArr()
if err != nil {
return nil, err
}
copy(bytesOut[_DATA_START_ADR_SINGLE_ITEM:], siByteArr)
return bytesOut, nil
}
// Tgt is either COMPACT_FULL or UPDATABLE
//ints 2,3
n := s.n
//ints 4
minK := uint16(s.minK)
numLevels := uint8(s.numLevels)
//end of full preamble
lvlsArr := s.getLevelsArray()
minMaxByteArr := s.getMinMaxByteArr()
itemsByteArr := s.getRetainedItemsByteArr()
binary.LittleEndian.PutUint64(bytesOut[8:16], n)
binary.LittleEndian.PutUint16(bytesOut[16:18], minK)
bytesOut[18] = numLevels
for i := uint8(0); i < numLevels; i++ {
binary.LittleEndian.PutUint32(bytesOut[_DATA_START_ADR+i*4:], lvlsArr[i])
}
copy(bytesOut[_DATA_START_ADR+(numLevels*4):], minMaxByteArr)
copy(bytesOut[_DATA_START_ADR+int(numLevels*4)+len(minMaxByteArr):], itemsByteArr)
return bytesOut, nil
}