You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@datasketches.apache.org by le...@apache.org on 2021/05/11 05:25:18 UTC

[datasketches-memory] 02/04: interim update

This is an automated email from the ASF dual-hosted git repository.

leerho pushed a commit to branch noSplitPackage
in repository https://gitbox.apache.org/repos/asf/datasketches-memory.git

commit 9c318efc1c89ff4cd71a2aaca9240a5abaecae7f
Author: Lee Rhodes <le...@users.noreply.github.com>
AuthorDate: Fri May 7 09:44:36 2021 -0700

    interim update
---
 .../datasketches/memory/AllocateDirectMap.java     |   9 +-
 .../memory/BBNonNativeWritableBufferImpl.java      |   4 +-
 .../memory/BBNonNativeWritableMemoryImpl.java      |   4 +-
 .../datasketches/memory/BBWritableBufferImpl.java  |   4 +-
 .../datasketches/memory/BBWritableMemoryImpl.java  |   4 +-
 .../org/apache/datasketches/memory/BaseState.java  |  23 +---
 .../memory/BaseWritableMemoryImpl.java             |   8 +-
 .../memory/DirectNonNativeWritableBufferImpl.java  |  11 +-
 .../memory/DirectNonNativeWritableMemoryImpl.java  |  11 +-
 .../memory/DirectWritableBufferImpl.java           |  10 +-
 .../memory/DirectWritableMemoryImpl.java           |  13 +-
 .../memory/HeapNonNativeWritableBufferImpl.java    |   4 +-
 .../memory/HeapNonNativeWritableMemoryImpl.java    |   4 +-
 .../memory/HeapWritableBufferImpl.java             |   4 +-
 .../memory/HeapWritableMemoryImpl.java             |   4 +-
 .../memory/MapNonNativeWritableBufferImpl.java     |  11 +-
 .../memory/MapNonNativeWritableMemoryImpl.java     |  11 +-
 .../datasketches/memory/MapWritableBufferImpl.java |  11 +-
 .../datasketches/memory/MapWritableMemoryImpl.java |  11 +-
 .../org/apache/datasketches/memory/Memory.java     |  16 +--
 .../java/org/apache/datasketches/memory/Prim.java  |   8 +-
 .../apache/datasketches/memory/StepBoolean.java    |  10 +-
 .../java/org/apache/datasketches/memory/Util.java  |  31 ++++-
 .../apache/datasketches/memory/WritableMemory.java |  25 ++--
 .../memory/test/AllocateDirectMemoryTest.java      |  60 ++++++---
 .../test/AllocateDirectWritableMapMemoryTest.java  |  53 ++++++--
 .../datasketches/memory/test/BaseStateTest.java    |   8 +-
 .../datasketches/memory/test/ReflectUtil.java      | 143 +++++++++++++++++++++
 28 files changed, 389 insertions(+), 126 deletions(-)

diff --git a/src/main/java/org/apache/datasketches/memory/AllocateDirectMap.java b/src/main/java/org/apache/datasketches/memory/AllocateDirectMap.java
index 29c2d48..25bfef7 100644
--- a/src/main/java/org/apache/datasketches/memory/AllocateDirectMap.java
+++ b/src/main/java/org/apache/datasketches/memory/AllocateDirectMap.java
@@ -242,13 +242,8 @@ class AllocateDirectMap implements Map {
     }
   }
 
