in src/main/java/org/apache/datasketches/theta/ForwardCompatibility.java [94:151]
static final CompactSketch heapify2to3(final Memory srcMem, final short seedHash) {
final int memCap = (int) srcMem.getCapacity();
final int preLongs = extractPreLongs(srcMem); //1,2 or 3
final int familyId = extractFamilyID(srcMem); //1,2,3,4
if ((familyId < 1) || (familyId > 4)) {
throw new SketchesArgumentException("Family (Sketch Type) must be 1 to 4: " + familyId);
}
int reqBytesIn = 8;
int curCount = 0;
long thetaLong = Long.MAX_VALUE;
if (preLongs == 1) {
reqBytesIn = 8;
validateInputSize(reqBytesIn, memCap);
return EmptyCompactSketch.getInstance();
}
if (preLongs == 2) { //includes pre0 + count, no theta (== 1.0)
reqBytesIn = preLongs << 3;
validateInputSize(reqBytesIn, memCap);
curCount = extractCurCount(srcMem);
if (curCount == 0) {
return EmptyCompactSketch.getInstance();
}
if (curCount == 1) {
reqBytesIn = (preLongs + 1) << 3;
validateInputSize(reqBytesIn, memCap);
final long hash = srcMem.getLong(preLongs << 3);
return new SingleItemSketch(hash, seedHash);
}
//curCount > 1
reqBytesIn = (curCount + preLongs) << 3;
validateInputSize(reqBytesIn, memCap);
final long[] compactOrderedCache = new long[curCount];
srcMem.getLongArray(preLongs << 3, compactOrderedCache, 0, curCount);
return new HeapCompactSketch(compactOrderedCache, false, seedHash, curCount, thetaLong,true);
}
if (preLongs == 3) { //pre0 + count + theta
reqBytesIn = (preLongs) << 3; //
validateInputSize(reqBytesIn, memCap);
curCount = extractCurCount(srcMem);
thetaLong = extractThetaLong(srcMem);
if ((curCount == 0) && (thetaLong == Long.MAX_VALUE)) {
return EmptyCompactSketch.getInstance();
}
if ((curCount == 1) && (thetaLong == Long.MAX_VALUE)) {
reqBytesIn = (preLongs + 1) << 3;
validateInputSize(reqBytesIn, memCap);
final long hash = srcMem.getLong(preLongs << 3);
return new SingleItemSketch(hash, seedHash);
}
//curCount > 1 and/or theta < 1.0
reqBytesIn = (curCount + preLongs) << 3;
validateInputSize(reqBytesIn, memCap);
final long[] compactOrderedCache = new long[curCount];
srcMem.getLongArray(preLongs << 3, compactOrderedCache, 0, curCount);
return new HeapCompactSketch(compactOrderedCache, false, seedHash, curCount, thetaLong, true);
}
throw new SketchesArgumentException("PreLongs must be 1,2, or 3: " + preLongs);
}