Skip to content

Commit 8420e6a

Browse files
committed
Implement getDataAsByteBuffer(ByteOrder order) for non-integral array classes
Add tests for getDataAsByteBuffer. Also, fix bug when getting a section of an ArrayString. Fixes #1592
1 parent 653ce8d commit 8420e6a

6 files changed

Lines changed: 343 additions & 20 deletions

File tree

cdm/core/src/main/java/ucar/ma2/ArrayByte.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
/*
2-
* Copyright (c) 1998-2018 University Corporation for Atmospheric Research/Unidata
2+
* Copyright (c) 1998-2026 University Corporation for Atmospheric Research/Unidata
33
* See LICENSE for license information.
44
*/
5+
56
package ucar.ma2;
67

78
import java.nio.ByteBuffer;
@@ -120,8 +121,11 @@ public ByteBuffer getDataAsByteBuffer() {
120121
}
121122

122123
@Override
123-
public ByteBuffer getDataAsByteBuffer(ByteOrder order) {// order irrelevant here
124-
return ByteBuffer.wrap((byte[]) get1DJavaArray(getDataType()));
124+
public ByteBuffer getDataAsByteBuffer(ByteOrder order) {
125+
ByteBuffer bb = ByteBuffer.wrap((byte[]) get1DJavaArray(getDataType()));
126+
if (order != null)
127+
bb.order(order);
128+
return bb;
125129
}
126130

127131
/**

cdm/core/src/main/java/ucar/ma2/ArrayChar.java

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
/*
2-
* Copyright (c) 1998-2018 University Corporation for Atmospheric Research/Unidata
2+
* Copyright (c) 1998-2026 University Corporation for Atmospheric Research/Unidata
33
* See LICENSE for license information.
44
*/
5+
56
package ucar.ma2;
67

78
import java.nio.ByteBuffer;
9+
import java.nio.ByteOrder;
810
import java.util.Iterator;
911

1012
/**
@@ -137,10 +139,16 @@ protected void copyTo1DJavaArray(IndexIterator iter, Object javaArray) {
137139
*/
138140
@Override
139141
public ByteBuffer getDataAsByteBuffer() {
140-
ByteBuffer bb = ByteBuffer.allocate((int) getSize());
141-
resetLocalIterator();
142-
while (hasNext())
143-
bb.put(nextByte());
142+
return getDataAsByteBuffer(null);
143+
}
144+
145+
@Override
146+
public ByteBuffer getDataAsByteBuffer(ByteOrder order) {
147+
ByteBuffer bb = super.getDataAsByteBuffer((int) getSize(), order);
148+
char[] ja = (char[]) get1DJavaArray(DataType.CHAR);
149+
for (char c : ja) {
150+
bb.put((byte) c);
151+
}
144152
return bb;
145153
}
146154

cdm/core/src/main/java/ucar/ma2/ArrayDouble.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
/*
2-
* Copyright (c) 1998-2018 University Corporation for Atmospheric Research/Unidata
2+
* Copyright (c) 1998-2026 University Corporation for Atmospheric Research/Unidata
33
* See LICENSE for license information.
44
*/
5+
56
package ucar.ma2;
67

78
import java.nio.ByteBuffer;
9+
import java.nio.ByteOrder;
810
import java.nio.DoubleBuffer;
911

1012
/**
@@ -115,9 +117,14 @@ protected void copyTo1DJavaArray(IndexIterator iter, Object javaArray) {
115117

116118
@Override
117119
public ByteBuffer getDataAsByteBuffer() {
118-
ByteBuffer bb = ByteBuffer.allocate((int) (8 * getSize()));
120+
return getDataAsByteBuffer(null);
121+
}
122+
123+
@Override
124+
public ByteBuffer getDataAsByteBuffer(ByteOrder order) {
125+
ByteBuffer bb = super.getDataAsByteBuffer((int) (8 * getSize()), order);
119126
DoubleBuffer ib = bb.asDoubleBuffer();
120-
ib.put((double[]) get1DJavaArray(DataType.DOUBLE)); // make sure its in canonical order
127+
ib.put((double[]) get1DJavaArray(DataType.DOUBLE));
121128
return bb;
122129
}
123130

cdm/core/src/main/java/ucar/ma2/ArrayFloat.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
/*
2-
* Copyright (c) 1998-2018 University Corporation for Atmospheric Research/Unidata
2+
* Copyright (c) 1998-2026 University Corporation for Atmospheric Research/Unidata
33
* See LICENSE for license information.
44
*/
5+
56
package ucar.ma2;
67

78
import java.nio.ByteBuffer;
9+
import java.nio.ByteOrder;
810
import java.nio.FloatBuffer;
911

1012
/**
@@ -118,9 +120,14 @@ protected void copyTo1DJavaArray(IndexIterator iter, Object javaArray) {
118120

119121
@Override
120122
public ByteBuffer getDataAsByteBuffer() {
121-
ByteBuffer bb = ByteBuffer.allocate((int) (4 * getSize()));
123+
return getDataAsByteBuffer(null);
124+
}
125+
126+
@Override
127+
public ByteBuffer getDataAsByteBuffer(ByteOrder order) {
128+
ByteBuffer bb = super.getDataAsByteBuffer((int) (4 * getSize()), order);
122129
FloatBuffer ib = bb.asFloatBuffer();
123-
ib.put((float[]) get1DJavaArray(DataType.FLOAT)); // make sure its in canonical order
130+
ib.put((float[]) get1DJavaArray(DataType.FLOAT));
124131
return bb;
125132
}
126133

cdm/core/src/main/java/ucar/ma2/ArrayString.java

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
/*
2-
* Copyright (c) 1998-2018 University Corporation for Atmospheric Research/Unidata
2+
* Copyright (c) 1998-2026 University Corporation for Atmospheric Research/Unidata
33
* See LICENSE for license information.
44
*/
5+
56
package ucar.ma2;
67

78
import java.nio.ByteBuffer;
9+
import java.nio.ByteOrder;
810
import java.nio.CharBuffer;
911

1012
/**
@@ -122,15 +124,21 @@ protected void copyTo1DJavaArray(IndexIterator iter, Object javaArray) {
122124

123125
@Override
124126
public ByteBuffer getDataAsByteBuffer() {
127+
return getDataAsByteBuffer(null);
128+
}
129+
130+
@Override
131+
public ByteBuffer getDataAsByteBuffer(ByteOrder order) {
125132
// Store strings as null terminated character sequences
133+
Object[] ja = (Object[]) get1DJavaArray(DataType.STRING);
126134
int totalsize = 0;
127-
for (String aStorage : storage)
128-
totalsize += (aStorage.length() + 1); // 1 for null terminator
129-
ByteBuffer bb = ByteBuffer.allocate(2 * totalsize);
135+
for (Object s : ja)
136+
totalsize += (((String) s).length() + 1); // 1 for null terminator
137+
ByteBuffer bb = super.getDataAsByteBuffer(2 * totalsize, order);
130138
CharBuffer cb = bb.asCharBuffer();
131139
// Concatenate
132-
for (String s : storage) {
133-
cb.append(s);
140+
for (Object s : ja) {
141+
cb.append((String) s);
134142
cb.append('\0');
135143
}
136144
return bb;

0 commit comments

Comments
 (0)