if (dt == DataType.STRING)
hasStrings = true;
}
int recsize = matt.mdt.byteSize;
Layout layout = new LayoutRegular(matt.dataPos, recsize, shape, new Section(shape));
sm.setStructureSize(recsize);
// place data into an ArrayStructureBB for efficiency
ArrayStructureBB asbb = new ArrayStructureBB(sm, shape);
byte[] byteArray = asbb.getByteBuffer().array();
while (layout.hasNext()) {
Layout.Chunk chunk = layout.next();
if (chunk == null) continue;
if (debugStructure)
System.out.println(" readStructure " + matt.name + " chunk= " + chunk + " index.getElemSize= " + layout.getElemSize());
// copy bytes directly into the underlying byte[]
raf.seek(chunk.getSrcPos());
raf.read(byteArray, (int) chunk.getDestElem() * recsize, chunk.getNelems() * recsize);
}
// strings are stored on the heap, and must be read separately
if (hasStrings) {
int destPos = 0;
for (int i = 0; i< layout.getTotalNelems(); i++) { // loop over each structure
h5iosp.convertStrings(asbb, destPos, sm);
destPos += layout.getElemSize();
}
}
return asbb;
} // Structure case
// Strings
if ((vinfo.typeInfo.hdfType == 9) && (vinfo.typeInfo.isVString)) {
Layout layout = new LayoutRegular(matt.dataPos, matt.mdt.byteSize, shape, new Section(shape));
ArrayObject.D1 data = new ArrayObject.D1(String.class, (int) layout.getTotalNelems());
int count = 0;
while (layout.hasNext()) {
Layout.Chunk chunk = layout.next();
if (chunk == null) continue;
for (int i = 0; i < chunk.getNelems(); i++) {
long address = chunk.getSrcPos() + layout.getElemSize() * i;
String sval = readHeapString(address);
data.set(count++, sval);
}
}
return data;
} // vlen case
// Vlen (non-String)
if (vinfo.typeInfo.hdfType == 9) { // vlen
int endian = vinfo.typeInfo.endian;
DataType readType = dataType;
if (vinfo.typeInfo.base.hdfType == 7) { // reference
readType = DataType.LONG;
endian = 1; // apparently always LE
}
Layout layout = new LayoutRegular(matt.dataPos, matt.mdt.byteSize, shape, new Section(shape));
// general case is to read an array of vlen objects
// each vlen generates an Array - so return ArrayObject of Array
boolean scalar = layout.getTotalNelems() == 1; // if scalar, return just the len Array
Array[] data = new Array[(int) layout.getTotalNelems()];
int count = 0;
while (layout.hasNext()) {
Layout.Chunk chunk = layout.next();
if (chunk == null) continue;
for (int i = 0; i < chunk.getNelems(); i++) {
long address = chunk.getSrcPos() + layout.getElemSize() * i;
Array vlenArray = getHeapDataArray(address, readType, endian);
if (vinfo.typeInfo.base.hdfType == 7)
data[count++] = h5iosp.convertReference(vlenArray);
else
data[count++] = vlenArray;
}
}
return (scalar) ? data[0] : Array.factory(Array.class, shape, data);
} // vlen case
// NON-STRUCTURE CASE
DataType readDtype = dataType;
int elemSize = dataType.getSize();
int endian = vinfo.typeInfo.endian;
if (vinfo.typeInfo.hdfType == 2) { // time
readDtype = vinfo.mdt.timeType;
elemSize = readDtype.getSize();
} else if (vinfo.typeInfo.hdfType == 3) { // char
if (vinfo.mdt.byteSize > 1) {
int[] newShape = new int[shape.length + 1];
System.arraycopy(shape, 0, newShape, 0, shape.length);
newShape[shape.length] = vinfo.mdt.byteSize ;
shape = newShape;
}
} else if (vinfo.typeInfo.hdfType == 5) { // opaque
elemSize = vinfo.mdt.byteSize;
} else if (vinfo.typeInfo.hdfType == 8) { // enum
H5header.TypeInfo baseInfo = vinfo.typeInfo.base;
readDtype = baseInfo.dataType;
elemSize = readDtype.getSize();
endian = baseInfo.endian;
}
Layout layout = new LayoutRegular(matt.dataPos, elemSize, shape, new Section(shape));
Object data = h5iosp.readDataPrimitive(layout, dataType, shape, null, endian, false);
Array dataArray = null;
if ((dataType == DataType.CHAR)) {
if (vinfo.mdt.byteSize > 1) { // chop back into pieces