in frequencies/longs_sketch.go [488:535]
func (s *LongsSketch) ToSlice() []byte {
empty := s.IsEmpty()
activeItems := s.GetNumActiveItems()
preLongs := 1
outBytes := 8
if !empty {
preLongs = internal.FamilyEnum.Frequency.MaxPreLongs //4
outBytes = (preLongs + (2 * activeItems)) << 3 //2 because both keys and values are longs
}
outArr := make([]byte, outBytes)
//build first preLong empty or not
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(s.lgMaxMapSize), pre0) //Byte 3
pre0 = insertLgCurMapSize(int64(s.hashMap.lgLength), pre0) //Byte 4
if empty {
pre0 = insertFlags(_EMPTY_FLAG_MASK, pre0) //Byte 5
binary.LittleEndian.PutUint64(outArr, uint64(pre0))
return outArr
}
pre := int64(0)
pre0 = insertFlags(0, pre0) //Byte 5
preArr := make([]int64, preLongs)
preArr[0] = pre0
preArr[1] = insertActiveItems(int64(activeItems), pre)
preArr[2] = s.streamWeight
preArr[3] = s.offset
for i := 0; i < preLongs; i++ {
binary.LittleEndian.PutUint64(outArr[i<<3:], uint64(preArr[i]))
}
preBytes := preLongs << 3
activeValues := s.hashMap.getActiveValues()
for i := 0; i < activeItems; i++ {
binary.LittleEndian.PutUint64(outArr[preBytes+(i<<3):], uint64(activeValues[i]))
}
activeKeys := s.hashMap.getActiveKeys()
for i := 0; i < activeItems; i++ {
binary.LittleEndian.PutUint64(outArr[preBytes+((activeItems+i)<<3):], uint64(activeKeys[i]))
}
return outArr
}