in src/main/java/org/apache/datasketches/kll/KllMemoryValidate.java [115:159]
private void compactMemoryValidate(final Memory srcMem) { //FOR HEAPIFY. NOT UPDATABLE
if (empty && singleItem) { memoryValidateThrow(EMPTYBIT_AND_SINGLEBIT, flags); }
final int sw = (empty ? 1 : 0) | (singleItem ? 4 : 0);
switch (sw) {
case 0: { //FULL_COMPACT
if (preInts != PREAMBLE_INTS_FULL) { memoryValidateThrow(INVALID_PREINTS, preInts); }
if (serVer != SERIAL_VERSION_EMPTY_FULL) { memoryValidateThrow(EMPTYBIT_AND_SER_VER, serVer); }
n = getMemoryN(srcMem);
minK = getMemoryMinK(srcMem);
numLevels = getMemoryNumLevels(srcMem);
// Get Levels Arr and add the last element
levelsArr = new int[numLevels + 1];
srcMem.getIntArray(DATA_START_ADR, levelsArr, 0, numLevels); //copies all except the last one
final int capacityItems = KllHelper.computeTotalItemCapacity(k, m, numLevels);
levelsArr[numLevels] = capacityItems; //load the last one
final int retainedItems = (levelsArr[numLevels] - levelsArr[0]);
sketchBytes = DATA_START_ADR + numLevels * Integer.BYTES + 2 * typeBytes + retainedItems * typeBytes;
break;
}
case 1: { //EMPTY_COMPACT
if (preInts != PREAMBLE_INTS_EMPTY_SINGLE) { memoryValidateThrow(EMPTYBIT_AND_PREINTS, preInts); }
if (serVer != SERIAL_VERSION_EMPTY_FULL) { memoryValidateThrow(EMPTYBIT_AND_SER_VER, serVer); }
n = 0; //assumed
minK = k; //assumed
numLevels = 1; //assumed
levelsArr = new int[] {k, k};
sketchBytes = DATA_START_ADR_SINGLE_ITEM;
break;
}
case 4: { //SINGLE_COMPACT
if (preInts != PREAMBLE_INTS_EMPTY_SINGLE) { memoryValidateThrow(SINGLEBIT_AND_PREINTS, preInts); }
if (serVer != SERIAL_VERSION_SINGLE) { memoryValidateThrow(SINGLEBIT_AND_SER_VER, serVer); }
n = 1; //assumed
minK = k; //assumed
numLevels = 1; //assumed
levelsArr = new int[] {k - 1, k};
sketchBytes = DATA_START_ADR_SINGLE_ITEM + typeBytes;
break;
}
default: break; //can not happen
}
}