func()

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
}