in kll/items_sketch_validate.go [103:151]
func (vlid *itemsSketchMemoryValidate[C]) validate() error {
switch vlid.sketchStructure {
case _COMPACT_FULL:
if vlid.emptyFlag {
return fmt.Errorf("Empty flag and compact full")
}
vlid.n = getN(vlid.srcMem)
vlid.minK = getMinK(vlid.srcMem)
vlid.numLevels = getNumLevels(vlid.srcMem)
// Get Levels Arr and add the last element
vlid.levelsArr = make([]uint32, vlid.numLevels+1)
for i := uint8(0); i < vlid.numLevels; i++ {
vlid.levelsArr[i] = binary.LittleEndian.Uint32(vlid.srcMem[_DATA_START_ADR+i*4 : _DATA_START_ADR+i*4+4])
}
capacityItems := computeTotalItemCapacity(uint16(vlid.k), uint8(vlid.m), uint8(vlid.numLevels))
vlid.levelsArr[vlid.numLevels] = capacityItems //load the last one
sb, err := computeSketchBytes(vlid.srcMem, vlid.levelsArr, vlid.typeBytes, vlid.serde)
if err != nil {
return err
}
vlid.sketchBytes = sb
case _COMPACT_EMPTY:
if !vlid.emptyFlag {
return fmt.Errorf("Empty flag and compact empty")
}
vlid.n = 0 //assumed
vlid.minK = uint16(vlid.k)
vlid.numLevels = 1 //assumed
vlid.levelsArr = []uint32{uint32(vlid.k), uint32(vlid.k)}
vlid.sketchBytes = _DATA_START_ADR_SINGLE_ITEM
case _COMPACT_SINGLE:
if vlid.emptyFlag {
return fmt.Errorf("Empty flag and compact single")
}
vlid.n = 1 //assumed
vlid.minK = uint16(vlid.k)
vlid.numLevels = 1 //assumed
vlid.levelsArr = []uint32{uint32(vlid.k) - 1, uint32(vlid.k)}
v, err := vlid.serde.SizeOfMany(vlid.srcMem, _DATA_START_ADR_SINGLE_ITEM, 1)
if err != nil {
return err
}
vlid.sketchBytes = _DATA_START_ADR_SINGLE_ITEM + v
default:
return fmt.Errorf("Invalid preamble ints and serial version combo")
}
return nil
}