@Test(dataProvider = "slices") publicvoid testOffset(SegmentSlice s1, SegmentSlice s2) { if (s1.contains(s2)) { // check that a segment and its overlapping segment point to same elements long offset = s1.segment.segmentOffset(s2.segment); for (int i = 0; i < s2.size(); i++) {
out.format("testOffset s1:%s, s2:%s, offset:%d, i:%s\n", s1, s2, offset, i); byte expected = s2.segment.get(JAVA_BYTE, i); byte found = s1.segment.get(JAVA_BYTE, i + offset);
assertEquals(found, expected);
}
} elseif (s1.kind != s2.kind) { // check that offset from s1 to s2 fails try { long offset = s1.segment.segmentOffset(s2.segment);
out.format("testOffset s1:%s, s2:%s, offset:%d\n", s1, s2, offset);
fail("offset unexpectedly passed!");
} catch (UnsupportedOperationException ex) {
assertTrue(ex.getMessage().contains("Cannot compute offset from native to heap (or vice versa)."));
}
} elseif (!s2.contains(s1)) { // disjoint segments - check that offset is out of bounds long offset = s1.segment.segmentOffset(s2.segment); for (int i = 0; i < s2.size(); i++) {
out.format("testOffset s1:%s, s2:%s, offset:%d, i:%s\n", s1, s2, offset, i);
s2.segment.get(JAVA_BYTE, i); try {
s1.segment.get(JAVA_BYTE, i + offset);
fail("Offset on a disjoint segment is not out of bounds!");
} catch (IndexOutOfBoundsException ex) {
assertTrue(true);
}
}
}
}
final Kind kind; finalint first; finalint last; final MemorySegment segment;
public SegmentSlice(Kind kind, int first, int last, MemorySegment segment) { this.kind = kind; this.first = first; this.last = last; this.segment = segment;
}
boolean contains(SegmentSlice other) { return kind == other.kind &&
first <= other.first &&
last >= other.last;
}
int size() { return last - first + 1;
}
}
@DataProvider(name = "slices") static Object[][] slices() { int[] sizes = { 16, 8, 4, 2, 1 };
List<SegmentSlice> slices = new ArrayList<>(); for (SegmentSlice.Kind kind : SegmentSlice.Kind.values()) { // init root segment
MemorySegment segment = kind.makeSegment(16); for (int i = 0 ; i < 16 ; i++) {
segment.set(JAVA_BYTE, i, (byte)i);
} // compute all slices for (int size : sizes) { for (int index = 0 ; index < 16 ; index += size) {
MemorySegment slice = segment.asSlice(index, size);
slices.add(new SegmentSlice(kind, index, index + size - 1, slice));
}
}
}
Object[][] sliceArray = new Object[slices.size() * slices.size()][]; for (int i = 0 ; i < slices.size() ; i++) { for (int j = 0 ; j < slices.size() ; j++) {
sliceArray[i * slices.size() + j] = new Object[] { slices.get(i), slices.get(j) };
}
} return sliceArray;
}
}
Messung V0.5 in Prozent
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.14Bemerkung:
(vorverarbeitet am 2026-10-11)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.