in src/main/java/org/apache/datasketches/theta/CompactSketch.java [286:326]
private static CompactSketch wrap(final byte[] bytes, final long seed, final boolean enforceSeed) {
final int serVer = bytes[PreambleUtil.SER_VER_BYTE];
final int familyId = bytes[PreambleUtil.FAMILY_BYTE];
final Family family = Family.idToFamily(familyId);
if (family != Family.COMPACT) {
throw new IllegalArgumentException("Corrupted: " + family + " is not Compact!");
}
final short seedHash = ThetaUtil.computeSeedHash(seed);
if (serVer == 4) {
return WrappedCompactCompressedSketch.wrapInstance(bytes, seedHash);
} else if (serVer == 3) {
final int flags = bytes[FLAGS_BYTE];
if ((flags & EMPTY_FLAG_MASK) > 0) {
return EmptyCompactSketch.getHeapInstance(Memory.wrap(bytes));
}
final int preLongs = bytes[PREAMBLE_LONGS_BYTE];
if (otherCheckForSingleItem(preLongs, serVer, familyId, flags)) {
return SingleItemSketch.heapify(Memory.wrap(bytes), enforceSeed ? seedHash : getShortLE(bytes, SEED_HASH_SHORT));
}
//not empty & not singleItem
final boolean compactFlag = (flags & COMPACT_FLAG_MASK) > 0;
if (!compactFlag) {
throw new SketchesArgumentException(
"Corrupted: COMPACT family sketch image must have compact flag set");
}
final boolean readOnly = (flags & READ_ONLY_FLAG_MASK) > 0;
if (!readOnly) {
throw new SketchesArgumentException(
"Corrupted: COMPACT family sketch image must have Read-Only flag set");
}
return WrappedCompactSketch.wrapInstance(bytes,
enforceSeed ? seedHash : getShortLE(bytes, SEED_HASH_SHORT));
} else if (serVer == 1) {
return ForwardCompatibility.heapify1to3(Memory.wrap(bytes), seedHash);
} else if (serVer == 2) {
return ForwardCompatibility.heapify2to3(Memory.wrap(bytes),
enforceSeed ? seedHash : getShortLE(bytes, SEED_HASH_SHORT));
}
throw new SketchesArgumentException(
"Corrupted: Serialization Version " + serVer + " not recognized.");
}