@Override public Array getArray(int recnum, StructureMembers.Member m) { if (m.isVariableLength()) { int offset = calcOffsetSetOrder(recnum, m); int heapIndex = bbuffer.getInt(offset); return (Array) heap.get( heapIndex); } return super.getArray(recnum, m); }
public MemberData(StructureMembers.Member member, int nelems) { this.member = member; this.nelems = nelems; this.dtype = member.getDataType(); this.isVlen = member.isVariableLength(); if (isVlen) vlenList = new ArrayList<>(nelems); else if (dtype == DataType.STRING) stringList = new ArrayList<>(nelems * member.getSize()); else if (dtype == DataType.OPAQUE) opaqueList = new ArrayList<>(nelems * member.getSize()); else if (dtype == DataType.STRUCTURE); else bb = ByteBuffer.allocate(nelems * member.getSizeBytes()); }
@Override public Array getArray(int recnum, StructureMembers.Member m) { if (m.isVariableLength()) { int offset = calcOffsetSetOrder(recnum, m); int heapIndex = bbuffer.getInt(offset); return (Array) heap.get( heapIndex); } return super.getArray(recnum, m); }
} else if (m.isVariableLength()) {
} else if (m.isVariableLength()) { int startPos = pos + m.getDataParam(); bb.order(ByteOrder.LITTLE_ENDIAN);
} else if (m.isVariableLength()) {
} else if (m.isVariableLength()) { int startPos = pos + m.getDataParam(); bb.order(ByteOrder.LITTLE_ENDIAN);
if (md.member.isVariableLength()) { md.vlenList.add(as.getArray(recno, md.member)); } else {
this.isVlen = member.isVariableLength(); this.nelems = (int) section.computeSize();
} else if (!equals(member1.getStructureMembers(), member2.getStructureMembers())) { return false; } else if (!Objects.deepEquals(member1.isVariableLength(), member2.isVariableLength())) { return false;
NcStreamProto.ArrayStructureCol.Builder buildNestedStructureData(List<MemberData> mdataList) { NcStreamProto.ArrayStructureCol.Builder result = NcStreamProto.ArrayStructureCol.newBuilder(); for (MemberData nestedMemberData : mdataList) { NcStreamProto.DataCol.Builder nestedBuilder = NcStreamProto.DataCol.newBuilder(); nestedBuilder.setName(nestedMemberData.member.getName()); nestedBuilder.setDataType(NcStream.convertDataType(nestedMemberData.member.getDataType())); nestedBuilder.setNelems(nestedMemberData.nelems); nestedBuilder.setSection(NcStream.encodeSection(nestedMemberData.section)); if (nestedMemberData.member.isVariableLength()) { nestedMemberData.finishVlens(); nestedBuilder.addAllVlens(nestedMemberData.vlens); nestedMemberData.bb.flip(); nestedBuilder.setPrimdata(ByteString.copyFrom(nestedMemberData.bb)); nestedBuilder.setNelems(nestedMemberData.nelems); nestedBuilder.setIsVlen(true); } else if (nestedMemberData.member.getDataType() == DataType.STRING) { nestedBuilder.addAllStringdata(nestedMemberData.stringList); } else if (nestedMemberData.member.getDataType() == DataType.OPAQUE) { nestedBuilder.addAllOpaquedata(nestedMemberData.opaqueList); } else if (nestedMemberData.member.getDataType() == DataType.STRUCTURE) { nestedBuilder.setStructdata(buildNestedStructureData(nestedMemberData.members)); // recurse } else { nestedMemberData.bb.flip(); nestedBuilder.setPrimdata(ByteString.copyFrom(nestedMemberData.bb)); } result.addMemberData(nestedBuilder); } return result; }
void convertHeap(ArrayStructureBB asbb, int pos, StructureMembers sm) throws java.io.IOException, InvalidRangeException { ByteBuffer bb = asbb.getByteBuffer(); for (StructureMembers.Member m : sm.getMembers()) { if (m.getDataType() == DataType.STRING) { m.setDataObject(ByteOrder.nativeOrder()); // the index is always written in "native order" int size = m.getSize(); int destPos = pos + m.getDataParam(); String[] result = new String[size]; for (int i = 0; i < size; i++) result[i] = headerParser.readHeapString(bb, destPos + i * 16); // 16 byte "heap ids" are in the ByteBuffer int index = asbb.addObjectToHeap(result); bb.order(ByteOrder.nativeOrder()); // the string index is always written in "native order" bb.putInt(destPos, index); // overwrite with the index into the StringHeap } else if (m.isVariableLength()) { int destPos = pos + m.getDataParam(); bb.order(ByteOrder.LITTLE_ENDIAN); ByteOrder bo = (ByteOrder) m.getDataObject(); int endian = bo.equals(ByteOrder.LITTLE_ENDIAN) ? RandomAccessFile.LITTLE_ENDIAN : RandomAccessFile.BIG_ENDIAN; Array vlenArray = headerParser.readHeapVlen(bb, destPos, m.getDataType(), endian); int index = asbb.addObjectToHeap(vlenArray); bb.order(ByteOrder.nativeOrder()); // the string index is always written in "native order" bb.putInt(destPos, index); // overwrite with the index into the StringHeap } } }
NcStreamProto.ArrayStructureCol.Builder encodeStructureData(Array data) { assert data instanceof ArrayStructure; ArrayStructure as = (ArrayStructure) data; int nelems = (int) as.getSize(); // create MemberData to hold extracted data List<MemberData> memberDataList = new ArrayList<>(); StructureMembers sm = as.getStructureMembers(); for (StructureMembers.Member m : sm.getMembers()) { memberDataList.add(new MemberData(m, as.getShape())); } // data extraction for (int recno = 0; recno < nelems; recno++) { for (MemberData md : memberDataList) { if (md.member.isVariableLength()) { md.vlenList.add( as.getArray(recno, md.member)); } else { extractData(as, recno, md); } } } // construct the result recursively return buildNestedStructureData(memberDataList); }
private void convertHeap(ArrayStructureBB asbb, int pos, StructureMembers sm) throws java.io.IOException { ByteBuffer bb = asbb.getByteBuffer(); for (StructureMembers.Member m : sm.getMembers()) { if (m.getDataType() == DataType.STRING) { int size = m.getSize(); int destPos = pos + m.getDataParam(); String[] result = new String[size]; for (int i = 0; i < size; i++) { long addr = bb.getLong(pos); Pointer p = new MyPointer(addr); result[i] = p.getString(0, false); } int index = asbb.addObjectToHeap(result); bb.putInt(destPos, index); // overwrite with the index into the StringHeap } else if (m.isVariableLength()) { int destPos = pos + m.getDataParam(); Array result = decodeVlen(m.getDataType(), pos + m.getDataParam(), bb); int index = asbb.addObjectToHeap(result); bb.order(ByteOrder.nativeOrder()); // the string index is always written in "native order" bb.putInt(destPos, index); // overwrite with the index into the StringHeap } } }
/** * Get the total size in bytes. This does not have to match the VariableSimpleIF. * * Note that this will not be correct when containing a member of type Sequence, or String, since those * are variable length. In that case * * @return total size in bytes */ public int getSizeBytes() { if (getDataType() == DataType.SEQUENCE) return getDataType().getSize(); else if (getDataType() == DataType.STRING) return getDataType().getSize(); else if (getDataType() == DataType.STRUCTURE) return size * members.getStructureSize(); else if(this.isVariableLength()) return 0; // do not know else return size * getDataType().getSize(); }
@Override public Array getArray(int recnum, StructureMembers.Member m) { if (m.isVariableLength()) { int offset = calcOffsetSetOrder(recnum, m); int heapIndex = bbuffer.getInt(offset); return (Array) heap.get( heapIndex); } return super.getArray(recnum, m); }
public Array getArray(int recno, StructureMembers.Member m) { if (m.isVariableLength()) { Array data = m.getDataArray(); if (data instanceof ArrayObject) { ArrayObject ao = (ArrayObject) data; Object dao = ao.getObject(recno); assert dao instanceof Array; return (Array) dao; } } return super.getArray(recno, m); }