This is an automated email from the ASF dual-hosted git repository. leerho pushed a commit to branch removeIncompatibleMethods in repository https://gitbox.apache.org/repos/asf/datasketches-memory.git
commit 994eadbbe9a4b16e56267204bcc08f99d9d0f9f4 Author: Lee Rhodes <[email protected]> AuthorDate: Wed Feb 1 14:47:52 2023 -0800 Removed methods that will not be able to be easily replicated using Java 17 Panama --- .../apache/datasketches/memory/MurmurHash3v2.java | 361 ------------------- .../org/apache/datasketches/memory/Resource.java | 35 +- .../apache/datasketches/memory/WritableBuffer.java | 6 +- .../apache/datasketches/memory/WritableMemory.java | 33 -- .../memory/internal/BaseWritableBufferImpl.java | 10 +- .../memory/internal/BaseWritableMemoryImpl.java | 8 +- .../memory/internal/NativeWritableMemoryImpl.java | 23 -- .../internal/NonNativeWritableMemoryImpl.java | 31 -- .../datasketches/memory/internal/ResourceImpl.java | 81 ++--- .../datasketches/memory/internal/Buffer2Test.java | 6 +- .../memory/internal/BufferBoundaryCheckTest.java | 14 - .../memory/internal/CommonMemoryTest.java | 26 -- .../datasketches/memory/internal/LeafImplTest.java | 8 +- .../memory/internal/MurmurHash3v2Test.java | 399 --------------------- .../internal/NativeWritableBufferImplTest.java | 4 +- .../internal/NativeWritableMemoryImplTest.java | 4 +- .../internal/NonNativeWritableMemoryImplTest.java | 37 -- .../memory/internal/WritableMemoryTest.java | 4 +- 18 files changed, 74 insertions(+), 1016 deletions(-) diff --git a/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/MurmurHash3v2.java b/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/MurmurHash3v2.java deleted file mode 100644 index b862571..0000000 --- a/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/MurmurHash3v2.java +++ /dev/null @@ -1,361 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.datasketches.memory; - -import static java.nio.charset.StandardCharsets.UTF_8; -import static org.apache.datasketches.memory.internal.UnsafeUtil.unsafe; - -import org.apache.datasketches.memory.internal.ResourceImpl; - -/** - * <p>The MurmurHash3 is a fast, non-cryptographic, 128-bit hash function that has - * excellent avalanche and 2-way bit independence properties.</p> - * - * <p>Austin Appleby's C++ - * <a href="https://github.com/aappleby/smhasher/blob/master/src/MurmurHash3.cpp"> - * MurmurHash3_x64_128(...), final revision 150</a>, - * which is in the Public Domain, was the inspiration for this implementation in Java.</p> - * - * <p>This implementation of the MurmurHash3 allows hashing of a block of on-heap Memory defined by an offset - * and length. The calling API also allows the user to supply the small output array of two longs, - * so that the entire hash function is static and free of object allocations.</p> - * - * <p>This implementation produces exactly the same hash result as the - * MurmurHash3 function in datasketches-java given compatible inputs.</p> - * - * @author Lee Rhodes - */ -public final class MurmurHash3v2 { - private static final long C1 = 0x87c37b91114253d5L; - private static final long C2 = 0x4cf5ad432745937fL; - - //Provided for backward compatibility - - /** - * Returns a 128-bit hash of the input. - * Provided for compatibility with older version of MurmurHash3, - * but empty or null input now throws IllegalArgumentException. - * @param in long array - * @param seed A long valued seed. - * @return the hash - */ - public static long[] hash(final long[] in, final long seed) { - if ((in == null) || (in.length == 0)) { - throw new IllegalArgumentException("Input in is empty or null."); - } - return hash(Memory.wrap(in), 0L, in.length << 3, seed, new long[2]); - } - - /** - * Returns a 128-bit hash of the input. - * Provided for compatibility with older version of MurmurHash3, - * but empty or null input now throws IllegalArgumentException. - * @param in int array - * @param seed A long valued seed. - * @return the hash - */ - public static long[] hash(final int[] in, final long seed) { - if ((in == null) || (in.length == 0)) { - throw new IllegalArgumentException("Input in is empty or null."); - } - return hash(Memory.wrap(in), 0L, in.length << 2, seed, new long[2]); - } - - /** - * Returns a 128-bit hash of the input. - * Provided for compatibility with older version of MurmurHash3, - * but empty or null input now throws IllegalArgumentException. - * @param in char array - * @param seed A long valued seed. - * @return the hash - */ - public static long[] hash(final char[] in, final long seed) { - if ((in == null) || (in.length == 0)) { - throw new IllegalArgumentException("Input in is empty or null."); - } - return hash(Memory.wrap(in), 0L, in.length << 1, seed, new long[2]); - } - - /** - * Returns a 128-bit hash of the input. - * Provided for compatibility with older version of MurmurHash3, - * but empty or null input now throws IllegalArgumentException. - * @param in byte array - * @param seed A long valued seed. - * @return the hash - */ - public static long[] hash(final byte[] in, final long seed) { - if ((in == null) || (in.length == 0)) { - throw new IllegalArgumentException("Input in is empty or null."); - } - return hash(Memory.wrap(in), 0L, in.length, seed, new long[2]); - } - - //Single primitive inputs - - /** - * Returns a 128-bit hash of the input. - * Note the entropy of the resulting hash cannot be more than 64 bits. - * @param in a long - * @param seed A long valued seed. - * @param hashOut A long array of size 2 - * @return the hash - */ - public static long[] hash(final long in, final long seed, final long[] hashOut) { - final long h1 = seed ^ mixK1(in); - final long h2 = seed; - return finalMix128(h1, h2, 8, hashOut); - } - - /** - * Returns a 128-bit hash of the input. - * Note the entropy of the resulting hash cannot be more than 64 bits. - * @param in a double - * @param seed A long valued seed. - * @param hashOut A long array of size 2 - * @return the hash - */ - public static long[] hash(final double in, final long seed, final long[] hashOut) { - final double d = (in == 0.0) ? 0.0 : in; // canonicalize -0.0, 0.0 - final long k1 = Double.doubleToLongBits(d); // canonicalize all NaN forms - final long h1 = seed ^ mixK1(k1); - final long h2 = seed; - return finalMix128(h1, h2, 8, hashOut); - } - - /** - * Returns a 128-bit hash of the input. - * An empty or null input throws IllegalArgumentException. - * @param in a String - * @param seed A long valued seed. - * @param hashOut A long array of size 2 - * @return the hash - */ - public static long[] hash(final String in, final long seed, final long[] hashOut) { - if ((in == null) || (in.length() == 0)) { - throw new IllegalArgumentException("Input in is empty or null."); - } - final byte[] byteArr = in.getBytes(UTF_8); - return hash(Memory.wrap(byteArr), 0L, byteArr.length, seed, hashOut); - } - - //The main API call - - /** - * Returns a 128-bit hash of the input as a long array of size 2. - * - * @param mem The input on-heap Memory. Must be non-null and non-empty, - * otherwise throws IllegalArgumentException. - * @param offsetBytes the starting point within Memory. - * @param lengthBytes the total number of bytes to be hashed. - * @param seed A long valued seed. - * @param hashOut the size 2 long array for the resulting 128-bit hash - * @return the hash. - */ - @SuppressWarnings("restriction") - public static long[] hash(final Memory mem, final long offsetBytes, final long lengthBytes, - final long seed, final long[] hashOut) { - if ((mem == null) || (mem.getCapacity() == 0L)) { - throw new IllegalArgumentException("Input mem is empty or null."); - } - final Object uObj = ((WritableMemory) mem).getArray(); - if (uObj == null) { - throw new IllegalArgumentException("The backing resource of input mem is not on-heap."); - } - long cumOff = ((ResourceImpl)mem).getCumulativeOffset(offsetBytes); - - long h1 = seed; - long h2 = seed; - long rem = lengthBytes; - - // Process the 128-bit blocks (the body) into the hash - while (rem >= 16L) { - final long k1 = unsafe.getLong(uObj, cumOff); //0, 16, 32, ... - final long k2 = unsafe.getLong(uObj, cumOff + 8); //8, 24, 40, ... - cumOff += 16L; - rem -= 16L; - - h1 ^= mixK1(k1); - h1 = Long.rotateLeft(h1, 27); - h1 += h2; - h1 = (h1 * 5) + 0x52dce729L; - - h2 ^= mixK2(k2); - h2 = Long.rotateLeft(h2, 31); - h2 += h1; - h2 = (h2 * 5) + 0x38495ab5L; - } - - // Get the tail (if any): 1 to 15 bytes - if (rem > 0L) { - long k1 = 0; - long k2 = 0; - switch ((int) rem) { - case 15: { - k2 ^= (unsafe.getByte(uObj, cumOff + 14) & 0xFFL) << 48; - } - //$FALL-THROUGH$ - case 14: { - k2 ^= (unsafe.getShort(uObj, cumOff + 12) & 0xFFFFL) << 32; - k2 ^= (unsafe.getInt(uObj, cumOff + 8) & 0xFFFFFFFFL); - k1 = unsafe.getLong(uObj, cumOff); - break; - } - - case 13: { - k2 ^= (unsafe.getByte(uObj, cumOff + 12) & 0xFFL) << 32; - } - //$FALL-THROUGH$ - case 12: { - k2 ^= (unsafe.getInt(uObj, cumOff + 8) & 0xFFFFFFFFL); - k1 = unsafe.getLong(uObj, cumOff); - break; - } - - case 11: { - k2 ^= (unsafe.getByte(uObj, cumOff + 10) & 0xFFL) << 16; - } - //$FALL-THROUGH$ - case 10: { - k2 ^= (unsafe.getShort(uObj, cumOff + 8) & 0xFFFFL); - k1 = unsafe.getLong(uObj, cumOff); - break; - } - - case 9: { - k2 ^= (unsafe.getByte(uObj, cumOff + 8) & 0xFFL); - } - //$FALL-THROUGH$ - case 8: { - k1 = unsafe.getLong(uObj, cumOff); - break; - } - - case 7: { - k1 ^= (unsafe.getByte(uObj, cumOff + 6) & 0xFFL) << 48; - } - //$FALL-THROUGH$ - case 6: { - k1 ^= (unsafe.getShort(uObj, cumOff + 4) & 0xFFFFL) << 32; - k1 ^= (unsafe.getInt(uObj, cumOff) & 0xFFFFFFFFL); - break; - } - - case 5: { - k1 ^= (unsafe.getByte(uObj, cumOff + 4) & 0xFFL) << 32; - } - //$FALL-THROUGH$ - case 4: { - k1 ^= (unsafe.getInt(uObj, cumOff) & 0xFFFFFFFFL); - break; - } - - case 3: { - k1 ^= (unsafe.getByte(uObj, cumOff + 2) & 0xFFL) << 16; - } - //$FALL-THROUGH$ - case 2: { - k1 ^= (unsafe.getShort(uObj, cumOff) & 0xFFFFL); - break; - } - - case 1: { - k1 ^= (unsafe.getByte(uObj, cumOff) & 0xFFL); - break; - } - //default: break; //can't happen - } - - h1 ^= mixK1(k1); - h2 ^= mixK2(k2); - } - return finalMix128(h1, h2, lengthBytes, hashOut); - } - - //--Helper methods---------------------------------------------------- - - /** - * Self mix of k1 - * - * @param k1 input argument - * @return mix - */ - private static long mixK1(long k1) { - k1 *= C1; - k1 = Long.rotateLeft(k1, 31); - k1 *= C2; - return k1; - } - - /** - * Self mix of k2 - * - * @param k2 input argument - * @return mix - */ - private static long mixK2(long k2) { - k2 *= C2; - k2 = Long.rotateLeft(k2, 33); - k2 *= C1; - return k2; - } - - /** - * Final self mix of h*. - * - * @param h input to final mix - * @return mix - */ - private static long finalMix64(long h) { - h ^= h >>> 33; - h *= 0xff51afd7ed558ccdL; - h ^= h >>> 33; - h *= 0xc4ceb9fe1a85ec53L; - h ^= h >>> 33; - return h; - } - - /** - * Finalization: Add the length into the hash and mix - * @param h1 intermediate hash - * @param h2 intermediate hash - * @param lengthBytes the length in bytes - * @param hashOut the output array of 2 longs - * @return hashOut - */ - private static long[] finalMix128(long h1, long h2, final long lengthBytes, final long[] hashOut) { - h1 ^= lengthBytes; - h2 ^= lengthBytes; - - h1 += h2; - h2 += h1; - - h1 = finalMix64(h1); - h2 = finalMix64(h2); - - h1 += h2; - h2 += h1; - - hashOut[0] = h1; - hashOut[1] = h2; - return hashOut; - } - -} diff --git a/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/Resource.java b/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/Resource.java index 591379b..6d87514 100644 --- a/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/Resource.java +++ b/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/Resource.java @@ -20,7 +20,6 @@ package org.apache.datasketches.memory; import java.io.UncheckedIOException; -import java.nio.ByteBuffer; import java.nio.ByteOrder; /** @@ -116,12 +115,6 @@ public interface Resource extends AutoCloseable { */ void force(); - /** - * Gets the backing ByteBuffer if it exists, otherwise returns null. - * @return the backing ByteBuffer if it exists, otherwise returns null. - */ - ByteBuffer getByteBuffer(); //TODO Deprecate - /** * Gets the current ByteOrder. * This may be different from the ByteOrder of the backing resource and {@link ByteOrder#nativeOrder()} @@ -150,19 +143,6 @@ public interface Resource extends AutoCloseable { */ long getTotalOffset(); - /** - * Returns true if this object is backed by an on-heap primitive array - * @return true if this object is backed by an on-heap primitive array - */ - boolean hasArray(); //TODO Change to isHeapResource - - /** - * Returns true if this object is valid and has not been closed. - * This is relevant only for direct (off-heap) memory and Mapped Files. - * @return true if this object is valid and has not been closed. - */ - boolean isValid(); //TODO isAlive() - /** * Returns true if this Memory is backed by a ByteBuffer. * @return true if this Memory is backed by a ByteBuffer. @@ -193,6 +173,12 @@ public interface Resource extends AutoCloseable { */ boolean isDuplicateBufferView(); + /** + * Returns true if this object is backed by an on-heap primitive array + * @return true if this object is backed by an on-heap primitive array + */ + boolean isHeapResource(); + /** * Tells whether or not the contents of this memory-mapped Resource is resident in physical memory. * @@ -239,7 +225,7 @@ public interface Resource extends AutoCloseable { * Returns true if the backing resource is a memory-mapped file. * @return true if the backing resource is a memory-mapped file. */ - boolean isMapped(); + boolean isMemoryMappedResource(); /** * If true, all put and get operations will assume the non-native ByteOrder. @@ -270,6 +256,13 @@ public interface Resource extends AutoCloseable { */ boolean isSameResource(Resource that); + /** + * Returns true if this object is valid and has not been closed. + * This is relevant only for direct (off-heap) memory and Mapped Files. + * @return true if this object is valid and has not been closed. + */ + boolean isValid(); + /** * Loads the contents of this memory-mapped Resource into physical memory. * diff --git a/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/WritableBuffer.java b/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/WritableBuffer.java index b6aebe0..027b26a 100644 --- a/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/WritableBuffer.java +++ b/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/WritableBuffer.java @@ -364,11 +364,6 @@ public interface WritableBuffer extends Buffer { // NO ATOMIC METHODS //OTHER WRITE METHODS - /** - * Returns the primitive backing array, otherwise null. - * @return the primitive backing array, otherwise null. - */ - Object getArray(); /** * Clears all bytes of this Buffer from position to end to zero. The position will be set to end. @@ -405,6 +400,7 @@ public interface WritableBuffer extends Buffer { * in the test tree. * @return the MemoryRequestServer object or null. */ + @Override public MemoryRequestServer getMemoryRequestServer(); } diff --git a/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/WritableMemory.java b/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/WritableMemory.java index bccd2b4..c5cfec6 100644 --- a/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/WritableMemory.java +++ b/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/WritableMemory.java @@ -538,40 +538,7 @@ public interface WritableMemory extends Memory { */ void putShortArray(long offsetBytes, short[] srcArray, int srcOffsetShorts, int lengthShorts); - //Atomic Methods - /** - * Atomically adds the given value to the long located at offsetBytes. - * @param offsetBytes offset bytes relative to this Memory start - * @param delta the amount to add - * @return the the previous value - */ - long getAndAddLong(long offsetBytes, long delta); - - /** - * Atomically sets the current value at the memory location to the given updated value - * if and only if the current value {@code ==} the expected value. - * @param offsetBytes offset bytes relative to this Memory start - * @param expect the expected value - * @param update the new value - * @return {@code true} if successful. False return indicates that - * the current value at the memory location was not equal to the expected value. - */ - boolean compareAndSwapLong(long offsetBytes, long expect, long update); - - /** - * Atomically exchanges the given value with the current value located at offsetBytes. - * @param offsetBytes offset bytes relative to this Memory start - * @param newValue new value - * @return the previous value - */ - long getAndSetLong(long offsetBytes, long newValue); - //OTHER WRITE METHODS - /** - * Returns the primitive backing array, otherwise null. - * @return the primitive backing array, otherwise null. - */ - Object getArray(); /** * Clears all bytes of this Memory to zero diff --git a/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/BaseWritableBufferImpl.java b/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/BaseWritableBufferImpl.java index 955d668..438a55f 100644 --- a/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/BaseWritableBufferImpl.java +++ b/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/BaseWritableBufferImpl.java @@ -387,9 +387,13 @@ public abstract class BaseWritableBufferImpl extends BaseBufferImpl implements W unsafe.putShort(getUnsafeObject(), getCumulativeOffset(offsetBytes), value); } - //OTHER - @Override - public final Object getArray() { + //OTHER WRITE METHODS + + /** + * Returns the primitive backing array, otherwise null. + * @return the primitive backing array, otherwise null. + */ + final Object getArray() { checkValid(); return getUnsafeObject(); } diff --git a/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/BaseWritableMemoryImpl.java b/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/BaseWritableMemoryImpl.java index e2aee82..a65f889 100644 --- a/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/BaseWritableMemoryImpl.java +++ b/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/BaseWritableMemoryImpl.java @@ -403,8 +403,12 @@ public abstract class BaseWritableMemoryImpl extends ResourceImpl implements Wri } //OTHER WRITE METHODS - @Override - public final Object getArray() { + + /** + * Returns the primitive backing array, otherwise null. + * @return the primitive backing array, otherwise null. + */ + final Object getArray() { checkValid(); return getUnsafeObject(); } diff --git a/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/NativeWritableMemoryImpl.java b/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/NativeWritableMemoryImpl.java index b53d957..922a62d 100644 --- a/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/NativeWritableMemoryImpl.java +++ b/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/NativeWritableMemoryImpl.java @@ -26,7 +26,6 @@ import static org.apache.datasketches.memory.internal.UnsafeUtil.ARRAY_FLOAT_BAS import static org.apache.datasketches.memory.internal.UnsafeUtil.ARRAY_FLOAT_INDEX_SCALE; import static org.apache.datasketches.memory.internal.UnsafeUtil.ARRAY_INT_BASE_OFFSET; import static org.apache.datasketches.memory.internal.UnsafeUtil.ARRAY_LONG_BASE_OFFSET; -import static org.apache.datasketches.memory.internal.UnsafeUtil.ARRAY_LONG_INDEX_SCALE; import static org.apache.datasketches.memory.internal.UnsafeUtil.ARRAY_SHORT_BASE_OFFSET; import static org.apache.datasketches.memory.internal.UnsafeUtil.unsafe; @@ -283,26 +282,4 @@ abstract class NativeWritableMemoryImpl extends BaseWritableMemoryImpl { ); } - //Atomic Write Methods - @Override - public long getAndAddLong(final long offsetBytes, final long delta) { //JDK 8+ - checkValidAndBoundsForWrite(offsetBytes, ARRAY_LONG_INDEX_SCALE); - final long addr = getCumulativeOffset(offsetBytes); - return unsafe.getAndAddLong(getUnsafeObject(), addr, delta); - } - - @Override - public long getAndSetLong(final long offsetBytes, final long newValue) { //JDK 8+ - checkValidAndBoundsForWrite(offsetBytes, ARRAY_LONG_INDEX_SCALE); - final long addr = getCumulativeOffset(offsetBytes); - return unsafe.getAndSetLong(getUnsafeObject(), addr, newValue); - } - - @Override - public boolean compareAndSwapLong(final long offsetBytes, final long expect, final long update) { - checkValidAndBoundsForWrite(offsetBytes, ARRAY_LONG_INDEX_SCALE); - return unsafe.compareAndSwapLong( - getUnsafeObject(), getCumulativeOffset(offsetBytes), expect, update); - } - } diff --git a/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/NonNativeWritableMemoryImpl.java b/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/NonNativeWritableMemoryImpl.java index ad2133d..8597ce5 100644 --- a/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/NonNativeWritableMemoryImpl.java +++ b/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/NonNativeWritableMemoryImpl.java @@ -21,7 +21,6 @@ package org.apache.datasketches.memory.internal; import static org.apache.datasketches.memory.internal.UnsafeUtil.ARRAY_DOUBLE_INDEX_SCALE; import static org.apache.datasketches.memory.internal.UnsafeUtil.ARRAY_FLOAT_INDEX_SCALE; -import static org.apache.datasketches.memory.internal.UnsafeUtil.ARRAY_LONG_INDEX_SCALE; import static org.apache.datasketches.memory.internal.UnsafeUtil.unsafe; import org.apache.datasketches.memory.WritableMemory; @@ -215,34 +214,4 @@ abstract class NonNativeWritableMemoryImpl extends BaseWritableMemoryImpl { getUnsafeObject(), getCumulativeOffset(offsetBytes)); } - //Atomic Write Methods - @Override - public long getAndAddLong(final long offsetBytes, final long delta) { //JDK 8+ - checkValidAndBoundsForWrite(offsetBytes, ARRAY_LONG_INDEX_SCALE); - final long addr = getCumulativeOffset(offsetBytes); - long oldValReverseBytes, oldVal, newValReverseBytes; - final Object unsafeObj = getUnsafeObject(); - do { - oldValReverseBytes = unsafe.getLongVolatile(unsafeObj, addr); - oldVal = Long.reverseBytes(oldValReverseBytes); - newValReverseBytes = Long.reverseBytes(oldVal + delta); - } while (!unsafe.compareAndSwapLong(unsafeObj, addr, oldValReverseBytes, newValReverseBytes)); - - return oldVal; - } - - @Override - public long getAndSetLong(final long offsetBytes, final long newValue) { //JDK 8+ - checkValidAndBoundsForWrite(offsetBytes, ARRAY_LONG_INDEX_SCALE); - final long addr = getCumulativeOffset(offsetBytes); - final long newValueReverseBytes = Long.reverseBytes(newValue); - return Long.reverseBytes(unsafe.getAndSetLong(getUnsafeObject(), addr, newValueReverseBytes)); - } - - @Override - public boolean compareAndSwapLong(final long offsetBytes, final long expect, final long update) { - checkValidAndBoundsForWrite(offsetBytes, ARRAY_LONG_INDEX_SCALE); - return unsafe.compareAndSwapLong(getUnsafeObject(), getCumulativeOffset(offsetBytes), - Long.reverseBytes(expect), Long.reverseBytes(update)); - } } diff --git a/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/ResourceImpl.java b/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/ResourceImpl.java index d6411a3..092a567 100644 --- a/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/ResourceImpl.java +++ b/datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/ResourceImpl.java @@ -115,6 +115,13 @@ public abstract class ResourceImpl implements Resource { } } + static void checkJavaVersion(final String jdkVer, final int p0, final int p1 ) { + final boolean ok = ((p0 == 1) && (p1 == 8)) || (p0 == 8) || (p0 == 11); + if (!ok) { throw new IllegalArgumentException( + "Unsupported JDK Major Version. It must be one of 1.8, 8, 11: " + jdkVer); + } + } + public static final void checkThread(final Thread owner) { if (owner != Thread.currentThread()) { throw new IllegalStateException("Attempted access outside owning thread"); @@ -141,14 +148,6 @@ public abstract class ResourceImpl implements Resource { } } - @Override - public final boolean equals(final Object that) { - if (this == that) { return true; } - return that instanceof ResourceImpl - ? CompareAndCopy.equals(this, (ResourceImpl) that) - : false; - } - @Override public final boolean equalTo(final long thisOffsetBytes, final Resource that, final long thatOffsetBytes, final long lengthBytes) { @@ -162,11 +161,15 @@ public abstract class ResourceImpl implements Resource { } //Overridden by ByteBuffer Leafs - @Override - public ByteBuffer getByteBuffer() { + ByteBuffer getByteBuffer() { return null; } + @Override + public final ByteOrder getByteOrder() { + return isNonNativeType(getTypeId()) ? Util.NON_NATIVE_BYTE_ORDER : ByteOrder.nativeOrder(); + } + /** * Gets the cumulative offset in bytes of this object from the backing resource. * This offset may also include other offset components such as the native off-heap @@ -197,11 +200,6 @@ public abstract class ResourceImpl implements Resource { //Overridden by ByteBuffer, Direct and Map Leaves abstract long getNativeBaseOffset(); - @Override - public final ByteOrder getByteOrder() { - return isNonNativeType(getTypeId()) ? Util.NON_NATIVE_BYTE_ORDER : ByteOrder.nativeOrder(); - } - //Overridden by all leafs abstract int getTypeId(); @@ -211,17 +209,6 @@ public abstract class ResourceImpl implements Resource { return null; } - @Override - public final boolean hasArray() { - checkValid(); - return getUnsafeObject() != null; - } - - @Override - public final int hashCode() { - return (int) xxHash64(0, getCapacity(), 0); //xxHash64() calls checkValid() - } - @Override public boolean isByteBufferResource() { return (getTypeId() & BYTEBUF) > 0; @@ -255,6 +242,12 @@ public abstract class ResourceImpl implements Resource { return (typeId & DUPLICATE) > 0; } + @Override + public final boolean isHeapResource() { + checkValid(); + return getUnsafeObject() != null; + } + final boolean isHeapType(final int typeId) { return (typeId & (MAP | DIRECT)) == 0; } @@ -265,7 +258,7 @@ public abstract class ResourceImpl implements Resource { } @Override - public boolean isMapped() { + public boolean isMemoryMappedResource() { return (getTypeId() & MAP) > 0; } @@ -314,21 +307,6 @@ public abstract class ResourceImpl implements Resource { return (typeId & REGION) > 0; } - final boolean isWritableType(final int typeId) { //not used - return (typeId & READONLY) == 0; - } - - @Override - public void load() { //overridden by Map leafs - throw new IllegalStateException("This resource is not a memory-mapped file type."); - } - - final static int removeNnBuf(final int typeId) { return typeId & ~NONNATIVE & ~BUFFER; } - - final static int setReadOnlyType(final int typeId, final boolean readOnly) { - return readOnly ? typeId | READONLY : typeId & ~READONLY; - } - @Override public boolean isSameResource(final Resource that) { checkValid(); @@ -336,7 +314,6 @@ public abstract class ResourceImpl implements Resource { final ResourceImpl that1 = (ResourceImpl) that; that1.checkValid(); if (this == that1) { return true; } - return getCumulativeOffset(0) == that1.getCumulativeOffset(0) && getCapacity() == that1.getCapacity() && getUnsafeObject() == that1.getUnsafeObject() @@ -349,11 +326,13 @@ public abstract class ResourceImpl implements Resource { return true; } - static void checkJavaVersion(final String jdkVer, final int p0, final int p1 ) { - final boolean ok = ((p0 == 1) && (p1 == 8)) || (p0 == 8) || (p0 == 11); - if (!ok) { throw new IllegalArgumentException( - "Unsupported JDK Major Version. It must be one of 1.8, 8, 11: " + jdkVer); - } + final boolean isWritableType(final int typeId) { //not used + return (typeId & READONLY) == 0; + } + + @Override + public void load() { //overridden by Map leafs + throw new IllegalStateException("This resource is not a memory-mapped file type."); } private static String pad(final String s, final int fieldLen) { @@ -383,11 +362,17 @@ public abstract class ResourceImpl implements Resource { //REACHABILITY FENCE static void reachabilityFence(final Object obj) { } + final static int removeNnBuf(final int typeId) { return typeId & ~NONNATIVE & ~BUFFER; } + @Override public void setMemoryRequestServer(final MemoryRequestServer memReqSvr) { this.memReqSvr = memReqSvr; } + final static int setReadOnlyType(final int typeId, final boolean readOnly) { + return readOnly ? typeId | READONLY : typeId & ~READONLY; + } + /** * Returns a formatted hex string of an area of this object. * Used primarily for testing. diff --git a/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/Buffer2Test.java b/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/Buffer2Test.java index e90b956..d40ce05 100644 --- a/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/Buffer2Test.java +++ b/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/Buffer2Test.java @@ -55,7 +55,7 @@ public class Buffer2Test { assertEquals(a1, b1); } - assertEquals(true, buffer.hasArray()); + assertEquals(true, buffer.isHeapResource()); assertEquals(true, buffer.isByteBufferResource()); } @@ -75,7 +75,7 @@ public class Buffer2Test { assertEquals(bb.get(), buffer.getByte()); } - assertEquals(false, buffer.hasArray()); + assertEquals(false, buffer.isHeapResource()); assertEquals(true, buffer.isByteBufferResource()); } @@ -98,7 +98,7 @@ public class Buffer2Test { buffer.getByteArray(copyByteArray, 0, 64); assertEquals(byteArray, copyByteArray); - assertEquals(true, buffer.hasArray()); + assertEquals(true, buffer.isHeapResource()); assertEquals(false, buffer.isByteBufferResource()); } diff --git a/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/BufferBoundaryCheckTest.java b/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/BufferBoundaryCheckTest.java index 8edbd46..ac90665 100644 --- a/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/BufferBoundaryCheckTest.java +++ b/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/BufferBoundaryCheckTest.java @@ -107,18 +107,4 @@ public class BufferBoundaryCheckTest { writableMemory.putDouble(1, 1d); } - @Test(expectedExceptions = MemoryBoundsException.class) - public void testGetAndAddLong() { - writableMemory.getAndAddLong(1, 1L); - } - - @Test(expectedExceptions = MemoryBoundsException.class) - public void testGetAndSetLong() { - writableMemory.getAndSetLong(1, 1L); - } - - @Test(expectedExceptions = MemoryBoundsException.class) - public void testCompareAndSwapLong() { - writableMemory.compareAndSwapLong(1, 0L, 1L); - } } diff --git a/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/CommonMemoryTest.java b/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/CommonMemoryTest.java index dbac94a..b617ccc 100644 --- a/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/CommonMemoryTest.java +++ b/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/CommonMemoryTest.java @@ -278,32 +278,6 @@ public class CommonMemoryTest { } } - @Test - public void checkAtomicMethods() throws Exception { - int memCapacity = 8; - try (WritableMemory mem = WritableMemory.allocateDirect(memCapacity)) { - assertEquals(mem.getCapacity(), memCapacity); - atomicMethodTests(mem); - } - } - - public static void atomicMethodTests(WritableMemory mem) { - mem.putLong(0, 500); - mem.getAndAddLong(0, 1); - assertEquals(mem.getLong(0), 501); - - mem.putInt(0, 500); - boolean b = mem.compareAndSwapLong(0, 500, 501); - assertTrue(b); - assertEquals(mem.getLong(0), 501); - - mem.putLong(0, 500); - long oldLong = mem.getAndSetLong(0, 501); - long newLong = mem.getLong(0); - assertEquals(oldLong, 500); - assertEquals(newLong, 501); - } - @Test public void checkSetClearMemoryRegions() throws Exception { int memCapacity = 64; //must be 64 diff --git a/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/LeafImplTest.java b/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/LeafImplTest.java index 5dad4ec..cc76b31 100644 --- a/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/LeafImplTest.java +++ b/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/LeafImplTest.java @@ -175,7 +175,7 @@ public class LeafImplTest { assertEquals(mem.asWritableBuffer(oo).getShort(0), 256); assertEquals(mem.getTotalOffset(), 0); - ByteBuffer bb = mem.getByteBuffer(); + ByteBuffer bb = ((ResourceImpl)mem).getByteBuffer(); assertTrue( hasByteBuffer ? bb != null : bb == null); assertTrue(mem.getByteOrder() == bo); @@ -204,7 +204,7 @@ public class LeafImplTest { assertEquals(buf.writableDuplicate(oo).getShort(0), 256); assertEquals(buf.getTotalOffset(), 0); - bb = buf.getByteBuffer(); + bb = ((ResourceImpl)buf).getByteBuffer(); assertTrue(hasByteBuffer ? bb != null : bb == null); assertTrue(buf.getByteOrder() == bo); @@ -232,7 +232,7 @@ public class LeafImplTest { assertEquals(nnMem.asWritableBuffer(bo).getShort(0), 1); assertEquals(nnMem.asWritableBuffer(oo).getShort(0), 256); - bb = nnMem.getByteBuffer(); + bb = ((ResourceImpl)nnMem).getByteBuffer(); assertTrue( hasByteBuffer ? bb != null : bb == null); assertTrue(nnMem.getByteOrder() == oo); @@ -259,7 +259,7 @@ public class LeafImplTest { assertEquals(nnBuf.writableDuplicate(bo).getShort(0), 1); assertEquals(nnBuf.writableDuplicate(oo).getShort(0), 256); - bb = nnBuf.getByteBuffer(); + bb = ((ResourceImpl)nnBuf).getByteBuffer(); assertTrue( hasByteBuffer ? bb != null : bb == null); assertTrue(nnBuf.getByteOrder() == oo); diff --git a/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/MurmurHash3v2Test.java b/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/MurmurHash3v2Test.java deleted file mode 100644 index d64965c..0000000 --- a/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/MurmurHash3v2Test.java +++ /dev/null @@ -1,399 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.datasketches.memory.internal; - -import static java.nio.charset.StandardCharsets.UTF_8; -import static org.apache.datasketches.memory.MurmurHash3v2.hash; -import static org.testng.Assert.fail; - -import org.apache.datasketches.memory.Memory; -import org.apache.datasketches.memory.MurmurHash3v2; -import org.apache.datasketches.memory.WritableMemory; -import org.testng.Assert; -import org.testng.annotations.Test; - -/** - * Tests the MurmurHash3 against specific, known hash results given known - * inputs obtained from the public domain C++ version 150. - * - * @author Lee Rhodes - */ -public class MurmurHash3v2Test { - - @Test - public void checkByteArrRemainderGT8() { //byte[], remainder > 8 - String keyStr = "The quick brown fox jumps over the lazy dog"; - byte[] key = keyStr.getBytes(UTF_8); - long[] result = hash(key, 0); - //Should be: - long h1 = 0xe34bbc7bbc071b6cL; - long h2 = 0x7a433ca9c49a9347L; - Assert.assertEquals(result[0], h1); - Assert.assertEquals(result[1], h2); - } - - @Test - public void checkByteArrChange1bit() { //byte[], change one bit - String keyStr = "The quick brown fox jumps over the lazy eog"; - byte[] key = keyStr.getBytes(UTF_8); - long[] result = hash(key, 0); - //Should be: - long h1 = 0x362108102c62d1c9L; - long h2 = 0x3285cd100292b305L; - Assert.assertEquals(result[0], h1); - Assert.assertEquals(result[1], h2); - } - - @Test - public void checkByteArrRemainderLt8() { //byte[], test a remainder < 8 - String keyStr = "The quick brown fox jumps over the lazy dogdogdog"; - byte[] key = keyStr.getBytes(UTF_8); - long[] result = hash(key, 0); - //Should be; - long h1 = 0x9c8205300e612fc4L; - long h2 = 0xcbc0af6136aa3df9L; - Assert.assertEquals(result[0], h1); - Assert.assertEquals(result[1], h2); - } - - @Test - public void checkByteArrReaminderEQ8() { //byte[], test a remainder = 8 - String keyStr = "The quick brown fox jumps over the lazy1"; - byte[] key = keyStr.getBytes(UTF_8); - long[] result = hash(key, 0); - //Should be: - long h1 = 0xe3301a827e5cdfe3L; - long h2 = 0xbdbf05f8da0f0392L; - Assert.assertEquals(result[0], h1); - Assert.assertEquals(result[1], h2); - - } - - /** - * This test should have the exact same output as Test4 - */ - @Test - public void checkLongArrRemainderEQ8() { //long[], test a remainder = 8 - String keyStr = "The quick brown fox jumps over the lazy1"; - long[] key = stringToLongs(keyStr); - long[] result = hash(key, 0); - //Should be: - long h1 = 0xe3301a827e5cdfe3L; - long h2 = 0xbdbf05f8da0f0392L; - Assert.assertEquals(result[0], h1); - Assert.assertEquals(result[1], h2); - - } - - /** - * This test should have the exact same output as Test4 - */ - @Test - public void checkIntArrRemainderEQ8() { //int[], test a remainder = 8 - String keyStr = "The quick brown fox jumps over the lazy1"; //40B - int[] key = stringToInts(keyStr); - long[] result = hash(key, 0); - //Should be: - long h1 = 0xe3301a827e5cdfe3L; - long h2 = 0xbdbf05f8da0f0392L; - Assert.assertEquals(result[0], h1); - Assert.assertEquals(result[1], h2); - } - - @Test - public void checkIntArrRemainderEQ0() { //int[], test a remainder = 0 - String keyStr = "The quick brown fox jumps over t"; //32B - int[] key = stringToInts(keyStr); - long[] result = hash(key, 0); - //Should be: - long h1 = 0xdf6af91bb29bdacfL; - long h2 = 0x91a341c58df1f3a6L; - Assert.assertEquals(result[0], h1); - Assert.assertEquals(result[1], h2); - } - - - /** - * Tests an odd remainder of int[]. - */ - @Test - public void checkIntArrOddRemainder() { //int[], odd remainder - String keyStr = "The quick brown fox jumps over the lazy dog"; //43B - int[] key = stringToInts(keyStr); - long[] result = hash(key, 0); - //Should be: - long h1 = 0x1eb232b0087543f5L; - long h2 = 0xfc4c1383c3ace40fL; - Assert.assertEquals(result[0], h1); - Assert.assertEquals(result[1], h2); - } - - - /** - * Tests an odd remainder of int[]. - */ - @Test - public void checkCharArrOddRemainder() { //char[], odd remainder - String keyStr = "The quick brown fox jumps over the lazy dog.."; //45B - char[] key = keyStr.toCharArray(); - long[] result = hash(key, 0); - //Should be: - long h1 = 0xca77b498ea9ed953L; - long h2 = 0x8b8f8ec3a8f4657eL; - Assert.assertEquals(result[0], h1); - Assert.assertEquals(result[1], h2); - } - - /** - * Tests an odd remainder of int[]. - */ - @Test - public void checkCharArrRemainderEQ0() { //char[], remainder of 0 - String keyStr = "The quick brown fox jumps over the lazy "; //40B - char[] key = keyStr.toCharArray(); - long[] result = hash(key, 0); - //Should be: - long h1 = 0x51b15e9d0887f9f1L; - long h2 = 0x8106d226786511ebL; - Assert.assertEquals(result[0], h1); - Assert.assertEquals(result[1], h2); - } - - @Test - public void checkByteArrAllOnesZeros() { //byte[], test a ones byte and a zeros byte - byte[] key = { - 0x54, 0x68, 0x65, 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x20, 0x62, 0x72, 0x6f, 0x77, 0x6e, - 0x20, 0x66, 0x6f, 0x78, 0x20, 0x6a, 0x75, 0x6d, 0x70, 0x73, 0x20, 0x6f, 0x76, 0x65, - 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x61, 0x7a, 0x79, 0x20, 0x64, 0x6f, 0x67, - (byte) 0xff, 0x64, 0x6f, 0x67, 0x00 - }; - long[] result = MurmurHash3v2.hash(key, 0); - - //Should be: - long h1 = 0xe88abda785929c9eL; - long h2 = 0x96b98587cacc83d6L; - Assert.assertEquals(result[0], h1); - Assert.assertEquals(result[1], h2); - } - - /** - * This test demonstrates that the hash of byte[], char[], int[], or long[] will produce the - * same hash result if, and only if, all the arrays have the same exact length in bytes, and if - * the contents of the values in the arrays have the same byte endianness and overall order. - */ - @Test - public void checkCrossTypeHashConsistency() { - long[] out; - println("Bytes"); - byte[] bArr = {1,2,3,4,5,6,7,8, 9,10,11,12,13,14,15,16, 17,18,19,20,21,22,23,24}; - long[] out1 = hash(bArr, 0L); - println(longToHexBytes(out1[0])); - println(longToHexBytes(out1[1])); - - println("Chars"); - char[] cArr = {0X0201, 0X0403, 0X0605, 0X0807, 0X0a09, 0X0c0b, 0X0e0d, 0X100f, - 0X1211, 0X1413, 0X1615, 0X1817}; - out = hash(cArr, 0L); - Assert.assertEquals(out, out1); - println(longToHexBytes(out[0])); - println(longToHexBytes(out[1])); - - println("Ints"); - int[] iArr = {0X04030201, 0X08070605, 0X0c0b0a09, 0X100f0e0d, 0X14131211, 0X18171615}; - out = hash(iArr, 0L); - Assert.assertEquals(out, out1); - println(longToHexBytes(out[0])); - println(longToHexBytes(out[1])); - - println("Longs"); - long[] lArr = {0X0807060504030201L, 0X100f0e0d0c0b0a09L, 0X1817161514131211L}; - out = hash(lArr, 0L); - Assert.assertEquals(out, out1); - println(longToHexBytes(out[0])); - println(longToHexBytes(out[1])); - } - - @Test - public void checkEmptyOrNullExceptions() { - try { - long[] arr = null; hash(arr, 1L); fail(); - } catch (final IllegalArgumentException e) { } - try { - int[] arr = null; hash(arr, 1L); fail(); - } catch (final IllegalArgumentException e) { } - try { - char[] arr = null; hash(arr, 1L); fail(); - } catch (final IllegalArgumentException e) { } - try { - byte[] arr = null; hash(arr, 1L); fail(); - } catch (final IllegalArgumentException e) { } - try { - long[] out = new long[2]; - String in = null; hash(in, 1L, out); fail(); - } catch (final IllegalArgumentException e) { } - try { - long[] out = new long[2]; - Memory mem = Memory.wrap(new byte[0]); - out = hash(mem, 0L, 4L, 1L, out); - } catch (final IllegalArgumentException e) { } - try (Memory mem = WritableMemory.allocateDirect(8)) { - long[] out = new long[2]; - out = hash(mem, 0L, 4L, 1L, out); - } catch (Exception ee) { } - } - - @Test - public void checkHashTails() { - long[] out = new long[2]; - WritableMemory mem = WritableMemory.allocate(32); - mem.fill((byte)85); - - for (int i = 16; i <= 32; i++) { - out = hash(mem, 0, i, 1L, out); - } - } - - @Test - public void checkSinglePrimitives() { - long[] out = new long[2]; - out = hash(1L, 1L, out); - out = hash(0.0, 1L, out); - out = hash("123", 1L, out); - } - - //Helper methods - - private static long[] stringToLongs(String in) { - byte[] bArr = in.getBytes(UTF_8); - int inLen = bArr.length; - int outLen = (inLen / 8) + (((inLen % 8) != 0) ? 1 : 0); - long[] out = new long[outLen]; - - for (int i = 0; i < (outLen - 1); i++ ) { - for (int j = 0; j < 8; j++ ) { - out[i] |= ((bArr[(i * 8) + j] & 0xFFL) << (j * 8)); - } - } - int inTail = 8 * (outLen - 1); - int rem = inLen - inTail; - for (int j = 0; j < rem; j++ ) { - out[outLen - 1] |= ((bArr[inTail + j] & 0xFFL) << (j * 8)); - } - return out; - } - - private static int[] stringToInts(String in) { - byte[] bArr = in.getBytes(UTF_8); - int inLen = bArr.length; - int outLen = (inLen / 4) + (((inLen % 4) != 0) ? 1 : 0); - int[] out = new int[outLen]; - - for (int i = 0; i < (outLen - 1); i++ ) { - for (int j = 0; j < 4; j++ ) { - out[i] |= ((bArr[(i * 4) + j] & 0xFFL) << (j * 8)); - } - } - int inTail = 4 * (outLen - 1); - int rem = inLen - inTail; - for (int j = 0; j < rem; j++ ) { - out[outLen - 1] |= ((bArr[inTail + j] & 0xFFL) << (j * 8)); - } - return out; - } - - /** - * Returns a string of spaced hex bytes in Big-Endian order. - * @param v the given long - * @return string of spaced hex bytes in Big-Endian order. - */ - private static String longToHexBytes(final long v) { - final long mask = 0XFFL; - final StringBuilder sb = new StringBuilder(); - for (int i = 8; i-- > 0; ) { - final String s = Long.toHexString((v >>> (i * 8)) & mask); - sb.append(zeroPad(s, 2)).append(" "); - } - return sb.toString(); - } - - /** - * Prepend the given string with zeros. If the given string is equal or greater than the given - * field length, it will be returned without modification. - * @param s the given string - * @param fieldLength desired total field length including the given string - * @return the given string prepended with zeros. - */ - private static final String zeroPad(final String s, final int fieldLength) { - return characterPad(s, fieldLength, '0', false); - } - - /** - * Prepend or postpend the given string with the given character to fill the given field length. - * If the given string is equal or greater than the given field length, it will be returned - * without modification. - * @param s the given string - * @param fieldLength the desired field length - * @param padChar the desired pad character - * @param postpend if true append the padCharacters to the end of the string. - * @return prepended or postpended given string with the given character to fill the given field - * length. - */ - private static final String characterPad(final String s, final int fieldLength, final char padChar, - final boolean postpend) { - final char[] chArr = s.toCharArray(); - final int sLen = chArr.length; - if (sLen < fieldLength) { - final char[] out = new char[fieldLength]; - final int blanks = fieldLength - sLen; - - if (postpend) { - for (int i = 0; i < sLen; i++) { - out[i] = chArr[i]; - } - for (int i = sLen; i < fieldLength; i++) { - out[i] = padChar; - } - } else { //prepend - for (int i = 0; i < blanks; i++) { - out[i] = padChar; - } - for (int i = blanks; i < fieldLength; i++) { - out[i] = chArr[i - blanks]; - } - } - - return String.valueOf(out); - } - return s; - } - - @Test - public void printlnTest() { - println("PRINTING: " + this.getClass().getName()); - } - - /** - * @param s value to print - */ - static void println(String s) { - //System.out.println(s); //disable here - } - -} diff --git a/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/NativeWritableBufferImplTest.java b/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/NativeWritableBufferImplTest.java index 2dc582e..7a626b0 100644 --- a/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/NativeWritableBufferImplTest.java +++ b/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/NativeWritableBufferImplTest.java @@ -69,7 +69,7 @@ public class NativeWritableBufferImplTest { for (int i = 0; i < 8; i++) { assertEquals(dstArray[i], srcArray[i]); } - assertTrue(buf.hasArray()); + assertTrue(buf.isHeapResource()); } @Test @@ -249,7 +249,7 @@ public class NativeWritableBufferImplTest { } assertTrue(wbuf.isByteBufferResource()); - ByteBuffer byteBuf2 = wbuf.getByteBuffer(); + ByteBuffer byteBuf2 = ((ResourceImpl)wbuf).getByteBuffer(); assertEquals(byteBuf2, byteBuf); //println( mem.toHexString("HeapBB", 0, memCapacity)); } diff --git a/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/NativeWritableMemoryImplTest.java b/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/NativeWritableMemoryImplTest.java index 57ecd23..7f768e0 100644 --- a/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/NativeWritableMemoryImplTest.java +++ b/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/NativeWritableMemoryImplTest.java @@ -67,7 +67,7 @@ public class NativeWritableMemoryImplTest { for (int i = 0; i < 8; i++) { assertEquals(dstArray[i], srcArray[i]); } - assertTrue(mem.hasArray()); + assertTrue(mem.isHeapResource()); } @Test @@ -428,7 +428,7 @@ public class NativeWritableMemoryImplTest { } assertTrue(wmem.isByteBufferResource()); - ByteBuffer byteBuf2 = wmem.getByteBuffer(); + ByteBuffer byteBuf2 = ((ResourceImpl)wmem).getByteBuffer(); assertEquals(byteBuf2, byteBuf); //println( mem.toHexString("HeapBB", 0, memCapacity)); } diff --git a/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/NonNativeWritableMemoryImplTest.java b/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/NonNativeWritableMemoryImplTest.java index cf1076c..26f101d 100644 --- a/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/NonNativeWritableMemoryImplTest.java +++ b/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/NonNativeWritableMemoryImplTest.java @@ -20,12 +20,10 @@ package org.apache.datasketches.memory.internal; import static org.testng.Assert.assertEquals; -import static org.testng.Assert.fail; import java.nio.ByteOrder; import org.apache.datasketches.memory.Memory; -import org.apache.datasketches.memory.MemoryBoundsException; import org.apache.datasketches.memory.WritableMemory; import org.testng.annotations.Test; @@ -167,41 +165,6 @@ public class NonNativeWritableMemoryImplTest { assertEquals(arr2, arr1); } - //check Atomic Write Methods - - @Test - public void testGetAndAddLong() { - wmem.getAndAddLong(0, 1L); - try { - wmem.getAndAddLong(1, 1L); - fail("Expected MemoryBoundsException"); - } catch (final MemoryBoundsException expected) { - // ignore - } - } - - @Test - public void testGetAndSetLong() { - wmem.getAndSetLong(0, 1L); - try { - wmem.getAndSetLong(1, 1L); - fail("Expected MemoryBoundsException"); - } catch (final MemoryBoundsException expected) { - // ignore - } - } - - @Test - public void testCompareAndSwapLong() { - wmem.compareAndSwapLong(0, 0L, 1L); - try { - wmem.compareAndSwapLong(1, 0L, 1L); - fail("Expected MemoryBoundsException"); - } catch (final MemoryBoundsException expected) { - // ignore - } - } - //check Region @Test public void checkRegion() { diff --git a/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/WritableMemoryTest.java b/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/WritableMemoryTest.java index 39f0f74..9dbccf4 100644 --- a/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/WritableMemoryTest.java +++ b/datasketches-memory-java8/src/test/java/org/apache/datasketches/memory/internal/WritableMemoryTest.java @@ -65,9 +65,9 @@ public class WritableMemoryTest { public void checkGetArray() { byte[] byteArr = new byte[64]; WritableMemory wmem = WritableMemory.writableWrap(byteArr); - assertTrue(wmem.getArray() == byteArr); + assertTrue(((BaseWritableMemoryImpl) wmem).getArray() == byteArr); WritableBuffer wbuf = wmem.asWritableBuffer(); - assertTrue(wbuf.getArray() == byteArr); + assertTrue(((BaseWritableBufferImpl)wbuf).getArray() == byteArr); } @Test(expectedExceptions = IllegalArgumentException.class) --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
