in kll/items_sketch.go [906:959]
func (s *ItemsSketch[C]) addEmptyTopLevelToCompletelyFullSketch() {
myCurLevelsArr := s.getLevelsArray()
myCurNumLevels := s.numLevels
myCurTotalItemsCapacity := myCurLevelsArr[myCurNumLevels]
myCurItemsArr := s.GetTotalItemsArray()
minItem := s.minItem
maxItem := s.maxItem
deltaItemsCap := levelCapacity(s.k, myCurNumLevels+1, 0, s.m)
myNewTotalItemsCapacity := myCurTotalItemsCapacity + deltaItemsCap
// Check if growing the levels arr if required.
// Note that merging MIGHT over-grow levels_, in which case we might not have to grow it
growLevelsArr := len(myCurLevelsArr) < int(myCurNumLevels+2)
var (
myNewLevelsArr []uint32
myNewNumLevels uint8
)
//myNewLevelsArr := make([]uint32, myCurNumLevels+2)
// GROW LEVELS ARRAY
if growLevelsArr {
//grow levels arr by one and copy the old data to the new array, extra space at the top.
myNewLevelsArr = make([]uint32, myCurNumLevels+2)
copy(myNewLevelsArr, myCurLevelsArr)
myNewNumLevels = myCurNumLevels + 1
s.numLevels++ //increment for off-heap
} else {
myNewLevelsArr = myCurLevelsArr
myNewNumLevels = myCurNumLevels
}
// This loop updates all level indices EXCLUDING the "extra" index at the top
for level := uint8(0); level <= myNewNumLevels-1; level++ {
myNewLevelsArr[level] += deltaItemsCap
}
myNewLevelsArr[myNewNumLevels] = myNewTotalItemsCapacity // initialize the new "extra" index at the top
// GROW items ARRAY
myNewItemsArr := make([]C, myNewTotalItemsCapacity)
for i := uint32(0); i < myCurTotalItemsCapacity; i++ {
myNewItemsArr[i+deltaItemsCap] = myCurItemsArr[i]
}
// update our sketch with new expanded spaces
s.numLevels = myNewNumLevels
s.levels = myNewLevelsArr
s.minItem = minItem
s.maxItem = maxItem
s.items = myNewItemsArr
}