func convertToHll4()

in hll/hll_4array.go [124:170]


func convertToHll4(srcAbsHllArr hllArray) (hllSketchStateI, error) {
	lgConfigK := srcAbsHllArr.GetLgConfigK()
	hll4Array := newHll4Array(lgConfigK)
	hll4Array.putOutOfOrder(srcAbsHllArr.isOutOfOrder())

	// 1st pass: compute starting curMin and numAtCurMin:
	pair, err := curMinAndNum(srcAbsHllArr)
	if err != nil {
		return nil, err
	}
	curMin := getPairValue(pair)
	numAtCurMin := getPairLow26(pair)

	// 2nd pass: Must know curMin to create auxHashMap.
	// Populate KxQ registers, build auxHashMap if needed
	srcItr := srcAbsHllArr.iterator()
	auxHashMap := hll4Array.getAuxHashMap() //may be null
	for srcItr.nextValid() {
		slotNo := srcItr.getIndex()
		actualValue, err := srcItr.getValue()
		if err != nil {
			return nil, err
		}
		err = hll4Array.hipAndKxQIncrementalUpdate(0, actualValue)
		if err != nil {
			return nil, err
		}
		if actualValue >= (curMin + 15) {
			hll4Array.putNibble(slotNo, auxToken)
			if auxHashMap == nil {
				auxHashMap = newAuxHashMap(lgAuxArrInts[lgConfigK], lgConfigK)
				hll4Array.putAuxHashMap(auxHashMap, false)
			}
			err := auxHashMap.mustAdd(slotNo, actualValue)
			if err != nil {
				return nil, err
			}
		} else {
			hll4Array.putNibble(slotNo, byte(actualValue-curMin))
		}
	}
	hll4Array.putCurMin(curMin)
	hll4Array.putNumAtCurMin(numAtCurMin)
	hll4Array.putHipAccum(srcAbsHllArr.getHipAccum()) //intentional overwrite
	hll4Array.putRebuildCurMinNumKxQFlag(false)
	return hll4Array, nil
}