/** * Copyright 2010-2023 JogAmp Community. All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * The views and conclusions contained in the software and documentation are those of the * authors and should not be interpreted as representing official policies, either expressed * or implied, of JogAmp Community. */ /* * Created on Saturday, March 27 2010 11:55 */ package com.jogamp.common.nio; import java.nio.Buffer; import java.nio.ByteBuffer; import java.nio.IntBuffer; import java.nio.LongBuffer; import com.jogamp.common.os.Platform; import com.jogamp.common.util.LongObjectHashMap; /** * Hardware independent container holding an array of native pointer, * while its {@link #getDirectBufferAddress()} is-a pointer-pointer type value. *
* An instance maps an array of pointers of referenced Buffer objects, represented as longs. *
** The native values (NIO direct ByteBuffer) might be 32bit or 64bit wide, * depending of the CPU pointer width, see {@link #POINTER_SIZE}. *
* @author Sven Gothel * @author Michael Bien */ public class PointerBuffer extends AbstractBuffer [ dest[destElemPos] .. dest[destElemPos+elemCount] [
* and increment the position by elemCount
. */
public final PointerBuffer get(final long[] dest, final int destElemPos, final int elemCount) {
get(position, dest, destElemPos, elemCount);
position += elemCount;
return this;
}
/** Absolute put method. Put the pointer value at the given index */
public final PointerBuffer put(final int idx, final long v) {
if (0 > idx || idx >= limit()) {
throw new IndexOutOfBoundsException("idx "+idx+" not within [0.."+limit()+"), "+this);
}
if (Platform.is32Bit()) {
((IntBuffer) buffer).put(idx, (int) v);
} else {
((LongBuffer) buffer).put(idx, v);
}
return this;
}
/** Relative put method. Put the pointer value at the current position and increment the position by one. */
public final PointerBuffer put(final long value) {
put(position, value);
position++;
return this;
}
/** Absolute put method. Put element-bytes for `elemCount` elements from `src` at `srcElemPos` into this buffer at the given element-index `destElemPos` */
public final PointerBuffer put(final long[] src, final int srcElemPos, final int destElemPos, final int elemCount) {
if (0 > destElemPos || destElemPos + elemCount > limit() || 0 > elemCount ||
0 > srcElemPos || srcElemPos + elemCount > src.length )
{
throw new IndexOutOfBoundsException("srcElemPos "+srcElemPos+", destElemPos "+destElemPos+", elemCount "+elemCount+
", destLimit "+limit()+", srcLimit "+src.length+", "+this);
}
if (Platform.is32Bit()) {
final IntBuffer dest = (IntBuffer) buffer;
for(int i=0; ielemCount
. */
public final PointerBuffer put(final long[] src, final int srcElemPos, final int elemCount) {
put(src, srcElemPos, position, elemCount);
position += elemCount;
return this;
}
/** Put the address of the given direct Buffer at the given position
of this pointer array.
Adding a reference of the given direct Buffer to this object.
@throws IllegalArgumentException if bb is null or not a direct buffer
*/
public final PointerBuffer referenceBuffer(final int index, final Buffer bb) {
if(null==bb) {
throw new IllegalArgumentException("Buffer is null");
}
if(!Buffers.isDirect(bb)) {
throw new IllegalArgumentException("Buffer is not direct");
}
final long mask = Platform.is32Bit() ? 0x00000000FFFFFFFFL : 0xFFFFFFFFFFFFFFFFL ;
final long bbAddr = Buffers.getDirectBufferAddressImpl(bb) & mask;
if(0==bbAddr) {
throw new RuntimeException("Couldn't determine native address of given Buffer: "+bb);
}
validateDataMap();
put(index, bbAddr);
dataMap.put(bbAddr, bb);
return this;
}
/** Put the address of the given direct Buffer at the end
of this pointer array.
Adding a reference of the given direct Buffer to this object. */
public final PointerBuffer referenceBuffer(final Buffer bb) {
referenceBuffer(position, bb);
position++;
return this;
}
public final Buffer getReferencedBuffer(final int index) {
if(null != dataMap) {
final long addr = get(index);
return (Buffer) dataMap.get(addr);
}
return null;
}
public final Buffer getReferencedBuffer() {
final Buffer bb = getReferencedBuffer(position);
position++;
return bb;
}
@Override
public String toString() {
return "PointerBuffer"+toSubString();
}
}