in frequencies/items_sketch.go [398:448]
func (i *ItemsSketch[C]) ToSlice() ([]byte, error) {
if i.hashMap.serde == nil {
return nil, errors.New("no SerDe provided")
}
preLongs := 0
outBytes := 0
empty := i.IsEmpty()
activeItems := i.GetNumActiveItems()
bytes := make([]byte, 0)
if empty {
preLongs = 1
outBytes = 8
} else {
preLongs = internal.FamilyEnum.Frequency.MaxPreLongs
bytes = i.hashMap.serde.SerializeManyToSlice(i.hashMap.getActiveKeys())
outBytes = ((preLongs + activeItems) << 3) + len(bytes)
}
outArr := make([]byte, outBytes)
pre0 := int64(0)
pre0 = insertPreLongs(int64(preLongs), pre0) //Byte 0
pre0 = insertSerVer(_SER_VER, pre0) //Byte 1
pre0 = insertFamilyID(int64(internal.FamilyEnum.Frequency.Id), pre0) //Byte 2
pre0 = insertLgMaxMapSize(int64(i.lgMaxMapSize), pre0) //Byte 3
pre0 = insertLgCurMapSize(int64(i.hashMap.lgLength), pre0) //Byte 4
if empty {
pre0 = insertFlags(_EMPTY_FLAG_MASK, pre0) //Byte 5
} else {
pre0 = insertFlags(0, pre0) //Byte 5
}
if empty {
binary.LittleEndian.PutUint64(outArr, uint64(pre0))
} else {
pre := int64(0)
preArr := make([]int64, preLongs)
preArr[0] = pre0
preArr[1] = insertActiveItems(int64(activeItems), pre)
preArr[2] = int64(i.streamWeight)
preArr[3] = int64(i.offset)
for j := 0; j < preLongs; j++ {
binary.LittleEndian.PutUint64(outArr[j<<3:], uint64(preArr[j]))
}
preBytes := preLongs << 3
for j := 0; j < activeItems; j++ {
binary.LittleEndian.PutUint64(outArr[preBytes+j<<3:], uint64(i.hashMap.getActiveValues()[j]))
}
copy(outArr[preBytes+(activeItems<<3):], bytes)
}
return outArr, nil
}