From bc9d6f2a132dffff189a2f6dbd042652dbddcf9d Mon Sep 17 00:00:00 2001 From: Stefan Nothaas Date: Wed, 19 Dec 2018 16:11:40 +0100 Subject: [PATCH] core: Add support for float and double arrays to im-/exporters --- .../dxnet/core/LargeMessageExporter.java | 76 ++++++++ .../dxnet/core/MessageExporterDefault.java | 42 ++++- .../dxnet/core/MessageExporterOverflow.java | 40 ++++ .../dxnet/core/MessageImporterDefault.java | 40 ++++ .../dxnet/core/MessageImporterOverflow.java | 98 ++++++++++ .../core/MessageImporterUnderOverflow.java | 172 +++++++++++++++++- .../dxnet/core/MessageImporterUnderflow.java | 112 +++++++++++- 7 files changed, 559 insertions(+), 21 deletions(-) diff --git a/src/main/java/de/hhu/bsinfo/dxnet/core/LargeMessageExporter.java b/src/main/java/de/hhu/bsinfo/dxnet/core/LargeMessageExporter.java index 6b9d4b5..97cce8b 100644 --- a/src/main/java/de/hhu/bsinfo/dxnet/core/LargeMessageExporter.java +++ b/src/main/java/de/hhu/bsinfo/dxnet/core/LargeMessageExporter.java @@ -515,6 +515,16 @@ public int writeLongs(final long[] p_array) { return writeLongs(p_array, 0, p_array.length); } + @Override + public int writeFloats(final float[] p_array) { + return writeFloats(p_array, 0, p_array.length); + } + + @Override + public int writeDoubles(final double[] p_array) { + return writeDoubles(p_array, 0, p_array.length); + } + @Override public int writeBytes(final byte[] p_array, final int p_offset, final int p_length) { if (m_skippedBytes < m_unfinishedOperation.getIndex()) { @@ -649,6 +659,36 @@ public int writeLongs(final long[] p_array, final int p_offset, final int p_leng return p_length; } + @Override + public int writeFloats(final float[] p_array, final int p_offset, final int p_length) { + int floatsToSkip = 0; + if (m_skippedBytes < m_skipBytes) { + floatsToSkip = (m_skipBytes - m_skippedBytes) / Float.BYTES; + m_skippedBytes = m_skipBytes - (m_skipBytes - m_skippedBytes) % Float.BYTES; + } + + for (int i = floatsToSkip; i < p_length; i++) { + writeFloat(p_array[p_offset + i]); + } + + return p_length; + } + + @Override + public int writeDoubles(final double[] p_array, final int p_offset, final int p_length) { + int doublesToSkip = 0; + if (m_skippedBytes < m_skipBytes) { + doublesToSkip = (m_skipBytes - m_skippedBytes) / Double.BYTES; + m_skippedBytes = m_skipBytes - (m_skipBytes - m_skippedBytes) % Double.BYTES; + } + + for (int i = doublesToSkip; i < p_length; i++) { + writeDouble(p_array[p_offset + i]); + } + + return p_length; + } + @Override public void writeByteArray(final byte[] p_array) { if (m_skippedBytes < m_unfinishedOperation.getIndex()) { @@ -738,4 +778,40 @@ public void writeLongArray(final long[] p_array) { } } } + + @Override + public void writeFloatArray(final float[] p_array) { + if (m_skippedBytes < m_unfinishedOperation.getIndex()) { + // Array length and array were written before + m_skippedBytes += ObjectSizeUtil.sizeofCompactedNumber(p_array.length) + p_array.length * Float.BYTES; + } else { + int startPosition = getNumberOfWrittenBytes(); + writeCompactNumber(p_array.length); + try { + writeFloats(p_array); + } catch (final ArrayIndexOutOfBoundsException e) { + // Not enough space in buffer currently -> abort + m_unfinishedOperation.setIndex(startPosition); + throw e; + } + } + } + + @Override + public void writeDoubleArray(final double[] p_array) { + if (m_skippedBytes < m_unfinishedOperation.getIndex()) { + // Array length and array were written before + m_skippedBytes += ObjectSizeUtil.sizeofCompactedNumber(p_array.length) + p_array.length * Double.BYTES; + } else { + int startPosition = getNumberOfWrittenBytes(); + writeCompactNumber(p_array.length); + try { + writeDoubles(p_array); + } catch (final ArrayIndexOutOfBoundsException e) { + // Not enough space in buffer currently -> abort + m_unfinishedOperation.setIndex(startPosition); + throw e; + } + } + } } diff --git a/src/main/java/de/hhu/bsinfo/dxnet/core/MessageExporterDefault.java b/src/main/java/de/hhu/bsinfo/dxnet/core/MessageExporterDefault.java index 9ae9ac2..b8cbd1b 100644 --- a/src/main/java/de/hhu/bsinfo/dxnet/core/MessageExporterDefault.java +++ b/src/main/java/de/hhu/bsinfo/dxnet/core/MessageExporterDefault.java @@ -145,7 +145,7 @@ public int writeShorts(final short[] p_array) { } @Override - public int writeChars(char[] p_array) { + public int writeChars(final char[] p_array) { return writeChars(p_array, 0, p_array.length); } @@ -159,6 +159,16 @@ public int writeLongs(final long[] p_array) { return writeLongs(p_array, 0, p_array.length); } + @Override + public int writeFloats(final float[] p_array) { + return writeFloats(p_array, 0, p_array.length); + } + + @Override + public int writeDoubles(final double[] p_array) { + return writeDoubles(p_array, 0, p_array.length); + } + @Override public int writeBytes(final byte[] p_array, final int p_offset, final int p_length) { int ret = UnsafeMemory.writeBytes(m_bufferAddress + m_currentPosition, p_array, p_offset, p_length); @@ -199,6 +209,22 @@ public int writeLongs(final long[] p_array, final int p_offset, final int p_leng return ret; } + @Override + public int writeFloats(final float[] p_array, final int p_offset, final int p_length) { + int ret = UnsafeMemory.writeFloats(m_bufferAddress + m_currentPosition, p_array, p_offset, p_length); + m_currentPosition += Float.BYTES * ret; + + return ret; + } + + @Override + public int writeDoubles(final double[] p_array, final int p_offset, final int p_length) { + int ret = UnsafeMemory.writeDoubles(m_bufferAddress + m_currentPosition, p_array, p_offset, p_length); + m_currentPosition += Double.BYTES * ret; + + return ret; + } + @Override public void writeByteArray(final byte[] p_array) { writeCompactNumber(p_array.length); @@ -212,7 +238,7 @@ public void writeShortArray(final short[] p_array) { } @Override - public void writeCharArray(char[] p_array) { + public void writeCharArray(final char[] p_array) { writeCompactNumber(p_array.length); writeChars(p_array); } @@ -229,4 +255,16 @@ public void writeLongArray(final long[] p_array) { writeLongs(p_array); } + @Override + public void writeFloatArray(final float[] p_array) { + writeCompactNumber(p_array.length); + writeFloats(p_array); + } + + @Override + public void writeDoubleArray(final double[] p_array) { + writeCompactNumber(p_array.length); + writeDoubles(p_array); + } + } diff --git a/src/main/java/de/hhu/bsinfo/dxnet/core/MessageExporterOverflow.java b/src/main/java/de/hhu/bsinfo/dxnet/core/MessageExporterOverflow.java index 18c9ee3..ff890ac 100644 --- a/src/main/java/de/hhu/bsinfo/dxnet/core/MessageExporterOverflow.java +++ b/src/main/java/de/hhu/bsinfo/dxnet/core/MessageExporterOverflow.java @@ -226,6 +226,16 @@ public int writeLongs(final long[] p_array) { return writeLongs(p_array, 0, p_array.length); } + @Override + public int writeFloats(final float[] p_array) { + return writeFloats(p_array, 0, p_array.length); + } + + @Override + public int writeDoubles(final double[] p_array) { + return writeDoubles(p_array, 0, p_array.length); + } + @Override public int writeBytes(final byte[] p_array, final int p_offset, final int p_length) { if (m_currentPosition + p_length <= m_bufferSize) { @@ -278,6 +288,24 @@ public int writeLongs(final long[] p_array, final int p_offset, final int p_leng return p_length; } + @Override + public int writeFloats(final float[] p_array, final int p_offset, final int p_length) { + for (int i = 0; i < p_length; i++) { + writeFloat(p_array[p_offset + i]); + } + + return p_length; + } + + @Override + public int writeDoubles(final double[] p_array, final int p_offset, final int p_length) { + for (int i = 0; i < p_length; i++) { + writeDouble(p_array[p_offset + i]); + } + + return p_length; + } + @Override public void writeByteArray(final byte[] p_array) { writeCompactNumber(p_array.length); @@ -307,4 +335,16 @@ public void writeLongArray(final long[] p_array) { writeCompactNumber(p_array.length); writeLongs(p_array); } + + @Override + public void writeFloatArray(final float[] p_array) { + writeCompactNumber(p_array.length); + writeFloats(p_array); + } + + @Override + public void writeDoubleArray(final double[] p_array) { + writeCompactNumber(p_array.length); + writeDoubles(p_array); + } } diff --git a/src/main/java/de/hhu/bsinfo/dxnet/core/MessageImporterDefault.java b/src/main/java/de/hhu/bsinfo/dxnet/core/MessageImporterDefault.java index 4481a2d..475867d 100644 --- a/src/main/java/de/hhu/bsinfo/dxnet/core/MessageImporterDefault.java +++ b/src/main/java/de/hhu/bsinfo/dxnet/core/MessageImporterDefault.java @@ -198,6 +198,16 @@ public int readLongs(final long[] p_array) { return readLongs(p_array, 0, p_array.length); } + @Override + public int readFloats(final float[] p_array) { + return readFloats(p_array, 0, p_array.length); + } + + @Override + public int readDoubles(final double[] p_array) { + return readDoubles(p_array, 0, p_array.length); + } + @Override public int readBytes(final byte[] p_array, final int p_offset, final int p_length) { int ret = UnsafeMemory.readBytes(m_bufferAddress + m_currentPosition, p_array, p_offset, p_length); @@ -246,6 +256,22 @@ public int readLongs(final long[] p_array, final int p_offset, final int p_lengt return ret; } + @Override + public int readFloats(final float[] p_array, final int p_offset, final int p_length) { + int ret = UnsafeMemory.readFloats(m_bufferAddress + m_currentPosition, p_array, p_offset, p_length); + m_currentPosition += ret * Float.BYTES; + + return ret; + } + + @Override + public int readDoubles(final double[] p_array, final int p_offset, final int p_length) { + int ret = UnsafeMemory.readDoubles(m_bufferAddress + m_currentPosition, p_array, p_offset, p_length); + m_currentPosition += ret * Double.BYTES; + + return ret; + } + @Override public byte[] readByteArray(final byte[] p_array) { byte[] arr = new byte[readCompactNumber(0)]; @@ -280,4 +306,18 @@ public long[] readLongArray(final long[] p_array) { readLongs(arr); return arr; } + + @Override + public float[] readFloatArray(final float[] p_array) { + float[] arr = new float[readCompactNumber(0)]; + readFloats(arr); + return arr; + } + + @Override + public double[] readDoubleArray(final double[] p_array) { + double[] arr = new double[readCompactNumber(0)]; + readDoubles(arr); + return arr; + } } diff --git a/src/main/java/de/hhu/bsinfo/dxnet/core/MessageImporterOverflow.java b/src/main/java/de/hhu/bsinfo/dxnet/core/MessageImporterOverflow.java index d6ac26f..6a89002 100644 --- a/src/main/java/de/hhu/bsinfo/dxnet/core/MessageImporterOverflow.java +++ b/src/main/java/de/hhu/bsinfo/dxnet/core/MessageImporterOverflow.java @@ -310,6 +310,30 @@ public int readLongs(final long[] p_array) { return readLongs(p_array, 0, p_array.length); } + @Override + public int readFloats(final float[] p_array) { + if (m_currentPosition == m_bufferSize) { + m_unfinishedOperation.setIndex(m_currentPosition - m_startPosition); + throw m_exception; + } + + // Exception might be thrown in readLongs + // Do not store unfinished operation as partly de-serialized array will be passed anyway + return readFloats(p_array, 0, p_array.length); + } + + @Override + public int readDoubles(final double[] p_array) { + if (m_currentPosition == m_bufferSize) { + m_unfinishedOperation.setIndex(m_currentPosition - m_startPosition); + throw m_exception; + } + + // Exception might be thrown in readLongs + // Do not store unfinished operation as partly de-serialized array will be passed anyway + return readDoubles(p_array, 0, p_array.length); + } + @Override public int readBytes(final byte[] p_array, final int p_offset, final int p_length) { if (m_currentPosition == m_bufferSize) { @@ -422,6 +446,38 @@ public int readLongs(final long[] p_array, final int p_offset, final int p_lengt return p_length; } + @Override + public int readFloats(final float[] p_array, final int p_offset, final int p_length) { + if (m_currentPosition == m_bufferSize) { + m_unfinishedOperation.setIndex(m_currentPosition - m_startPosition); + throw m_exception; + } + + for (int i = 0; i < p_length; i++) { + // Exception might be thrown in readFloat + // Do not store unfinished operation as partly de-serialized array will be passed anyway + p_array[p_offset + i] = readFloat(0); + } + + return p_length; + } + + @Override + public int readDoubles(final double[] p_array, final int p_offset, final int p_length) { + if (m_currentPosition == m_bufferSize) { + m_unfinishedOperation.setIndex(m_currentPosition - m_startPosition); + throw m_exception; + } + + for (int i = 0; i < p_length; i++) { + // Exception might be thrown in readDouble + // Do not store unfinished operation as partly de-serialized array will be passed anyway + p_array[p_offset + i] = readDouble(0); + } + + return p_length; + } + @Override public byte[] readByteArray(final byte[] p_array) { if (m_currentPosition == m_bufferSize) { @@ -525,4 +581,46 @@ public long[] readLongArray(final long[] p_array) { return arr; } + + @Override + public float[] readFloatArray(final float[] p_array) { + if (m_currentPosition == m_bufferSize) { + m_unfinishedOperation.setIndex(m_currentPosition - m_startPosition); + throw m_exception; + } + + int startPosition = m_currentPosition; + float[] arr = new float[readCompactNumber(0)]; + try { + readFloats(arr); + } catch (final ArrayIndexOutOfBoundsException e) { + // Store partly de-serialized array to be finished later + m_unfinishedOperation.setIndex(startPosition - m_startPosition); + m_unfinishedOperation.setObject(arr); + throw e; + } + + return arr; + } + + @Override + public double[] readDoubleArray(final double[] p_array) { + if (m_currentPosition == m_bufferSize) { + m_unfinishedOperation.setIndex(m_currentPosition - m_startPosition); + throw m_exception; + } + + int startPosition = m_currentPosition; + double[] arr = new double[readCompactNumber(0)]; + try { + readDoubles(arr); + } catch (final ArrayIndexOutOfBoundsException e) { + // Store partly de-serialized array to be finished later + m_unfinishedOperation.setIndex(startPosition - m_startPosition); + m_unfinishedOperation.setObject(arr); + throw e; + } + + return arr; + } } diff --git a/src/main/java/de/hhu/bsinfo/dxnet/core/MessageImporterUnderOverflow.java b/src/main/java/de/hhu/bsinfo/dxnet/core/MessageImporterUnderOverflow.java index 4b1007c..6b0ceb8 100644 --- a/src/main/java/de/hhu/bsinfo/dxnet/core/MessageImporterUnderOverflow.java +++ b/src/main/java/de/hhu/bsinfo/dxnet/core/MessageImporterUnderOverflow.java @@ -88,7 +88,7 @@ public void setUnfinishedOperation(final UnfinishedImExporterOperation p_unfinis } @Override - public void setNumberOfReadBytes(int p_numberOfReadBytes) { + public void setNumberOfReadBytes(final int p_numberOfReadBytes) { m_skipBytes = p_numberOfReadBytes; m_skippedBytes = 0; } @@ -367,7 +367,7 @@ public double readDouble(final double p_double) { } @Override - public int readCompactNumber(int p_int) { + public int readCompactNumber(final int p_int) { if (m_currentPosition == m_bufferSize) { // Overflow m_unfinishedOperation.setIndex(m_skippedBytes + m_currentPosition); @@ -437,12 +437,12 @@ public String readString(final String p_string) { } @Override - public int readBytes(byte[] p_array) { + public int readBytes(final byte[] p_array) { return readBytes(p_array, 0, p_array.length); } @Override - public int readShorts(short[] p_array) { + public int readShorts(final short[] p_array) { return readShorts(p_array, 0, p_array.length); } @@ -452,15 +452,25 @@ public int readChars(final char[] p_array) { } @Override - public int readInts(int[] p_array) { + public int readInts(final int[] p_array) { return readInts(p_array, 0, p_array.length); } @Override - public int readLongs(long[] p_array) { + public int readLongs(final long[] p_array) { return readLongs(p_array, 0, p_array.length); } + @Override + public int readFloats(final float[] p_array) { + return readFloats(p_array, 0, p_array.length); + } + + @Override + public int readDoubles(final double[] p_array) { + return readDoubles(p_array, 0, p_array.length); + } + @Override public int readBytes(byte[] p_array, int p_offset, int p_length) { if (m_currentPosition == m_bufferSize) { @@ -563,7 +573,7 @@ public int readBytes(final long p_byteBufferAddress, final int p_offset, final i } @Override - public int readShorts(short[] p_array, int p_offset, int p_length) { + public int readShorts(final short[] p_array, final int p_offset, final int p_length) { if (m_currentPosition == m_bufferSize) { // Overflow m_unfinishedOperation.setIndex(m_skippedBytes + m_currentPosition); @@ -605,7 +615,7 @@ public int readChars(final char[] p_array, final int p_offset, final int p_lengt } @Override - public int readInts(int[] p_array, int p_offset, int p_length) { + public int readInts(final int[] p_array, final int p_offset, final int p_length) { if (m_currentPosition == m_bufferSize) { // Overflow m_unfinishedOperation.setIndex(m_skippedBytes + m_currentPosition); @@ -626,7 +636,7 @@ public int readInts(int[] p_array, int p_offset, int p_length) { } @Override - public int readLongs(long[] p_array, int p_offset, int p_length) { + public int readLongs(final long[] p_array, final int p_offset, final int p_length) { if (m_currentPosition == m_bufferSize) { // Overflow m_unfinishedOperation.setIndex(m_skippedBytes + m_currentPosition); @@ -646,6 +656,48 @@ public int readLongs(long[] p_array, int p_offset, int p_length) { return p_length; } + @Override + public int readFloats(final float[] p_array, final int p_offset, final int p_length) { + if (m_currentPosition == m_bufferSize) { + // Overflow + m_unfinishedOperation.setIndex(m_skippedBytes + m_currentPosition); + throw m_exception; + } + + int floatsToSkip = 0; + if (m_skippedBytes < m_skipBytes) { + floatsToSkip = (m_skipBytes - m_skippedBytes) / Float.BYTES; + m_skippedBytes = m_skipBytes - (m_skipBytes - m_skippedBytes) % Float.BYTES; + } + + for (int i = floatsToSkip; i < p_length; i++) { + p_array[p_offset + i] = readFloat(p_array[p_offset + i]); + } + + return p_length; + } + + @Override + public int readDoubles(final double[] p_array, final int p_offset, final int p_length) { + if (m_currentPosition == m_bufferSize) { + // Overflow + m_unfinishedOperation.setIndex(m_skippedBytes + m_currentPosition); + throw m_exception; + } + + int doublesToSkip = 0; + if (m_skippedBytes < m_skipBytes) { + doublesToSkip = (m_skipBytes - m_skippedBytes) / Double.BYTES; + m_skippedBytes = m_skipBytes - (m_skipBytes - m_skippedBytes) % Double.BYTES; + } + + for (int i = doublesToSkip; i < p_length; i++) { + p_array[p_offset + i] = readDouble(p_array[p_offset + i]); + } + + return p_length; + } + @Override public byte[] readByteArray(final byte[] p_array) { if (m_currentPosition == m_bufferSize) { @@ -747,7 +799,7 @@ public short[] readShortArray(final short[] p_array) { } @Override - public char[] readCharArray(char[] p_array) { + public char[] readCharArray(final char[] p_array) { if (m_currentPosition == m_bufferSize) { // Overflow m_unfinishedOperation.setIndex(m_skippedBytes + m_currentPosition); @@ -895,4 +947,104 @@ public long[] readLongArray(final long[] p_array) { return arr; } } + + @Override + public float[] readFloatArray(final float[] p_array) { + if (m_currentPosition == m_bufferSize) { + // Overflow + m_unfinishedOperation.setIndex(m_skippedBytes + m_currentPosition); + throw m_exception; + } + + int startPosition = m_skippedBytes + m_currentPosition; + if (m_skippedBytes < m_unfinishedOperation.getIndex()) { + // Array length and array were read before, return passed array + m_skippedBytes += ObjectSizeUtil.sizeofCompactedNumber(p_array.length) + p_array.length * Float.BYTES; + return p_array; + } else if (m_skippedBytes < m_skipBytes) { + // Float array was partly de-serialized -> continue + float[] arr; + if (m_unfinishedOperation.getObject() == null) { + // Array length has not been read completely + arr = new float[readCompactNumber(0)]; + } else { + // Array was created before but is incomplete + arr = (float[]) m_unfinishedOperation.getObject(); + m_skippedBytes += ObjectSizeUtil.sizeofCompactedNumber(arr.length); + } + try { + readFloats(arr); + } catch (final ArrayIndexOutOfBoundsException e) { + // Store partly de-serialized array to be finished later + m_unfinishedOperation.setIndex(startPosition); + m_unfinishedOperation.setObject(arr); + throw e; + } + m_unfinishedOperation.setObject(null); + + return arr; + } else { + // Read floats normally as all previously read bytes have been skipped already + float[] arr = new float[readCompactNumber(0)]; + try { + readFloats(arr); + } catch (final ArrayIndexOutOfBoundsException e) { + // Store partly de-serialized array to be finished later + m_unfinishedOperation.setIndex(startPosition); + m_unfinishedOperation.setObject(arr); + throw e; + } + return arr; + } + } + + @Override + public double[] readDoubleArray(final double[] p_array) { + if (m_currentPosition == m_bufferSize) { + // Overflow + m_unfinishedOperation.setIndex(m_skippedBytes + m_currentPosition); + throw m_exception; + } + + int startPosition = m_skippedBytes + m_currentPosition; + if (m_skippedBytes < m_unfinishedOperation.getIndex()) { + // Array length and array were read before, return passed array + m_skippedBytes += ObjectSizeUtil.sizeofCompactedNumber(p_array.length) + p_array.length * Double.BYTES; + return p_array; + } else if (m_skippedBytes < m_skipBytes) { + // Double array was partly de-serialized -> continue + double[] arr; + if (m_unfinishedOperation.getObject() == null) { + // Array length has not been read completely + arr = new double[readCompactNumber(0)]; + } else { + // Array was created before but is incomplete + arr = (double[]) m_unfinishedOperation.getObject(); + m_skippedBytes += ObjectSizeUtil.sizeofCompactedNumber(arr.length); + } + try { + readDoubles(arr); + } catch (final ArrayIndexOutOfBoundsException e) { + // Store partly de-serialized array to be finished later + m_unfinishedOperation.setIndex(startPosition); + m_unfinishedOperation.setObject(arr); + throw e; + } + m_unfinishedOperation.setObject(null); + + return arr; + } else { + // Read doubles normally as all previously read bytes have been skipped already + double[] arr = new double[readCompactNumber(0)]; + try { + readDoubles(arr); + } catch (final ArrayIndexOutOfBoundsException e) { + // Store partly de-serialized array to be finished later + m_unfinishedOperation.setIndex(startPosition); + m_unfinishedOperation.setObject(arr); + throw e; + } + return arr; + } + } } diff --git a/src/main/java/de/hhu/bsinfo/dxnet/core/MessageImporterUnderflow.java b/src/main/java/de/hhu/bsinfo/dxnet/core/MessageImporterUnderflow.java index e207d10..8612a3f 100644 --- a/src/main/java/de/hhu/bsinfo/dxnet/core/MessageImporterUnderflow.java +++ b/src/main/java/de/hhu/bsinfo/dxnet/core/MessageImporterUnderflow.java @@ -262,7 +262,7 @@ public double readDouble(final double p_double) { } @Override - public int readCompactNumber(int p_int) { + public int readCompactNumber(final int p_int) { if (m_skippedBytes < m_unfinishedOperation.getIndex()) { // Compact number was read before, return passed value m_skippedBytes += ObjectSizeUtil.sizeofCompactedNumber(p_int); @@ -309,12 +309,12 @@ public String readString(final String p_string) { } @Override - public int readBytes(byte[] p_array) { + public int readBytes(final byte[] p_array) { return readBytes(p_array, 0, p_array.length); } @Override - public int readShorts(short[] p_array) { + public int readShorts(final short[] p_array) { return readShorts(p_array, 0, p_array.length); } @@ -324,17 +324,27 @@ public int readChars(final char[] p_array) { } @Override - public int readInts(int[] p_array) { + public int readInts(final int[] p_array) { return readInts(p_array, 0, p_array.length); } @Override - public int readLongs(long[] p_array) { + public int readLongs(final long[] p_array) { return readLongs(p_array, 0, p_array.length); } @Override - public int readBytes(byte[] p_array, int p_offset, int p_length) { + public int readFloats(final float[] p_array) { + return readFloats(p_array, 0, p_array.length); + } + + @Override + public int readDoubles(final double[] p_array) { + return readDoubles(p_array, 0, p_array.length); + } + + @Override + public int readBytes(final byte[] p_array, final int p_offset, final int p_length) { if (m_skippedBytes < m_unfinishedOperation.getIndex()) { // Full skip, bytes were read before m_skippedBytes += p_length; @@ -376,7 +386,7 @@ public int readBytes(final long p_byteBufferAddress, final int p_offset, final i } @Override - public int readShorts(short[] p_array, int p_offset, int p_length) { + public int readShorts(final short[] p_array, final int p_offset, final int p_length) { int shortsToSkip = 0; if (m_skippedBytes < m_skipBytes) { shortsToSkip = (m_skipBytes - m_skippedBytes) / Short.BYTES; @@ -406,7 +416,7 @@ public int readChars(final char[] p_array, final int p_offset, final int p_lengt } @Override - public int readInts(int[] p_array, int p_offset, int p_length) { + public int readInts(final int[] p_array, final int p_offset, final int p_length) { int intsToSkip = 0; if (m_skippedBytes < m_skipBytes) { intsToSkip = (m_skipBytes - m_skippedBytes) / Integer.BYTES; @@ -421,7 +431,7 @@ public int readInts(int[] p_array, int p_offset, int p_length) { } @Override - public int readLongs(long[] p_array, int p_offset, int p_length) { + public int readLongs(final long[] p_array, final int p_offset, final int p_length) { int longsToSkip = 0; if (m_skippedBytes < m_skipBytes) { longsToSkip = (m_skipBytes - m_skippedBytes) / Long.BYTES; @@ -435,6 +445,36 @@ public int readLongs(long[] p_array, int p_offset, int p_length) { return p_length; } + @Override + public int readFloats(final float[] p_array, final int p_offset, final int p_length) { + int floatsToSkip = 0; + if (m_skippedBytes < m_skipBytes) { + floatsToSkip = (m_skipBytes - m_skippedBytes) / Float.BYTES; + m_skippedBytes = m_skipBytes - (m_skipBytes - m_skippedBytes) % Float.BYTES; + } + + for (int i = floatsToSkip; i < p_length; i++) { + p_array[p_offset + i] = readFloat(p_array[p_offset + i]); + } + + return p_length; + } + + @Override + public int readDoubles(final double[] p_array, final int p_offset, final int p_length) { + int doublesToSkip = 0; + if (m_skippedBytes < m_skipBytes) { + doublesToSkip = (m_skipBytes - m_skippedBytes) / Double.BYTES; + m_skippedBytes = m_skipBytes - (m_skipBytes - m_skippedBytes) % Double.BYTES; + } + + for (int i = doublesToSkip; i < p_length; i++) { + p_array[p_offset + i] = readDouble(p_array[p_offset + i]); + } + + return p_length; + } + @Override public byte[] readByteArray(final byte[] p_array) { if (m_skippedBytes < m_unfinishedOperation.getIndex()) { @@ -569,4 +609,58 @@ public long[] readLongArray(final long[] p_array) { return arr; } } + + @Override + public float[] readFloatArray(final float[] p_array) { + if (m_skippedBytes < m_unfinishedOperation.getIndex()) { + // Array length and array were read before, return passed array + m_skippedBytes += ObjectSizeUtil.sizeofCompactedNumber(p_array.length) + p_array.length * Float.BYTES; + return p_array; + } else if (m_skippedBytes < m_skipBytes) { + // Float array was partly de-serialized -> continue + float[] arr; + if (m_unfinishedOperation.getObject() == null) { + // Array length has not been read completely + arr = new float[readCompactNumber(0)]; + } else { + // Array was created before but is incomplete + arr = (float[]) m_unfinishedOperation.getObject(); + m_skippedBytes += ObjectSizeUtil.sizeofCompactedNumber(arr.length); + } + readFloats(arr); + return arr; + } else { + // Read floats normally as all previously read bytes have been skipped already + float[] arr = new float[readCompactNumber(0)]; + readFloats(arr); + return arr; + } + } + + @Override + public double[] readDoubleArray(final double[] p_array) { + if (m_skippedBytes < m_unfinishedOperation.getIndex()) { + // Array length and array were read before, return passed array + m_skippedBytes += ObjectSizeUtil.sizeofCompactedNumber(p_array.length) + p_array.length * Double.BYTES; + return p_array; + } else if (m_skippedBytes < m_skipBytes) { + // Double array was partly de-serialized -> continue + double[] arr; + if (m_unfinishedOperation.getObject() == null) { + // Array length has not been read completely + arr = new double[readCompactNumber(0)]; + } else { + // Array was created before but is incomplete + arr = (double[]) m_unfinishedOperation.getObject(); + m_skippedBytes += ObjectSizeUtil.sizeofCompactedNumber(arr.length); + } + readDoubles(arr); + return arr; + } else { + // Read doubles normally as all previously read bytes have been skipped already + double[] arr = new double[readCompactNumber(0)]; + readDoubles(arr); + return arr; + } + } }