in datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/Utf8.java [58:87]
static final int getCharsFromUtf8(final long offsetBytes, final int utf8LengthBytes,
final Appendable dst, final long cumBaseOffset, final Object unsafeObj)
throws IOException, Utf8CodingException {
if ((dst instanceof CharBuffer) && ((CharBuffer) dst).hasArray()) {
return getCharBufferCharsFromUtf8(offsetBytes, ((CharBuffer) dst), utf8LengthBytes,
cumBaseOffset, unsafeObj);
}
//Decode Direct CharBuffers and all other Appendables
final long address = cumBaseOffset + offsetBytes;
// Optimize for 100% ASCII (Hotspot loves small simple top-level loops like this).
// This simple loop stops when we encounter a byte >= 0x80 (i.e. non-ASCII).
// Need to keep this loop int-indexed, because it's faster for Hotspot JIT, it doesn't insert
// savepoint polls on each iteration.
int i = 0;
for (; i < utf8LengthBytes; i++) {
final byte b = unsafe.getByte(unsafeObj, address + i);
if (!DecodeUtil.isOneByte(b)) {
break;
}
dst.append((char) b);
}
if (i == utf8LengthBytes) {
return i;
}
return getNonAsciiCharsFromUtf8(dst, address + i, address + utf8LengthBytes, unsafeObj,
cumBaseOffset) + i;
}