29package com.jogamp.common.nio;
31import java.nio.ByteBuffer;
32import java.nio.CharBuffer;
33import java.nio.DoubleBuffer;
34import java.nio.FloatBuffer;
35import java.nio.IntBuffer;
36import java.nio.LongBuffer;
37import java.nio.ShortBuffer;
67 final int oldLimit = src.limit();
68 src.position(srcByteOffset);
69 src.limit(srcByteOffset + (
elementSize * elemCount ));
77 throw new NullPointerException(
"aptr is null");
81 throw new InternalError(
"Couldn't dereference aptr 0x"+Long.toHexString(aptr)+
", size "+elemCount+
" * "+
elementSize);
93 throw new IndexOutOfBoundsException(
"remaining[this "+
remaining()+
" < src "+elemCount+
"], this "+
this+
", src "+src);
96 throw new IllegalArgumentException(
"Element-Size mismatch source "+src+
", dest "+
this);
107 return (ByteBuffer)
buffer;
116 public final ByteBuffer
slice(
final int offset,
final int length) {
117 if (0 > offset || offset + length >
limit()) {
118 throw new IndexOutOfBoundsException(
"idx "+offset+
" + elemCount "+length+
" not within [0.."+
limit()+
"), "+
this);
121 final int oldPos = src.position();
122 final int oldLimit = src.limit();
124 final ByteBuffer ref = src.slice().order(src.order());
125 src.position( oldPos ).limit( oldLimit );
130 public final ByteBuffer
get(
final int srcElemPos,
final ByteBuffer destElemBytes,
final int destElemPos,
final int elemCount) {
131 if (0 > srcElemPos || srcElemPos + elemCount >
limit() || 0 > elemCount ||
132 0 > destElemPos ||
elementSize * ( destElemPos + elemCount ) > destElemBytes.limit() ) {
133 throw new IndexOutOfBoundsException(
"destElemPos "+destElemPos+
", srcElemPos "+srcElemPos+
", elemCount "+elemCount+
134 ", srcLimit "+
limit()+
", destLimit "+(destElemBytes.limit()/
elementSize)+
", "+
this);
137 final int oldSrcLim = srcElemBytes.limit();
139 final int oldDestPos = destElemBytes.position();
140 destElemBytes.position( destElemPos *
elementSize );
141 destElemBytes.put(srcElemBytes).position(oldDestPos);
142 srcElemBytes.limit(oldSrcLim).rewind();
143 return destElemBytes;
146 public final ByteBuffer
get(
final int srcElemPos,
final ByteBuffer destElemBytes) {
147 return get(srcElemPos, destElemBytes, 0, 1);
150 public final ByteBuffer
get(
final ByteBuffer destElemBytes) {
151 final ByteBuffer r =
get(
position, destElemBytes, 0, 1);
159 public final ElementBuffer get(
final ByteBuffer[] destElements,
int destElemPos,
int elemCount) {
160 if (destElements.length<destElemPos+elemCount) {
161 throw new IndexOutOfBoundsException(
"dest.length "+destElements.length+
" < (offset "+destElemPos+
" + length "+elemCount+
")");
164 throw new IndexOutOfBoundsException(
"remaining "+
remaining()+
" < length "+elemCount+
", this "+
this);
167 get(
position++, destElements[destElemPos++]);
174 public final ElementBuffer get(
final int srcElemPos,
final byte[] dest,
final int destElemPos,
final int elemCount) {
176 if (0 > srcElemPos || srcElemPos + elemCount >
limit() || 0 > elemCount ||
177 0 > destElemPos || destElemPos + elemCount > dest.length ) {
178 throw new IndexOutOfBoundsException(
"destElemPos "+destElemPos+
", srcElemPos "+srcElemPos+
", elemCount "+elemCount+
179 ", srcLimit "+
limit()+
", destLimit "+dest.length+
", "+
this);
182 final int oldPos = src.position();
183 final int oldLim = src.limit();
184 src.position( srcElemPos ).limit( srcElemPos + elemCount );
185 src.get(dest, destElemPos, elemCount);
186 src.position( oldPos ).limit( oldLim );
190 public final ElementBuffer get(
final int srcElemPos,
final short[] dest,
final int destElemPos,
final int elemCount) {
192 if (0 > srcElemPos || srcElemPos + elemCount >
limit() || 0 > elemCount ||
193 0 > destElemPos || destElemPos + elemCount > dest.length ) {
194 throw new IndexOutOfBoundsException(
"destElemPos "+destElemPos+
", srcElemPos "+srcElemPos+
", elemCount "+elemCount+
195 ", srcLimit "+
limit()+
", destLimit "+dest.length+
", "+
this);
198 src.position( srcElemPos ).limit( srcElemPos + elemCount );
199 src.get(dest, destElemPos, elemCount);
203 public final ElementBuffer get(
final int srcElemPos,
final char[] dest,
final int destElemPos,
final int elemCount) {
205 if (0 > srcElemPos || srcElemPos + elemCount >
limit() || 0 > elemCount ||
206 0 > destElemPos || destElemPos + elemCount > dest.length ) {
207 throw new IndexOutOfBoundsException(
"destElemPos "+destElemPos+
", srcElemPos "+srcElemPos+
", elemCount "+elemCount+
208 ", srcLimit "+
limit()+
", destLimit "+dest.length+
", "+
this);
211 src.position( srcElemPos ).limit( srcElemPos + elemCount );
212 src.get(dest, destElemPos, elemCount);
216 public final ElementBuffer get(
final int srcElemPos,
final int[] dest,
final int destElemPos,
final int elemCount) {
218 if (0 > srcElemPos || srcElemPos + elemCount >
limit() || 0 > elemCount ||
219 0 > destElemPos || destElemPos + elemCount > dest.length ) {
220 throw new IndexOutOfBoundsException(
"destElemPos "+destElemPos+
", srcElemPos "+srcElemPos+
", elemCount "+elemCount+
221 ", srcLimit "+
limit()+
", destLimit "+dest.length+
", "+
this);
224 src.position( srcElemPos ).limit( srcElemPos + elemCount );
225 src.get(dest, destElemPos, elemCount);
229 public final ElementBuffer get(
final int srcElemPos,
final float[] dest,
final int destElemPos,
final int elemCount) {
231 if (0 > srcElemPos || srcElemPos + elemCount >
limit() || 0 > elemCount ||
232 0 > destElemPos || destElemPos + elemCount > dest.length ) {
233 throw new IndexOutOfBoundsException(
"destElemPos "+destElemPos+
", srcElemPos "+srcElemPos+
", elemCount "+elemCount+
234 ", srcLimit "+
limit()+
", destLimit "+dest.length+
", "+
this);
237 src.position( srcElemPos ).limit( srcElemPos + elemCount );
238 src.get(dest, destElemPos, elemCount);
242 public final ElementBuffer get(
final int srcElemPos,
final long[] dest,
final int destElemPos,
final int elemCount) {
244 if (0 > srcElemPos || srcElemPos + elemCount >
limit() || 0 > elemCount ||
245 0 > destElemPos || destElemPos + elemCount > dest.length ) {
246 throw new IndexOutOfBoundsException(
"destElemPos "+destElemPos+
", srcElemPos "+srcElemPos+
", elemCount "+elemCount+
247 ", srcLimit "+
limit()+
", destLimit "+dest.length+
", "+
this);
250 src.position( srcElemPos ).limit( srcElemPos + elemCount );
251 src.get(dest, destElemPos, elemCount);
255 public final ElementBuffer get(
final int srcElemPos,
final double[] dest,
final int destElemPos,
final int elemCount) {
257 if (0 > srcElemPos || srcElemPos + elemCount >
limit() || 0 > elemCount ||
258 0 > destElemPos || destElemPos + elemCount > dest.length ) {
259 throw new IndexOutOfBoundsException(
"destElemPos "+destElemPos+
", srcElemPos "+srcElemPos+
", elemCount "+elemCount+
260 ", srcLimit "+
limit()+
", destLimit "+dest.length+
", "+
this);
263 src.position( srcElemPos ).limit( srcElemPos + elemCount );
264 src.get(dest, destElemPos, elemCount);
270 public final ElementBuffer put(
final ByteBuffer srcElemBytes,
final int srcElemPos,
final int destElemPos,
final int elemCount) {
271 if (0 > destElemPos || destElemPos + elemCount >
limit() || 0 > elemCount ||
272 0 > srcElemPos ||
elementSize * ( srcElemPos + elemCount ) > srcElemBytes.limit() ) {
273 throw new IndexOutOfBoundsException(
"srcElemPos "+srcElemPos+
", destElemPos "+destElemPos+
", elemCount "+elemCount+
274 ", destLimit "+
limit()+
", srcLimit "+(srcElemBytes.limit()/
elementSize)+
", "+
this);
277 final int oldSrcPos = srcElemBytes.position();
278 final int oldSrcLim = srcElemBytes.limit();
280 destElemBytes.position(
elementSize * destElemPos );
281 destElemBytes.put(srcElemBytes).rewind();
282 srcElemBytes.limit(oldSrcLim).position(oldSrcPos);
287 return put(srcElemBytes, 0, destElemPos, 1);
299 if (srcElements.length<offset+length) {
300 throw new IndexOutOfBoundsException(
"src.length "+srcElements.length+
" < (offset "+offset+
" + length "+length+
")");
303 throw new IndexOutOfBoundsException(
"remaining "+
remaining()+
" < length "+length+
", this "+
this);
313 public final ElementBuffer put(
final byte[] src,
final int srcElemPos,
final int destElemPos,
final int elemCount) {
315 if (0 > destElemPos || destElemPos + elemCount >
limit() || 0 > elemCount ||
316 0 > srcElemPos || srcElemPos + elemCount > src.length ) {
317 throw new IndexOutOfBoundsException(
"srcElemPos "+srcElemPos+
", destElemPos "+destElemPos+
", elemCount "+elemCount+
318 ", destLimit "+
limit()+
", srcLimit "+src.length+
", "+
this);
321 final int oldPos = dest.position();
322 final int oldLim = dest.limit();
323 dest.position( destElemPos ).limit( destElemPos + elemCount );
324 dest.put(src, srcElemPos, elemCount);
325 dest.position( oldPos ).limit( oldLim );
329 public final ElementBuffer put(
final short[] src,
final int srcElemPos,
final int destElemPos,
final int elemCount) {
331 if (0 > destElemPos || destElemPos + elemCount >
limit() || 0 > elemCount ||
332 0 > srcElemPos || srcElemPos + elemCount > src.length ) {
333 throw new IndexOutOfBoundsException(
"srcElemPos "+srcElemPos+
", destElemPos "+destElemPos+
", elemCount "+elemCount+
334 ", destLimit "+
limit()+
", srcLimit "+src.length+
", "+
this);
337 dest.position( destElemPos ).limit( destElemPos + elemCount );
338 dest.put(src, srcElemPos, elemCount);
342 public final ElementBuffer put(
final char[] src,
final int srcElemPos,
final int destElemPos,
final int elemCount) {
344 if (0 > destElemPos || destElemPos + elemCount >
limit() || 0 > elemCount ||
345 0 > srcElemPos || srcElemPos + elemCount > src.length ) {
346 throw new IndexOutOfBoundsException(
"srcElemPos "+srcElemPos+
", destElemPos "+destElemPos+
", elemCount "+elemCount+
347 ", destLimit "+
limit()+
", srcLimit "+src.length+
", "+
this);
350 dest.position( destElemPos ).limit( destElemPos + elemCount );
351 dest.put(src, srcElemPos, elemCount);
355 public final ElementBuffer put(
final int[] src,
final int srcElemPos,
final int destElemPos,
final int elemCount) {
357 if (0 > destElemPos || destElemPos + elemCount >
limit() || 0 > elemCount ||
358 0 > srcElemPos || srcElemPos + elemCount > src.length ) {
359 throw new IndexOutOfBoundsException(
"srcElemPos "+srcElemPos+
", destElemPos "+destElemPos+
", elemCount "+elemCount+
360 ", destLimit "+
limit()+
", srcLimit "+src.length+
", "+
this);
363 dest.position( destElemPos ).limit( destElemPos + elemCount );
364 dest.put(src, srcElemPos, elemCount);
368 public final ElementBuffer put(
final float[] src,
final int srcElemPos,
final int destElemPos,
final int elemCount) {
370 if (0 > destElemPos || destElemPos + elemCount >
limit() || 0 > elemCount ||
371 0 > srcElemPos || srcElemPos + elemCount > src.length ) {
372 throw new IndexOutOfBoundsException(
"srcElemPos "+srcElemPos+
", destElemPos "+destElemPos+
", elemCount "+elemCount+
373 ", destLimit "+
limit()+
", srcLimit "+src.length+
", "+
this);
376 dest.position( destElemPos ).limit( destElemPos + elemCount );
377 dest.put(src, srcElemPos, elemCount);
381 public final ElementBuffer put(
final long[] src,
final int srcElemPos,
final int destElemPos,
final int elemCount) {
383 if (0 > destElemPos || destElemPos + elemCount >
limit() || 0 > elemCount ||
384 0 > srcElemPos || srcElemPos + elemCount > src.length ) {
385 throw new IndexOutOfBoundsException(
"srcElemPos "+srcElemPos+
", destElemPos "+destElemPos+
", elemCount "+elemCount+
386 ", destLimit "+
limit()+
", srcLimit "+src.length+
", "+
this);
389 dest.position( destElemPos ).limit( destElemPos + elemCount );
390 dest.put(src, srcElemPos, elemCount);
394 public final ElementBuffer put(
final double[] src,
final int srcElemPos,
final int destElemPos,
final int elemCount) {
396 if (0 > destElemPos || destElemPos + elemCount >
limit() || 0 > elemCount ||
397 0 > srcElemPos || srcElemPos + elemCount > src.length ) {
398 throw new IndexOutOfBoundsException(
"srcElemPos "+srcElemPos+
", destElemPos "+destElemPos+
", elemCount "+elemCount+
399 ", destLimit "+
limit()+
", srcLimit "+src.length+
", "+
this);
402 dest.position( destElemPos ).limit( destElemPos + elemCount );
403 dest.put(src, srcElemPos, elemCount);
Utility methods allowing easy java.nio.Buffer manipulations.
static ByteBuffer newDirectByteBuffer(final int numElements)
Allocates a new direct ByteBuffer with the specified number of elements.
static final int SIZEOF_BYTE
static final int SIZEOF_SHORT
static final int SIZEOF_DOUBLE
static final int SIZEOF_CHAR
static final int SIZEOF_INT
static final int SIZEOF_LONG
static final int SIZEOF_FLOAT
Hardware independent container holding an array of linearly aligned elements, while its getDirectBuff...
final ElementBuffer put(final int[] src, final int srcElemPos, final int destElemPos, final int elemCount)
Absolute put method.
final ElementBuffer put(final ByteBuffer[] srcElements, int offset, int length)
Relative bulk put method.
final ByteBuffer slice(final int offset, final int length)
Returns a slice of this instance's ByteBuffer [offset..offset+length), i.e.
final ElementBuffer put(final long[] src, final int srcElemPos, final int destElemPos, final int elemCount)
Absolute put method.
static ElementBuffer allocateDirect(final int elementSize, final int elemCount)
Returns a direct PointerBuffer in native order, w/o backup array.
final ByteBuffer getByteBuffer()
Returns the ByteBuffer, i.e.
final ElementBuffer put(final ByteBuffer srcElemBytes, final int srcElemPos, final int destElemPos, final int elemCount)
Absolute put method.
final ElementBuffer put(final int destElemPos, final ByteBuffer srcElemBytes)
Absolute put method.
final ElementBuffer put(final double[] src, final int srcElemPos, final int destElemPos, final int elemCount)
Absolute put method.
static ElementBuffer derefPointer(final int elementSize, final ByteBuffer ptrSrc, final int ptrSrcByteOffset, final int elemCount)
static ElementBuffer wrap(final int elementSize, final ByteBuffer src)
final ElementBuffer put(final ByteBuffer srcElemBytes)
Relative put method.
final ElementBuffer put(final char[] src, final int srcElemPos, final int destElemPos, final int elemCount)
Absolute put method.
final ElementBuffer put(final ElementBuffer src)
static ElementBuffer derefPointer(final int elementSize, final long aptr, final int elemCount)
static ElementBuffer allocate(final int elementSize, final int elemCount)
Returns a non direct PointerBuffer in native order, having a backup array.
final ElementBuffer put(final byte[] src, final int srcElemPos, final int destElemPos, final int elemCount)
Absolute put method.
final ElementBuffer put(final float[] src, final int srcElemPos, final int destElemPos, final int elemCount)
Absolute put method.
final ElementBuffer put(final short[] src, final int srcElemPos, final int destElemPos, final int elemCount)
Absolute put method.
static ElementBuffer wrap(final int elementSize, final ByteBuffer src, final int srcByteOffset, final int elemCount)
Hardware independent container holding an array of native pointer, while its getDirectBufferAddress()...
static PointerBuffer wrap(final ByteBuffer src)
Wraps given ByteBuffer src up to it ByteBuffer#capacity()/POINTER_SIZE pointers.
final long get(final int idx)
Absolute get method.