public ByteBuffer toByteBuffer(int index, int length) { checkIndexLength(index, length); if (base instanceof byte[]) { return ByteBuffer.wrap((byte[]) base, (int) ((address - ARRAY_BYTE_BASE_OFFSET) + index), length).slice(); } if ((reference instanceof ByteBuffer) && ((ByteBuffer) reference).isDirect()) { ByteBuffer buffer = (ByteBuffer) reference; int position = toIntExact(address - bufferAddress(buffer)) + index; buffer = buffer.duplicate(); buffer.position(position); buffer.limit(position + length); return buffer.slice(); } throw new UnsupportedOperationException("Conversion to ByteBuffer not supported for this Slice"); }
/** * Wrap the visible portion of a {@link java.nio.ByteBuffer}. */ public static Slice wrappedBuffer(ByteBuffer buffer) { if (buffer.isDirect()) { long address = getAddress(buffer); return new Slice(null, address + buffer.position(), buffer.remaining(), buffer.capacity(), buffer); } if (buffer.hasArray()) { return new Slice(buffer.array(), buffer.arrayOffset() + buffer.position(), buffer.remaining()); } throw new IllegalArgumentException("cannot wrap " + buffer.getClass().getName()); }
/** * Wrap the visible portion of a {@link java.nio.ByteBuffer}. */ public static Slice wrappedBuffer(ByteBuffer buffer) { if (buffer.isDirect()) { long address = bufferAddress(buffer); return new Slice(null, address + buffer.position(), buffer.remaining(), buffer.capacity(), buffer); } if (buffer.hasArray()) { return new Slice(buffer.array(), buffer.arrayOffset() + buffer.position(), buffer.remaining()); } throw new IllegalArgumentException("cannot wrap " + buffer.getClass().getName()); }
@Test public void testRawAddressWithReference() throws Exception { ByteBuffer buffer = ByteBuffer.allocateDirect(100); assertTrue(buffer.isDirect()); long address = getAddress(buffer); UnsafeSliceFactory factory = UnsafeSliceFactory.getInstance(); Slice slice = factory.newSlice(address, buffer.capacity(), buffer); slice.setInt(32, 0xDEADBEEF); assertEquals(slice.getInt(32), 0xDEADBEEF); }
@Test public void testRawAddressWithReference() throws Exception { ByteBuffer buffer = ByteBuffer.allocateDirect(100); assertTrue(buffer.isDirect()); long address = bufferAddress(buffer); UnsafeSliceFactory factory = UnsafeSliceFactory.getInstance(); Slice slice = factory.newSlice(address, buffer.capacity(), buffer); slice.setInt(32, 0xDEADBEEF); assertEquals(slice.getInt(32), 0xDEADBEEF); }