Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -25,45 +25,21 @@
import static java.lang.foreign.ValueLayout.JAVA_INT_UNALIGNED;
import static java.lang.foreign.ValueLayout.JAVA_LONG_UNALIGNED;
import static java.lang.foreign.ValueLayout.JAVA_SHORT_UNALIGNED;
import static org.apache.datasketches.memory.internal.NativeWritableMemoryImpl.getCharArr;
import static org.apache.datasketches.memory.internal.NativeWritableMemoryImpl.getDoubleArr;
import static org.apache.datasketches.memory.internal.NativeWritableMemoryImpl.getFloatArr;
import static org.apache.datasketches.memory.internal.NativeWritableMemoryImpl.getIntArr;
import static org.apache.datasketches.memory.internal.NativeWritableMemoryImpl.getLongArr;
import static org.apache.datasketches.memory.internal.NativeWritableMemoryImpl.getShortArr;
import static org.apache.datasketches.memory.internal.NativeWritableMemoryImpl.putCharArr;
import static org.apache.datasketches.memory.internal.NativeWritableMemoryImpl.putDoubleArr;
import static org.apache.datasketches.memory.internal.NativeWritableMemoryImpl.putFloatArr;
import static org.apache.datasketches.memory.internal.NativeWritableMemoryImpl.putIntArr;
import static org.apache.datasketches.memory.internal.NativeWritableMemoryImpl.putLongArr;
import static org.apache.datasketches.memory.internal.NativeWritableMemoryImpl.putShortArr;

import java.lang.foreign.Arena;
import java.lang.foreign.MemorySegment;

import org.apache.datasketches.memory.MemoryRequestServer;
import org.apache.datasketches.memory.WritableBuffer;

/*
* Developer notes: The heavier methods, such as put/get arrays, duplicate, region, clear, fill,
* compareTo, etc., use hard checks (check*() and incrementAndCheck*() methods), which execute at
* runtime and throw exceptions if violated. The cost of the runtime checks are minor compared to
* the rest of the work these methods are doing.
*
* <p>The light weight methods, such as put/get primitives, use asserts (assert*() and
* incrementAndAssert*() methods), which only execute when asserts are enabled and JIT will remove
* them entirely from production runtime code. The offset versions of the light weight methods will
* simplify to a single unsafe call, which is further simplified by JIT to an intrinsic that is
* often a single CPU instruction.
*/