-  static boolean isFileReadOnly(final File file) {
-    try (RandomAccessFile raf = new RandomAccessFile(file, "rw")) {
-      raf.close();
-      return false;
-    } catch (final SecurityException | IOException f) { //could not open for write
-      return true;
-    }
+  public static boolean isFileReadOnly(final File file) {
+    return (!file.canWrite());
   }
 
   private static final class Deallocator implements Runnable {
diff --git a/src/main/java/org/apache/datasketches/memory/BBNonNativeWritableBufferImpl.java b/src/main/java/org/apache/datasketches/memory/BBNonNativeWritableBufferImpl.java
index 44d87b9..cc01a7e 100644
--- a/src/main/java/org/apache/datasketches/memory/BBNonNativeWritableBufferImpl.java
+++ b/src/main/java/org/apache/datasketches/memory/BBNonNativeWritableBufferImpl.java
@@ -54,7 +54,7 @@ final class BBNonNativeWritableBufferImpl extends NonNativeWritableBufferImpl {
   BaseWritableBufferImpl toWritableRegion(final long offsetBytes, final long capacityBytes,
       final boolean readOnly, final ByteOrder byteOrder) {
     final int type = typeId | REGION | (readOnly ? READONLY : 0);
-    return isNativeByteOrder(byteOrder)
+    return Util.isNativeByteOrder(byteOrder)
         ? new BBWritableBufferImpl(
           unsafeObj, nativeBaseOffset, getRegionOffset(offsetBytes), capacityBytes,
           type, byteBuf, originMemory)
@@ -66,7 +66,7 @@ final class BBNonNativeWritableBufferImpl extends NonNativeWritableBufferImpl {
   @Override
   BaseWritableBufferImpl toDuplicate(final boolean readOnly, final ByteOrder byteOrder) {
     final int type = typeId | DUPLICATE | (readOnly ? READONLY : 0);
-    return isNativeByteOrder(byteOrder)
+    return Util.isNativeByteOrder(byteOrder)
         ? new BBWritableBufferImpl(
             unsafeObj, nativeBaseOffset, getRegionOffset(), getCapacity(),
             type, byteBuf, originMemory)
diff --git a/src/main/java/org/apache/datasketches/memory/BBNonNativeWritableMemoryImpl.java b/src/main/java/org/apache/datasketches/memory/BBNonNativeWritableMemoryImpl.java
index 1a43bf2..4f83901 100644
--- a/src/main/java/org/apache/datasketches/memory/BBNonNativeWritableMemoryImpl.java
+++ b/src/main/java/org/apache/datasketches/memory/BBNonNativeWritableMemoryImpl.java
@@ -53,7 +53,7 @@ final class BBNonNativeWritableMemoryImpl extends NonNativeWritableMemoryImpl {
   BaseWritableMemoryImpl toWritableRegion(final long offsetBytes, final long capacityBytes,
       final boolean readOnly, final ByteOrder byteOrder) {
     final int type = typeId | REGION | (readOnly ? READONLY : 0);
-    return isNativeByteOrder(byteOrder)
+    return Util.isNativeByteOrder(byteOrder)
         ? new BBWritableMemoryImpl(
             unsafeObj, nativeBaseOffset, getRegionOffset(offsetBytes), capacityBytes,
             type, getByteBuffer())
@@ -65,7 +65,7 @@ final class BBNonNativeWritableMemoryImpl extends NonNativeWritableMemoryImpl {
   @Override
   BaseWritableBufferImpl toWritableBuffer(final boolean readOnly, final ByteOrder byteOrder) {
     final int type = typeId | (readOnly ? READONLY : 0);
-    return isNativeByteOrder(byteOrder)
+    return Util.isNativeByteOrder(byteOrder)
         ? new BBWritableBufferImpl(
             unsafeObj, nativeBaseOffset, getRegionOffset(), getCapacity(),
             type, byteBuf, this)
diff --git a/src/main/java/org/apache/datasketches/memory/BBWritableBufferImpl.java b/src/main/java/org/apache/datasketches/memory/BBWritableBufferImpl.java
index a44e118..20802b9 100644
--- a/src/main/java/org/apache/datasketches/memory/BBWritableBufferImpl.java
+++ b/src/main/java/org/apache/datasketches/memory/BBWritableBufferImpl.java
@@ -54,7 +54,7 @@ final class BBWritableBufferImpl extends WritableBufferImpl {
   BaseWritableBufferImpl toWritableRegion(final long offsetBytes, final long capacityBytes,
       final boolean readOnly, final ByteOrder byteOrder) {
     final int type = typeId | REGION | (readOnly ? READONLY : 0);
-    return isNativeByteOrder(byteOrder)
+    return Util.isNativeByteOrder(byteOrder)
         ? new BBWritableBufferImpl(
             unsafeObj, nativeBaseOffset, getRegionOffset(offsetBytes), capacityBytes,
             type, byteBuf, originMemory)
@@ -66,7 +66,7 @@ final class BBWritableBufferImpl extends WritableBufferImpl {
   @Override
   BaseWritableBufferImpl toDuplicate(final boolean readOnly, final ByteOrder byteOrder) {
     final int type = typeId | DUPLICATE | (readOnly ? READONLY : 0);
-    return isNativeByteOrder(byteOrder)
+    return Util.isNativeByteOrder(byteOrder)
         ? new BBWritableBufferImpl(
             unsafeObj, nativeBaseOffset, getRegionOffset(), getCapacity(),
             type, byteBuf, originMemory)
diff --git a/src/main/java/org/apache/datasketches/memory/BBWritableMemoryImpl.java b/src/main/java/org/apache/datasketches/memory/BBWritableMemoryImpl.java
index 99284e3..dd06c0b 100644
--- a/src/main/java/org/apache/datasketches/memory/BBWritableMemoryImpl.java
+++ b/src/main/java/org/apache/datasketches/memory/BBWritableMemoryImpl.java
@@ -53,7 +53,7 @@ final class BBWritableMemoryImpl extends WritableMemoryImpl {
   BaseWritableMemoryImpl toWritableRegion(final long offsetBytes, final long capacityBytes,
       final boolean readOnly, final ByteOrder byteOrder) {
     final int type = typeId | REGION | (readOnly ? READONLY : 0);
-    return isNativeByteOrder(byteOrder)
+    return Util.isNativeByteOrder(byteOrder)
         ? new BBWritableMemoryImpl(
             unsafeObj, nativeBaseOffset, getRegionOffset(offsetBytes), capacityBytes,
             type, getByteBuffer())
@@ -65,7 +65,7 @@ final class BBWritableMemoryImpl extends WritableMemoryImpl {
   @Override
   BaseWritableBufferImpl toWritableBuffer(final boolean readOnly, final ByteOrder byteOrder) {
     final int type = typeId | (readOnly ? READONLY : 0);
-    return isNativeByteOrder(byteOrder)
+    return Util.isNativeByteOrder(byteOrder)
         ? new BBWritableBufferImpl(
             unsafeObj, nativeBaseOffset, getRegionOffset(), getCapacity(),
             type, byteBuf, this)
diff --git a/src/main/java/org/apache/datasketches/memory/BaseState.java b/src/main/java/org/apache/datasketches/memory/BaseState.java
index da66836..82f4e7d 100644
--- a/src/main/java/org/apache/datasketches/memory/BaseState.java
+++ b/src/main/java/org/apache/datasketches/memory/BaseState.java
@@ -37,11 +37,6 @@ import java.util.concurrent.atomic.AtomicLong;
 @SuppressWarnings({"restriction"})
 abstract class BaseState {
 
-  //Byte Order related
-  static final ByteOrder nativeByteOrder = ByteOrder.nativeOrder();
-  static final ByteOrder nonNativeByteOrder = nativeByteOrder == ByteOrder.LITTLE_ENDIAN
-      ? ByteOrder.BIG_ENDIAN : ByteOrder.LITTLE_ENDIAN;
-
   //Monitoring
   static final AtomicLong currentDirectMemoryAllocations_ = new AtomicLong();
   static final AtomicLong currentDirectMemoryAllocated_ = new AtomicLong();
@@ -101,20 +96,12 @@ abstract class BaseState {
   //Byte Order Related
 
   /**
-   * Returns the Native Byte Order
-   * @return the Native Byte Order
-   */
-  public static final ByteOrder getNativeByteOrder() {
-    return nativeByteOrder;
-  }
-
-  /**
    * Gets the current Type ByteOrder.
    * This may be different from the ByteOrder of the backing resource and of the Native Byte Order.
    * @return the current Type ByteOrder.
    */
   public final ByteOrder getTypeByteOrder() {
-    return isNonNativeType() ? BaseState.nonNativeByteOrder : BaseState.nativeByteOrder;
+    return isNonNativeType() ? Util.nonNativeByteOrder : Util.nativeByteOrder;
   }
 
   /**
@@ -126,7 +113,7 @@ abstract class BaseState {
     if (byteOrder == null) {
       throw new IllegalArgumentException("ByteOrder parameter cannot be null.");
     }
-    return BaseState.nativeByteOrder == byteOrder;
+    return Util.nativeByteOrder == byteOrder;
   }
 
   /**
@@ -138,7 +125,7 @@ abstract class BaseState {
    */
   public final boolean isByteOrderCompatible(final ByteOrder byteOrder) {
     final ByteOrder typeBO = getTypeByteOrder();
-    return typeBO == getNativeByteOrder() && typeBO == byteOrder;
+    return typeBO == Util.nativeByteOrder && typeBO == byteOrder;
   }
 
   /**
@@ -364,7 +351,7 @@ abstract class BaseState {
     assert isValid() : "Memory not valid.";
   }
 
-  final void checkValid() {
+  void checkValid() {
     if (!isValid()) {
       throw new IllegalStateException("Memory not valid.");
     }
@@ -548,7 +535,7 @@ abstract class BaseState {
     sb.append("Valid               : ").append(state.isValid()).append(LS);
     sb.append("Read Only           : ").append(state.isReadOnly()).append(LS);
     sb.append("Type Byte Order     : ").append(state.getTypeByteOrder().toString()).append(LS);
-    sb.append("Native Byte Order   : ").append(nativeByteOrder.toString()).append(LS);
+    sb.append("Native Byte Order   : ").append(Util.nativeByteOrder.toString()).append(LS);
     sb.append("JDK Runtime Version : ").append(UnsafeUtil.JDK).append(LS);
     //Data detail
     sb.append("Data, littleEndian  :  0  1  2  3  4  5  6  7");
diff --git a/src/main/java/org/apache/datasketches/memory/BaseWritableMemoryImpl.java b/src/main/java/org/apache/datasketches/memory/BaseWritableMemoryImpl.java
index 829fe14..820358f 100644
--- a/src/main/java/org/apache/datasketches/memory/BaseWritableMemoryImpl.java
+++ b/src/main/java/org/apache/datasketches/memory/BaseWritableMemoryImpl.java
@@ -76,7 +76,7 @@ abstract class BaseWritableMemoryImpl extends WritableMemory {
       final long lengthBytes, final boolean localReadOnly, final ByteOrder byteOrder) {
     if (lengthBytes == 0) { return BaseWritableMemoryImpl.ZERO_SIZE_MEMORY; }
     final int typeId = localReadOnly ? READONLY : 0;
-    return isNativeByteOrder(byteOrder)
+    return Util.isNativeByteOrder(byteOrder)
         ? new HeapWritableMemoryImpl(arr, offsetBytes, lengthBytes, typeId)
         : new HeapNonNativeWritableMemoryImpl(arr, offsetBytes, lengthBytes, typeId);
   }
@@ -88,7 +88,7 @@ abstract class BaseWritableMemoryImpl extends WritableMemory {
       throw new ReadOnlyException("ByteBuffer is Read Only");
     }
     final int typeId = (abb.resourceReadOnly || localReadOnly) ? READONLY : 0;
-    return isNativeByteOrder(byteOrder)
+    return Util.isNativeByteOrder(byteOrder)
         ? new BBWritableMemoryImpl(abb.unsafeObj, abb.nativeBaseOffset,
             abb.regionOffset, abb.capacityBytes, typeId, byteBuf)
         : new BBNonNativeWritableMemoryImpl(abb.unsafeObj, abb.nativeBaseOffset,
@@ -106,7 +106,7 @@ abstract class BaseWritableMemoryImpl extends WritableMemory {
       throw new ReadOnlyException("File is Read Only");
     }
     final int typeId = (dirWMap.resourceReadOnly || localReadOnly) ? READONLY : 0;
-    final BaseWritableMemoryImpl wmem = isNativeByteOrder(byteOrder)
+    final BaseWritableMemoryImpl wmem = Util.isNativeByteOrder(byteOrder)
         ? new MapWritableMemoryImpl(dirWMap.nativeBaseOffset, 0L, capacityBytes,
             typeId, dirWMap.getValid())
         : new MapNonNativeWritableMemoryImpl(dirWMap.nativeBaseOffset, 0L, capacityBytes,
@@ -123,7 +123,7 @@ abstract class BaseWritableMemoryImpl extends WritableMemory {
     }
     final AllocateDirect direct = new AllocateDirect(capacityBytes);
     final int typeId = 0; //direct is never read-only on construction
-    final BaseWritableMemoryImpl wmem = isNativeByteOrder(byteOrder)
+    final BaseWritableMemoryImpl wmem = Util.isNativeByteOrder(byteOrder)
         ? new DirectWritableMemoryImpl(direct.getNativeBaseOffset(), 0L, capacityBytes,
             typeId, direct.getValid(), memReqSvr)
         : new DirectNonNativeWritableMemoryImpl(direct.getNativeBaseOffset(), 0L, capacityBytes,
diff --git a/src/main/java/org/apache/datasketches/memory/DirectNonNativeWritableBufferImpl.java b/src/main/java/org/apache/datasketches/memory/DirectNonNativeWritableBufferImpl.java
index c3801da..db02695 100644
--- a/src/main/java/org/apache/datasketches/memory/DirectNonNativeWritableBufferImpl.java
+++ b/src/main/java/org/apache/datasketches/memory/DirectNonNativeWritableBufferImpl.java
@@ -54,7 +54,7 @@ final class DirectNonNativeWritableBufferImpl extends NonNativeWritableBufferImp
   BaseWritableBufferImpl toWritableRegion(final long offsetBytes, final long capacityBytes,
       final boolean readOnly, final ByteOrder byteOrder) {
     final int type = typeId | REGION | (readOnly ? READONLY : 0);
-    return isNativeByteOrder(byteOrder)
+    return Util.isNativeByteOrder(byteOrder)
         ? new DirectWritableBufferImpl(
             nativeBaseOffset, getRegionOffset(offsetBytes), capacityBytes,
             type, valid, memReqSvr, originMemory)
@@ -66,7 +66,7 @@ final class DirectNonNativeWritableBufferImpl extends NonNativeWritableBufferImp
   @Override
   BaseWritableBufferImpl toDuplicate(final boolean readOnly, final ByteOrder byteOrder) {
     final int type = typeId | DUPLICATE | (readOnly ? READONLY : 0);
-    return isNativeByteOrder(byteOrder)
+    return Util.isNativeByteOrder(byteOrder)
         ? new DirectWritableBufferImpl(
             nativeBaseOffset, getRegionOffset(), getCapacity(),
             type, valid, memReqSvr, originMemory)
@@ -96,4 +96,11 @@ final class DirectNonNativeWritableBufferImpl extends NonNativeWritableBufferImp
     return valid.get();
   }
 
+  @Override
+  void checkValid() {
+    if (!this.isValid()) {
+      throw new IllegalStateException("Memory not valid.");
+    }
+  }
+  
 }
diff --git a/src/main/java/org/apache/datasketches/memory/DirectNonNativeWritableMemoryImpl.java b/src/main/java/org/apache/datasketches/memory/DirectNonNativeWritableMemoryImpl.java
index 6e74efa..6649830 100644
--- a/src/main/java/org/apache/datasketches/memory/DirectNonNativeWritableMemoryImpl.java
+++ b/src/main/java/org/apache/datasketches/memory/DirectNonNativeWritableMemoryImpl.java
@@ -52,7 +52,7 @@ final class DirectNonNativeWritableMemoryImpl extends NonNativeWritableMemoryImp
   BaseWritableMemoryImpl toWritableRegion(final long offsetBytes, final long capacityBytes,
       final boolean readOnly, final ByteOrder byteOrder) {
     final int type = typeId | REGION | (readOnly ? READONLY : 0);
-    return isNativeByteOrder(byteOrder)
+    return Util.isNativeByteOrder(byteOrder)
         ? new DirectWritableMemoryImpl(
             nativeBaseOffset, getRegionOffset(offsetBytes), capacityBytes,
             type, valid, memReqSvr)
@@ -64,7 +64,7 @@ final class DirectNonNativeWritableMemoryImpl extends NonNativeWritableMemoryImp
   @Override
   BaseWritableBufferImpl toWritableBuffer(final boolean readOnly, final ByteOrder byteOrder) {
     final int type = typeId | (readOnly ? READONLY : 0);
-    return isNativeByteOrder(byteOrder)
+    return Util.isNativeByteOrder(byteOrder)
         ? new DirectWritableBufferImpl(
             nativeBaseOffset, getRegionOffset(), getCapacity(),
             type, valid, memReqSvr, this)
@@ -94,4 +94,11 @@ final class DirectNonNativeWritableMemoryImpl extends NonNativeWritableMemoryImp
     return valid.get();
   }
 
+  @Override
+  void checkValid() {
+    if (!this.isValid()) {
+      throw new IllegalStateException("Memory not valid.");
+    }
+  }
+  
 }
diff --git a/src/main/java/org/apache/datasketches/memory/DirectWritableBufferImpl.java b/src/main/java/org/apache/datasketches/memory/DirectWritableBufferImpl.java
index 4a222f3..076910f 100644
--- a/src/main/java/org/apache/datasketches/memory/DirectWritableBufferImpl.java
+++ b/src/main/java/org/apache/datasketches/memory/DirectWritableBufferImpl.java
@@ -54,7 +54,7 @@ final class DirectWritableBufferImpl extends WritableBufferImpl {
   BaseWritableBufferImpl toWritableRegion(final long offsetBytes, final long capacityBytes,
       final boolean readOnly, final ByteOrder byteOrder) {
     final int type = typeId | REGION | (readOnly ? READONLY : 0);
-    return isNativeByteOrder(byteOrder)
+    return Util.isNativeByteOrder(byteOrder)
         ? new DirectWritableBufferImpl(
             nativeBaseOffset, getRegionOffset(offsetBytes), capacityBytes,
             type, valid, memReqSvr, originMemory)
@@ -66,7 +66,7 @@ final class DirectWritableBufferImpl extends WritableBufferImpl {
   @Override
   BaseWritableBufferImpl toDuplicate(final boolean readOnly, final ByteOrder byteOrder) {
     final int type = typeId | DUPLICATE | (readOnly ? READONLY : 0);
-    return isNativeByteOrder(byteOrder)
+    return Util.isNativeByteOrder(byteOrder)
         ? new DirectWritableBufferImpl(
             nativeBaseOffset, getRegionOffset(), getCapacity(),
             type, valid, memReqSvr, originMemory)
@@ -96,4 +96,10 @@ final class DirectWritableBufferImpl extends WritableBufferImpl {
     return valid.get();
   }
 
+  @Override
+  void checkValid() {
+    if (!this.isValid()) {
+      throw new IllegalStateException("Memory not valid.");
+    }
+  }
 }
diff --git a/src/main/java/org/apache/datasketches/memory/DirectWritableMemoryImpl.java b/src/main/java/org/apache/datasketches/memory/DirectWritableMemoryImpl.java
index 4c86746..886c7bb 100644
--- a/src/main/java/org/apache/datasketches/memory/DirectWritableMemoryImpl.java
+++ b/src/main/java/org/apache/datasketches/memory/DirectWritableMemoryImpl.java
@@ -52,7 +52,7 @@ final class DirectWritableMemoryImpl extends WritableMemoryImpl {
   BaseWritableMemoryImpl toWritableRegion(final long offsetBytes, final long capacityBytes,
       final boolean readOnly, final ByteOrder byteOrder) {
     final int type = typeId | REGION | (readOnly ? READONLY : 0);
-    return isNativeByteOrder(byteOrder)
+    return Util.isNativeByteOrder(byteOrder)
         ? new DirectWritableMemoryImpl(
             nativeBaseOffset, getRegionOffset(offsetBytes), capacityBytes,
             type, valid, memReqSvr)
@@ -64,7 +64,7 @@ final class DirectWritableMemoryImpl extends WritableMemoryImpl {
   @Override
   BaseWritableBufferImpl toWritableBuffer(final boolean readOnly, final ByteOrder byteOrder) {
     final int type = typeId | (readOnly ? READONLY : 0);
-    return isNativeByteOrder(byteOrder)
+    return Util.isNativeByteOrder(byteOrder)
         ? new DirectWritableBufferImpl(
             nativeBaseOffset, getRegionOffset(), getCapacity(),
             type, valid, memReqSvr, this)
@@ -93,5 +93,12 @@ final class DirectWritableMemoryImpl extends WritableMemoryImpl {
   public boolean isValid() {
     return valid.get();
   }
-
+  
+  @Override
+  void checkValid() {
+    if (!this.isValid()) {
+      throw new IllegalStateException("Memory not valid.");
+    }
+  }
+  
 }
diff --git a/src/main/java/org/apache/datasketches/memory/HeapNonNativeWritableBufferImpl.java b/src/main/java/org/apache/datasketches/memory/HeapNonNativeWritableBufferImpl.java
index 9ab8ba7..f7e2838 100644
--- a/src/main/java/org/apache/datasketches/memory/HeapNonNativeWritableBufferImpl.java
+++ b/src/main/java/org/apache/datasketches/memory/HeapNonNativeWritableBufferImpl.java
@@ -47,7 +47,7 @@ final class HeapNonNativeWritableBufferImpl extends NonNativeWritableBufferImpl
   BaseWritableBufferImpl toWritableRegion(final long offsetBytes, final long capacityBytes,
       final boolean readOnly, final ByteOrder byteOrder) {
     final int type = typeId | REGION | (readOnly ? READONLY : 0);
-    return isNativeByteOrder(byteOrder)
+    return Util.isNativeByteOrder(byteOrder)
         ? new HeapWritableBufferImpl(
             unsafeObj, getRegionOffset(offsetBytes), capacityBytes,
             type, originMemory)
@@ -59,7 +59,7 @@ final class HeapNonNativeWritableBufferImpl extends NonNativeWritableBufferImpl
   @Override
   BaseWritableBufferImpl toDuplicate(final boolean readOnly, final ByteOrder byteOrder) {
     final int type = typeId | DUPLICATE | (readOnly ? READONLY : 0);
-    return isNativeByteOrder(byteOrder)
+    return Util.isNativeByteOrder(byteOrder)
         ? new HeapWritableBufferImpl(
             unsafeObj, getRegionOffset(), getCapacity(),
             type, originMemory)
diff --git a/src/main/java/org/apache/datasketches/memory/HeapNonNativeWritableMemoryImpl.java b/src/main/java/org/apache/datasketches/memory/HeapNonNativeWritableMemoryImpl.java
index e9957ca..359a8c6 100644
--- a/src/main/java/org/apache/datasketches/memory/HeapNonNativeWritableMemoryImpl.java
+++ b/src/main/java/org/apache/datasketches/memory/HeapNonNativeWritableMemoryImpl.java
@@ -46,7 +46,7 @@ final class HeapNonNativeWritableMemoryImpl extends NonNativeWritableMemoryImpl
   BaseWritableMemoryImpl toWritableRegion(final long offsetBytes, final long capacityBytes,
       final boolean readOnly, final ByteOrder byteOrder) {
     final int type = typeId | REGION | (readOnly ? READONLY : 0);
-    return isNativeByteOrder(byteOrder)
+    return Util.isNativeByteOrder(byteOrder)
         ? new HeapWritableMemoryImpl(
             unsafeObj, getRegionOffset(offsetBytes), capacityBytes,
             type)
@@ -58,7 +58,7 @@ final class HeapNonNativeWritableMemoryImpl extends NonNativeWritableMemoryImpl
   @Override
   BaseWritableBufferImpl toWritableBuffer(final boolean readOnly, final ByteOrder byteOrder) {
     final int type = typeId | (readOnly ? READONLY : 0);
-    return isNativeByteOrder(byteOrder)
+    return Util.isNativeByteOrder(byteOrder)
         ? new HeapWritableBufferImpl(
             unsafeObj, getRegionOffset(), getCapacity(),
             type, this)
diff --git a/src/main/java/org/apache/datasketches/memory/HeapWritableBufferImpl.java b/src/main/java/org/apache/datasketches/memory/HeapWritableBufferImpl.java
index 17f2fb6..0e3cb56 100644
--- a/src/main/java/org/apache/datasketches/memory/HeapWritableBufferImpl.java
+++ b/src/main/java/org/apache/datasketches/memory/HeapWritableBufferImpl.java
@@ -47,7 +47,7 @@ final class HeapWritableBufferImpl extends WritableBufferImpl {
   BaseWritableBufferImpl toWritableRegion(final long offsetBytes, final long capacityBytes,
       final boolean readOnly, final ByteOrder byteOrder) {
     final int type = typeId | REGION | (readOnly ? READONLY : 0);
-    return isNativeByteOrder(byteOrder)
+    return Util.isNativeByteOrder(byteOrder)
         ? new HeapWritableBufferImpl(
             unsafeObj, getRegionOffset(offsetBytes), capacityBytes,
             type, originMemory)
@@ -59,7 +59,7 @@ final class HeapWritableBufferImpl extends WritableBufferImpl {
   @Override
   BaseWritableBufferImpl toDuplicate(final boolean readOnly, final ByteOrder byteOrder) {
     final int type = typeId | DUPLICATE | (readOnly ? READONLY : 0);
-    return isNativeByteOrder(byteOrder)
+    return Util.isNativeByteOrder(byteOrder)
         ? new HeapWritableBufferImpl(
             unsafeObj, getRegionOffset(), getCapacity(),
             type, originMemory)
diff --git a/src/main/java/org/apache/datasketches/memory/HeapWritableMemoryImpl.java b/src/main/java/org/apache/datasketches/memory/HeapWritableMemoryImpl.java
index a26abcf..147702e 100644
--- a/src/main/java/org/apache/datasketches/memory/HeapWritableMemoryImpl.java
+++ b/src/main/java/org/apache/datasketches/memory/HeapWritableMemoryImpl.java
@@ -46,7 +46,7 @@ final class HeapWritableMemoryImpl extends WritableMemoryImpl {
   BaseWritableMemoryImpl toWritableRegion(final long offsetBytes, final long capacityBytes,
       final boolean readOnly, final ByteOrder byteOrder) {
     final int type = typeId | REGION | (readOnly ? READONLY : 0);
-    return isNativeByteOrder(byteOrder)
+    return Util.isNativeByteOrder(byteOrder)
         ? new HeapWritableMemoryImpl(
             unsafeObj, getRegionOffset(offsetBytes), capacityBytes,
             type)
@@ -58,7 +58,7 @@ final class HeapWritableMemoryImpl extends WritableMemoryImpl {
   @Override
   BaseWritableBufferImpl toWritableBuffer(final boolean readOnly, final ByteOrder byteOrder) {
     final int type = typeId | (readOnly ? READONLY : 0);
-    return isNativeByteOrder(byteOrder)
+    return Util.isNativeByteOrder(byteOrder)
         ? new HeapWritableBufferImpl(
             unsafeObj, getRegionOffset(), getCapacity(),
             type, this)
diff --git a/src/main/java/org/apache/datasketches/memory/MapNonNativeWritableBufferImpl.java b/src/main/java/org/apache/datasketches/memory/MapNonNativeWritableBufferImpl.java
index 354030c..2ab9c58 100644
--- a/src/main/java/org/apache/datasketches/memory/MapNonNativeWritableBufferImpl.java
+++ b/src/main/java/org/apache/datasketches/memory/MapNonNativeWritableBufferImpl.java
@@ -50,7 +50,7 @@ final class MapNonNativeWritableBufferImpl extends NonNativeWritableBufferImpl {
   BaseWritableBufferImpl toWritableRegion(final long offsetBytes, final long capacityBytes,
       final boolean readOnly, final ByteOrder byteOrder) {
     final int type = REGION | (readOnly ? READONLY : 0);
-    return isNativeByteOrder(byteOrder)
+    return Util.isNativeByteOrder(byteOrder)
         ? new MapWritableBufferImpl(
             nativeBaseOffset, getRegionOffset(offsetBytes), capacityBytes,
             type, valid, originMemory)
@@ -62,7 +62,7 @@ final class MapNonNativeWritableBufferImpl extends NonNativeWritableBufferImpl {
   @Override
   BaseWritableBufferImpl toDuplicate(final boolean readOnly, final ByteOrder byteOrder) {
     final int type = DUPLICATE | (readOnly ? READONLY : 0);
-    return isNativeByteOrder(byteOrder)
+    return Util.isNativeByteOrder(byteOrder)
         ? new MapWritableBufferImpl(
             nativeBaseOffset, getRegionOffset(), getCapacity(),
             type, valid, originMemory)
@@ -86,4 +86,11 @@ final class MapNonNativeWritableBufferImpl extends NonNativeWritableBufferImpl {
     return valid.get();
   }
 
+  @Override
+  void checkValid() {
+    if (!this.isValid()) {
+      throw new IllegalStateException("Memory not valid.");
+    }
+  }
+  
 }
diff --git a/src/main/java/org/apache/datasketches/memory/MapNonNativeWritableMemoryImpl.java b/src/main/java/org/apache/datasketches/memory/MapNonNativeWritableMemoryImpl.java
index a7e578f..05f6989 100644
--- a/src/main/java/org/apache/datasketches/memory/MapNonNativeWritableMemoryImpl.java
+++ b/src/main/java/org/apache/datasketches/memory/MapNonNativeWritableMemoryImpl.java
@@ -49,7 +49,7 @@ final class MapNonNativeWritableMemoryImpl extends NonNativeWritableMemoryImpl {
   BaseWritableMemoryImpl toWritableRegion(final long offsetBytes, final long capacityBytes,
       final boolean readOnly, final ByteOrder byteOrder) {
     final int type = typeId | REGION | (readOnly ? READONLY : 0);
-    return isNativeByteOrder(byteOrder)
+    return Util.isNativeByteOrder(byteOrder)
         ? new MapWritableMemoryImpl(
             nativeBaseOffset, getRegionOffset(offsetBytes), capacityBytes,
             type, valid)
@@ -61,7 +61,7 @@ final class MapNonNativeWritableMemoryImpl extends NonNativeWritableMemoryImpl {
   @Override
   BaseWritableBufferImpl toWritableBuffer(final boolean readOnly, final ByteOrder byteOrder) {
     final int type = typeId | (readOnly ? READONLY : 0);
-    return isNativeByteOrder(byteOrder)
+    return Util.isNativeByteOrder(byteOrder)
         ? new MapWritableBufferImpl(
             nativeBaseOffset, getRegionOffset(), getCapacity(),
             type, valid, this)
@@ -85,4 +85,11 @@ final class MapNonNativeWritableMemoryImpl extends NonNativeWritableMemoryImpl {
     return valid.get();
   }
 
+  @Override
+  void checkValid() {
+    if (!this.isValid()) {
+      throw new IllegalStateException("Memory not valid.");
+    }
+  }
+  
 }
diff --git a/src/main/java/org/apache/datasketches/memory/MapWritableBufferImpl.java b/src/main/java/org/apache/datasketches/memory/MapWritableBufferImpl.java
index ccf0a74..6aab451 100644
--- a/src/main/java/org/apache/datasketches/memory/MapWritableBufferImpl.java
+++ b/src/main/java/org/apache/datasketches/memory/MapWritableBufferImpl.java
@@ -50,7 +50,7 @@ final class MapWritableBufferImpl extends WritableBufferImpl {
   BaseWritableBufferImpl toWritableRegion(final long offsetBytes, final long capacityBytes,
       final boolean readOnly, final ByteOrder byteOrder) {
     final int type = typeId | REGION | (readOnly ? READONLY : 0);
-    return isNativeByteOrder(byteOrder)
+    return Util.isNativeByteOrder(byteOrder)
         ? new MapWritableBufferImpl(
             nativeBaseOffset, getRegionOffset(offsetBytes), capacityBytes,
             type, valid, originMemory)
@@ -62,7 +62,7 @@ final class MapWritableBufferImpl extends WritableBufferImpl {
   @Override
   BaseWritableBufferImpl toDuplicate(final boolean readOnly, final ByteOrder byteOrder) {
     final int type = typeId | DUPLICATE | (readOnly ? READONLY : 0);
-    return isNativeByteOrder(byteOrder)
+    return Util.isNativeByteOrder(byteOrder)
         ? new MapWritableBufferImpl(
             nativeBaseOffset, getRegionOffset(), getCapacity(),
             type, valid, originMemory)
@@ -86,4 +86,11 @@ final class MapWritableBufferImpl extends WritableBufferImpl {
     return valid.get();
   }
 
+  @Override
+  void checkValid() {
+    if (!this.isValid()) {
+      throw new IllegalStateException("Memory not valid.");
+    }
+  }
+  
 }
diff --git a/src/main/java/org/apache/datasketches/memory/MapWritableMemoryImpl.java b/src/main/java/org/apache/datasketches/memory/MapWritableMemoryImpl.java
index fdcbe9b..1448947 100644
--- a/src/main/java/org/apache/datasketches/memory/MapWritableMemoryImpl.java
+++ b/src/main/java/org/apache/datasketches/memory/MapWritableMemoryImpl.java
@@ -49,7 +49,7 @@ final class MapWritableMemoryImpl extends WritableMemoryImpl {
   BaseWritableMemoryImpl toWritableRegion(final long offsetBytes, final long capacityBytes,
       final boolean readOnly, final ByteOrder byteOrder) {
     final int type = typeId | REGION | (readOnly ? READONLY : 0);
-    return isNativeByteOrder(byteOrder)
+    return Util.isNativeByteOrder(byteOrder)
         ? new MapWritableMemoryImpl(
             nativeBaseOffset, getRegionOffset(offsetBytes), capacityBytes,
             type, valid)
@@ -61,7 +61,7 @@ final class MapWritableMemoryImpl extends WritableMemoryImpl {
   @Override
   BaseWritableBufferImpl toWritableBuffer(final boolean readOnly, final ByteOrder byteOrder) {
     final int type = typeId | (readOnly ? READONLY : 0);
-    return isNativeByteOrder(byteOrder)
+    return Util.isNativeByteOrder(byteOrder)
         ? new MapWritableBufferImpl(
             nativeBaseOffset, getRegionOffset(), getCapacity(),
             type, valid, this)
@@ -85,4 +85,11 @@ final class MapWritableMemoryImpl extends WritableMemoryImpl {
     return valid.get();
   }
 
+  @Override
+  void checkValid() {
+    if (!this.isValid()) {
+      throw new IllegalStateException("Memory not valid.");
+    }
+  }
+  
 }
diff --git a/src/main/java/org/apache/datasketches/memory/Memory.java b/src/main/java/org/apache/datasketches/memory/Memory.java
index 3af3631..c6c9ba1 100644
--- a/src/main/java/org/apache/datasketches/memory/Memory.java
+++ b/src/main/java/org/apache/datasketches/memory/Memory.java
@@ -227,7 +227,7 @@ public abstract class Memory extends BaseState {
   public static Memory wrap(final boolean[] arr) {
     final long lengthBytes = arr.length << Prim.BOOLEAN.shift();
     return BaseWritableMemoryImpl.wrapHeapArray(arr, 0L, lengthBytes, true,
-        BaseState.nativeByteOrder);
+        Util.nativeByteOrder);
   }
 
   /**
@@ -241,7 +241,7 @@ public abstract class Memory extends BaseState {
    * @return a new <i>Memory</i> for read operations
    */
   public static Memory wrap(final byte[] arr) {
-    return Memory.wrap(arr, 0, arr.length, BaseState.nativeByteOrder);
+    return Memory.wrap(arr, 0, arr.length, Util.nativeByteOrder);
   }
 
   /**
@@ -289,7 +289,7 @@ public abstract class Memory extends BaseState {
    */
   public static Memory wrap(final char[] arr) {
     final long lengthBytes = arr.length << Prim.CHAR.shift();
-    return BaseWritableMemoryImpl.wrapHeapArray(arr, 0L, lengthBytes, true, BaseState.nativeByteOrder);
+    return BaseWritableMemoryImpl.wrapHeapArray(arr, 0L, lengthBytes, true, Util.nativeByteOrder);
   }
 
   /**
@@ -303,7 +303,7 @@ public abstract class Memory extends BaseState {
    */
   public static Memory wrap(final short[] arr) {
     final long lengthBytes = arr.length << Prim.SHORT.shift();
-    return BaseWritableMemoryImpl.wrapHeapArray(arr, 0L, lengthBytes, true, BaseState.nativeByteOrder);
+    return BaseWritableMemoryImpl.wrapHeapArray(arr, 0L, lengthBytes, true, Util.nativeByteOrder);
   }
 
   /**
@@ -317,7 +317,7 @@ public abstract class Memory extends BaseState {
    */
   public static Memory wrap(final int[] arr) {
     final long lengthBytes = arr.length << Prim.INT.shift();
-    return BaseWritableMemoryImpl.wrapHeapArray(arr, 0L, lengthBytes, true, BaseState.nativeByteOrder);
+    return BaseWritableMemoryImpl.wrapHeapArray(arr, 0L, lengthBytes, true, Util.nativeByteOrder);
   }
 
   /**
@@ -332,7 +332,7 @@ public abstract class Memory extends BaseState {
    */
   public static Memory wrap(final long[] arr) {
     final long lengthBytes = arr.length << Prim.LONG.shift();
-    return BaseWritableMemoryImpl.wrapHeapArray(arr, 0L, lengthBytes, true, BaseState.nativeByteOrder);
+    return BaseWritableMemoryImpl.wrapHeapArray(arr, 0L, lengthBytes, true, Util.nativeByteOrder);
   }
 
   /**
@@ -347,7 +347,7 @@ public abstract class Memory extends BaseState {
    */
   public static Memory wrap(final float[] arr) {
     final long lengthBytes = arr.length << Prim.FLOAT.shift();
-    return BaseWritableMemoryImpl.wrapHeapArray(arr, 0L, lengthBytes, true, BaseState.nativeByteOrder);
+    return BaseWritableMemoryImpl.wrapHeapArray(arr, 0L, lengthBytes, true, Util.nativeByteOrder);
   }
 
   /**
@@ -362,7 +362,7 @@ public abstract class Memory extends BaseState {
    */
   public static Memory wrap(final double[] arr) {
     final long lengthBytes = arr.length << Prim.DOUBLE.shift();
-    return BaseWritableMemoryImpl.wrapHeapArray(arr, 0L, lengthBytes, true, BaseState.nativeByteOrder);
+    return BaseWritableMemoryImpl.wrapHeapArray(arr, 0L, lengthBytes, true, Util.nativeByteOrder);
   }
 
   //PRIMITIVE getX() and getXArray()
diff --git a/src/main/java/org/apache/datasketches/memory/Prim.java b/src/main/java/org/apache/datasketches/memory/Prim.java
index 0178d27..9b956bd 100644
--- a/src/main/java/org/apache/datasketches/memory/Prim.java
+++ b/src/main/java/org/apache/datasketches/memory/Prim.java
@@ -52,7 +52,7 @@ import static org.apache.datasketches.memory.UnsafeUtil.SHORT_SHIFT;
  *
  * @author Lee Rhodes
  */
-enum Prim {
+public enum Prim {
   BOOLEAN(ARRAY_BOOLEAN_BASE_OFFSET, ARRAY_BOOLEAN_INDEX_SCALE, BOOLEAN_SHIFT),
   BYTE(ARRAY_BYTE_BASE_OFFSET, ARRAY_BYTE_INDEX_SCALE, BYTE_SHIFT),
   CHAR(ARRAY_CHAR_BASE_OFFSET, ARRAY_CHAR_INDEX_SCALE, CHAR_SHIFT),
@@ -73,15 +73,15 @@ enum Prim {
     this.sizeShift_ = sizeShift;
   }
 
-  long off() {
+  public long off() {
     return arrBaseOff_;
   }
 
-  long scale() {
+  public long scale() {
     return arrIdxScale_;
   }
 
-  long shift() {
+  public long shift() {
     return sizeShift_;
   }
 
diff --git a/src/main/java/org/apache/datasketches/memory/StepBoolean.java b/src/main/java/org/apache/datasketches/memory/StepBoolean.java
index 16d6b19..e614d4c 100644
--- a/src/main/java/org/apache/datasketches/memory/StepBoolean.java
+++ b/src/main/java/org/apache/datasketches/memory/StepBoolean.java
@@ -26,7 +26,7 @@ import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
  *
  * @author Lee Rhodes
  */
-final class StepBoolean {
+public final class StepBoolean {
   private static final int FALSE = 0;
   private static final int TRUE = 1;
   private static final AtomicIntegerFieldUpdater<StepBoolean> STATE_FIELD_UPDATER =
@@ -35,7 +35,7 @@ final class StepBoolean {
   private final int initialState;
   private volatile int state;
 
-  StepBoolean(final boolean initialState) {
+  public StepBoolean(final boolean initialState) {
     this.initialState = initialState ? TRUE : FALSE;
     state = this.initialState;
   }
@@ -44,7 +44,7 @@ final class StepBoolean {
    * Gets the current state.
    * @return the current state.
    */
-  boolean get() {
+  public boolean get() {
     return state == TRUE;
   }
 
@@ -53,7 +53,7 @@ final class StepBoolean {
    * @return true if this call led to the change of the state; false if the state has already been
    * changed
    */
-  boolean change() {
+  public boolean change() {
     final int notInitialState = initialState == TRUE ? FALSE : TRUE;
     return STATE_FIELD_UPDATER.compareAndSet(this, initialState, notInitialState);
   }
@@ -62,7 +62,7 @@ final class StepBoolean {
    * Return true if the state has changed from the initial state
    * @return true if the state has changed from the initial state
    */
-  boolean hasChanged() {
+  public boolean hasChanged() {
     return state != initialState;
   }
 }
diff --git a/src/main/java/org/apache/datasketches/memory/Util.java b/src/main/java/org/apache/datasketches/memory/Util.java
index 10b3eb5..3866c59 100644
--- a/src/main/java/org/apache/datasketches/memory/Util.java
+++ b/src/main/java/org/apache/datasketches/memory/Util.java
@@ -26,6 +26,7 @@ import java.io.IOException;
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.net.URL;
+import java.nio.ByteOrder;
 import java.nio.file.Files;
 import java.nio.file.Paths;
 import java.util.Random;
@@ -34,10 +35,38 @@ import java.util.Random;
  * @author Lee Rhodes
  */
 public final class Util {
-  private static final String LS = System.getProperty("line.separator");
+  public static final String LS = System.getProperty("line.separator");
+  
+  //Byte Order related
+  public static final ByteOrder nativeByteOrder = ByteOrder.nativeOrder();
+  public static final ByteOrder nonNativeByteOrder = nativeByteOrder == ByteOrder.LITTLE_ENDIAN
+      ? ByteOrder.BIG_ENDIAN : ByteOrder.LITTLE_ENDIAN;
 
   private Util() { }
 
+  //Byte Order Related
+  
+  /**
+   * Returns the Native Byte Order
+   * @return the Native Byte Order
+   */
+  public static final ByteOrder getNativeByteOrder() {
+    return nativeByteOrder;
+  }
+
+  /**
+   * Returns true if the given byteOrder is the same as the native byte order.
+   * @param byteOrder the given byte order
+   * @return true if the given byteOrder is the same as the native byte order.
+   */
+  public static boolean isNativeByteOrder(final ByteOrder byteOrder) {
+    if (byteOrder == null) {
+      throw new IllegalArgumentException("ByteOrder parameter cannot be null.");
+    }
+    return Util.nativeByteOrder == byteOrder;
+  }
+  
+  
   /**
    * Searches a range of the specified array of longs for the specified value using the binary
    * search algorithm. The range must be sorted method) prior to making this call.
diff --git a/src/main/java/org/apache/datasketches/memory/WritableMemory.java b/src/main/java/org/apache/datasketches/memory/WritableMemory.java
index 39eaef7..84f3d85 100644
--- a/src/main/java/org/apache/datasketches/memory/WritableMemory.java
+++ b/src/main/java/org/apache/datasketches/memory/WritableMemory.java
@@ -90,7 +90,7 @@ public abstract class WritableMemory extends Memory {
    * @throws IOException file not found or a RuntimeException.
    */
   public static WritableMapHandle map(final File file) throws IOException {
-    return map(file, 0, file.length(), BaseState.nativeByteOrder);
+    return map(file, 0, file.length(), Util.nativeByteOrder);
   }
 
   /**
@@ -157,7 +157,7 @@ public abstract class WritableMemory extends Memory {
    */
   public static WritableDirectHandle allocateDirect(final long capacityBytes,
       final MemoryRequestServer memReqSvr) {
-    return BaseWritableMemoryImpl.wrapDirect(capacityBytes, BaseState.nativeByteOrder, memReqSvr);
+    return BaseWritableMemoryImpl.wrapDirect(capacityBytes, Util.nativeByteOrder, memReqSvr);
   }
 
   //REGIONS
@@ -243,7 +243,7 @@ public abstract class WritableMemory extends Memory {
    */
   public static WritableMemory allocate(final int capacityBytes) {
     final byte[] arr = new byte[capacityBytes];
-    return wrap(arr, BaseState.nativeByteOrder);
+    return wrap(arr, Util.nativeByteOrder);
   }
 
   /**
@@ -272,7 +272,7 @@ public abstract class WritableMemory extends Memory {
    */
   public static WritableMemory wrap(final boolean[] arr) {
     final long lengthBytes = arr.length << Prim.BOOLEAN.shift();
-    return BaseWritableMemoryImpl.wrapHeapArray(arr, 0L, lengthBytes, false, BaseState.nativeByteOrder);
+    return BaseWritableMemoryImpl.wrapHeapArray(arr, 0L, lengthBytes, false, Util.nativeByteOrder);
   }
 
   /**
@@ -286,7 +286,7 @@ public abstract class WritableMemory extends Memory {
    * @return a new WritableMemory for write operations on the given primitive array.
    */
   public static WritableMemory wrap(final byte[] arr) {
-    return WritableMemory.wrap(arr, 0, arr.length, BaseState.nativeByteOrder);
+    return WritableMemory.wrap(arr, 0, arr.length, Util.nativeByteOrder);
   }
 
   /**
@@ -335,7 +335,7 @@ public abstract class WritableMemory extends Memory {
    */
   public static WritableMemory wrap(final char[] arr) {
     final long lengthBytes = arr.length << Prim.CHAR.shift();
-    return BaseWritableMemoryImpl.wrapHeapArray(arr, 0L, lengthBytes, false, BaseState.nativeByteOrder);
+    return BaseWritableMemoryImpl.wrapHeapArray(arr, 0L, lengthBytes, false, Util.nativeByteOrder);
   }
 
   /**
@@ -350,7 +350,7 @@ public abstract class WritableMemory extends Memory {
    */
   public static WritableMemory wrap(final short[] arr) {
     final long lengthBytes = arr.length << Prim.SHORT.shift();
-    return BaseWritableMemoryImpl.wrapHeapArray(arr, 0L, lengthBytes, false, BaseState.nativeByteOrder);
+    return BaseWritableMemoryImpl.wrapHeapArray(arr, 0L, lengthBytes, false, Util.nativeByteOrder);
   }
 
   /**
@@ -365,7 +365,7 @@ public abstract class WritableMemory extends Memory {
    */
   public static WritableMemory wrap(final int[] arr) {
     final long lengthBytes = arr.length << Prim.INT.shift();
-    return BaseWritableMemoryImpl.wrapHeapArray(arr, 0L, lengthBytes, false, BaseState.nativeByteOrder);
+    return BaseWritableMemoryImpl.wrapHeapArray(arr, 0L, lengthBytes, false, Util.nativeByteOrder);
   }
 
   /**
@@ -380,7 +380,7 @@ public abstract class WritableMemory extends Memory {
    */
   public static WritableMemory wrap(final long[] arr) {
     final long lengthBytes = arr.length << Prim.LONG.shift();
-    return BaseWritableMemoryImpl.wrapHeapArray(arr, 0L, lengthBytes, false, BaseState.nativeByteOrder);
+    return BaseWritableMemoryImpl.wrapHeapArray(arr, 0L, lengthBytes, false, Util.nativeByteOrder);
   }
 
   /**
@@ -395,7 +395,7 @@ public abstract class WritableMemory extends Memory {
    */
   public static WritableMemory wrap(final float[] arr) {
     final long lengthBytes = arr.length << Prim.FLOAT.shift();
-    return BaseWritableMemoryImpl.wrapHeapArray(arr, 0L, lengthBytes, false, BaseState.nativeByteOrder);
+    return BaseWritableMemoryImpl.wrapHeapArray(arr, 0L, lengthBytes, false, Util.nativeByteOrder);
   }
 
   /**
@@ -410,7 +410,7 @@ public abstract class WritableMemory extends Memory {
    */
   public static WritableMemory wrap(final double[] arr) {
     final long lengthBytes = arr.length << Prim.DOUBLE.shift();
-    return BaseWritableMemoryImpl.wrapHeapArray(arr, 0L, lengthBytes, false, BaseState.nativeByteOrder);
+    return BaseWritableMemoryImpl.wrapHeapArray(arr, 0L, lengthBytes, false, Util.nativeByteOrder);
   }
   //END OF CONSTRUCTOR-TYPE METHODS
 
@@ -640,6 +640,7 @@ public abstract class WritableMemory extends Memory {
    */
   public abstract void setBits(long offsetBytes, byte bitMask);
 
+  
   //OTHER WRITABLE API METHODS
   /**
    * For Direct Memory only. Other types of backing resources will return null.
@@ -653,5 +654,5 @@ public abstract class WritableMemory extends Memory {
   public MemoryRequestServer getMemoryRequestServer() {
     return null;
   }
-
+  
 }
diff --git a/src/test/java/org/apache/datasketches/memory/test/AllocateDirectMemoryTest.java b/src/test/java/org/apache/datasketches/memory/test/AllocateDirectMemoryTest.java
index 877ee5c..6a37003 100644
--- a/src/test/java/org/apache/datasketches/memory/test/AllocateDirectMemoryTest.java
+++ b/src/test/java/org/apache/datasketches/memory/test/AllocateDirectMemoryTest.java
@@ -24,9 +24,12 @@ import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertNotNull;
 import static org.testng.Assert.fail;
 
-import org.apache.datasketches.memory.BaseState;
-import org.apache.datasketches.memory.BaseWritableMemoryImpl;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.nio.ByteOrder;
+
 import org.apache.datasketches.memory.MemoryRequestServer;
+import org.apache.datasketches.memory.Util;
 import org.apache.datasketches.memory.WritableDirectHandle;
 import org.apache.datasketches.memory.WritableHandle;
 import org.apache.datasketches.memory.WritableMemory;
@@ -35,23 +38,28 @@ import org.testng.annotations.Test;
 
 @SuppressWarnings("javadoc")
 public class AllocateDirectMemoryTest {
-
+  
   @Test
   public void simpleAllocateDirect() {
     int longs = 32;
-    WritableMemory wMem1;
+    WritableMemory wMem;
     try (WritableHandle wh = WritableMemory.allocateDirect(longs << 3)) {
-      wMem1 = wh.get();
+      wMem = wh.get();
       for (int i = 0; i<longs; i++) {
-        wMem1.putLong(i << 3, i);
-        assertEquals(wMem1.getLong(i << 3), i);
+        wMem.putLong(i << 3, i);
+        assertEquals(wMem.getLong(i << 3), i);
       }
     }
+    //The TWR block has exited, so the memory should be invalid
     try {
-      wMem1.checkValid();
+      final Class<?> wMemClass = wMem.getClass();
+      Method method = ReflectUtil.getMethod(wMemClass, "checkValid", (Class<?>[])null);
+      method.invoke(wMem, (Object[]) null);
+      //wMem.checkValid();
       fail();
-    } catch (IllegalStateException e) {
-      //ok
+    } catch (final Exception e) {
+      if (e instanceof IllegalStateException || e instanceof InvocationTargetException) { } //OK
+      else { throw new RuntimeException(e); }
     }
   }
 
@@ -87,19 +95,24 @@ public class AllocateDirectMemoryTest {
     try (WritableHandle wh = WritableMemory.allocateDirect(128, null)) {
       WritableMemory wmem = wh.get();
       assertNotNull(wmem.getMemoryRequestServer());
-
-
     }
   }
 
 
   @Test
   public void checkNonNativeDirect() { //not allowed in public API
-    try (WritableDirectHandle h =
-        BaseWritableMemoryImpl.wrapDirect(8, BaseState.nonNativeByteOrder, null)) {
+    Class<?> bwMemImpl = ReflectUtil.getClass("org.apache.datasketches.memory.BaseWritableMemoryImpl");
+    Method wrapDirectMethod = 
+        ReflectUtil.getMethod(bwMemImpl, "wrapDirect", long.class, ByteOrder.class, MemoryRequestServer.class);
+    try (WritableDirectHandle h = (WritableDirectHandle) 
+        wrapDirectMethod.invoke(wrapDirectMethod, 8,  Util.nonNativeByteOrder, null)) {
+        //BaseWritableMemoryImpl.wrapDirect(8, Util.nonNativeByteOrder, null)) {
       WritableMemory wmem = h.get();
       wmem.putChar(0, (char) 1);
       assertEquals(wmem.getByte(1), (byte) 1);
+    } catch (final Exception e) {
+      if (e instanceof IllegalStateException || e instanceof InvocationTargetException) { } //OK
+      else { throw new RuntimeException(e); }
     }
   }
 
@@ -108,16 +121,25 @@ public class AllocateDirectMemoryTest {
     final long cap = 128;
     try (WritableDirectHandle wdh = WritableMemory.allocateDirect(cap)) {
       wdh.close(); //explicit close. Does the work of closing
-      wdh.direct.close(); //redundant
     } //end of scope call to Cleaner/Deallocator also will be redundant
   }
 
   @AfterClass
   public void checkDirectCounter() {
-    final long count = BaseState.getCurrentDirectMemoryAllocations();
-    if (count != 0) {
-      println(""+count);
-      fail();
+    final Class<?> baseStateClass = ReflectUtil.getClass("org.apache.datasketches.memory.BaseState");
+    final Method currDirMemAllocMethod = 
+        ReflectUtil.getMethod(baseStateClass, "getCurrentDirectMemoryAllocations", (Class<?>[])null);
+    long count;
+    try {
+      count = (long) currDirMemAllocMethod.invoke(currDirMemAllocMethod, (Object[])null);
+      //final long count = BaseState.getCurrentDirectMemoryAllocations();
+      if (count != 0) {
+        println(""+count);
+        fail();
+      }
+    } catch (final Exception e) {
+      if (e instanceof IllegalStateException || e instanceof InvocationTargetException) { } //OK
+      else { throw new RuntimeException(e); }
     }
   }
 
diff --git a/src/test/java/org/apache/datasketches/memory/test/AllocateDirectWritableMapMemoryTest.java b/src/test/java/org/apache/datasketches/memory/test/AllocateDirectWritableMapMemoryTest.java
index dd56842..25af375 100644
--- a/src/test/java/org/apache/datasketches/memory/test/AllocateDirectWritableMapMemoryTest.java
+++ b/src/test/java/org/apache/datasketches/memory/test/AllocateDirectWritableMapMemoryTest.java
@@ -24,8 +24,8 @@
 package org.apache.datasketches.memory.test;
 
 import static java.nio.charset.StandardCharsets.UTF_8;
-import static org.apache.datasketches.memory.AllocateDirectMap.isFileReadOnly;
-import static org.apache.datasketches.memory.Util.getResourceFile;
+//import static org.apache.datasketches.memory.AllocateDirectMap.isFileReadOnly;
+import static org.apache.datasketches.memory.Util.*;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertTrue;
 import static org.testng.Assert.fail;
@@ -35,12 +35,14 @@ import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.io.UnsupportedEncodingException;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
 import java.nio.ByteOrder;
 
-import org.apache.datasketches.memory.BaseState;
 import org.apache.datasketches.memory.MapHandle;
 import org.apache.datasketches.memory.Memory;
 import org.apache.datasketches.memory.ReadOnlyException;
+import org.apache.datasketches.memory.Util;
 import org.apache.datasketches.memory.WritableHandle;
 import org.apache.datasketches.memory.WritableMapHandle;
 import org.apache.datasketches.memory.WritableMemory;
@@ -130,7 +132,7 @@ public class AllocateDirectWritableMapMemoryTest {
     file.deleteOnExit();  //comment out if you want to examine the file.
 
     final long bytes = 8;
-    try (WritableMapHandle h = WritableMemory.map(file, 0L, bytes, BaseState.nonNativeByteOrder)) {
+    try (WritableMapHandle h = WritableMemory.map(file, 0L, bytes, Util.nonNativeByteOrder)) {
       WritableMemory wmem = h.get();
       wmem.putChar(0, (char) 1);
       assertEquals(wmem.getByte(1), (byte) 1);
@@ -148,7 +150,15 @@ public class AllocateDirectWritableMapMemoryTest {
   @Test(expectedExceptions = ReadOnlyException.class)
   public void simpleMap2() throws IOException {
     File file = getResourceFile("GettysburgAddress.txt");
-    assertTrue(isFileReadOnly(file));
+    final Class<?> allocDirMapClass = ReflectUtil.getClass("org.apache.datasketches.memory.AllocateDirectMap");
+    final Method roMethod = ReflectUtil.getMethod(allocDirMapClass, "isFileReadOnly", file.getClass());
+    try {
+      assertTrue((boolean)roMethod.invoke(roMethod, file));
+      //assertTrue(isFileReadOnly(file));
+    } catch (final Exception e) {
+      if (e instanceof IllegalStateException || e instanceof InvocationTargetException) { } //OK
+      else { throw new RuntimeException(e); }
+    }
     try (WritableMapHandle rh = WritableMemory.map(file)) {
       //
     }
@@ -219,19 +229,38 @@ public class AllocateDirectWritableMapMemoryTest {
   public void checkExplicitClose() throws Exception {
     File file = getResourceFile("GettysburgAddress.txt");
     try (MapHandle wmh = Memory.map(file)) {
-      wmh.close(); //explicit close. Does the work of closing
-      wmh.dirMap.close(); //redundant
+      wmh.close(); //explicit close.
     } //end of scope call to Cleaner/Deallocator also will be redundant
   }
 
   @AfterClass
-  public void checkMapCounter() {
-    final long count = BaseState.getCurrentDirectMemoryMapAllocations();
-    if (count != 0) {
-      println(""+count);
-      fail();
+  public void checkDirectCounter() {
+    final Class<?> baseStateClass = ReflectUtil.getClass("org.apache.datasketches.memory.BaseState");
+    final Method currDirMemAllocMethod = 
+        ReflectUtil.getMethod(baseStateClass, "getCurrentDirectMemoryMapAllocations", (Class<?>[])null);
+    long count;
+    try {
+      count = (long) currDirMemAllocMethod.invoke(currDirMemAllocMethod, (Object[])null);
+      //final long count = BaseState.getCurrentDirectMemoryMapAllocations();
+      if (count != 0) {
+        println(""+count);
+        fail();
+      }
+    } catch (final Exception e) {
+      if (e instanceof IllegalStateException || e instanceof InvocationTargetException) { } //OK
+      else { throw new RuntimeException(e); }
     }
   }
+  
+  
+//  @AfterClass
+//  public void checkMapCounter() {
+//    final long count = BaseState.getCurrentDirectMemoryMapAllocations();
+//    if (count != 0) {
+//      println(""+count);
+//      fail();
+//    }
+//  }
 
   @Test
   public void printlnTest() {
diff --git a/src/test/java/org/apache/datasketches/memory/test/BaseStateTest.java b/src/test/java/org/apache/datasketches/memory/test/BaseStateTest.java
index 2151b05..21045ff 100644
--- a/src/test/java/org/apache/datasketches/memory/test/BaseStateTest.java
+++ b/src/test/java/org/apache/datasketches/memory/test/BaseStateTest.java
@@ -27,11 +27,11 @@ import static org.testng.Assert.fail;
 
 import java.nio.ByteOrder;
 
-import org.apache.datasketches.memory.BaseState;
 import org.apache.datasketches.memory.Buffer;
 import org.apache.datasketches.memory.Memory;
 import org.apache.datasketches.memory.Prim;
 import org.apache.datasketches.memory.StepBoolean;
+import org.apache.datasketches.memory.Util;
 import org.apache.datasketches.memory.WritableBuffer;
 import org.apache.datasketches.memory.WritableMemory;
 import org.testng.annotations.Test;
@@ -90,7 +90,9 @@ public class BaseStateTest {
 
   @Test
   public void checkGetNativeBaseOffset_Heap() {
-    WritableMemory wmem = WritableMemory.allocate(8);
+    WritableMemory wmem = WritableMemory.allocate(8); //heap
+    final long offset;
+    
     assertEquals(wmem.getNativeBaseOffset(), 0L);
   }
 
@@ -102,7 +104,7 @@ public class BaseStateTest {
 
   @Test(expectedExceptions = IllegalArgumentException.class)
   public void checkByteOrderNull() {
-    BaseState.isNativeByteOrder(null);
+    Util.isNativeByteOrder(null);
     fail();
   }
 
diff --git a/src/test/java/org/apache/datasketches/memory/test/ReflectUtil.java b/src/test/java/org/apache/datasketches/memory/test/ReflectUtil.java
new file mode 100644
index 0000000..c60e113
--- /dev/null
+++ b/src/test/java/org/apache/datasketches/memory/test/ReflectUtil.java
@@ -0,0 +1,143 @@
+/*
+ * 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.test;
+
+import java.lang.reflect.*;
+
+public class ReflectUtil {
+
+  /**
+   * Gets a Class reference to the given class loaded by the SystemClassLoader. 
+   * This will work for private, package-private and abstract classes. 
+   * @param fullyQualifiedBinaryName the binary name is the name of the class file on disk. This does not instantiate
+   * a concrete class, but allows access to constructors, static fields and static methods.
+   * @return the Class object of the given class.
+   */
+  public static Class<?> getClass(String fullyQualifiedBinaryName) {
+    try {
+      ClassLoader scl = ClassLoader.getSystemClassLoader();
+      return scl.loadClass(fullyQualifiedBinaryName);
+    } catch (final Exception e) {
+      throw new RuntimeException(e);
+    }
+  }
+
+  /**
+   * Gets a declared constructor given the owner class and parameter types
+   * @param ownerClass the Class<?> object of the class loaded by the SystemClassLoader.
+   * @param parameterTypes parameter types for the constructor
+   * @return the constructor
+   */
+  public static Constructor<?> getConstructor(final Class<?> ownerClass, final Class<?>... parameterTypes ) {
+    try {
+      Constructor<?> ctor = ownerClass.getDeclaredConstructor(parameterTypes);
+      ctor.setAccessible(true);
+      return ctor;
+    } catch (final Exception e) {
+      throw new RuntimeException(e);
+    }
+  }
+
+  /**
+   * Gets a class instance from its constructor and initializing arguments.
+   * @param constructor the given Constructor
+   * @param initargs the initializing arguments
+   * @return the instantiated class.
+   */
+  public static Object getInstance(final Constructor<?> constructor, final Object... initargs) {
+    try {
+      constructor.setAccessible(true);
+      return constructor.newInstance(initargs);
+    } catch (final Exception e) {
+      throw new RuntimeException(e);
+    }
+  }
+  
+  
+  /**
+   * Gets a declared field of the given the loaded owner class and field name. The accessible flag will be set true.
+   * @param ownerClass the Class<?> object of the class loaded by the SystemClassLoader.
+   * @param fieldName the desired field name
+   * @return the desired field.  
+   */
+  public static Field getField(final Class<?> ownerClass, final String fieldName) {
+    try {
+      Field field = ownerClass.getDeclaredField(fieldName);
+      field.setAccessible(true);
+      return field;
+    } catch (final Exception e) {
+      throw new RuntimeException(e);
+    }
+  }
+  
+  /**
+   * Gets a field value given the loaded owner class and the Field. The accessible flag will be set true.
+   * @param ownerClass the loaded class owning the field
+   * @param field The Field object
+   * @return the returned value as an object.
+   */
+  public static Object getFieldValue(final Class<?> ownerClass, final Field field) {
+    try {
+      field.setAccessible(true);
+      return field.get(ownerClass);
+    } catch (final Exception e) {
+      throw new RuntimeException(e);
+    }
+  }
+  
+  /**
+   * Gets a declared method of the given the loaded owning class, method name and parameter types. 
+   * The accessible flag will be set true. 
+   * @param ownerClass the given 
+   * @param methodName the given method name
+   * @param parameterTypes the list of parameter types
+   * @return the desired method.
+   */
+  public static Method getMethod(final Class<?> ownerClass, final String methodName, final Class<?>... parameterTypes ) {
+    try {
+      Method method = (parameterTypes == null) 
+          ? ownerClass.getDeclaredMethod(methodName)
+          : ownerClass.getDeclaredMethod(methodName, parameterTypes);
+      method.setAccessible(true);
+      return method;
+    } catch (final Exception e) {
+      throw new RuntimeException(e);
+    }
+  }
+  
+//  /**
+//   * Invoke the given method along with its concreteOwnerClass and method argueents.
+//   * Any exception is returned to the caller.
+//   * @param method the given method
+//   * @param concreteOwnerInstance the concrete owning class instance
+//   * @param args the method arguments
+//   * @return the result of the invoked method.
+//   */
+//  public static Object invokeMethod(
+//      final Method method, 
+//      final Object concreteOwnerInstance, 
+//      Object... args) throws IllegalAccessException, InvocationTargetException, IllegalArgumentException {
+//      method.setAccessible(true);
+//      return method.invoke(concreteOwnerInstance, args);
+//  }
+  
+}
+
+

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@datasketches.apache.org
For additional commands, e-mail: commits-help@datasketches.apache.org