1
1

Fix a compile issue in MPI.java

A conflict was not fully resolved in the previous merge.  This
fixes the issue that was created.

Signed-off-by: Nathaniel Graham <ngraham@lanl.gov>
Этот коммит содержится в:
Nathaniel Graham 2015-07-24 11:54:52 -06:00
родитель 0d7a38552e
Коммит f87c41e926

Просмотреть файл

@ -45,7 +45,6 @@
* Copyright: Northeast Parallel Architectures Center
* at Syracuse University 1998
*/
package mpi;
import java.io.*;
@ -998,923 +997,5 @@ public final class MPI
{
return DoubleBuffer.wrap(buf, offset, buf.length - offset).slice();
}
=======
private static boolean initialized, finalized;
private static byte[] buffer = null; // Buffer allocation
private static final int MAX_PROCESSOR_NAME = 256;
private static final ByteOrder nativeOrder = ByteOrder.nativeOrder();
public static final Intracomm COMM_WORLD, COMM_SELF;
public static final int THREAD_SINGLE, THREAD_FUNNELED, THREAD_SERIALIZED,
THREAD_MULTIPLE;
public static final int GRAPH, DIST_GRAPH, CART;
public static final int ANY_SOURCE, ANY_TAG;
public static final Op MAX, MIN, SUM, PROD, LAND, BAND,
LOR, BOR, LXOR, BXOR, REPLACE, NO_OP;
/**
* Global minimum operator.
* <p>{@code MINLOC} and {@link #MAXLOC} can be used with each of the following
* datatypes: {@link #INT2}, {@link #SHORT_INT}, {@link #LONG_INT},
* {@link #FLOAT_INT} and {@link #DOUBLE_INT}.
*/
public static final Op MINLOC;
/** Global maximum operator. See {@link #MINLOC}.*/
public static final Op MAXLOC;
public static final Datatype DATATYPE_NULL;
public static final Datatype BYTE, CHAR, SHORT, BOOLEAN,
INT, LONG, FLOAT, DOUBLE, PACKED,
FLOAT_COMPLEX, DOUBLE_COMPLEX;
/** Struct which must be used with {@link #int2}. */
public static final Datatype INT2;
/** Struct which must be used with {@link #shortInt}. */
public static final Datatype SHORT_INT;
/** Struct which must be used with {@link #longInt}. */
public static final Datatype LONG_INT;
/** Struct which must be used with {@link #floatInt}. */
public static final Datatype FLOAT_INT;
/** Struct which must be used with {@link #doubleInt}. */
public static final Datatype DOUBLE_INT;
/** Struct object for {@link #INT2} datatype. */
public static final Int2 int2;
/** Struct object for {@link #SHORT_INT} datatype. */
public static final ShortInt shortInt;
/** Struct object for {@link #LONG_INT} datatype. */
public static final LongInt longInt;
/** Struct object for {@link #FLOAT_INT} datatype. */
public static final FloatInt floatInt;
/** Struct object for {@link #DOUBLE_INT} datatype. */
public static final DoubleInt doubleInt;
public static final Request REQUEST_NULL;
public static final Group GROUP_EMPTY;
public static final Info INFO_ENV, INFO_NULL;
public static final int PROC_NULL;
public static final int UNDEFINED;
public static final int IDENT, CONGRUENT, SIMILAR, UNEQUAL;
public static final int TAG_UB, HOST, IO, WTIME_IS_GLOBAL;
public static final int APPNUM, LASTUSEDCODE, UNIVERSE_SIZE, WIN_BASE,
WIN_SIZE, WIN_DISP_UNIT;
public static final int VERSION, SUBVERSION;
public static final int ROOT, KEYVAL_INVALID, BSEND_OVERHEAD;
public static final int MAX_OBJECT_NAME, MAX_PORT_NAME, MAX_DATAREP_STRING;
public static final int MAX_INFO_KEY, MAX_INFO_VAL;
public static final int ORDER_C, ORDER_FORTRAN;
public static final int DISTRIBUTE_BLOCK, DISTRIBUTE_CYCLIC, DISTRIBUTE_NONE,
DISTRIBUTE_DFLT_DARG;
public static final int MODE_CREATE, MODE_RDONLY, MODE_WRONLY, MODE_RDWR,
MODE_DELETE_ON_CLOSE, MODE_UNIQUE_OPEN, MODE_EXCL,
MODE_APPEND, MODE_SEQUENTIAL;
public static final int DISPLACEMENT_CURRENT;
public static final int SEEK_SET, SEEK_CUR, SEEK_END;
public static final int MODE_NOCHECK, MODE_NOPRECEDE, MODE_NOPUT,
MODE_NOSTORE, MODE_NOSUCCEED;
public static final int LOCK_EXCLUSIVE, LOCK_SHARED;
public static final Errhandler ERRORS_ARE_FATAL, ERRORS_RETURN;
// Error classes and codes
public static final int SUCCESS;
public static final int ERR_BUFFER;
public static final int ERR_COUNT;
public static final int ERR_TYPE;
public static final int ERR_TAG;
public static final int ERR_COMM;
public static final int ERR_RANK;
public static final int ERR_REQUEST;
public static final int ERR_ROOT;
public static final int ERR_GROUP;
public static final int ERR_OP;
public static final int ERR_TOPOLOGY;
public static final int ERR_DIMS;
public static final int ERR_ARG;
public static final int ERR_UNKNOWN;
public static final int ERR_TRUNCATE;
public static final int ERR_OTHER;
public static final int ERR_INTERN;
public static final int ERR_IN_STATUS;
public static final int ERR_PENDING;
public static final int ERR_ACCESS;
public static final int ERR_AMODE;
public static final int ERR_ASSERT;
public static final int ERR_BAD_FILE;
public static final int ERR_BASE;
public static final int ERR_CONVERSION;
public static final int ERR_DISP;
public static final int ERR_DUP_DATAREP;
public static final int ERR_FILE_EXISTS;
public static final int ERR_FILE_IN_USE;
public static final int ERR_FILE;
public static final int ERR_INFO_KEY;
public static final int ERR_INFO_NOKEY;
public static final int ERR_INFO_VALUE;
public static final int ERR_INFO;
public static final int ERR_IO;
public static final int ERR_KEYVAL;
public static final int ERR_LOCKTYPE;
public static final int ERR_NAME;
public static final int ERR_NO_MEM;
public static final int ERR_NOT_SAME;
public static final int ERR_NO_SPACE;
public static final int ERR_NO_SUCH_FILE;
public static final int ERR_PORT;
public static final int ERR_QUOTA;
public static final int ERR_READ_ONLY;
public static final int ERR_RMA_CONFLICT;
public static final int ERR_RMA_SYNC;
public static final int ERR_SERVICE;
public static final int ERR_SIZE;
public static final int ERR_SPAWN;
public static final int ERR_UNSUPPORTED_DATAREP;
public static final int ERR_UNSUPPORTED_OPERATION;
public static final int ERR_WIN;
public static final int ERR_LASTCODE;
public static final int ERR_SYSRESOURCE;
static
{
System.loadLibrary("mpi_java");
DATATYPE_NULL = new Datatype();
BYTE = new Datatype();
CHAR = new Datatype();
SHORT = new Datatype();
BOOLEAN = new Datatype();
INT = new Datatype();
LONG = new Datatype();
FLOAT = new Datatype();
DOUBLE = new Datatype();
PACKED = new Datatype();
INT2 = new Datatype();
SHORT_INT = new Datatype();
LONG_INT = new Datatype();
FLOAT_INT = new Datatype();
DOUBLE_INT = new Datatype();
FLOAT_COMPLEX = new Datatype();
DOUBLE_COMPLEX = new Datatype();
int2 = newInt2();
shortInt = newShortInt();
longInt = newLongInt();
floatInt = newFloatInt();
doubleInt = newDoubleInt();
MAX = new Op(1);
MIN = new Op(2);
SUM = new Op(3);
PROD = new Op(4);
LAND = new Op(5);
BAND = new Op(6);
LOR = new Op(7);
BOR = new Op(8);
LXOR = new Op(9);
BXOR = new Op(10);
MINLOC = new Op(11);
MAXLOC = new Op(12);
REPLACE = new Op(13);
NO_OP = new Op(14);
GROUP_EMPTY = new Group(Group.getEmpty());
REQUEST_NULL = new Request(Request.getNull());
INFO_ENV = Info.newEnv();
INFO_NULL = new Info(Info.NULL);
Constant c = new Constant();
THREAD_SINGLE = c.THREAD_SINGLE;
THREAD_FUNNELED = c.THREAD_FUNNELED;
THREAD_SERIALIZED = c.THREAD_SERIALIZED;
THREAD_MULTIPLE = c.THREAD_MULTIPLE;
GRAPH = c.GRAPH;
DIST_GRAPH = c.DIST_GRAPH;
CART = c.CART;
ANY_SOURCE = c.ANY_SOURCE;
ANY_TAG = c.ANY_TAG;
PROC_NULL = c.PROC_NULL;
UNDEFINED = c.UNDEFINED;
IDENT = c.IDENT;
CONGRUENT = c.CONGRUENT;
SIMILAR = c.SIMILAR;
UNEQUAL = c.UNEQUAL;
TAG_UB = c.TAG_UB;
HOST = c.HOST;
IO = c.IO;
WTIME_IS_GLOBAL = c.WTIME_IS_GLOBAL;
APPNUM = c.APPNUM;
LASTUSEDCODE = c.LASTUSEDCODE;
UNIVERSE_SIZE = c.UNIVERSE_SIZE;
WIN_BASE = c.WIN_BASE;
WIN_SIZE = c.WIN_SIZE;
WIN_DISP_UNIT = c.WIN_DISP_UNIT;
VERSION = c.VERSION;
SUBVERSION = c.SUBVERSION;
ROOT = c.ROOT;
KEYVAL_INVALID = c.KEYVAL_INVALID;
BSEND_OVERHEAD = c.BSEND_OVERHEAD;
MAX_OBJECT_NAME = c.MAX_OBJECT_NAME;
MAX_PORT_NAME = c.MAX_PORT_NAME;
MAX_DATAREP_STRING = c.MAX_DATAREP_STRING;
MAX_INFO_KEY = c.MAX_INFO_KEY;
MAX_INFO_VAL = c.MAX_INFO_VAL;
ORDER_C = c.ORDER_C;
ORDER_FORTRAN = c.ORDER_FORTRAN;
DISTRIBUTE_BLOCK = c.DISTRIBUTE_BLOCK;
DISTRIBUTE_CYCLIC = c.DISTRIBUTE_CYCLIC;
DISTRIBUTE_NONE = c.DISTRIBUTE_NONE;
DISTRIBUTE_DFLT_DARG = c.DISTRIBUTE_DFLT_DARG;
MODE_CREATE = c.MODE_CREATE;
MODE_RDONLY = c.MODE_RDONLY;
MODE_WRONLY = c.MODE_WRONLY;
MODE_RDWR = c.MODE_RDWR;
MODE_DELETE_ON_CLOSE = c.MODE_DELETE_ON_CLOSE;
MODE_UNIQUE_OPEN = c.MODE_UNIQUE_OPEN;
MODE_EXCL = c.MODE_EXCL;
MODE_APPEND = c.MODE_APPEND;
MODE_SEQUENTIAL = c.MODE_SEQUENTIAL;
DISPLACEMENT_CURRENT = c.DISPLACEMENT_CURRENT;
SEEK_SET = c.SEEK_SET;
SEEK_CUR = c.SEEK_CUR;
SEEK_END = c.SEEK_END;
MODE_NOCHECK = c.MODE_NOCHECK;
MODE_NOPRECEDE = c.MODE_NOPRECEDE;
MODE_NOPUT = c.MODE_NOPUT;
MODE_NOSTORE = c.MODE_NOSTORE;
MODE_NOSUCCEED = c.MODE_NOSUCCEED;
LOCK_EXCLUSIVE = c.LOCK_EXCLUSIVE;
LOCK_SHARED = c.LOCK_SHARED;
ERRORS_ARE_FATAL = new Errhandler(Errhandler.getFatal());
ERRORS_RETURN = new Errhandler(Errhandler.getReturn());
COMM_WORLD = new Intracomm();
COMM_SELF = new Intracomm();
// Error classes and codes
SUCCESS = c.SUCCESS;
ERR_BUFFER = c.ERR_BUFFER;
ERR_COUNT = c.ERR_COUNT;
ERR_TYPE = c.ERR_TYPE;
ERR_TAG = c.ERR_TAG;
ERR_COMM = c.ERR_COMM;
ERR_RANK = c.ERR_RANK;
ERR_REQUEST = c.ERR_REQUEST;
ERR_ROOT = c.ERR_ROOT;
ERR_GROUP = c.ERR_GROUP;
ERR_OP = c.ERR_OP;
ERR_TOPOLOGY = c.ERR_TOPOLOGY;
ERR_DIMS = c.ERR_DIMS;
ERR_ARG = c.ERR_ARG;
ERR_UNKNOWN = c.ERR_UNKNOWN;
ERR_TRUNCATE = c.ERR_TRUNCATE;
ERR_OTHER = c.ERR_OTHER;
ERR_INTERN = c.ERR_INTERN;
ERR_IN_STATUS = c.ERR_IN_STATUS;
ERR_PENDING = c.ERR_PENDING;
ERR_ACCESS = c.ERR_ACCESS;
ERR_AMODE = c.ERR_AMODE;
ERR_ASSERT = c.ERR_ASSERT;
ERR_BAD_FILE = c.ERR_BAD_FILE;
ERR_BASE = c.ERR_BASE;
ERR_CONVERSION = c.ERR_CONVERSION;
ERR_DISP = c.ERR_DISP;
ERR_DUP_DATAREP = c.ERR_DUP_DATAREP;
ERR_FILE_EXISTS = c.ERR_FILE_EXISTS;
ERR_FILE_IN_USE = c.ERR_FILE_IN_USE;
ERR_FILE = c.ERR_FILE;
ERR_INFO_KEY = c.ERR_INFO_KEY;
ERR_INFO_NOKEY = c.ERR_INFO_NOKEY;
ERR_INFO_VALUE = c.ERR_INFO_VALUE;
ERR_INFO = c.ERR_INFO;
ERR_IO = c.ERR_IO;
ERR_KEYVAL = c.ERR_KEYVAL;
ERR_LOCKTYPE = c.ERR_LOCKTYPE;
ERR_NAME = c.ERR_NAME;
ERR_NO_MEM = c.ERR_NO_MEM;
ERR_NOT_SAME = c.ERR_NOT_SAME;
ERR_NO_SPACE = c.ERR_NO_SPACE;
ERR_NO_SUCH_FILE = c.ERR_NO_SUCH_FILE;
ERR_PORT = c.ERR_PORT;
ERR_QUOTA = c.ERR_QUOTA;
ERR_READ_ONLY = c.ERR_READ_ONLY;
ERR_RMA_CONFLICT = c.ERR_RMA_CONFLICT;
ERR_RMA_SYNC = c.ERR_RMA_SYNC;
ERR_SERVICE = c.ERR_SERVICE;
ERR_SIZE = c.ERR_SIZE;
ERR_SPAWN = c.ERR_SPAWN;
ERR_UNSUPPORTED_DATAREP = c.ERR_UNSUPPORTED_DATAREP;
ERR_UNSUPPORTED_OPERATION = c.ERR_UNSUPPORTED_OPERATION;
ERR_WIN = c.ERR_WIN;
ERR_LASTCODE = c.ERR_LASTCODE;
ERR_SYSRESOURCE = c.ERR_SYSRESOURCE;
}
private static native Int2 newInt2();
private static native ShortInt newShortInt();
private static native LongInt newLongInt();
private static native FloatInt newFloatInt();
private static native DoubleInt newDoubleInt();
private static void initCommon() throws MPIException
{
initialized = true;
DATATYPE_NULL.setBasic(Datatype.NULL);
BYTE.setBasic(Datatype.BYTE);
CHAR.setBasic(Datatype.CHAR);
SHORT.setBasic(Datatype.SHORT);
BOOLEAN.setBasic(Datatype.BOOLEAN);
INT.setBasic(Datatype.INT);
LONG.setBasic(Datatype.LONG);
FLOAT.setBasic(Datatype.FLOAT);
DOUBLE.setBasic(Datatype.DOUBLE);
PACKED.setBasic(Datatype.PACKED);
INT2.setBasic(Datatype.INT2, MPI.BYTE);
SHORT_INT.setBasic(Datatype.SHORT_INT, MPI.BYTE);
LONG_INT.setBasic(Datatype.LONG_INT, MPI.BYTE);
FLOAT_INT.setBasic(Datatype.FLOAT_INT, MPI.BYTE);
DOUBLE_INT.setBasic(Datatype.DOUBLE_INT, MPI.BYTE);
FLOAT_COMPLEX.setBasic(Datatype.FLOAT_COMPLEX, MPI.FLOAT);
DOUBLE_COMPLEX.setBasic(Datatype.DOUBLE_COMPLEX, MPI.DOUBLE);
COMM_WORLD.setType(Intracomm.WORLD);
COMM_SELF.setType(Intracomm.SELF);
}
/**
* Initialize MPI.
* <p>Java binding of the MPI operation {@code MPI_INIT}.
* @param args arguments to the {@code main} method.
* @return arguments
* @throws MPIException Signals that an MPI exception of some sort has occurred.
*/
public static String[] Init(String[] args) throws MPIException
{
if(initialized)
throw new MPIException("MPI is already initialized.");
String[] newArgs = Init_jni(args);
initCommon();
return newArgs;
}
private static native String [] Init_jni(String[] args);
/**
* Initialize MPI with threads.
* <p>Java binding of the MPI operation {@code MPI_INIT_THREAD}.
* @param args arguments to the {@code main} method.
* @param required desired level of thread support
* @return provided level of thread support
* @throws MPIException Signals that an MPI exception of some sort has occurred.
*/
public static int InitThread(String[] args, int required) throws MPIException
{
if(initialized)
throw new MPIException("MPI is already initialized.");
int provided = InitThread_jni(args, required);
initCommon();
return provided;
}
private static native int InitThread_jni(String[] args, int required)
throws MPIException;
/**
* Java binding of the MPI operation {@code MPI_QUERY_THREAD}.
* @return provided level of thread support
* @throws MPIException Signals that an MPI exception of some sort has occurred.
*/
public static int queryThread() throws MPIException
{
MPI.check();
return queryThread_jni();
}
private static native int queryThread_jni() throws MPIException;
/**
* Java binding of the MPI operation {@code MPI_IS_THREAD_MAIN}.
* @return true if it is the main thread
* @throws MPIException Signals that an MPI exception of some sort has occurred.
*/
public static boolean isThreadMain() throws MPIException
{
MPI.check();
return isThreadMain_jni();
}
private static native boolean isThreadMain_jni() throws MPIException;
/**
* Finalize MPI.
* <p>Java binding of the MPI operation {@code MPI_FINALIZE}.
* @throws MPIException Signals that an MPI exception of some sort has occurred.
*/
public static void Finalize() throws MPIException
{
check();
Finalize_jni();
finalized = true;
}
private static native void Finalize_jni() throws MPIException;
/**
* Returns an elapsed time on the calling processor.
* <p>Java binding of the MPI operation {@code MPI_WTIME}.
* @return time in seconds since an arbitrary time in the past.
* @throws MPIException Signals that an MPI exception of some sort has occurred.
*/
public static double wtime() throws MPIException
{
check();
return wtime_jni();
}
private static native double wtime_jni();
/**
* Returns resolution of timer.
* <p>Java binding of the MPI operation {MPI_WTICK}.
* @return resolution of {@code wtime} in seconds.
* @throws MPIException Signals that an MPI exception of some sort has occurred.
*/
public static double wtick() throws MPIException
{
check();
return wtick_jni();
}
private static native double wtick_jni();
/**
* Returns the name of the processor on which it is called.
* <p>Java binding of the MPI operation {@code MPI_GET_PROCESSOR_NAME}.
* @return A unique specifier for the actual node.
* @throws MPIException Signals that an MPI exception of some sort has occurred.
*/
static public String getProcessorName() throws MPIException
{
check();
byte[] buf = new byte[MAX_PROCESSOR_NAME];
int lengh = getProcessorName(buf);
return new String(buf,0,lengh);
}
static private native int getProcessorName(byte[] buf);
/**
* Test if MPI has been initialized.
* <p>Java binding of the MPI operation {@code MPI_INITIALIZED}.
* @return {@code true} if {@code Init} has been called,
* {@code false} otherwise.
* @throws MPIException Signals that an MPI exception of some sort has occurred.
*/
static public native boolean isInitialized() throws MPIException;
/**
* Test if MPI has been finalized.
* <p>Java binding of the MPI operation {@code MPI_FINALIZED}.
* @return {@code true} if {@code Finalize} has been called,
* {@code false} otherwise.
* @throws MPIException Signals that an MPI exception of some sort has occurred.
*/
static public native boolean isFinalized() throws MPIException;
/**
* Attaches a user-provided buffer for sending.
* <p>Java binding of the MPI operation {@code MPI_BUFFER_ATTACH}.
* @param buffer initial buffer
* @throws MPIException Signals that an MPI exception of some sort has occurred.
*/
static public void attachBuffer(byte[] buffer) throws MPIException
{
check();
MPI.buffer = buffer;
attachBuffer_jni(buffer);
}
static private native void attachBuffer_jni(byte[] buffer);
/**
* Removes an existing buffer (for use in sending).
* <p>Java binding of the MPI operation {@code MPI_BUFFER_DETACH}.
* @return initial buffer
* @throws MPIException Signals that an MPI exception of some sort has occurred.
*/
static public byte[] detachBuffer() throws MPIException
{
check();
detachBuffer_jni(buffer);
byte[] result = MPI.buffer;
MPI.buffer = null;
return result;
}
static private native void detachBuffer_jni(byte[] buffer);
/**
* Controls profiling.
* <p>This method is not implemented.
* <p>Java binding of the MPI operation {@code MPI_PCONTROL}.
* @param level Profiling level.
* @param obj Profiling information.
*/
public static void pControl(int level, Object obj)
{
// Nothing to do here.
}
/**
* Check if MPI has been initialized and hasn't been finalized.
* @throws MPIException Signals that an MPI exception of some sort has occurred.
*/
protected static void check() throws MPIException
{
if(!initialized)
throw new MPIException("MPI is not initialized.");
if(finalized)
throw new MPIException("MPI is finalized.");
}
protected static byte[] attrSet(Object value) throws MPIException
{
try
{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream os = new ObjectOutputStream(baos);
os.writeObject(value);
os.close();
return baos.toByteArray();
}
catch(IOException ex)
{
MPIException mpiex = new MPIException(ex);
mpiex.setStackTrace(ex.getStackTrace());
throw mpiex;
}
}
protected static Object attrGet(byte[] value) throws MPIException
{
if(value == null)
return null;
try
{
ByteArrayInputStream bais = new ByteArrayInputStream(value);
ObjectInputStream is = new ObjectInputStream(bais);
Object obj = is.readObject();
is.close();
return obj;
}
catch(ClassNotFoundException ex)
{
throw new MPIException(ex);
}
catch(IOException ex)
{
throw new MPIException(ex);
}
}
/**
* Allocates a new direct byte buffer.
* @param capacity The new buffer's capacity, in bytes
* @return The new byte buffer
*/
public static ByteBuffer newByteBuffer(int capacity)
{
ByteBuffer buf = ByteBuffer.allocateDirect(capacity);
buf.order(nativeOrder);
return buf;
}
/**
* Allocates a new direct char buffer.
* @param capacity The new buffer's capacity, in chars
* @return The new char buffer
*/
public static CharBuffer newCharBuffer(int capacity)
{
assert capacity <= Integer.MAX_VALUE / 2;
ByteBuffer buf = ByteBuffer.allocateDirect(capacity * 2);
buf.order(nativeOrder);
return buf.asCharBuffer();
}
/**
* Allocates a new direct short buffer.
* @param capacity The new buffer's capacity, in shorts
* @return The new short buffer
*/
public static ShortBuffer newShortBuffer(int capacity)
{
assert capacity <= Integer.MAX_VALUE / 2;
ByteBuffer buf = ByteBuffer.allocateDirect(capacity * 2);
buf.order(nativeOrder);
return buf.asShortBuffer();
}
/**
* Allocates a new direct int buffer.
* @param capacity The new buffer's capacity, in ints
* @return The new int buffer
*/
public static IntBuffer newIntBuffer(int capacity)
{
assert capacity <= Integer.MAX_VALUE / 4;
ByteBuffer buf = ByteBuffer.allocateDirect(capacity * 4);
buf.order(nativeOrder);
return buf.asIntBuffer();
}
/**
* Allocates a new direct long buffer.
* @param capacity The new buffer's capacity, in longs
* @return The new long buffer
*/
public static LongBuffer newLongBuffer(int capacity)
{
assert capacity <= Integer.MAX_VALUE / 8;
ByteBuffer buf = ByteBuffer.allocateDirect(capacity * 8);
buf.order(nativeOrder);
return buf.asLongBuffer();
}
/**
* Allocates a new direct float buffer.
* @param capacity The new buffer's capacity, in floats
* @return The new float buffer
*/
public static FloatBuffer newFloatBuffer(int capacity)
{
assert capacity <= Integer.MAX_VALUE / 4;
ByteBuffer buf = ByteBuffer.allocateDirect(capacity * 4);
buf.order(nativeOrder);
return buf.asFloatBuffer();
}
/**
* Allocates a new direct double buffer.
* @param capacity The new buffer's capacity, in doubles
* @return The new double buffer
*/
public static DoubleBuffer newDoubleBuffer(int capacity)
{
assert capacity <= Integer.MAX_VALUE / 8;
ByteBuffer buf = ByteBuffer.allocateDirect(capacity * 8);
buf.order(nativeOrder);
return buf.asDoubleBuffer();
}
/**
* Asserts that a buffer is direct.
* @param buf buffer
*/
protected static void assertDirectBuffer(Buffer buf)
{
if(!buf.isDirect())
throw new IllegalArgumentException("The buffer must be direct.");
}
/**
* Asserts that buffers are direct.
* @param sendbuf The send buffer
* @param recvbuf The receive buffer
*/
protected static void assertDirectBuffer(Buffer sendbuf, Buffer recvbuf)
{
if(!sendbuf.isDirect())
throw new IllegalArgumentException("The send buffer must be direct.");
if(!recvbuf.isDirect())
throw new IllegalArgumentException("The recv. buffer must be direct.");
}
/**
* Checks if an object is a direct buffer.
* @param obj object
* @return true if the object is a direct buffer
*/
protected static boolean isDirectBuffer(Object obj)
{
return obj instanceof Buffer && ((Buffer)obj).isDirect();
}
/**
* Checks if an object is a heap buffer.
* @param obj object
* @return true if the object is a heap buffer
*/
protected static boolean isHeapBuffer(Object obj)
{
return obj instanceof Buffer && !((Buffer)obj).isDirect();
}
/**
* Creates a new buffer whose content is a shared subsequence of a buffer.
* <p>The content of the new buffer will start at the specified offset.
* @param buf buffer
* @param offset offset
* @return the new buffer.
*/
public static ByteBuffer slice(ByteBuffer buf, int offset)
{
return ((ByteBuffer)buf.clear().position(offset))
.slice().order(nativeOrder);
}
/**
* Creates a new buffer whose content is a shared subsequence of a buffer.
* <p>The content of the new buffer will start at the specified offset.
* @param buf buffer
* @param offset offset
* @return the new buffer.
*/
public static CharBuffer slice(CharBuffer buf, int offset)
{
return ((CharBuffer)buf.clear().position(offset)).slice();
}
/**
* Creates a new buffer whose content is a shared subsequence of a buffer.
* <p>The content of the new buffer will start at the specified offset.
* @param buf buffer
* @param offset offset
* @return the new buffer.
*/
public static ShortBuffer slice(ShortBuffer buf, int offset)
{
return ((ShortBuffer)buf.clear().position(offset)).slice();
}
/**
* Creates a new buffer whose content is a shared subsequence of a buffer.
* <p>The content of the new buffer will start at the specified offset.
* @param buf buffer
* @param offset offset
* @return the new buffer.
*/
public static IntBuffer slice(IntBuffer buf, int offset)
{
return ((IntBuffer)buf.clear().position(offset)).slice();
}
/**
* Creates a new buffer whose content is a shared subsequence of a buffer.
* <p>The content of the new buffer will start at the specified offset.
* @param buf buffer
* @param offset offset
* @return the new buffer.
*/
public static LongBuffer slice(LongBuffer buf, int offset)
{
return ((LongBuffer)buf.clear().position(offset)).slice();
}
/**
* Creates a new buffer whose content is a shared subsequence of a buffer.
* <p>The content of the new buffer will start at the specified offset.
* @param buf buffer
* @param offset offset
* @return the new buffer.
*/
public static FloatBuffer slice(FloatBuffer buf, int offset)
{
return ((FloatBuffer)buf.clear().position(offset)).slice();
}
/**
* Creates a new buffer whose content is a shared subsequence of a buffer.
* <p>The content of the new buffer will start at the specified offset.
* @param buf buffer
* @param offset offset
* @return the new buffer.
*/
public static DoubleBuffer slice(DoubleBuffer buf, int offset)
{
return ((DoubleBuffer)buf.clear().position(offset)).slice();
}
/**
* Creates a new buffer whose content is a shared subsequence of a buffer.
* <p>The content of the new buffer will start at the specified offset.
* @param buf buffer
* @param offset offset
* @return the new buffer.
*/
public static ByteBuffer slice(byte[] buf, int offset)
{
return ByteBuffer.wrap(buf, offset, buf.length - offset)
.slice().order(nativeOrder);
}
/**
* Creates a new buffer whose content is a shared subsequence of a buffer.
* <p>The content of the new buffer will start at the specified offset.
* @param buf buffer
* @param offset offset
* @return the new buffer.
*/
public static CharBuffer slice(char[] buf, int offset)
{
return CharBuffer.wrap(buf, offset, buf.length - offset).slice();
}
/**
* Creates a new buffer whose content is a shared subsequence of a buffer.
* <p>The content of the new buffer will start at the specified offset.
* @param buf buffer
* @param offset offset
* @return the new buffer.
*/
public static ShortBuffer slice(short[] buf, int offset)
{
return ShortBuffer.wrap(buf, offset, buf.length - offset).slice();
}
/**
* Creates a new buffer whose content is a shared subsequence of a buffer.
* <p>The content of the new buffer will start at the specified offset.
* @param buf buffer
* @param offset offset
* @return the new buffer.
*/
public static IntBuffer slice(int[] buf, int offset)
{
return IntBuffer.wrap(buf, offset, buf.length - offset).slice();
}
/**
* Creates a new buffer whose content is a shared subsequence of a buffer.
* <p>The content of the new buffer will start at the specified offset.
* @param buf buffer
* @param offset offset
* @return the new buffer.
*/
public static LongBuffer slice(long[] buf, int offset)
{
return LongBuffer.wrap(buf, offset, buf.length - offset).slice();
}
/**
* Creates a new buffer whose content is a shared subsequence of a buffer.
* <p>The content of the new buffer will start at the specified offset.
* @param buf buffer
* @param offset offset
* @return the new buffer.
*/
public static FloatBuffer slice(float[] buf, int offset)
{
return FloatBuffer.wrap(buf, offset, buf.length - offset).slice();
}
/**
* Creates a new buffer whose content is a shared subsequence of a buffer.
* <p>The content of the new buffer will start at the specified offset.
* @param buf buffer
* @param offset offset
* @return the new buffer.
*/
public static DoubleBuffer slice(double[] buf, int offset)
{
return DoubleBuffer.wrap(buf, offset, buf.length - offset).slice();
}
} // MPI
} // MPI