You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sis.apache.org by de...@apache.org on 2018/12/11 19:11:17 UTC
[sis] 01/02: Mave Vector.buffer() optional.
This is an automated email from the ASF dual-hosted git repository.
desruisseaux pushed a commit to branch geoapi-4.0
in repository https://gitbox.apache.org/repos/asf/sis.git
commit 5d1392b6a32429578fe4f78656a30fe9a9560077
Author: Martin Desruisseaux <ma...@geomatys.com>
AuthorDate: Tue Dec 11 12:45:14 2018 +0100
Mave Vector.buffer() optional.
---
.../main/java/org/apache/sis/math/ArrayVector.java | 25 +++++++++++-----------
.../src/main/java/org/apache/sis/math/Vector.java | 25 ++++++++++++++++------
.../apache/sis/storage/netcdf/GridResource.java | 3 ++-
3 files changed, 33 insertions(+), 20 deletions(-)
diff --git a/core/sis-utility/src/main/java/org/apache/sis/math/ArrayVector.java b/core/sis-utility/src/main/java/org/apache/sis/math/ArrayVector.java
index f6a4a70..ed42e74 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/math/ArrayVector.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/math/ArrayVector.java
@@ -25,6 +25,7 @@ import java.nio.LongBuffer;
import java.nio.FloatBuffer;
import java.nio.DoubleBuffer;
import java.util.Arrays;
+import java.util.Optional;
import java.util.function.IntSupplier;
import org.apache.sis.util.Numbers;
import org.apache.sis.util.resources.Errors;
@@ -288,8 +289,8 @@ abstract class ArrayVector<E extends Number> extends Vector implements CheckedCo
}
/** Wraps this vector in a buffer. */
- @Override public Buffer buffer() {
- return DoubleBuffer.wrap(array);
+ @Override public Optional<Buffer> buffer() {
+ return Optional.of(DoubleBuffer.wrap(array));
}
/** Returns a copy of current data as a floating point array. */
@@ -403,8 +404,8 @@ abstract class ArrayVector<E extends Number> extends Vector implements CheckedCo
}
/** Wraps this vector in a buffer. */
- @Override public final Buffer buffer() {
- return FloatBuffer.wrap(array);
+ @Override public final Optional<Buffer> buffer() {
+ return Optional.of(FloatBuffer.wrap(array));
}
/** Returns a copy of current data as a floating point array. */
@@ -567,8 +568,8 @@ abstract class ArrayVector<E extends Number> extends Vector implements CheckedCo
}
/** Wraps this vector in a buffer. */
- @Override public final Buffer buffer() {
- return LongBuffer.wrap(array);
+ @Override public final Optional<Buffer> buffer() {
+ return Optional.of(LongBuffer.wrap(array));
}
/** Applies hash code contract specified {@link Vector#hashCode()}. */
@@ -689,8 +690,8 @@ abstract class ArrayVector<E extends Number> extends Vector implements CheckedCo
}
/** Wraps this vector in a buffer. */
- @Override public final Buffer buffer() {
- return IntBuffer.wrap(array);
+ @Override public final Optional<Buffer> buffer() {
+ return Optional.of(IntBuffer.wrap(array));
}
/** Applies hash code contract specified {@link Vector#hashCode()}. */
@@ -786,8 +787,8 @@ abstract class ArrayVector<E extends Number> extends Vector implements CheckedCo
*/
/** Wraps this vector in a buffer. */
- @Override public final Buffer buffer() {
- return ShortBuffer.wrap(array);
+ @Override public final Optional<Buffer> buffer() {
+ return Optional.of(ShortBuffer.wrap(array));
}
/** Applies hash code contract specified {@link Vector#hashCode()}. */
@@ -884,8 +885,8 @@ abstract class ArrayVector<E extends Number> extends Vector implements CheckedCo
*/
/** Wraps this vector in a buffer. */
- @Override public final Buffer buffer() {
- return ByteBuffer.wrap(array);
+ @Override public final Optional<Buffer> buffer() {
+ return Optional.of(ByteBuffer.wrap(array));
}
/** Applies hash code contract specified {@link Vector#hashCode()}. */
diff --git a/core/sis-utility/src/main/java/org/apache/sis/math/Vector.java b/core/sis-utility/src/main/java/org/apache/sis/math/Vector.java
index fc384a6..defac99 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/math/Vector.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/math/Vector.java
@@ -22,6 +22,7 @@ import java.util.Arrays;
import java.util.AbstractList;
import java.util.RandomAccess;
import java.util.StringJoiner;
+import java.util.Optional;
import java.util.function.IntSupplier;
import org.apache.sis.internal.jdk9.JDK9;
import org.apache.sis.measure.NumberRange;
@@ -85,7 +86,9 @@ import static org.apache.sis.util.ArgumentChecks.ensureValidIndex;
* by the code that <em>create</em> a {@code Vector} object, but the data type may not be known
* by the code that will <em>use</em> the {@code Vector} object.
* For example a method performing a numerical calculation may want to see the data as {@code double} values
- * without concern about whether the data were really stored as {@code double} or as {@code float} values.</div>
+ * without concern about whether the data were really stored as {@code double} or as {@code float} values.
+ * For the situations where a {@link Buffer} is needed, inter-operability is provided by the {@link #buffer()}
+ * method and by accepting buffer in the {@link #create(Object, boolean)} method.</div>
*
* @author Martin Desruisseaux (MPO, Geomatys)
* @version 1.0
@@ -104,6 +107,7 @@ public abstract class Vector extends AbstractList<Number> implements RandomAcces
* <li>A {@code Number[]} array.</li>
* <li>A {@code String[]} array (not recommended, but happen with some file formats).</li>
* <li>A {@code Vector}, in which case it is returned unchanged.</li>
+ * <li>A {@link Buffer} backed by an array.</li>
* <li>The {@code null} value, in which case {@code null} is returned.</li>
* </ul>
*
@@ -133,6 +137,14 @@ public abstract class Vector extends AbstractList<Number> implements RandomAcces
if (array instanceof Vector) {
return (Vector) array;
}
+ if (array instanceof Buffer) {
+ final Buffer buffer = (Buffer) array;
+ if (buffer.hasArray()) {
+ final int offset = buffer.arrayOffset();
+ return ArrayVector.newInstance(buffer.array(), isUnsigned)
+ .subList(offset + buffer.position(), offset + buffer.limit());
+ }
+ }
throw new IllegalArgumentException(Errors.format(Errors.Keys.IllegalArgumentClass_2, "array", array.getClass()));
}
@@ -948,9 +960,9 @@ search: for (;;) {
* Returns a buffer over the sub-section represented by this {@code SubSampling} instance.
*/
@Override
- public Buffer buffer() {
+ public Optional<Buffer> buffer() {
if (step == 1) {
- return JDK9.slice(Vector.this.buffer().position(first).limit(first + length));
+ Vector.this.buffer().map((b) -> JDK9.slice(b.position(first).limit(first + length)));
}
return super.buffer();
}
@@ -1275,13 +1287,12 @@ search: for (;;) {
* Date are provided in their "raw" form. For example unsigned integers are given as plain {@code int} elements
* and it is caller responsibility to use {@link Integer#toUnsignedLong(int)} if needed.
*
- * @return the vector data as a buffer.
- * @throws UnsupportedOperationException if this vector can not be represented by a buffer.
+ * @return the vector data as a buffer. Absent if this vector is not backed by an array or a buffer.
*
* @since 1.0
*/
- public Buffer buffer() {
- throw new UnsupportedOperationException();
+ public Optional<Buffer> buffer() {
+ return Optional.empty();
}
/**
diff --git a/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/GridResource.java b/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/GridResource.java
index 4c69e52..9d4f4bc 100644
--- a/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/GridResource.java
+++ b/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/GridResource.java
@@ -262,7 +262,8 @@ final class GridResource extends AbstractGridResource implements ResourceOnFileS
} catch (IOException e) {
throw new DataStoreException(e);
}
- return new Image(domain, getSampleDimensions(), data.getDataType().toJava2D(samples.buffer()));
+ // Optional.orElseThrow() below should never fail since Variable.read(…) wraps primitive array.
+ return new Image(domain, getSampleDimensions(), data.getDataType().toJava2D(samples.buffer().get()));
}
/**