/* * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package com.apple.jobjc; import java.nio.ByteBuffer; import java.nio.ByteOrder; /** * A wrapper around a direct ByteBuffer and its native pointer. For documentation, @see java.nio.ByteBuffer */ public class NativeBuffer { static native long getPtrOfBuffer(final ByteBuffer byteBuffer); public final ByteBuffer buffer; public final long bufferPtr; public NativeBuffer(final int capacity){ this(ByteBuffer.allocateDirect(capacity)); } /** * Wrap a ByteBuffer and set the ByteOrder to nativeOrder. */ public NativeBuffer(ByteBuffer buffer){ this.buffer = buffer; this.bufferPtr = getPtrOfBuffer(buffer); assert buffer != null; assert bufferPtr != 0; this.buffer.order(ByteOrder.nativeOrder()); } public byte get() { return buffer.get(); } public char getChar() { return buffer.getChar(); } public double getDouble() { return buffer.getDouble(); } public float getFloat() { return buffer.getFloat(); } public int getInt() { return buffer.getInt(); } public long getLong() { return buffer.getLong(); } public short getShort() { return buffer.getShort(); } public NativeBuffer put(byte b) { buffer.put(b); return this; } public NativeBuffer put(NativeBuffer src) { buffer.put(src.buffer); return this; } public NativeBuffer putChar(char c) { buffer.putChar(c); return this; } public NativeBuffer putDouble(double d) { buffer.putDouble(d); return this; } public NativeBuffer putFloat(float f) { buffer.putFloat(f); return this; } public NativeBuffer putInt(int i) { buffer.putInt(i); return this; } public NativeBuffer putLong(long l) { buffer.putLong(l); return this; } public NativeBuffer putShort(short s) { buffer.putShort(s); return this; } public int capacity() { return buffer.capacity(); } public int position() { return buffer.position(); } public NativeBuffer position(int newPosition) { buffer.position(newPosition); return this; } public NativeBuffer rewind(){ buffer.rewind(); return this; } public int limit() { return buffer.limit(); } public NativeBuffer limit(final int sizeof) { buffer.limit(sizeof); return this; } public int remaining() { return buffer.remaining(); } public NativeBuffer slice(){ return new NativeBuffer(buffer.slice()); } @Override public String toString() { final StringBuilder builder = new StringBuilder(); for(int i = 0; i < limit(); i += JObjCRuntime.PTR_LEN){ if(position() == i) builder.append("*"); if(JObjCRuntime.IS32) builder.append(buffer.getInt(i)); else builder.append(buffer.getLong(i)); builder.append(" "); } return builder.toString(); } public long positionPtr() { return bufferPtr + position(); } /** * bufferPtr <= ptr && ptr < bufferPtr + capacity(); */ public boolean ptrInBounds(final long ptr){ return bufferPtr <= ptr && ptr < bufferPtr + capacity(); } }