package mpi; import mpi.MPI; import java.nio.ByteBuffer; /** Simple MPI Serializable packet for EM Loop */ public abstract class MPIPacket { final int shift; private final int extent; private final int mArrayLength; ByteBuffer buffer; private static int firstPointOffset = 0; private static int numberOfPointsOffset = Integer.BYTES; private static int mArrayOffset = 2 * Integer.BYTES; private MPIPacket(int mArrayLength, int extent, int shift, ByteBuffer buffer) { this.extent = extent; this.shift = shift; this.mArrayLength = mArrayLength; this.buffer = (buffer == null) ? MPI.newByteBuffer(extent) : buffer; // new ByteBuffers are automatically initialized to zero } public static MPIPacket newIntegerPacket(int mArrayLength){ return newIntegerPacket(mArrayLength, null); } private static MPIPacket newIntegerPacket(int mArrayLength, ByteBuffer buffer){ return new MPIPacket(mArrayLength,(mArrayLength+2) * Integer.BYTES, Integer.BYTES, buffer){ public int getMArrayIntAt(int idx){ return this.buffer.getInt(mArrayOffset+idx*this.shift); } public void setMArrayIntAt(int idx, int value){ this.buffer.putInt(mArrayOffset+idx*this.shift, value); } }; } public static MPIPacket loadIntegerPacket(ByteBuffer buffer){ return newIntegerPacket(((buffer.capacity()/Integer.BYTES) - 2), buffer); } public static MPIPacket newDoublePacket(int mArrayLength){ return newDoublePacket(mArrayLength, null); } private static MPIPacket newDoublePacket(int mArrayLength, ByteBuffer buffer){ return new MPIPacket(mArrayLength, 2 * Integer.BYTES + mArrayLength * Double.BYTES, Double.BYTES, buffer){ public double getMArrayDoubleAt(int idx){ return this.buffer.getDouble(mArrayOffset + idx * this.shift); } public void setMArrayDoubleAt(int idx, double value){ this.buffer.putDouble(mArrayOffset + idx * this.shift, value); } }; } public static MPIPacket loadDoublePacket(ByteBuffer buffer){ return newDoublePacket(((buffer.capacity() - 2*Integer.BYTES)/Double.BYTES), buffer); } public int getMArrayIntAt(int idx){ throw new UnsupportedOperationException(); } public void setMArrayIntAt(int idx, int value){ throw new UnsupportedOperationException(); } public double getMArrayDoubleAt(int idx){ throw new UnsupportedOperationException(); } public void setMArrayDoubleAt(int idx, double value){ throw new UnsupportedOperationException(); } public ByteBuffer getBuffer() { return buffer; } public int getMArrayLength() { return mArrayLength; } public int getExtent() { return extent; } public int getFirstPoint(){ return buffer.getInt(firstPointOffset); } public void setFirstPoint(int firstPoint){ buffer.putInt(firstPointOffset, firstPoint); } public int getNumberOfPoints(){ return buffer.getInt(numberOfPointsOffset); } public void setNumberOfPoints(int numberOfPoints){ buffer.putInt(numberOfPointsOffset, numberOfPoints); } public enum Type {Integer, Double} }