/**
* Implementation of {@link WritableBuffer} for native endian byte order.
* @author Roman Leventov
* @author Lee Rhodes
*/
final class NativeWritableBufferImpl extends WritableBufferImpl {

//Pass-through ctor
NativeWritableBufferImpl(
final Arena arena,
final MemorySegment seg,
Expand All @@ -88,8 +64,8 @@ public char getChar(final long offsetBytes) {
@Override
public void getCharArray(final char[] dstArray, final int dstOffsetChars, final int lengthChars) {
final long pos = getPosition();
getCharArr(seg, pos, dstArray, dstOffsetChars, lengthChars);
setPosition(pos + (lengthChars) << CHAR_SHIFT);
MemorySegment.copy(seg, JAVA_CHAR_UNALIGNED, pos, dstArray, dstOffsetChars, lengthChars);
setPosition(pos + (lengthChars << CHAR_SHIFT));
}

@Override
Expand All @@ -107,8 +83,8 @@ public double getDouble(final long offsetBytes) {
@Override
public void getDoubleArray(final double[] dstArray, final int dstOffsetDoubles, final int lengthDoubles) {
final long pos = getPosition();
getDoubleArr(seg, pos, dstArray, dstOffsetDoubles, lengthDoubles);
setPosition(pos + (lengthDoubles) << DOUBLE_SHIFT);
MemorySegment.copy(seg, JAVA_DOUBLE_UNALIGNED, pos, dstArray, dstOffsetDoubles, lengthDoubles);
setPosition(pos + (lengthDoubles << DOUBLE_SHIFT));
}

@Override
Expand All @@ -126,8 +102,8 @@ public float getFloat(final long offsetBytes) {
@Override
public void getFloatArray(final float[] dstArray, final int dstOffsetFloats, final int lengthFloats) {
final long pos = getPosition();
getFloatArr(seg, pos, dstArray, dstOffsetFloats, lengthFloats);
setPosition(pos + (lengthFloats) << FLOAT_SHIFT);
MemorySegment.copy(seg, JAVA_FLOAT_UNALIGNED, pos, dstArray, dstOffsetFloats, lengthFloats);
setPosition(pos + (lengthFloats << FLOAT_SHIFT));
}

@Override
Expand All @@ -145,8 +121,8 @@ public int getInt(final long offsetBytes) {
@Override
public void getIntArray(final int[] dstArray, final int dstOffsetInts, final int lengthInts) {
final long pos = getPosition();
getIntArr(seg, pos, dstArray, dstOffsetInts, lengthInts);
setPosition(pos + (lengthInts) << INT_SHIFT);
MemorySegment.copy(seg, JAVA_INT_UNALIGNED, pos, dstArray, dstOffsetInts, lengthInts);
setPosition(pos + (lengthInts << INT_SHIFT));
}

@Override
Expand All @@ -164,8 +140,8 @@ public long getLong(final long offsetBytes) {
@Override
public void getLongArray(final long[] dstArray, final int dstOffsetLongs, final int lengthLongs) {
final long pos = getPosition();
getLongArr(seg, pos, dstArray, dstOffsetLongs, lengthLongs);
setPosition(pos + (lengthLongs) << LONG_SHIFT);
MemorySegment.copy(seg, JAVA_LONG_UNALIGNED, pos, dstArray, dstOffsetLongs, lengthLongs);
setPosition(pos + (lengthLongs << LONG_SHIFT));
}

@Override
Expand All @@ -183,8 +159,8 @@ public short getShort(final long offsetBytes) {
@Override
public void getShortArray(final short[] dstArray, final int dstOffsetShorts, final int lengthShorts) {
final long pos = getPosition();
getShortArr(seg, pos, dstArray, dstOffsetShorts, lengthShorts);
setPosition(pos + (lengthShorts) << SHORT_SHIFT);
MemorySegment.copy(seg, JAVA_SHORT_UNALIGNED, pos, dstArray, dstOffsetShorts, lengthShorts);
setPosition(pos + (lengthShorts << SHORT_SHIFT));
}

//PRIMITIVE putX() and putXArray()
Expand All @@ -203,8 +179,8 @@ public void putChar(final long offsetBytes, final char value) {
@Override
public void putCharArray(final char[] srcArray, final int srcOffsetChars, final int lengthChars) {
final long pos = getPosition();
putCharArr(seg, pos, srcArray, srcOffsetChars, lengthChars);
setPosition(pos + (lengthChars) << CHAR_SHIFT);
MemorySegment.copy(srcArray, srcOffsetChars, seg, JAVA_CHAR_UNALIGNED, pos, lengthChars);
setPosition(pos + (lengthChars << CHAR_SHIFT));
}

@Override
Expand All @@ -222,8 +198,8 @@ public void putDouble(final long offsetBytes, final double value) {
@Override
public void putDoubleArray(final double[] srcArray, final int srcOffsetDoubles, final int lengthDoubles) {
final long pos = getPosition();
putDoubleArr(seg, pos, srcArray, srcOffsetDoubles, lengthDoubles);
setPosition(pos + (lengthDoubles) << DOUBLE_SHIFT);
MemorySegment.copy(srcArray, srcOffsetDoubles, seg, JAVA_DOUBLE_UNALIGNED, pos, lengthDoubles);
setPosition(pos + (lengthDoubles << DOUBLE_SHIFT));
}

@Override
Expand All @@ -241,8 +217,8 @@ public void putFloat(final long offsetBytes, final float value) {
@Override
public void putFloatArray(final float[] srcArray, final int srcOffsetFloats, final int lengthFloats) {
final long pos = getPosition();
putFloatArr(seg, pos, srcArray, srcOffsetFloats, lengthFloats);
setPosition(pos + (lengthFloats) << FLOAT_SHIFT);
MemorySegment.copy(srcArray, srcOffsetFloats, seg, JAVA_FLOAT_UNALIGNED, pos, lengthFloats);
setPosition(pos + (lengthFloats << FLOAT_SHIFT));
}

@Override
Expand All @@ -260,8 +236,8 @@ public void putInt(final long offsetBytes, final int value) {
@Override
public void putIntArray(final int[] srcArray, final int srcOffsetInts, final int lengthInts) {
final long pos = getPosition();
putIntArr(seg, pos, srcArray, srcOffsetInts, lengthInts);
setPosition(pos + (lengthInts) << INT_SHIFT);
MemorySegment.copy(srcArray, srcOffsetInts, seg, JAVA_INT_UNALIGNED, pos, lengthInts);
setPosition(pos + (lengthInts << INT_SHIFT));
}

@Override
Expand All @@ -279,8 +255,8 @@ public void putLong(final long offsetBytes, final long value) {
@Override
public void putLongArray(final long[] srcArray, final int srcOffsetLongs, final int lengthLongs) {
final long pos = getPosition();
putLongArr(seg, pos, srcArray, srcOffsetLongs, lengthLongs);
setPosition(pos + (lengthLongs) << LONG_SHIFT);
MemorySegment.copy(srcArray, srcOffsetLongs, seg, JAVA_LONG_UNALIGNED, pos, lengthLongs);
setPosition(pos + (lengthLongs << LONG_SHIFT));
}

@Override
Expand All @@ -298,7 +274,8 @@ public void putShort(final long offsetBytes, final short value) {
@Override
public void putShortArray(final short[] srcArray, final int srcOffsetShorts, final int lengthShorts) {
final long pos = getPosition();
putShortArr(seg, pos, srcArray, srcOffsetShorts, lengthShorts);
setPosition(pos + (lengthShorts) << SHORT_SHIFT);
MemorySegment.copy(srcArray, srcOffsetShorts, seg, JAVA_SHORT_UNALIGNED, pos, lengthShorts);
setPosition(pos + (lengthShorts << SHORT_SHIFT));
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -19,17 +19,11 @@

package org.apache.datasketches.memory.internal;

import static java.lang.foreign.ValueLayout.JAVA_CHAR;
import static java.lang.foreign.ValueLayout.JAVA_CHAR_UNALIGNED;
import static java.lang.foreign.ValueLayout.JAVA_DOUBLE;
import static java.lang.foreign.ValueLayout.JAVA_DOUBLE_UNALIGNED;
import static java.lang.foreign.ValueLayout.JAVA_FLOAT;
import static java.lang.foreign.ValueLayout.JAVA_FLOAT_UNALIGNED;
import static java.lang.foreign.ValueLayout.JAVA_INT;
import static java.lang.foreign.ValueLayout.JAVA_INT_UNALIGNED;
import static java.lang.foreign.ValueLayout.JAVA_LONG;
import static java.lang.foreign.ValueLayout.JAVA_LONG_UNALIGNED;
import static java.lang.foreign.ValueLayout.JAVA_SHORT;
import static java.lang.foreign.ValueLayout.JAVA_SHORT_UNALIGNED;

import java.lang.foreign.Arena;
Expand All @@ -55,22 +49,15 @@ final class NativeWritableMemoryImpl extends WritableMemoryImpl {
super(seg, typeId, memReqSvr, arena);
}

///PRIMITIVE getX() and getXArray()
//PRIMITIVE getX() and getXArray()
@Override
public char getChar(final long offsetBytes) {
return seg.get(ValueLayout.JAVA_CHAR_UNALIGNED, offsetBytes);
}

@Override
public void getCharArray(final long offsetBytes, final char[] dstArray, final int dstOffsetChars, final int lengthChars) {
getCharArr(seg, offsetBytes, dstArray, dstOffsetChars, lengthChars);
}

static void getCharArr(
final MemorySegment seg, final long offsetBytes, final char[] dstArray, final int dstOffsetChars, final int lengthChars) {
final MemorySegment dstSeg = MemorySegment.ofArray(dstArray);
final long dstOffsetBytes = ((long) dstOffsetChars) << CHAR_SHIFT;
MemorySegment.copy(seg, JAVA_CHAR_UNALIGNED, offsetBytes, dstSeg, JAVA_CHAR, dstOffsetBytes, lengthChars);
MemorySegment.copy(seg, JAVA_CHAR_UNALIGNED, offsetBytes, dstArray, dstOffsetChars, lengthChars);
}

@Override
Expand All @@ -80,14 +67,7 @@ public double getDouble(final long offsetBytes) {

@Override
public void getDoubleArray(final long offsetBytes, final double[] dstArray, final int dstOffsetDoubles, final int lengthDoubles) {
getDoubleArr(seg, offsetBytes, dstArray, dstOffsetDoubles, lengthDoubles);
}

static void getDoubleArr(
final MemorySegment seg, final long offsetBytes, final double[] dstArray, final int dstOffsetDoubles, final int lengthDoubles) {
final MemorySegment dstSeg = MemorySegment.ofArray(dstArray);
final long dstOffsetBytes = ((long) dstOffsetDoubles) << DOUBLE_SHIFT;
MemorySegment.copy(seg, JAVA_DOUBLE_UNALIGNED, offsetBytes, dstSeg, JAVA_DOUBLE, dstOffsetBytes, lengthDoubles);
MemorySegment.copy(seg, JAVA_DOUBLE_UNALIGNED, offsetBytes, dstArray, dstOffsetDoubles, lengthDoubles);
}

@Override
Expand All @@ -97,14 +77,7 @@ public float getFloat(final long offsetBytes) {

@Override
public void getFloatArray(final long offsetBytes, final float[] dstArray, final int dstOffsetFloats, final int lengthFloats) {
getFloatArr(seg, offsetBytes, dstArray, dstOffsetFloats, lengthFloats);
}

static void getFloatArr(
final MemorySegment seg, final long offsetBytes, final float[] dstArray, final int dstOffsetFloats, final int lengthFloats) {
final MemorySegment dstSeg = MemorySegment.ofArray(dstArray);
final long dstOffsetBytes = ((long) dstOffsetFloats) << FLOAT_SHIFT;
MemorySegment.copy(seg, JAVA_FLOAT_UNALIGNED, offsetBytes, dstSeg, JAVA_FLOAT, dstOffsetBytes, lengthFloats);
MemorySegment.copy(seg, JAVA_FLOAT_UNALIGNED, offsetBytes, dstArray, dstOffsetFloats, lengthFloats);
}

@Override
Expand All @@ -114,14 +87,7 @@ public int getInt(final long offsetBytes) {

@Override
public void getIntArray(final long offsetBytes, final int[] dstArray, final int dstOffsetInts, final int lengthInts) {
getIntArr(seg, offsetBytes, dstArray, dstOffsetInts, lengthInts);
}

static void getIntArr(
final MemorySegment seg, final long offsetBytes, final int[] dstArray, final int dstOffsetInts, final int lengthInts) {
final MemorySegment dstSeg = MemorySegment.ofArray(dstArray);
final long dstOffsetBytes = ((long) dstOffsetInts) << INT_SHIFT;
MemorySegment.copy(seg, JAVA_INT_UNALIGNED, offsetBytes, dstSeg, JAVA_INT, dstOffsetBytes, lengthInts);
MemorySegment.copy(seg, JAVA_INT_UNALIGNED, offsetBytes, dstArray, dstOffsetInts, lengthInts);
}

@Override
Expand All @@ -131,14 +97,7 @@ public long getLong(final long offsetBytes) {

@Override
public void getLongArray(final long offsetBytes, final long[] dstArray, final int dstOffsetLongs, final int lengthLongs) {
getLongArr(seg, offsetBytes, dstArray, dstOffsetLongs, lengthLongs);
}

static void getLongArr(
final MemorySegment seg, final long offsetBytes, final long[] dstArray, final int dstOffsetLongs, final int lengthLongs) {
final MemorySegment dstSeg = MemorySegment.ofArray(dstArray);
final long dstOffsetBytes = ((long) dstOffsetLongs) << LONG_SHIFT;
MemorySegment.copy(seg, JAVA_LONG_UNALIGNED, offsetBytes, dstSeg, JAVA_LONG, dstOffsetBytes, lengthLongs);
MemorySegment.copy(seg, JAVA_LONG_UNALIGNED, offsetBytes, dstArray, dstOffsetLongs, lengthLongs);
}

@Override
Expand All @@ -148,14 +107,7 @@ public short getShort(final long offsetBytes) {

@Override
public void getShortArray(final long offsetBytes, final short[] dstArray, final int dstOffsetShorts, final int lengthShorts) {
getShortArr(seg, offsetBytes, dstArray, dstOffsetShorts, lengthShorts);
}

static void getShortArr(
final MemorySegment seg, final long offsetBytes, final short[] dstArray, final int dstOffsetShorts, final int lengthShorts) {
final MemorySegment dstSeg = MemorySegment.ofArray(dstArray);
final long dstOffsetBytes = ((long) dstOffsetShorts) << SHORT_SHIFT;
MemorySegment.copy(seg, JAVA_SHORT_UNALIGNED, offsetBytes, dstSeg, JAVA_SHORT, dstOffsetBytes, lengthShorts);
MemorySegment.copy(seg, JAVA_SHORT_UNALIGNED, offsetBytes, dstArray, dstOffsetShorts, lengthShorts);
}

//PRIMITIVE putX() and putXArray() implementations
Expand All @@ -166,14 +118,7 @@ public void putChar(final long offsetBytes, final char value) {

@Override
public void putCharArray(final long offsetBytes, final char[] srcArray, final int srcOffsetChars, final int lengthChars) {
putCharArr(seg, offsetBytes, srcArray, srcOffsetChars, lengthChars);
}

static void putCharArr(
final MemorySegment seg, final long offsetBytes, final char[] srcArray, final int srcOffsetChars, final int lengthChars) {
final MemorySegment srcSeg = MemorySegment.ofArray(srcArray);
final long srcOffsetBytes = ((long) srcOffsetChars) << CHAR_SHIFT;
MemorySegment.copy(srcSeg, JAVA_CHAR, srcOffsetBytes, seg, JAVA_CHAR_UNALIGNED, offsetBytes, lengthChars);
MemorySegment.copy(srcArray, srcOffsetChars, seg, JAVA_CHAR_UNALIGNED, offsetBytes, lengthChars);
}

@Override
Expand All @@ -183,14 +128,7 @@ public void putDouble(final long offsetBytes, final double value) {

@Override
public void putDoubleArray(final long offsetBytes, final double[] srcArray, final int srcOffsetDoubles, final int lengthDoubles) {
putDoubleArr(seg, offsetBytes, srcArray, srcOffsetDoubles, lengthDoubles);
}

static void putDoubleArr(
final MemorySegment seg, final long offsetBytes, final double[] srcArray, final int srcOffsetDoubles, final int lengthDoubles) {
final MemorySegment srcSeg = MemorySegment.ofArray(srcArray);
final long srcOffsetBytes = ((long) srcOffsetDoubles) << DOUBLE_SHIFT;
MemorySegment.copy(srcSeg, JAVA_DOUBLE, srcOffsetBytes, seg, JAVA_DOUBLE_UNALIGNED, offsetBytes, lengthDoubles);
MemorySegment.copy(srcArray, srcOffsetDoubles, seg, JAVA_DOUBLE_UNALIGNED, offsetBytes, lengthDoubles);
}

@Override
Expand All @@ -200,14 +138,7 @@ public void putFloat(final long offsetBytes, final float value) {

@Override
public void putFloatArray(final long offsetBytes, final float[] srcArray, final int srcOffsetFloats, final int lengthFloats) {
putFloatArr(seg, offsetBytes, srcArray, srcOffsetFloats, lengthFloats);
}

static void putFloatArr(
final MemorySegment seg, final long offsetBytes, final float[] srcArray, final int srcOffsetFloats, final int lengthFloats) {
final MemorySegment srcSeg = MemorySegment.ofArray(srcArray);
final long srcOffsetBytes = ((long) srcOffsetFloats) << FLOAT_SHIFT;
MemorySegment.copy(srcSeg, JAVA_FLOAT, srcOffsetBytes, seg, JAVA_FLOAT_UNALIGNED, offsetBytes, lengthFloats);
MemorySegment.copy(srcArray, srcOffsetFloats, seg, JAVA_FLOAT_UNALIGNED, offsetBytes, lengthFloats);
}

@Override
Expand All @@ -217,14 +148,7 @@ public void putInt(final long offsetBytes, final int value) {

@Override
public void putIntArray(final long offsetBytes, final int[] srcArray, final int srcOffsetInts, final int lengthInts) {
putIntArr(seg, offsetBytes, srcArray, srcOffsetInts, lengthInts);
}

static void putIntArr(
final MemorySegment seg, final long offsetBytes, final int[] srcArray, final int srcOffsetInts, final int lengthInts) {
final MemorySegment srcSeg = MemorySegment.ofArray(srcArray);
final long srcOffsetBytes = ((long) srcOffsetInts) << INT_SHIFT;
MemorySegment.copy(srcSeg, JAVA_INT, srcOffsetBytes, seg, JAVA_INT_UNALIGNED, offsetBytes, lengthInts);
MemorySegment.copy(srcArray, srcOffsetInts, seg, JAVA_INT_UNALIGNED, offsetBytes, lengthInts);
}

@Override
Expand All @@ -234,14 +158,7 @@ public void putLong(final long offsetBytes, final long value) {

@Override
public void putLongArray(final long offsetBytes, final long[] srcArray, final int srcOffsetLongs, final int lengthLongs) {
putLongArr(seg, offsetBytes, srcArray, srcOffsetLongs, lengthLongs);
}

static void putLongArr(
final MemorySegment seg, final long offsetBytes, final long[] srcArray, final int srcOffsetLongs, final int lengthLongs) {
final MemorySegment srcSeg = MemorySegment.ofArray(srcArray);
final long srcOffsetBytes = ((long) srcOffsetLongs) << LONG_SHIFT;
MemorySegment.copy(srcSeg, JAVA_LONG, srcOffsetBytes, seg, JAVA_LONG_UNALIGNED, offsetBytes, lengthLongs);
MemorySegment.copy(srcArray, srcOffsetLongs, seg, JAVA_LONG_UNALIGNED, offsetBytes, lengthLongs);
}

@Override
Expand All @@ -251,13 +168,7 @@ public void putShort(final long offsetBytes, final short value) {

@Override
public void putShortArray(final long offsetBytes, final short[] srcArray, final int srcOffsetShorts, final int lengthShorts) {
putShortArr(seg, offsetBytes, srcArray, srcOffsetShorts, lengthShorts);
MemorySegment.copy(srcArray, srcOffsetShorts, seg, JAVA_SHORT_UNALIGNED, offsetBytes, lengthShorts);
}

static void putShortArr(
final MemorySegment seg, final long offsetBytes, final short[] srcArray, final int srcOffsetShorts, final int lengthShorts) {
final MemorySegment srcSeg = MemorySegment.ofArray(srcArray);
final long srcOffsetBytes = ((long) srcOffsetShorts) << SHORT_SHIFT;
MemorySegment.copy(srcSeg, JAVA_SHORT, srcOffsetBytes, seg, JAVA_SHORT_UNALIGNED, offsetBytes, lengthShorts);
}
}
Loading