func()

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
}