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 2022/06/06 01:22:58 UTC

[datasketches-memory17] branch main updated: Code cleanup and simplification.

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

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


The following commit(s) were added to refs/heads/main by this push:
     new 72b9d44  Code cleanup and simplification.
72b9d44 is described below

commit 72b9d44e34c4eeef4923d16dcfaa96e5554a005a
Author: Lee Rhodes <le...@users.noreply.github.com>
AuthorDate: Sun Jun 5 18:22:54 2022 -0700

    Code cleanup and simplification.
---
 .../org/apache/datasketches/memory/BaseState.java  | 237 +++++++-----
 .../org/apache/datasketches/memory/Buffer.java     |   7 +-
 .../memory/DefaultMemoryRequestServer.java         |   2 +-
 .../org/apache/datasketches/memory/Memory.java     |   4 +-
 .../apache/datasketches/memory/WritableBuffer.java |   2 +-
 .../apache/datasketches/memory/WritableMemory.java |   4 +-
 .../memory/internal/BaseBufferImpl.java            |   6 +-
 .../memory/internal/BaseStateImpl.java             | 418 +++++++++++----------
 .../memory/internal/BaseWritableBufferImpl.java    |  96 ++---
 .../memory/internal/BaseWritableMemoryImpl.java    |  69 ++--
 .../memory/internal/NativeWritableBufferImpl.java  |  17 +-
 .../memory/internal/NativeWritableMemoryImpl.java  |  16 +-
 .../internal/NonNativeWritableBufferImpl.java      |  16 +-
 .../internal/NonNativeWritableMemoryImpl.java      |  16 +-
 .../datasketches/memory/internal/Buffer2Test.java  |   2 +-
 .../datasketches/memory/internal/BufferTest.java   |   2 +-
 .../internal/ExampleMemoryRequestServerTest.java   |   2 +-
 .../datasketches/memory/internal/LeafImplTest.java |  16 +-
 .../datasketches/memory/internal/MemoryTest.java   |   8 +-
 .../internal/NativeWritableBufferImplTest.java     |   8 +-
 .../internal/NonNativeWritableBufferImplTest.java  |  16 +-
 .../internal/NonNativeWritableMemoryImplTest.java  |   2 +-
 .../memory/internal/SpecificLeafTest.java          | 101 ++---
 .../memory/internal/WritableMemoryTest.java        |  14 +-
 24 files changed, 510 insertions(+), 571 deletions(-)

diff --git a/src/main/java/org/apache/datasketches/memory/BaseState.java b/src/main/java/org/apache/datasketches/memory/BaseState.java
index ff86e47..50e5cff 100644
--- a/src/main/java/org/apache/datasketches/memory/BaseState.java
+++ b/src/main/java/org/apache/datasketches/memory/BaseState.java
@@ -31,7 +31,7 @@ import jdk.incubator.foreign.ResourceScope;
  *
  * @author Lee Rhodes
  */
-public interface BaseState /* extends AutoCloseable */ {
+public interface BaseState {
 
   /**
    * The java line separator character as a String.
@@ -43,12 +43,42 @@ public interface BaseState /* extends AutoCloseable */ {
       ByteOrder.nativeOrder() == ByteOrder.LITTLE_ENDIAN
       ? ByteOrder.BIG_ENDIAN : ByteOrder.LITTLE_ENDIAN;
 
+  /**
+   * Returns a ByteBuffer view of this Memory object with the given ByteOrder.
+   * Some of the properties of the returned buffer are linked to the properties of this Memory object.
+   * For instance, if this Memory object is immutable (i.e., read-only, see isReadOnly()),
+   * then the resulting buffer is read-only (see Buffer.isReadOnly().
+   * Additionally, if this is a native memory segment, the resulting buffer is direct
+   * (see ByteBuffer.isDirect()). The endianness of the returned buffer will be set to
+   * the given ByteOrder.
+   * @param order the given ByteOrder.
+   * @return a ByteBuffer view of this Memory object with the given ByteOrder.
+   * @throws UnsupportedOperationException - if this segment cannot be mapped onto a ByteBuffer instance,
+   * e.g. because it models an heap-based segment that is not based on a byte[]),
+   * or if its size is greater than Integer.MAX_VALUE.
+   */
+  ByteBuffer asByteBufferView(ByteOrder order);
+
   /**
    * For off-heap segments, this closes the controlling ResourceScope. If the segment is
    * not off-heap, this does nothing.
    */
   void close();
 
+  /**
+   * Returns true if the given object is an instance of this class and has equal contents to
+   * this object in the given range of bytes. This will also check two distinct ranges within the
+   * same object for equals.
+   * @param thisOffsetBytes the starting offset in bytes for this object.
+   * @param that the given BaseState object
+   * @param thatOffsetBytes the starting offset in bytes for the given object
+   * @param lengthBytes the size of the range in bytes
+   * @return true if the given object has equal contents to this object in the given range of
+   * bytes.
+   */
+  boolean equalTo(long thisOffsetBytes, Object that,
+      long thatOffsetBytes, long lengthBytes);
+
   /**
    * Forces any changes made to the contents of this mapped segment to be written to the storage device described
    * by the mapped segment's file descriptor. Please refer to
@@ -57,29 +87,35 @@ public interface BaseState /* extends AutoCloseable */ {
   void force();
 
   /**
-   * Loads the contents of this mapped segment into physical memory. Please refer to
-   * <a href="https://docs.oracle.com/en/java/javase/17/docs/api/jdk.incubator.foreign/jdk/incubator/foreign/MemorySegment.html#load()">load()</a>
+   * Gets the capacity of this object in bytes
+   * @return the capacity of this object in bytes
    */
-  void load();
+  long getCapacity();
 
   /**
-   * Unloads the contents of this mapped segment from physical memory. Please refer to
-   * <a href="https://docs.oracle.com/en/java/javase/17/docs/api/jdk.incubator.foreign/jdk/incubator/foreign/MemorySegment.html#unload()">unload()</a>
+   * Returns the configured MemoryRequestSever or null, if it has not been configured.
+   * @return the configured MemoryRequestSever or null, if it has not been configured.
    */
-  void unload();
+  MemoryRequestServer getMemoryRequestServer();
 
   /**
-   * Tells whether or not the contents of this mapped segment is resident in physical memory. Please refer to
-   * <a href="https://docs.oracle.com/en/java/javase/17/docs/api/jdk.incubator.foreign/jdk/incubator/foreign/MemorySegment.html#isLoaded()">isLoaded()</a>
-   * @return true if it is likely that the contents of this segment is resident in physical memory.
+   * 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.
    */
-  boolean isLoaded();
+  ByteOrder getByteOrder();
 
   /**
-   * Returns the resource scope associated with this memory segment.
-   * @return the resource scope associated with this memory segment.
+   * Returns true if this Memory is backed by a ByteBuffer.
+   * @return true if this Memory is backed by a ByteBuffer.
    */
-  ResourceScope scope();
+  boolean hasByteBuffer();
+
+  /**
+   * Returns true if the MemoryRequestServer has been configured.
+   * @return true if the MemoryRequestServer has been configured.
+   */
+  boolean hasMemoryRequestServer();
 
   /**
    * Is the underlying resource scope alive?
@@ -88,11 +124,10 @@ public interface BaseState /* extends AutoCloseable */ {
   boolean isAlive();
 
   /**
-   * 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.
+   * Returns true if this instance is a Buffer or WritableBuffer instance.
+   * @return true if this instance is a Buffer or WritableBuffer instance.
    */
-  ByteOrder getTypeByteOrder();
+  boolean isBuffer();
 
   /**
    * Returns true if the Native ByteOrder is the same as the ByteOrder of the
@@ -104,91 +139,45 @@ public interface BaseState /* extends AutoCloseable */ {
   boolean isByteOrderCompatible(ByteOrder byteOrder);
 
   /**
-   * Returns true if the given object is an instance of this class and has equal contents to
-   * this object in the given range of bytes. This will also check two distinct ranges within the
-   * same object for equals.
-   * @param thisOffsetBytes the starting offset in bytes for this object.
-   * @param that the given BaseState object
-   * @param thatOffsetBytes the starting offset in bytes for the given object
-   * @param lengthBytes the size of the range in bytes
-   * @return true if the given object has equal contents to this object in the given range of
-   * bytes.
-   */
-  boolean equalTo(long thisOffsetBytes, Object that,
-      long thatOffsetBytes, long lengthBytes);
-
-  /**
-   * Returns a ByteBuffer view of this Memory object with the given ByteOrder.
-   * Some of the properties of the returned buffer are linked to the properties of this Memory object.
-   * For instance, if this Memory object is immutable (i.e., read-only, see isReadOnly()),
-   * then the resulting buffer is read-only (see Buffer.isReadOnly().
-   * Additionally, if this is a native memory segment, the resulting buffer is direct
-   * (see ByteBuffer.isDirect()). The endianness of the returned buffer will be set to
-   * the given ByteOrder.
-   * @param order the given ByteOrder.
-   * @return a ByteBuffer view of this Memory object with the given ByteOrder.
-   * @throws UnsupportedOperationException - if this segment cannot be mapped onto a ByteBuffer instance,
-   * e.g. because it models an heap-based segment that is not based on a byte[]),
-   * or if its size is greater than Integer.MAX_VALUE.
-   */
-  ByteBuffer asByteBufferView(ByteOrder order);
-
-  /**
-   * Returns a new ByteBuffer with a copy of the data from this Memory object.
-   * This new ByteBuffer will be writable, on heap, and with the endianness specified
-   * by the given ByteOrder.
-   * @param order the given ByteOrder.
-   * @return a new ByteBuffer with a copy of the data from this Memory object.
-   */
-  ByteBuffer toByteBuffer(ByteOrder order);
-
-  /**
-   * Returns a copy of the underlying MemorySegment.
-   * The size is limited to <i>Integer.MAX_VALUE</i>.
-   * @return a copy of the underlying MemorySegment
+   * Returns true if the backing resource is direct (off-heap) memory.
+   * This can be true for allocated direct memory, memory mapped files,
+   * or from a wrapped ByteBuffer that was allocated direct.
+   * @return true if the backing resource is direct (off-heap) memory.
    */
-  MemorySegment toMemorySegment();
+  boolean isDirect();
 
   /**
-   * Gets the capacity of this object in bytes
-   * @return the capacity of this object in bytes
+   * Returns true if this instance is a duplicate of a Buffer instance.
+   * @return true if this instance is a duplicate of a Buffer instance.
    */
-  long getCapacity();
+  boolean isDuplicate();
 
   /**
-   * Returns the 64-bit hash of the sequence of bytes in this object specified by
-   * <i>offsetBytes</i>, <i>lengthBytes</i> and a <i>seed</i>.  Note that the sequence of bytes is
-   * always processed in the same order independent of endianness.
-   *
-   * @param offsetBytes the given offset in bytes to the first byte of the byte sequence.
-   * @param lengthBytes the given length in bytes of the byte sequence.
-   * @param seed the given long seed.
-   * @return the 64-bit hash of the sequence of bytes in this object specified by
-   * <i>offsetBytes</i> and <i>lengthBytes</i>.
+   * Returns true if the backing resource is on the Java heap.
+   * This can be true for wrapped heap primitive arrays
+   * or from a wrapped ByteBuffer that was allocated on the Java heap.
+   * @return true if the backing resource is on the Java heap.
    */
-  long xxHash64(long offsetBytes, long lengthBytes, long seed);
+  boolean isHeap();
 
   /**
-   * Returns a 64-bit hash from a single long. This method has been optimized for speed when only
-   * a single hash of a long is required.
-   * @param in A long.
-   * @param seed A long valued seed.
-   * @return the hash.
+   * Tells whether or not the contents of this mapped segment is resident in physical memory. Please refer to
+   * <a href="https://docs.oracle.com/en/java/javase/17/docs/api/jdk.incubator.foreign/jdk/incubator/foreign/MemorySegment.html#isLoaded()">isLoaded()</a>
+   * @return true if it is likely that the contents of this segment is resident in physical memory.
    */
-  long xxHash64(long in, long seed);
+  boolean isLoaded();
 
   /**
-   * Returns true if this Memory is backed by a ByteBuffer.
-   * @return true if this Memory is backed by a ByteBuffer.
+   * Returns true if this instance is of a memory mapped file.
+   * @return true if this instance is of a memory mapped file.
    */
-  boolean hasByteBuffer();
+  boolean isMapped();
 
   /**
-   * Returns true if the backing resource is direct (off-heap) memory.
-   * This is the case for allocated direct memory, memory mapped files,
-   * @return true if the backing resource is direct (off-heap) memory.
+   * Returns true if this instance is of a Memory or WritableMemory instance
+   * @return true if this instance is of a Memory or WritableMemory instance
    */
-  boolean isDirect();
+  boolean isMemory();
 
   /**
    * Returns true if this object or the backing resource is read-only.
@@ -196,6 +185,12 @@ public interface BaseState /* extends AutoCloseable */ {
    */
   boolean isReadOnly();
 
+  /**
+   * Returns true if this instance is a region view of another Memory or Buffer
+   * @return true if this instance is a region view of another Memory or Buffer
+   */
+  boolean isRegion();
+
   /**
    * Returns true if the backing resource of <i>this</i> is identical with the backing resource
    * of <i>that</i>. The capacities must be the same.  If <i>this</i> is a region,
@@ -207,25 +202,32 @@ public interface BaseState /* extends AutoCloseable */ {
   boolean isSameResource(Object that);
 
   /**
-   * Returns the configured MemoryRequestSever or null, if it has not been configured.
-   * @return the configured MemoryRequestSever or null, if it has not been configured.
+   * Loads the contents of this mapped segment into physical memory. Please refer to
+   * <a href="https://docs.oracle.com/en/java/javase/17/docs/api/jdk.incubator.foreign/jdk/incubator/foreign/MemorySegment.html#load()">load()</a>
    */
-  MemoryRequestServer getMemoryRequestServer();
+  void load();
 
   /**
-   * Returns true if the MemoryRequestServer has been configured.
-   * @return true if the MemoryRequestServer has been configured.
+   * Returns the resource scope associated with this memory segment.
+   * @return the resource scope associated with this memory segment.
    */
-  boolean hasMemoryRequestServer();
+  ResourceScope scope();
+
+  //  /**
+  //   * Sets the default MemoryRequestServer to be used in case of capacity overflow of off-heap
+  //   * (Direct or Native) allocated Memory or of on-heap allocated Memory.
+  //   * @param memReqSvr the given default MemoryRequestServer
+  //   */
+  //  void setMemoryRequestServer(MemoryRequestServer memReqSvr);
 
   /**
-   * Sets the default MemoryRequestServer to be used in case of capacity overflow of off-heap
-   * (Direct or Native) allocated Memory or of on-heap allocated Memory.
-   * @param memReqSvr the given default MemoryRequestServer
+   * Returns a new ByteBuffer with a copy of the data from this Memory object.
+   * This new ByteBuffer will be writable, on heap, and with the endianness specified
+   * by the given ByteOrder.
+   * @param order the given ByteOrder.
+   * @return a new ByteBuffer with a copy of the data from this Memory object.
    */
-  void setMemoryRequestServer(MemoryRequestServer memReqSvr);
-
-  //TO STRING
+  ByteBuffer toByteBuffer(ByteOrder order);
 
   /**
    * Returns a description of this object with an optional formatted hex string of the data
@@ -238,4 +240,41 @@ public interface BaseState /* extends AutoCloseable */ {
    */
   String toHexString(String comment, long offsetBytes, int lengthBytes, boolean withData);
 
+  /**
+   * Returns a copy of the underlying MemorySegment.
+   * The size is limited to <i>Integer.MAX_VALUE</i>.
+   * @return a copy of the underlying MemorySegment
+   */
+  MemorySegment toMemorySegment();
+
+  /**
+   * Unloads the contents of this mapped segment from physical memory. Please refer to
+   * <a href="https://docs.oracle.com/en/java/javase/17/docs/api/jdk.incubator.foreign/jdk/incubator/foreign/MemorySegment.html#unload()">unload()</a>
+   */
+  void unload();
+
+  /**
+   * Returns a 64-bit hash from a single long. This method has been optimized for speed when only
+   * a single hash of a long is required.
+   * @param in A long.
+   * @param seed A long valued seed.
+   * @return the hash.
+   */
+  long xxHash64(long in, long seed);
+
+  //TO STRING
+
+  /**
+   * Returns the 64-bit hash of the sequence of bytes in this object specified by
+   * <i>offsetBytes</i>, <i>lengthBytes</i> and a <i>seed</i>.  Note that the sequence of bytes is
+   * always processed in the same order independent of endianness.
+   *
+   * @param offsetBytes the given offset in bytes to the first byte of the byte sequence.
+   * @param lengthBytes the given length in bytes of the byte sequence.
+   * @param seed the given long seed.
+   * @return the 64-bit hash of the sequence of bytes in this object specified by
+   * <i>offsetBytes</i> and <i>lengthBytes</i>.
+   */
+  long xxHash64(long offsetBytes, long lengthBytes, long seed);
+
 }
diff --git a/src/main/java/org/apache/datasketches/memory/Buffer.java b/src/main/java/org/apache/datasketches/memory/Buffer.java
index b73b70a..f6da017 100644
--- a/src/main/java/org/apache/datasketches/memory/Buffer.java
+++ b/src/main/java/org/apache/datasketches/memory/Buffer.java
@@ -84,10 +84,9 @@ public interface Buffer extends BaseBuffer {
    * <i>start</i>, <i>position</i> and <i>end</i>.
    */
   default Buffer duplicate() {
-    return duplicate(getTypeByteOrder());
+    return duplicate(getByteOrder());
   }
 
-
   /**
    * Returns a read-only duplicate view of this Buffer with the same but independent values of
    * <i>start</i>, <i>position</i> and <i>end</i>, but with the specified byteOrder.
@@ -126,7 +125,7 @@ public interface Buffer extends BaseBuffer {
    * <i>position</i> and <i>end</i>.
    */
   default Buffer region() {
-    return region(getPosition(), getEnd() - getPosition(), getTypeByteOrder());
+    return region(getPosition(), getEnd() - getPosition(), getByteOrder());
   }
 
   /**
@@ -158,7 +157,7 @@ public interface Buffer extends BaseBuffer {
    * @return Memory
    */
   default Memory asMemory() {
-    return asMemory(getTypeByteOrder());
+    return asMemory(getByteOrder());
   }
 
   /**
diff --git a/src/main/java/org/apache/datasketches/memory/DefaultMemoryRequestServer.java b/src/main/java/org/apache/datasketches/memory/DefaultMemoryRequestServer.java
index 51c2d2b..f8f828c 100644
--- a/src/main/java/org/apache/datasketches/memory/DefaultMemoryRequestServer.java
+++ b/src/main/java/org/apache/datasketches/memory/DefaultMemoryRequestServer.java
@@ -73,7 +73,7 @@ public final class DefaultMemoryRequestServer implements MemoryRequestServer {
    */
   @Override
   public WritableMemory request(final WritableMemory currentWritableMemory, final long capacityBytes) {
-    final WritableMemory wmem = WritableMemory.allocate((int)capacityBytes, currentWritableMemory.getTypeByteOrder());
+    final WritableMemory wmem = WritableMemory.allocate((int)capacityBytes, currentWritableMemory.getByteOrder());
     return wmem;
   }
 
diff --git a/src/main/java/org/apache/datasketches/memory/Memory.java b/src/main/java/org/apache/datasketches/memory/Memory.java
index 5222a01..1c25d80 100644
--- a/src/main/java/org/apache/datasketches/memory/Memory.java
+++ b/src/main/java/org/apache/datasketches/memory/Memory.java
@@ -138,7 +138,7 @@ public interface Memory extends BaseState {
    * offsetBytes and capacityBytes.
    */
   default Memory region(long offsetBytes, long capacityBytes) {
-    return region(offsetBytes, capacityBytes, getTypeByteOrder());
+    return region(offsetBytes, capacityBytes, getByteOrder());
   }
 
   /**
@@ -170,7 +170,7 @@ public interface Memory extends BaseState {
    * @return a new <i>Buffer</i>
    */
   default Buffer asBuffer() {
-    return asBuffer(getTypeByteOrder());
+    return asBuffer(getByteOrder());
   }
 
   /**
diff --git a/src/main/java/org/apache/datasketches/memory/WritableBuffer.java b/src/main/java/org/apache/datasketches/memory/WritableBuffer.java
index f3cae5d..a87b31e 100644
--- a/src/main/java/org/apache/datasketches/memory/WritableBuffer.java
+++ b/src/main/java/org/apache/datasketches/memory/WritableBuffer.java
@@ -123,7 +123,7 @@ public interface WritableBuffer extends Buffer {
    * @return a new <i>WritableBuffer</i> representing the defined writable region.
    */
   default WritableBuffer writableRegion() {
-    return writableRegion(getPosition(), getEnd() - getPosition(), getTypeByteOrder());
+    return writableRegion(getPosition(), getEnd() - getPosition(), getByteOrder());
   }
 
   /**
diff --git a/src/main/java/org/apache/datasketches/memory/WritableMemory.java b/src/main/java/org/apache/datasketches/memory/WritableMemory.java
index a2a60d2..1e47296 100644
--- a/src/main/java/org/apache/datasketches/memory/WritableMemory.java
+++ b/src/main/java/org/apache/datasketches/memory/WritableMemory.java
@@ -187,7 +187,7 @@ public interface WritableMemory extends Memory {
    * @return a new <i>WritableMemory</i> representing the defined writable region.
    */
   default WritableMemory writableRegion(long offsetBytes, long capacityBytes) {
-    return writableRegion(offsetBytes, capacityBytes, getTypeByteOrder());
+    return writableRegion(offsetBytes, capacityBytes, getByteOrder());
   }
 
   /**
@@ -221,7 +221,7 @@ public interface WritableMemory extends Memory {
    * @return a new <i>WritableBuffer</i> with a view of this WritableMemory
    */
   default WritableBuffer asWritableBuffer() {
-    return asWritableBuffer(getTypeByteOrder());
+    return asWritableBuffer(getByteOrder());
   }
 
   /**
diff --git a/src/main/java/org/apache/datasketches/memory/internal/BaseBufferImpl.java b/src/main/java/org/apache/datasketches/memory/internal/BaseBufferImpl.java
index b85debf..4166ed6 100644
--- a/src/main/java/org/apache/datasketches/memory/internal/BaseBufferImpl.java
+++ b/src/main/java/org/apache/datasketches/memory/internal/BaseBufferImpl.java
@@ -20,6 +20,7 @@
 package org.apache.datasketches.memory.internal;
 
 import org.apache.datasketches.memory.BaseBuffer;
+import org.apache.datasketches.memory.MemoryRequestServer;
 
 import jdk.incubator.foreign.MemorySegment;
 
@@ -49,8 +50,9 @@ public abstract class BaseBufferImpl extends BaseStateImpl implements BaseBuffer
   //Pass-through ctor
   BaseBufferImpl(
       final MemorySegment seg,
-      final int typeId) {
-    super(seg, typeId);
+      final int typeId,
+      final MemoryRequestServer memReqSvr) {
+    super(seg, typeId, memReqSvr);
     capacity = end = seg.byteSize();
   }
 
diff --git a/src/main/java/org/apache/datasketches/memory/internal/BaseStateImpl.java b/src/main/java/org/apache/datasketches/memory/internal/BaseStateImpl.java
index 97580d1..8783e68 100644
--- a/src/main/java/org/apache/datasketches/memory/internal/BaseStateImpl.java
+++ b/src/main/java/org/apache/datasketches/memory/internal/BaseStateImpl.java
@@ -27,6 +27,8 @@ import java.util.Objects;
 
 import org.apache.datasketches.memory.BaseState;
 import org.apache.datasketches.memory.MemoryRequestServer;
+import org.apache.datasketches.memory.WritableBuffer;
+import org.apache.datasketches.memory.WritableMemory;
 
 import jdk.incubator.foreign.MemoryAddress;
 import jdk.incubator.foreign.MemorySegment;
@@ -74,10 +76,6 @@ public abstract class BaseStateImpl implements BaseState {
   // X000 0000
   public static final int BYTEBUF = 1 << 7;
 
-  final MemorySegment seg;
-  final int typeId;
-  MemoryRequestServer memReqSvr;
-
   static {
     final String jdkVer = System.getProperty("java.version");
     final int[] p = parseJavaVersion(jdkVer);
@@ -85,30 +83,17 @@ public abstract class BaseStateImpl implements BaseState {
     JDK_MAJOR = (p[0] == 1) ? p[1] : p[0];
   }
 
-  public BaseStateImpl(final MemorySegment seg, final int typeId) {
+  final MemorySegment seg;
+  final int typeId;
+
+  MemoryRequestServer memReqSvr;
+
+  public BaseStateImpl(final MemorySegment seg, final int typeId, final MemoryRequestServer memReqSvr) {
     this.seg = seg;
     this.typeId = typeId;
+    this.memReqSvr = memReqSvr;
   }
 
-  @Override
-  public void force() { seg.force(); }
-
-  @Override
-  public void load() { seg.load(); }
-
-  @Override
-  public void unload() { seg.unload(); }
-
-  @Override
-  public boolean isLoaded() { return seg.isLoaded(); }
-
-  @Override
-  public ResourceScope scope() { return seg.scope(); }
-
-  @SuppressWarnings("resource")
-  @Override
-  public boolean isAlive() { return seg.scope().isAlive(); }
-
   /**
    * Check the requested offset and length against the allocated size.
    * The invariants equation is: {@code 0 <= reqOff <= reqLen <= reqOff + reqLen <= allocSize}.
@@ -126,161 +111,33 @@ public abstract class BaseStateImpl implements BaseState {
     }
   }
 
-  @SuppressWarnings("resource")
-  @Override
-  public void close() {
-    if (seg != null && seg.scope().isAlive() && !seg.scope().isImplicit()) {
-      if (seg.isNative() || seg.isMapped()) {
-        seg.scope().close();
-      }
+  public static void checkJavaVersion(final String jdkVer, final int p0) {
+    if ( p0 != 17 ) {
+      throw new IllegalArgumentException(
+          "Unsupported JDK Major Version, must be 17; " + jdkVer);
     }
   }
 
-  @Override
-  public final ByteOrder getTypeByteOrder() {
-    return isNonNativeType() ? NON_NATIVE_BYTE_ORDER : ByteOrder.nativeOrder();
-  }
-
-  @Override
-  public final boolean isByteOrderCompatible(final ByteOrder byteOrder) {
-    final ByteOrder typeBO = getTypeByteOrder();
-    return typeBO == ByteOrder.nativeOrder() && typeBO == byteOrder;
-  }
-
-  @Override
-  public final boolean equalTo(final long thisOffsetBytes, final Object that,
-      final long thatOffsetBytes, final long lengthBytes) {
-    return that instanceof BaseStateImpl
-      ? CompareAndCopy.equals(seg, thisOffsetBytes, ((BaseStateImpl) that).seg, thatOffsetBytes, lengthBytes)
-      : false;
-  }
-
-  @Override
-  public final ByteBuffer asByteBufferView(final ByteOrder order) {
-    final ByteBuffer byteBuf = seg.asByteBuffer().order(order);
-    return byteBuf;
-  }
-
-  @Override
-  public ByteBuffer toByteBuffer(final ByteOrder order) {
-    Objects.requireNonNull(order, "The input ByteOrder must not be null");
-    return ByteBuffer.wrap(seg.toByteArray());
-  }
-
-  @Override
-  public MemorySegment toMemorySegment() {
-    final MemorySegment arrSeg = MemorySegment.ofArray(new byte[(int)seg.byteSize()]);
-    arrSeg.copyFrom(seg);
-    return arrSeg;
-  }
-
-  @Override
-  public final long getCapacity() {
-    return seg.byteSize();
-  }
-
-  @Override
-  public MemoryRequestServer getMemoryRequestServer() {
-    return memReqSvr;
-  }
-
-  @Override
-  public boolean hasMemoryRequestServer() {
-    return memReqSvr != null;
-  }
-
-  @Override
-  public void setMemoryRequestServer(final MemoryRequestServer memReqSvr) {
-    this.memReqSvr = memReqSvr;
-  }
-
-  int getTypeId() {
-    return typeId;
-  }
-
-  @Override
-  public final long xxHash64(final long offsetBytes, final long lengthBytes, final long seed) {
-    return XxHash64.hash(seg, offsetBytes, lengthBytes, seed);
-  }
-
-  @Override
-  public final long xxHash64(final long in, final long seed) {
-    return XxHash64.hash(in, seed);
-  }
-
-  @Override
-  public final boolean hasByteBuffer() {
-    return isByteBufferType();
-  }
-
-  @Override
-  public final boolean isDirect() {
-    return seg.isNative();
-  }
-
-  @Override
-  public final boolean isSameResource(final Object that) {
-    if (this == that) { return true; }
-    final MemoryAddress myAdd = seg.address();
-    if (that instanceof BaseStateImpl) {
-      final MemoryAddress thatAdd = ((BaseStateImpl)that).seg.address();
-      return (myAdd.equals(thatAdd));
+  /**
+   * Returns first two number groups of the java version string.
+   * @param jdkVer the java version string from System.getProperty("java.version").
+   * @return first two number groups of the java version string.
+   * @throws IllegalArgumentException for an improper Java version string.
+   */
+  public static int[] parseJavaVersion(final String jdkVer) {
+    final int p0, p1;
+    try {
+      String[] parts = jdkVer.trim().split("\\.");//grab only number groups and "."
+      parts = parts[0].split("\\."); //split out the number groups
+      p0 = Integer.parseInt(parts[0]); //the first number group
+      p1 = (parts.length > 1) ? Integer.parseInt(parts[1]) : 0; //2nd number group, or 0
+    } catch (final NumberFormatException | ArrayIndexOutOfBoundsException  e) {
+      throw new IllegalArgumentException("Improper Java -version string: " + jdkVer + "\n" + e);
     }
-    return false;
-  }
-
-  //TYPE ID Management
-
-  @Override
-  public final boolean isReadOnly() {
-    return ((getTypeId() & READONLY) > 0) || seg.isReadOnly();
-  }
-
-  //  final static int setReadOnlyType(final int type, final boolean readOnly) { //not used
-  //    return (type & ~READONLY) | (readOnly ? READONLY : 0);
-  //  }
-
-  final boolean isRegionType() {
-    return (getTypeId() & REGION) > 0;
-  }
-
-  final boolean isDuplicateType() {
-    return (getTypeId() & DUPLICATE) > 0;
-  }
-
-  final boolean isMemoryType() {
-    return (getTypeId() & BUFFER) == 0;
-  }
-
-  final boolean isBufferType() {
-    return (getTypeId() & BUFFER) > 0;
-  }
-
-  final boolean isNativeType() {
-    return (getTypeId() & NONNATIVE) == 0;
-  }
-
-  final boolean isNonNativeType() {
-    return (getTypeId() & NONNATIVE) > 0;
-  }
-
-  final boolean isHeapType() { //test only
-    return (getTypeId() >>> 3 & 3) == 0;
-  }
-
-  final boolean isDirectType() { //test only
-    return (getTypeId() & DIRECT) > 0;
-  }
-
-  final boolean isMapType() { //test only
-    return (getTypeId() & MAP) > 0;
-  }
-
-  final boolean isByteBufferType() {
-    return (getTypeId() & BYTEBUF) > 0;
+    checkJavaVersion(jdkVer, p0);
+    return new int[] {p0, p1};
   }
 
-  //TO STRING
   /**
    * Decodes the resource type. This is primarily for debugging.
    * @param typeId the given typeId
@@ -325,10 +182,38 @@ public abstract class BaseStateImpl implements BaseState {
     return sb.toString();
   }
 
-  @Override
-  public final String toHexString(final String comment, final long offsetBytes, final int lengthBytes,
-      final boolean withData) {
-    return toHex(this, comment, offsetBytes, lengthBytes, withData);
+  static final WritableBuffer selectBuffer(
+      final MemorySegment segment,
+      final int type,
+      final MemoryRequestServer memReqSvr,
+      final boolean byteBufferType,
+      final boolean mapType,
+      final boolean nativeBOType) {
+    final MemoryRequestServer memReqSvr2 = (byteBufferType || mapType) ? null : memReqSvr;
+    final WritableBuffer wbuf;
+    if (nativeBOType) {
+      wbuf = new NativeWritableBufferImpl(segment, type, memReqSvr2);
+    } else { //non-native BO
+      wbuf = new NonNativeWritableBufferImpl(segment, type, memReqSvr2);
+    }
+    return wbuf;
+  }
+
+  static final WritableMemory selectMemory(
+      final MemorySegment segment,
+      final int type,
+      final MemoryRequestServer memReqSvr,
+      final boolean byteBufferType,
+      final boolean mapType,
+      final boolean nativeBOType) {
+    final MemoryRequestServer memReqSvr2 = (byteBufferType || mapType) ? null : memReqSvr;
+    final WritableMemory wmem;
+    if (nativeBOType) {
+      wmem = new NativeWritableMemoryImpl(segment, type, memReqSvr2);
+    } else { //non-native BO
+      wmem = new NonNativeWritableMemoryImpl(segment, type, memReqSvr2);
+    }
+    return wmem;
   }
 
   /**
@@ -362,7 +247,7 @@ public abstract class BaseStateImpl implements BaseState {
     sb.append("MemoryAddress hashCode : ").append(addHCStr).append(LS);
     sb.append("MemReqSvr, hashCode    : ").append(memReqStr).append(LS);
     sb.append("Read Only              : ").append(state.isReadOnly()).append(LS);
-    sb.append("Type Byte Order        : ").append(state.getTypeByteOrder().toString()).append(LS);
+    sb.append("Type Byte Order        : ").append(state.getByteOrder().toString()).append(LS);
     sb.append("Native Byte Order      : ").append(ByteOrder.nativeOrder().toString()).append(LS);
     sb.append("JDK Runtime Version    : ").append(JDK).append(LS);
     //Data detail
@@ -382,31 +267,166 @@ public abstract class BaseStateImpl implements BaseState {
     return sb.toString();
   }
 
-  /**
-   * Returns first two number groups of the java version string.
-   * @param jdkVer the java version string from System.getProperty("java.version").
-   * @return first two number groups of the java version string.
-   * @throws IllegalArgumentException for an improper Java version string.
-   */
-  public static int[] parseJavaVersion(final String jdkVer) {
-    final int p0, p1;
-    try {
-      String[] parts = jdkVer.trim().split("\\.");//grab only number groups and "."
-      parts = parts[0].split("\\."); //split out the number groups
-      p0 = Integer.parseInt(parts[0]); //the first number group
-      p1 = (parts.length > 1) ? Integer.parseInt(parts[1]) : 0; //2nd number group, or 0
-    } catch (final NumberFormatException | ArrayIndexOutOfBoundsException  e) {
-      throw new IllegalArgumentException("Improper Java -version string: " + jdkVer + "\n" + e);
+  @Override
+  public final ByteBuffer asByteBufferView(final ByteOrder order) {
+    final ByteBuffer byteBuf = seg.asByteBuffer().order(order);
+    return byteBuf;
+  }
+
+  @SuppressWarnings("resource")
+  @Override
+  public void close() {
+    if (seg != null && seg.scope().isAlive() && !seg.scope().isImplicit()) {
+      if (seg.isNative() || seg.isMapped()) {
+        seg.scope().close();
+      }
     }
-    checkJavaVersion(jdkVer, p0);
-    return new int[] {p0, p1};
   }
 
-  public static void checkJavaVersion(final String jdkVer, final int p0) {
-    if ( p0 != 17 ) {
-      throw new IllegalArgumentException(
-          "Unsupported JDK Major Version, must be 17; " + jdkVer);
+  @Override
+  public final boolean equalTo(final long thisOffsetBytes, final Object that,
+      final long thatOffsetBytes, final long lengthBytes) {
+    return that instanceof BaseStateImpl
+      ? CompareAndCopy.equals(seg, thisOffsetBytes, ((BaseStateImpl) that).seg, thatOffsetBytes, lengthBytes)
+      : false;
+  }
+
+  @Override
+  public void force() { seg.force(); }
+
+  @Override
+  public final long getCapacity() {
+    return seg.byteSize();
+  }
+
+  @Override
+  public MemoryRequestServer getMemoryRequestServer() {
+    return memReqSvr;
+  }
+
+  @Override
+  public final ByteOrder getByteOrder() {
+    return (typeId & NONNATIVE) > 0 ? NON_NATIVE_BYTE_ORDER : ByteOrder.nativeOrder();
+  }
+
+  @Override
+  public final boolean hasByteBuffer() {
+    return (typeId & BYTEBUF) > 0;
+  }
+
+  @Override
+  public boolean hasMemoryRequestServer() {
+    return memReqSvr != null;
+  }
+
+  @SuppressWarnings("resource")
+  @Override
+  public boolean isAlive() { return seg.scope().isAlive(); }
+
+  @Override
+  public final boolean isByteOrderCompatible(final ByteOrder byteOrder) {
+    final ByteOrder typeBO = getByteOrder();
+    return typeBO == ByteOrder.nativeOrder() && typeBO == byteOrder;
+  }
+
+  @Override
+  public final boolean isBuffer() {
+    return (typeId & BUFFER) > 0;
+  }
+
+  @Override
+  public final boolean isDirect() {
+    assert seg.isNative() == (typeId & DIRECT) > 0;
+    return seg.isNative();
+  }
+
+  @Override
+  public final boolean isDuplicate() {
+    return (typeId & DUPLICATE) > 0;
+  }
+
+  @Override
+  public final boolean isHeap() {
+    return !isDirect() && !isMapped();
+  }
+
+  @Override
+  public boolean isLoaded() { return seg.isLoaded(); }
+
+  @Override
+  public boolean isMapped() {
+    assert seg.isMapped() == (typeId & MAP) > 0;
+    return seg.isMapped();
+  }
+
+  @Override
+  public final boolean isMemory() {
+    return (typeId & BUFFER) == 0;
+  }
+
+  @Override
+  public final boolean isReadOnly() {
+    assert seg.isReadOnly() == (typeId & READONLY) > 0;
+    return seg.isReadOnly();
+  }
+
+  @Override
+  public final boolean isRegion() {
+    return (typeId & REGION) > 0;
+  }
+
+  @Override
+  public final boolean isSameResource(final Object that) {
+    if (this == that) { return true; }
+    final MemoryAddress myAdd = seg.address();
+    if (that instanceof BaseStateImpl) {
+      final MemoryAddress thatAdd = ((BaseStateImpl)that).seg.address();
+      return (myAdd.equals(thatAdd));
     }
+    return false;
+  }
+
+  @Override
+  public void load() { seg.load(); }
+
+  @Override
+  public ResourceScope scope() { return seg.scope(); }
+
+  //  @Override
+  //  public void setMemoryRequestServer(final MemoryRequestServer memReqSvr) {
+  //    this.memReqSvr = memReqSvr;
+  //  }
+
+  @Override
+  public ByteBuffer toByteBuffer(final ByteOrder order) {
+    Objects.requireNonNull(order, "The input ByteOrder must not be null");
+    return ByteBuffer.wrap(seg.toByteArray());
+  }
+
+  @Override
+  public final String toHexString(final String comment, final long offsetBytes, final int lengthBytes,
+      final boolean withData) {
+    return toHex(this, comment, offsetBytes, lengthBytes, withData);
+  }
+
+  @Override
+  public MemorySegment toMemorySegment() {
+    final MemorySegment arrSeg = MemorySegment.ofArray(new byte[(int)seg.byteSize()]);
+    arrSeg.copyFrom(seg);
+    return arrSeg;
+  }
+
+  @Override
+  public void unload() { seg.unload(); }
+
+  @Override
+  public final long xxHash64(final long in, final long seed) {
+    return XxHash64.hash(in, seed);
+  }
+
+  @Override
+  public final long xxHash64(final long offsetBytes, final long lengthBytes, final long seed) {
+    return XxHash64.hash(seg, offsetBytes, lengthBytes, seed);
   }
 
 }
diff --git a/src/main/java/org/apache/datasketches/memory/internal/BaseWritableBufferImpl.java b/src/main/java/org/apache/datasketches/memory/internal/BaseWritableBufferImpl.java
index 180c09a..e8ba9db 100644
--- a/src/main/java/org/apache/datasketches/memory/internal/BaseWritableBufferImpl.java
+++ b/src/main/java/org/apache/datasketches/memory/internal/BaseWritableBufferImpl.java
@@ -25,6 +25,7 @@ import java.util.Objects;
 
 import org.apache.datasketches.memory.Buffer;
 import org.apache.datasketches.memory.Memory;
+import org.apache.datasketches.memory.MemoryRequestServer;
 import org.apache.datasketches.memory.ReadOnlyException;
 import org.apache.datasketches.memory.WritableBuffer;
 import org.apache.datasketches.memory.WritableMemory;
@@ -55,8 +56,9 @@ public abstract class BaseWritableBufferImpl extends BaseBufferImpl implements W
   //Pass-through constructor
   BaseWritableBufferImpl(
       final MemorySegment seg,
-      final int typeId) {
-    super(seg, typeId);
+      final int typeId,
+      final MemoryRequestServer memReqSvr) {
+    super(seg, typeId, memReqSvr);
   }
 
   //NO WRAP HEAP ARRAY RESOURCE
@@ -74,13 +76,13 @@ public abstract class BaseWritableBufferImpl extends BaseBufferImpl implements W
         | (localReadOnly ? READONLY : 0)
         | (seg.isNative() ? DIRECT : 0)
         | (seg.isMapped() ? MAP : 0);
+    final WritableBuffer wbuf;
     if (byteOrder == NON_NATIVE_BYTE_ORDER) {
       type |= NONNATIVE;
-      final WritableBuffer wbuf = NonNativeWritableBufferImpl.notMemoryExtendable(seg, type);
-      wbuf.setStartPositionEnd(0, byteBuffer.position(), byteBuffer.limit());
-      return wbuf;
+      wbuf = new NonNativeWritableBufferImpl(seg, type, null);
+    } else {
+      wbuf = new NativeWritableBufferImpl(seg, type, null);
     }
-    final WritableBuffer wbuf = NativeWritableBufferImpl.notMemoryExtendable(seg, type);
     wbuf.setStartPositionEnd(0, byteBuffer.position(), byteBuffer.limit());
     return wbuf;
   }
@@ -114,11 +116,11 @@ public abstract class BaseWritableBufferImpl extends BaseBufferImpl implements W
     final MemorySegment slice = (readOnly && !seg.isReadOnly())
         ? seg.asSlice(offsetBytes, capacityBytes).asReadOnly()
         : seg.asSlice(offsetBytes, capacityBytes);
-    final boolean duplicateType = isDuplicateType();
+    final boolean duplicateType = isDuplicate();
     final boolean mapType = seg.isMapped();
     final boolean directType = seg.isNative();
     final boolean nativeBOType = byteOrder == ByteOrder.nativeOrder();
-    final boolean byteBufferType = isByteBufferType();
+    final boolean byteBufferType = hasByteBuffer();
     final int type = BUFFER | REGION
         | (readOnly ? READONLY : 0)
         | (duplicateType ? DUPLICATE : 0)
@@ -126,32 +128,21 @@ public abstract class BaseWritableBufferImpl extends BaseBufferImpl implements W
         | (directType ? DIRECT : 0)
         | (nativeBOType ? NATIVE : NONNATIVE)
         | (byteBufferType ? BYTEBUF : 0);
-    if (byteBufferType) {
-      if (nativeBOType) { return NativeWritableBufferImpl.notMemoryExtendable(slice, type); }
-      return NonNativeWritableBufferImpl.notMemoryExtendable(slice, type);
-    }
-    if (mapType) {
-      if (nativeBOType) { return NativeWritableBufferImpl.notMemoryExtendable(slice, type); }
-      return NonNativeWritableBufferImpl.notMemoryExtendable(slice, type);
-    }
-    if (directType) {
-      if (nativeBOType) { return NativeWritableBufferImpl.memoryExtendable(slice, type, memReqSvr); }
-      return NonNativeWritableBufferImpl.memoryExtendable(slice, type, memReqSvr);
-    }
-    //else heap type
-    if (nativeBOType) { return NativeWritableBufferImpl.memoryExtendable(slice, type, memReqSvr); }
-    return NonNativeWritableBufferImpl.memoryExtendable(slice, type, memReqSvr);
+
+    final WritableBuffer wbuf = selectBuffer(slice, type, memReqSvr, byteBufferType, mapType, nativeBOType);
+    wbuf.setStartPositionEnd(0, 0, wbuf.getCapacity());
+    return wbuf;
   }
 
   //DUPLICATES
   @Override
   public Buffer duplicate() {
-    return toWritableDuplicateImpl(true, getTypeByteOrder());
+    return duplicateImpl(true, getByteOrder());
   }
 
   @Override
   public Buffer duplicate(final ByteOrder byteOrder) {
-    return toWritableDuplicateImpl(true, byteOrder);
+    return duplicateImpl(true, byteOrder);
   }
 
   @Override
@@ -159,7 +150,7 @@ public abstract class BaseWritableBufferImpl extends BaseBufferImpl implements W
     if (isReadOnly()) {
       throw new ReadOnlyException("Cannot create a writable duplicate from a read-only Buffer.");
     }
-    return toWritableDuplicateImpl(false, getTypeByteOrder());
+    return duplicateImpl(false, getByteOrder());
   }
 
   @Override
@@ -167,44 +158,27 @@ public abstract class BaseWritableBufferImpl extends BaseBufferImpl implements W
     if (isReadOnly()) {
       throw new ReadOnlyException("Cannot create a writable duplicate from a read-only Buffer.");
     }
-    return toWritableDuplicateImpl(false, byteOrder);
+    return duplicateImpl(false, byteOrder);
   }
 
-  private WritableBuffer toWritableDuplicateImpl(final boolean localReadOnly, final ByteOrder byteOrder) {
+  private WritableBuffer duplicateImpl(final boolean localReadOnly, final ByteOrder byteOrder) {
     if (!this.isAlive()) { throw new IllegalStateException("This Memory is not alive."); }
     final boolean readOnly = isReadOnly() || localReadOnly;
     final MemorySegment seg2 = (readOnly && !seg.isReadOnly()) ? seg.asReadOnly() : seg;
-    final boolean regionType = isRegionType();
-    final boolean duplicateType = true;
+    final boolean regionType = isRegion();
     final boolean mapType = seg.isMapped();
     final boolean directType = seg.isNative();
     final boolean nativeBOType = byteOrder == ByteOrder.nativeOrder();
-    final boolean byteBufferType = isByteBufferType();
-    final int type = BUFFER
+    final boolean byteBufferType = hasByteBuffer();
+    final int type = BUFFER | DUPLICATE
         | (readOnly ? READONLY : 0)
         | (regionType ? REGION : 0)
-        | (duplicateType ? DUPLICATE : 0)
         | (mapType ? MAP : 0)
         | (directType ? DIRECT : 0)
         | (nativeBOType ? NATIVE : NONNATIVE)
         | (byteBufferType ? BYTEBUF : 0);
 
-    WritableBuffer wbuf;
-    if (byteBufferType) {
-      if (nativeBOType) { wbuf = NativeWritableBufferImpl.notMemoryExtendable(seg2, type); }
-      else { wbuf = NonNativeWritableBufferImpl.notMemoryExtendable(seg2, type); }
-    }
-    if (mapType) {
-      if (nativeBOType) { wbuf = NativeWritableBufferImpl.notMemoryExtendable(seg2, type); }
-      else { wbuf = NonNativeWritableBufferImpl.notMemoryExtendable(seg2, type); }
-    }
-    if (directType) {
-      if (nativeBOType) { wbuf = NativeWritableBufferImpl.memoryExtendable(seg2, type, memReqSvr); }
-      else { wbuf = NonNativeWritableBufferImpl.memoryExtendable(seg2, type, memReqSvr); }
-    }
-    //else heap type
-    if (nativeBOType) { wbuf = NativeWritableBufferImpl.memoryExtendable(seg2, type, memReqSvr); }
-    else { wbuf = NonNativeWritableBufferImpl.memoryExtendable(seg2, type, memReqSvr); }
+    final WritableBuffer wbuf = selectBuffer(seg2, type, memReqSvr, byteBufferType, mapType, nativeBOType);
     wbuf.setStartPositionEnd(getStart(), getPosition(), getEnd());
     return wbuf;
   }
@@ -230,12 +204,12 @@ public abstract class BaseWritableBufferImpl extends BaseBufferImpl implements W
     Objects.requireNonNull(byteOrder, "byteOrder must be non-null");
     final boolean readOnly = isReadOnly() || localReadOnly;
     final MemorySegment seg2 = (readOnly && !seg.isReadOnly()) ? seg.asReadOnly() : seg;
-    final boolean regionType = isRegionType();
-    final boolean duplicateType = isDuplicateType();
+    final boolean regionType = isRegion();
+    final boolean duplicateType = isDuplicate();
     final boolean mapType = seg.isMapped();
     final boolean directType = seg.isNative();
     final boolean nativeBOType = byteOrder == ByteOrder.nativeOrder();
-    final boolean byteBufferType = isByteBufferType();
+    final boolean byteBufferType = hasByteBuffer();
     final int type = MEMORY
         | (readOnly ? READONLY : 0)
         | (regionType ? REGION : 0)
@@ -244,22 +218,8 @@ public abstract class BaseWritableBufferImpl extends BaseBufferImpl implements W
         | (directType ? DIRECT : 0)
         | (nativeBOType ? NATIVE : NONNATIVE)
         | (byteBufferType ? BYTEBUF : 0);
-    WritableMemory wmem;
-    if (byteBufferType) {
-      if (nativeBOType) { wmem = NativeWritableMemoryImpl.notMemoryExtendable(seg2, type); }
-      else { wmem = NonNativeWritableMemoryImpl.notMemoryExtendable(seg2, type); }
-    }
-    if (mapType) {
-      if (nativeBOType) { wmem = NativeWritableMemoryImpl.notMemoryExtendable(seg2, type); }
-      else { wmem = NonNativeWritableMemoryImpl.notMemoryExtendable(seg2, type); }
-    }
-    if (directType) {
-      if (nativeBOType) { wmem = NativeWritableMemoryImpl.memoryExtendable(seg2, type, memReqSvr); }
-      else { wmem = NonNativeWritableMemoryImpl.memoryExtendable(seg2, type, memReqSvr); }
-    }
-    //else heap type
-    if (nativeBOType) { wmem = NativeWritableMemoryImpl.memoryExtendable(seg2, type, memReqSvr); }
-    else { wmem = NonNativeWritableMemoryImpl.memoryExtendable(seg2, type, memReqSvr); }
+
+    final WritableMemory wmem = selectMemory(seg2, type, memReqSvr, byteBufferType, mapType, nativeBOType);
     return wmem;
   }
 
diff --git a/src/main/java/org/apache/datasketches/memory/internal/BaseWritableMemoryImpl.java b/src/main/java/org/apache/datasketches/memory/internal/BaseWritableMemoryImpl.java
index 296b059..ae5bb9c 100644
--- a/src/main/java/org/apache/datasketches/memory/internal/BaseWritableMemoryImpl.java
+++ b/src/main/java/org/apache/datasketches/memory/internal/BaseWritableMemoryImpl.java
@@ -63,8 +63,9 @@ public abstract class BaseWritableMemoryImpl extends BaseStateImpl implements Wr
   //Pass-through constructor
   BaseWritableMemoryImpl(
       final MemorySegment seg,
-      final int typeId) {
-    super(seg, typeId);
+      final int typeId,
+      final MemoryRequestServer memReqSvr) {
+    super(seg, typeId, memReqSvr);
   }
 
   //WRAP HEAP ARRAY RESOURCE
@@ -77,9 +78,9 @@ public abstract class BaseWritableMemoryImpl extends BaseStateImpl implements Wr
         | (seg.isReadOnly() ? READONLY : 0);
     if (byteOrder == NON_NATIVE_BYTE_ORDER) {
       type |= NONNATIVE;
-      return NonNativeWritableMemoryImpl.memoryExtendable(seg, type, memReqSvr);
+      return new NonNativeWritableMemoryImpl(seg, type, memReqSvr);
     }
-    return NativeWritableMemoryImpl.memoryExtendable(seg, type, memReqSvr);
+    return new NativeWritableMemoryImpl(seg, type, memReqSvr);
   }
 
   //BYTE BUFFER RESOURCE
@@ -97,9 +98,9 @@ public abstract class BaseWritableMemoryImpl extends BaseStateImpl implements Wr
         | (seg.isMapped() ? MAP : 0);
     if (byteOrder == NON_NATIVE_BYTE_ORDER) {
       type |= NONNATIVE;
-      return NonNativeWritableMemoryImpl.notMemoryExtendable(seg, type);
+      return new NonNativeWritableMemoryImpl(seg, type, null);
     }
-    return NativeWritableMemoryImpl.notMemoryExtendable(seg, type);
+    return new NativeWritableMemoryImpl(seg, type, null);
   }
 
   //MAP RESOURCE
@@ -148,8 +149,8 @@ public abstract class BaseWritableMemoryImpl extends BaseStateImpl implements Wr
         | (localReadOnly ? READONLY : 0)
         | (nativeBOType ? NATIVE : NONNATIVE);
     return nativeBOType
-        ? NativeWritableMemoryImpl.notMemoryExtendable(seg, type)
-        : NonNativeWritableMemoryImpl.notMemoryExtendable(seg, type);
+        ? new NativeWritableMemoryImpl(seg, type, null)
+        : new NonNativeWritableMemoryImpl(seg, type, null);
   }
 
   //DIRECT RESOURCE
@@ -180,8 +181,8 @@ public abstract class BaseWritableMemoryImpl extends BaseStateImpl implements Wr
     final int type = MEMORY | DIRECT
         | (nativeBOType ? NATIVE : NONNATIVE);
     return nativeBOType
-        ? NativeWritableMemoryImpl.memoryExtendable(seg, type, memReqSvr)
-        : NonNativeWritableMemoryImpl.memoryExtendable(seg, type, memReqSvr);
+        ? new NativeWritableMemoryImpl(seg, type, memReqSvr)
+        : new NonNativeWritableMemoryImpl(seg, type, memReqSvr);
   }
 
   //REGION DERIVED
@@ -210,11 +211,11 @@ public abstract class BaseWritableMemoryImpl extends BaseStateImpl implements Wr
     final MemorySegment slice = (readOnly && !seg.isReadOnly())
         ? seg.asSlice(offsetBytes, capacityBytes).asReadOnly()
         : seg.asSlice(offsetBytes, capacityBytes);
-    final boolean duplicateType = isDuplicateType();
+    final boolean duplicateType = isDuplicate();
     final boolean mapType = seg.isMapped();
     final boolean directType = seg.isNative();
     final boolean nativeBOType = byteOrder == ByteOrder.nativeOrder();
-    final boolean byteBufferType = isByteBufferType();
+    final boolean byteBufferType = hasByteBuffer();
     final int type = MEMORY | REGION
         | (readOnly ? READONLY : 0)
         | (duplicateType ? DUPLICATE : 0)
@@ -222,21 +223,9 @@ public abstract class BaseWritableMemoryImpl extends BaseStateImpl implements Wr
         | (directType ? DIRECT : 0)
         | (nativeBOType ? NATIVE : NONNATIVE)
         | (byteBufferType ? BYTEBUF : 0);
-    if (byteBufferType) {
-      if (nativeBOType) { return NativeWritableMemoryImpl.notMemoryExtendable(slice, type); }
-      return NonNativeWritableMemoryImpl.notMemoryExtendable(slice, type);
-    }
-    if (mapType) {
-      if (nativeBOType) { return NativeWritableMemoryImpl.notMemoryExtendable(slice, type); }
-      return NonNativeWritableMemoryImpl.notMemoryExtendable(slice, type);
-    }
-    if (directType) {
-      if (nativeBOType) { return NativeWritableMemoryImpl.memoryExtendable(slice, type, memReqSvr); }
-      return NonNativeWritableMemoryImpl.memoryExtendable(slice, type, memReqSvr);
-    }
-    //else heap type
-    if (nativeBOType) { return NativeWritableMemoryImpl.memoryExtendable(slice, type, memReqSvr); }
-    return NonNativeWritableMemoryImpl.memoryExtendable(slice, type, memReqSvr);
+
+    final WritableMemory wmem = selectMemory(slice, type, memReqSvr, byteBufferType, mapType, nativeBOType);
+    return wmem;
   }
 
   //AS BUFFER DERIVED
@@ -260,12 +249,12 @@ public abstract class BaseWritableMemoryImpl extends BaseStateImpl implements Wr
     Objects.requireNonNull(byteOrder, "byteOrder must be non-null");
     final boolean readOnly = isReadOnly() || localReadOnly;
     final MemorySegment seg2 = (readOnly && !seg.isReadOnly()) ? seg.asReadOnly() : seg;
-    final boolean regionType = isRegionType();
-    final boolean duplicateType = isDuplicateType();
+    final boolean regionType = isRegion();
+    final boolean duplicateType = isDuplicate();
     final boolean mapType = seg.isMapped();
     final boolean directType = seg.isNative();
     final boolean nativeBOType = byteOrder == ByteOrder.nativeOrder();
-    final boolean byteBufferType = isByteBufferType();
+    final boolean byteBufferType = hasByteBuffer();
     final int type = BUFFER
         | (readOnly ? READONLY : 0)
         | (regionType ? REGION : 0)
@@ -274,23 +263,9 @@ public abstract class BaseWritableMemoryImpl extends BaseStateImpl implements Wr
         | (mapType ? MAP : 0)
         | (nativeBOType ? NATIVE : NONNATIVE)
         | (byteBufferType ? BYTEBUF : 0);
-    WritableBuffer wbuf;
-    if (byteBufferType) {
-      if (nativeBOType) { wbuf = NativeWritableBufferImpl.notMemoryExtendable(seg2, type); }
-      else { wbuf = NonNativeWritableBufferImpl.notMemoryExtendable(seg2, type); }
-    }
-    if (mapType) {
-      if (nativeBOType) { wbuf = NativeWritableBufferImpl.notMemoryExtendable(seg2, type); }
-      else { wbuf = NonNativeWritableBufferImpl.notMemoryExtendable(seg2, type); }
-    }
-    if (directType) {
-      if (nativeBOType) { wbuf = NativeWritableBufferImpl.memoryExtendable(seg2, type, memReqSvr); }
-      else { wbuf = NonNativeWritableBufferImpl.memoryExtendable(seg2, type, memReqSvr); }
-    }
-    //else heap type
-    if (nativeBOType) { wbuf = NativeWritableBufferImpl.memoryExtendable(seg2, type, memReqSvr); }
-    else { wbuf = NonNativeWritableBufferImpl.memoryExtendable(seg2, type, memReqSvr); }
-    wbuf.setStartPositionEnd(0, 0, getCapacity());
+
+    final WritableBuffer wbuf = selectBuffer(seg2, type, memReqSvr, byteBufferType, mapType, nativeBOType);
+    wbuf.setStartPositionEnd(0, 0, wbuf.getCapacity());
     return wbuf;
   }
 
diff --git a/src/main/java/org/apache/datasketches/memory/internal/NativeWritableBufferImpl.java b/src/main/java/org/apache/datasketches/memory/internal/NativeWritableBufferImpl.java
index aed07c7..f9f45f7 100644
--- a/src/main/java/org/apache/datasketches/memory/internal/NativeWritableBufferImpl.java
+++ b/src/main/java/org/apache/datasketches/memory/internal/NativeWritableBufferImpl.java
@@ -48,27 +48,12 @@ final class NativeWritableBufferImpl extends BaseWritableBufferImpl {
 
   //Pass-through ctor
   NativeWritableBufferImpl(
-      final MemorySegment seg,
-      final int typeId) {
-    super(seg, typeId);
-  }
-
-  static NativeWritableBufferImpl memoryExtendable(
       final MemorySegment seg,
       final int typeId,
       final MemoryRequestServer memReqSvr) {
-    final NativeWritableBufferImpl impl = new NativeWritableBufferImpl(seg, typeId);
-    if (memReqSvr != null) { impl.setMemoryRequestServer(memReqSvr); }
-    return impl;
+    super(seg, typeId, memReqSvr);
   }
 
-  static NativeWritableBufferImpl notMemoryExtendable(
-      final MemorySegment seg,
-      final int typeId) {
-    return new NativeWritableBufferImpl(seg, typeId);
-  }
-
-
   //PRIMITIVE getX() and getXArray()
   @Override
   public char getChar() {
diff --git a/src/main/java/org/apache/datasketches/memory/internal/NativeWritableMemoryImpl.java b/src/main/java/org/apache/datasketches/memory/internal/NativeWritableMemoryImpl.java
index 5f279a7..9f3feea 100644
--- a/src/main/java/org/apache/datasketches/memory/internal/NativeWritableMemoryImpl.java
+++ b/src/main/java/org/apache/datasketches/memory/internal/NativeWritableMemoryImpl.java
@@ -47,24 +47,10 @@ final class NativeWritableMemoryImpl extends BaseWritableMemoryImpl {
 
   //Pass-through ctor
   NativeWritableMemoryImpl(
-      final MemorySegment seg,
-      final int typeId) {
-    super(seg, typeId);
-  }
-
-  static NativeWritableMemoryImpl memoryExtendable(
       final MemorySegment seg,
       final int typeId,
       final MemoryRequestServer memReqSvr) {
-    final NativeWritableMemoryImpl impl = new NativeWritableMemoryImpl(seg, typeId);
-    if (memReqSvr != null) { impl.setMemoryRequestServer(memReqSvr); }
-    return impl;
-  }
-
-  static NativeWritableMemoryImpl notMemoryExtendable(
-      final MemorySegment seg,
-      final int typeId) {
-    return new NativeWritableMemoryImpl(seg, typeId);
+    super(seg, typeId, memReqSvr);
   }
 
   ///PRIMITIVE getX() and getXArray()
diff --git a/src/main/java/org/apache/datasketches/memory/internal/NonNativeWritableBufferImpl.java b/src/main/java/org/apache/datasketches/memory/internal/NonNativeWritableBufferImpl.java
index 63b7862..25e773c 100644
--- a/src/main/java/org/apache/datasketches/memory/internal/NonNativeWritableBufferImpl.java
+++ b/src/main/java/org/apache/datasketches/memory/internal/NonNativeWritableBufferImpl.java
@@ -48,24 +48,10 @@ final class NonNativeWritableBufferImpl extends BaseWritableBufferImpl {
 
   //Pass-through ctor
   NonNativeWritableBufferImpl(
-      final MemorySegment seg,
-      final int typeId) {
-    super(seg, typeId);
-  }
-
-  static NonNativeWritableBufferImpl memoryExtendable(
       final MemorySegment seg,
       final int typeId,
       final MemoryRequestServer memReqSvr) {
-    final NonNativeWritableBufferImpl impl = new NonNativeWritableBufferImpl(seg, typeId);
-    if (memReqSvr != null) { impl.setMemoryRequestServer(memReqSvr); }
-    return impl;
-  }
-
-  static NonNativeWritableBufferImpl notMemoryExtendable(
-      final MemorySegment seg,
-      final int typeId) {
-    return new NonNativeWritableBufferImpl(seg, typeId);
+    super(seg, typeId, memReqSvr);
   }
 
   //PRIMITIVE getX() and getXArray()
diff --git a/src/main/java/org/apache/datasketches/memory/internal/NonNativeWritableMemoryImpl.java b/src/main/java/org/apache/datasketches/memory/internal/NonNativeWritableMemoryImpl.java
index 87393d1..31fe94e 100644
--- a/src/main/java/org/apache/datasketches/memory/internal/NonNativeWritableMemoryImpl.java
+++ b/src/main/java/org/apache/datasketches/memory/internal/NonNativeWritableMemoryImpl.java
@@ -47,24 +47,10 @@ final class NonNativeWritableMemoryImpl extends BaseWritableMemoryImpl {
 
   //Pass-through ctor
   NonNativeWritableMemoryImpl(
-      final MemorySegment seg,
-      final int typeId) {
-    super(seg, typeId);
-  }
-
-  static NonNativeWritableMemoryImpl memoryExtendable(
       final MemorySegment seg,
       final int typeId,
       final MemoryRequestServer memReqSvr) {
-    final NonNativeWritableMemoryImpl impl = new NonNativeWritableMemoryImpl(seg, typeId);
-    if (memReqSvr != null) { impl.setMemoryRequestServer(memReqSvr); }
-    return impl;
-  }
-
-  static NonNativeWritableMemoryImpl notMemoryExtendable(
-      final MemorySegment seg,
-      final int typeId) {
-    return new NonNativeWritableMemoryImpl(seg, typeId);
+    super(seg, typeId, memReqSvr);
   }
 
   ///PRIMITIVE getX() and getXArray()
diff --git a/src/test/java/org/apache/datasketches/memory/internal/Buffer2Test.java b/src/test/java/org/apache/datasketches/memory/internal/Buffer2Test.java
index 1317271..9edd87c 100644
--- a/src/test/java/org/apache/datasketches/memory/internal/Buffer2Test.java
+++ b/src/test/java/org/apache/datasketches/memory/internal/Buffer2Test.java
@@ -321,7 +321,7 @@ public class Buffer2Test {
     for (int i = 0; i < n; i++) { arr[i] = i; }
     Memory mem = Memory.wrap(arr);
     Buffer buf = mem.asBuffer();
-    Buffer reg = buf.region(n2 * 8, n2 * 8, buf.getTypeByteOrder()); //top half
+    Buffer reg = buf.region(n2 * 8, n2 * 8, buf.getByteOrder()); //top half
     for (int i = 0; i < n2; i++) {
       long v = reg.getLong(i * 8);
       long e = i + n2;
diff --git a/src/test/java/org/apache/datasketches/memory/internal/BufferTest.java b/src/test/java/org/apache/datasketches/memory/internal/BufferTest.java
index 49797ec..084e352 100644
--- a/src/test/java/org/apache/datasketches/memory/internal/BufferTest.java
+++ b/src/test/java/org/apache/datasketches/memory/internal/BufferTest.java
@@ -207,7 +207,7 @@ public class BufferTest {
     ByteBuffer bb = ByteBuffer.allocate(n * 8);
     bb.order(BaseState.NON_NATIVE_BYTE_ORDER);
     Buffer buf = Buffer.wrap(bb);
-    assertEquals(buf.getTypeByteOrder(), ByteOrder.nativeOrder());
+    assertEquals(buf.getByteOrder(), ByteOrder.nativeOrder());
   }
 
   @Test
diff --git a/src/test/java/org/apache/datasketches/memory/internal/ExampleMemoryRequestServerTest.java b/src/test/java/org/apache/datasketches/memory/internal/ExampleMemoryRequestServerTest.java
index 9646968..eacc079 100644
--- a/src/test/java/org/apache/datasketches/memory/internal/ExampleMemoryRequestServerTest.java
+++ b/src/test/java/org/apache/datasketches/memory/internal/ExampleMemoryRequestServerTest.java
@@ -104,7 +104,7 @@ public class ExampleMemoryRequestServerTest {
     @SuppressWarnings("resource")
     @Override
     public WritableMemory request(WritableMemory currentWMem, long newCapacityBytes) {
-     ByteOrder order = currentWMem.getTypeByteOrder();
+     ByteOrder order = currentWMem.getByteOrder();
      WritableMemory wmem;
      if (offHeap) {
        wmem = WritableMemory.allocateDirect(newCapacityBytes, 8, ResourceScope.newConfinedScope(), order, this);
diff --git a/src/test/java/org/apache/datasketches/memory/internal/LeafImplTest.java b/src/test/java/org/apache/datasketches/memory/internal/LeafImplTest.java
index 6c60379..8105dc6 100644
--- a/src/test/java/org/apache/datasketches/memory/internal/LeafImplTest.java
+++ b/src/test/java/org/apache/datasketches/memory/internal/LeafImplTest.java
@@ -86,7 +86,7 @@ public class LeafImplTest {
     WritableMemory mem = WritableMemory.writableWrap(bb, NBO);
     assertEquals(bb.isDirect(), mem.isDirect());
 
-    checkCombinations(mem, off, cap, mem.isDirect(), mem.getTypeByteOrder(), true, false);
+    checkCombinations(mem, off, cap, mem.isDirect(), mem.getByteOrder(), true, false);
 
     //BB off heap, native order, has ByteBuffer, has MemReqSvr
     ByteBuffer dbb = ByteBuffer.allocateDirect((int)cap);
@@ -95,7 +95,7 @@ public class LeafImplTest {
     mem = WritableMemory.writableWrap(dbb, NBO);
     assertEquals(dbb.isDirect(), mem.isDirect());
 
-    checkCombinations(mem, off, cap,  mem.isDirect(), mem.getTypeByteOrder(), true, false);
+    checkCombinations(mem, off, cap,  mem.isDirect(), mem.getByteOrder(), true, false);
 
     //BB on heap, non native order, has ByteBuffer, has MemReqSvr
     bb = ByteBuffer.allocate((int)cap);
@@ -104,7 +104,7 @@ public class LeafImplTest {
     mem = WritableMemory.writableWrap(bb, NNBO);
     assertEquals(bb.isDirect(), mem.isDirect());
 
-    checkCombinations(mem, off, cap, mem.isDirect(), mem.getTypeByteOrder(), true, false);
+    checkCombinations(mem, off, cap, mem.isDirect(), mem.getByteOrder(), true, false);
 
     //BB off heap, non native order, has ByteBuffer, has MemReqSvr
     dbb = ByteBuffer.allocateDirect((int)cap);
@@ -113,7 +113,7 @@ public class LeafImplTest {
     mem = WritableMemory.writableWrap(dbb, NNBO);
     assertEquals(dbb.isDirect(), mem.isDirect());
 
-    checkCombinations(mem, off, cap,  mem.isDirect(), mem.getTypeByteOrder(), true, false);
+    checkCombinations(mem, off, cap,  mem.isDirect(), mem.getByteOrder(), true, false);
   }
 
   @Test
@@ -170,7 +170,7 @@ public class LeafImplTest {
     assertEquals(mem.writableRegion(off, cap, oo).getShort(0), 256);
     assertEquals(mem.asWritableBuffer(bo).getShort(0), 1);
     assertEquals(mem.asWritableBuffer(oo).getShort(0), 256);
-    assertTrue(mem.getTypeByteOrder() == bo);
+    assertTrue(mem.getByteOrder() == bo);
 
     if (fromByteBuffer) { assertTrue(mem.hasByteBuffer()); }
     else { assertFalse(mem.hasByteBuffer()); }
@@ -194,7 +194,7 @@ public class LeafImplTest {
     assertEquals(buf.writableRegion(off, cap, oo).getShort(0), 256);
     assertEquals(buf.writableDuplicate(bo).getShort(0), 1);
     assertEquals(buf.writableDuplicate(oo).getShort(0), 256);
-    assertTrue(buf.getTypeByteOrder() == bo);
+    assertTrue(buf.getByteOrder() == bo);
 
     if (fromByteBuffer) { assertTrue(buf.hasByteBuffer()); }
 
@@ -218,7 +218,7 @@ public class LeafImplTest {
     assertEquals(nnMem.asWritableBuffer(bo).getShort(0), 1);
     assertEquals(nnMem.asWritableBuffer(oo).getShort(0), 256);
 
-    assertTrue(nnMem.getTypeByteOrder() == oo);
+    assertTrue(nnMem.getByteOrder() == oo);
 
     if (fromByteBuffer) { assertTrue(nnMem.hasByteBuffer()); }
 
@@ -242,7 +242,7 @@ public class LeafImplTest {
     assertEquals(nnBuf.writableDuplicate(bo).getShort(0), 1);
     assertEquals(nnBuf.writableDuplicate(oo).getShort(0), 256);
 
-    assertTrue(nnBuf.getTypeByteOrder() == oo);
+    assertTrue(nnBuf.getByteOrder() == oo);
 
     if (fromByteBuffer) { assertTrue(nnBuf.hasByteBuffer()); }
 
diff --git a/src/test/java/org/apache/datasketches/memory/internal/MemoryTest.java b/src/test/java/org/apache/datasketches/memory/internal/MemoryTest.java
index 533b162..9e287a2 100644
--- a/src/test/java/org/apache/datasketches/memory/internal/MemoryTest.java
+++ b/src/test/java/org/apache/datasketches/memory/internal/MemoryTest.java
@@ -239,12 +239,12 @@ public class MemoryTest {
     ByteBuffer bb = ByteBuffer.allocate(n * 8);
     bb.order(ByteOrder.BIG_ENDIAN); //ignored
     Memory mem = Memory.wrap(bb); //Defaults to LE
-    assertTrue(mem.getTypeByteOrder() == ByteOrder.nativeOrder());
-    assertEquals(mem.getTypeByteOrder(), ByteOrder.LITTLE_ENDIAN);
+    assertTrue(mem.getByteOrder() == ByteOrder.nativeOrder());
+    assertEquals(mem.getByteOrder(), ByteOrder.LITTLE_ENDIAN);
     //Now explicitly set it
     mem = Memory.wrap(bb, BaseState.NON_NATIVE_BYTE_ORDER);
-    assertFalse(mem.getTypeByteOrder() == ByteOrder.nativeOrder());
-    assertEquals(mem.getTypeByteOrder(), ByteOrder.BIG_ENDIAN);
+    assertFalse(mem.getByteOrder() == ByteOrder.nativeOrder());
+    assertEquals(mem.getByteOrder(), ByteOrder.BIG_ENDIAN);
   }
 
   @Test
diff --git a/src/test/java/org/apache/datasketches/memory/internal/NativeWritableBufferImplTest.java b/src/test/java/org/apache/datasketches/memory/internal/NativeWritableBufferImplTest.java
index dcca8b7..272b4ec 100644
--- a/src/test/java/org/apache/datasketches/memory/internal/NativeWritableBufferImplTest.java
+++ b/src/test/java/org/apache/datasketches/memory/internal/NativeWritableBufferImplTest.java
@@ -218,7 +218,7 @@ public class NativeWritableBufferImplTest {
     try (ResourceScope scope = ResourceScope.newConfinedScope()) {
       WritableMemory wmem = WritableMemory.allocateDirect(memCapacity, scope, memReqSvr);
       WritableBuffer wbuf = wmem.asWritableBuffer();
-      wbuf.writableRegion(1, 64, wbuf.getTypeByteOrder()); //wrong!
+      wbuf.writableRegion(1, 64, wbuf.getByteOrder()); //wrong!
     }
   }
 
@@ -525,13 +525,13 @@ public class NativeWritableBufferImplTest {
     ByteBuffer bb = ByteBuffer.allocate(64);
     WritableBuffer wbuf = WritableBuffer.writableWrap(bb);
     @SuppressWarnings("unused")
-    WritableBuffer wreg = wbuf.writableRegion(0, 1, wbuf.getTypeByteOrder());
+    WritableBuffer wreg = wbuf.writableRegion(0, 1, wbuf.getByteOrder());
 
     try {
       Buffer buf = Buffer.wrap(bb);
       wbuf = (WritableBuffer) buf;
       @SuppressWarnings("unused")
-      WritableBuffer wreg2 = wbuf.writableRegion(0, 1, wbuf.getTypeByteOrder());
+      WritableBuffer wreg2 = wbuf.writableRegion(0, 1, wbuf.getByteOrder());
       Assert.fail();
     } catch (ReadOnlyException expected) {
       // ignore
@@ -542,7 +542,7 @@ public class NativeWritableBufferImplTest {
   public void checkZeroBuffer() {
     WritableMemory wmem = WritableMemory.allocate(8);
     WritableBuffer wbuf = wmem.asWritableBuffer();
-    WritableBuffer reg = wbuf.writableRegion(0, 0, wbuf.getTypeByteOrder());
+    WritableBuffer reg = wbuf.writableRegion(0, 0, wbuf.getByteOrder());
     assertEquals(reg.getCapacity(), 0);
   }
 
diff --git a/src/test/java/org/apache/datasketches/memory/internal/NonNativeWritableBufferImplTest.java b/src/test/java/org/apache/datasketches/memory/internal/NonNativeWritableBufferImplTest.java
index 155409b..ab42ba6 100644
--- a/src/test/java/org/apache/datasketches/memory/internal/NonNativeWritableBufferImplTest.java
+++ b/src/test/java/org/apache/datasketches/memory/internal/NonNativeWritableBufferImplTest.java
@@ -240,10 +240,10 @@ public class NonNativeWritableBufferImplTest {
     WritableMemory wmem = WritableMemory.writableWrap(bArr, ByteOrder.BIG_ENDIAN);
     WritableBuffer wbuf = wmem.asWritableBuffer();
     WritableBuffer wdup = wbuf.writableDuplicate();
-    assertEquals(wdup.getTypeByteOrder(), ByteOrder.BIG_ENDIAN);
+    assertEquals(wdup.getByteOrder(), ByteOrder.BIG_ENDIAN);
 
     WritableBuffer wreg = wbuf.writableRegion();
-    assertEquals(wreg.getTypeByteOrder(), ByteOrder.BIG_ENDIAN);
+    assertEquals(wreg.getByteOrder(), ByteOrder.BIG_ENDIAN);
   }
 
   @Test
@@ -251,27 +251,27 @@ public class NonNativeWritableBufferImplTest {
     byte[] bArr = new byte[8];
     bArr[1] = 1;
     WritableMemory wmem = WritableMemory.writableWrap(bArr, ByteOrder.BIG_ENDIAN);
-    assertEquals(wmem.getTypeByteOrder(), ByteOrder.BIG_ENDIAN);
+    assertEquals(wmem.getByteOrder(), ByteOrder.BIG_ENDIAN);
     assertEquals(wmem.getChar(0), 1);
 
     Buffer buf = wmem.asBuffer();
-    assertEquals(buf.getTypeByteOrder(), ByteOrder.BIG_ENDIAN); //
+    assertEquals(buf.getByteOrder(), ByteOrder.BIG_ENDIAN); //
     assertEquals(buf.getChar(0), 1);
 
     Buffer dup = buf.duplicate();
-    assertEquals(dup.getTypeByteOrder(), ByteOrder.BIG_ENDIAN);
+    assertEquals(dup.getByteOrder(), ByteOrder.BIG_ENDIAN);
     assertEquals(dup.getChar(0), 1);
 
     Buffer reg = buf.region();
-    assertEquals(reg.getTypeByteOrder(), ByteOrder.BIG_ENDIAN);
+    assertEquals(reg.getByteOrder(), ByteOrder.BIG_ENDIAN);
     assertEquals(reg.getChar(0), 1);
 
     Memory mem = reg.asMemory();
-    assertEquals(mem.getTypeByteOrder(), ByteOrder.BIG_ENDIAN);
+    assertEquals(mem.getByteOrder(), ByteOrder.BIG_ENDIAN);
     assertEquals(mem.getChar(0), 1);
 
     Memory mreg = mem.region(0, 8);
-    assertEquals(mreg.getTypeByteOrder(), ByteOrder.BIG_ENDIAN);
+    assertEquals(mreg.getByteOrder(), ByteOrder.BIG_ENDIAN);
     assertEquals(mreg.getChar(0), 1);
 
   }
diff --git a/src/test/java/org/apache/datasketches/memory/internal/NonNativeWritableMemoryImplTest.java b/src/test/java/org/apache/datasketches/memory/internal/NonNativeWritableMemoryImplTest.java
index fcfff82..5746390 100644
--- a/src/test/java/org/apache/datasketches/memory/internal/NonNativeWritableMemoryImplTest.java
+++ b/src/test/java/org/apache/datasketches/memory/internal/NonNativeWritableMemoryImplTest.java
@@ -170,7 +170,7 @@ public class NonNativeWritableMemoryImplTest {
   @Test
   public void checkRegion() {
     WritableMemory wreg = wmem.writableRegion(0, wmem.getCapacity());
-    assertEquals(wreg.getTypeByteOrder(), ByteOrder.BIG_ENDIAN);
+    assertEquals(wreg.getByteOrder(), ByteOrder.BIG_ENDIAN);
   }
 
 }
diff --git a/src/test/java/org/apache/datasketches/memory/internal/SpecificLeafTest.java b/src/test/java/org/apache/datasketches/memory/internal/SpecificLeafTest.java
index 4401e01..5876e03 100644
--- a/src/test/java/org/apache/datasketches/memory/internal/SpecificLeafTest.java
+++ b/src/test/java/org/apache/datasketches/memory/internal/SpecificLeafTest.java
@@ -19,6 +19,7 @@
 
 package org.apache.datasketches.memory.internal;
 
+import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertTrue;
 
@@ -52,23 +53,23 @@ public class SpecificLeafTest {
     Memory mem = Memory.wrap(bb).region(0, bytes, ByteOrder.nativeOrder());
     assertTrue(mem.hasByteBuffer());
     assertTrue(mem.isReadOnly());
-    assertTrue(((BaseStateImpl)mem).isMemoryType());
-    assertFalse(((BaseStateImpl)mem).isDirectType());
-    assertFalse(((BaseStateImpl)mem).isMapType());
+    assertTrue(mem.isMemory());
+    assertFalse(mem.isDirect());
+    assertFalse(mem.isMapped());
     checkCrossLeafTypeIds(mem);
     Buffer buf = mem.asBuffer().region(0, bytes, ByteOrder.nativeOrder());
-    assertTrue(((BaseStateImpl)buf).isNativeType());
+    assertEquals(buf.getByteOrder(), BaseState.NATIVE_BYTE_ORDER);
 
     bb.order(BaseState.NON_NATIVE_BYTE_ORDER);
     Memory mem2 = Memory.wrap(bb).region(0, bytes, BaseState.NON_NATIVE_BYTE_ORDER);
     Buffer buf2 = mem2.asBuffer().region(0, bytes, BaseState.NON_NATIVE_BYTE_ORDER);
     Buffer buf3 = buf2.duplicate();
 
-    assertTrue(((BaseStateImpl)mem).isRegionType());
-    assertTrue(((BaseStateImpl)mem2).isRegionType());
-    assertTrue(((BaseStateImpl)buf).isRegionType());
-    assertTrue(((BaseStateImpl)buf2).isRegionType());
-    assertTrue(((BaseStateImpl)buf3).isDuplicateType());
+    assertTrue(mem.isRegion());
+    assertTrue(mem2.isRegion());
+    assertTrue(buf.isRegion());
+    assertTrue(buf2.isRegion());
+    assertTrue(buf3.isDuplicate());
   }
 
   @Test
@@ -77,8 +78,8 @@ public class SpecificLeafTest {
     try (ResourceScope scope = ResourceScope.newConfinedScope()) {
       WritableMemory wmem = WritableMemory.allocateDirect(bytes, scope, memReqSvr);
       assertFalse(((BaseStateImpl)wmem).isReadOnly());
-      assertTrue(((BaseStateImpl)wmem).isDirectType());
-      assertFalse(((BaseStateImpl)wmem).isHeapType());
+      assertTrue(wmem.isDirect());
+      assertFalse(wmem.isHeap());
       assertFalse(wmem.isReadOnly());
       checkCrossLeafTypeIds(wmem);
       WritableMemory nnwmem = wmem.writableRegion(0, bytes, BaseState.NON_NATIVE_BYTE_ORDER);
@@ -91,12 +92,12 @@ public class SpecificLeafTest {
       Buffer buf2 = mem2.asBuffer().region(0, bytes, BaseState.NON_NATIVE_BYTE_ORDER);
       Buffer buf3 = buf2.duplicate();
 
-      assertTrue(((BaseStateImpl)mem).isRegionType());
-      assertTrue(((BaseStateImpl)mem2).isRegionType());
-      assertTrue(((BaseStateImpl)mem2).isMemoryType());
-      assertTrue(((BaseStateImpl)buf).isRegionType());
-      assertTrue(((BaseStateImpl)buf2).isRegionType());
-      assertTrue(((BaseStateImpl)buf3).isDuplicateType());
+      assertTrue(mem.isRegion());
+      assertTrue(mem2.isRegion());
+      assertTrue(buf.isRegion());
+      assertTrue(buf2.isRegion());
+      assertTrue(buf3.isDuplicate());
+      assertTrue(mem2.isMemory());
     }
   }
 
@@ -114,7 +115,7 @@ public class SpecificLeafTest {
     final long bytes = 128;
     try (ResourceScope scope = ResourceScope.newConfinedScope()) {
       WritableMemory mem = WritableMemory.writableMap(file, 0L, bytes, scope, ByteOrder.nativeOrder());
-      assertTrue(((BaseStateImpl)mem).isMapType());
+      assertTrue(mem.isMapped());
       assertFalse(mem.isReadOnly());
       checkCrossLeafTypeIds(mem);
       Memory nnreg = mem.region(0, bytes, BaseState.NON_NATIVE_BYTE_ORDER);
@@ -127,14 +128,14 @@ public class SpecificLeafTest {
       Buffer buf2 = reg2.asBuffer().region(0, bytes, BaseState.NON_NATIVE_BYTE_ORDER);
       Buffer buf3 = buf2.duplicate();
 
-      assertTrue(((BaseStateImpl)reg).isRegionType());
-      assertTrue(((BaseStateImpl)reg2).isRegionType());
-      assertFalse(((BaseStateImpl)reg2).isNativeType());
-      assertTrue(((BaseStateImpl)buf).isRegionType());
-      assertFalse(((BaseStateImpl)buf).isMemoryType());
-      assertTrue(((BaseStateImpl)buf2).isRegionType());
-      assertTrue(((BaseStateImpl)buf3).isDuplicateType());
-      assertTrue(((BaseStateImpl)buf4).isDuplicateType());
+      assertTrue(reg.isRegion());
+      assertTrue(reg2.isRegion());
+      assertEquals(reg2.getByteOrder(), BaseState.NON_NATIVE_BYTE_ORDER);
+      assertTrue(buf.isRegion());
+      assertFalse(buf.isMemory());
+      assertTrue(buf2.isRegion());
+      assertTrue(buf3.isDuplicate());
+      assertTrue(buf4.isDuplicate());
     }
   }
 
@@ -142,7 +143,7 @@ public class SpecificLeafTest {
   public void checkHeapLeafs() {
     int bytes = 128;
     Memory mem = Memory.wrap(new byte[bytes]);
-    assertTrue(((BaseStateImpl)mem).isHeapType());
+    assertTrue(mem.isHeap());
     assertTrue(((BaseStateImpl)mem).isReadOnly());
     checkCrossLeafTypeIds(mem);
     Memory nnreg = mem.region(0, bytes, BaseState.NON_NATIVE_BYTE_ORDER);
@@ -155,47 +156,47 @@ public class SpecificLeafTest {
     Buffer buf2 = reg2.asBuffer().region(0, bytes, BaseState.NON_NATIVE_BYTE_ORDER);
     Buffer buf3 = buf2.duplicate();
 
-    assertFalse(((BaseStateImpl)mem).isRegionType());
-    assertTrue(((BaseStateImpl)reg2).isRegionType());
-    assertTrue(((BaseStateImpl)buf).isRegionType());
-    assertTrue(((BaseStateImpl)buf2).isRegionType());
-    assertTrue(((BaseStateImpl)buf3).isDuplicateType());
-    assertTrue(((BaseStateImpl)buf4).isDuplicateType());
+    assertFalse(mem.isRegion());
+    assertTrue(reg2.isRegion());
+    assertTrue(buf.isRegion());
+    assertTrue(buf2.isRegion());
+    assertTrue(buf3.isDuplicate());
+    assertTrue(buf4.isDuplicate());
   }
 
   private static void checkCrossLeafTypeIds(Memory mem) {
     Memory reg1 = mem.region(0, mem.getCapacity());
-    assertTrue(((BaseStateImpl)reg1).isRegionType());
+    assertTrue(reg1.isRegion());
 
     Buffer buf1 = reg1.asBuffer();
-    assertTrue(((BaseStateImpl)buf1).isRegionType()); //fails
-    assertTrue(((BaseStateImpl)buf1).isBufferType());
+    assertTrue(buf1.isRegion());
+    assertTrue(buf1.isBuffer());
     assertTrue(buf1.isReadOnly());
 
     Buffer buf2 = buf1.duplicate();
-    assertTrue(((BaseStateImpl)buf2).isRegionType());
-    assertTrue(((BaseStateImpl)buf2).isBufferType());
-    assertTrue(((BaseStateImpl)buf2).isDuplicateType());
+    assertTrue(buf2.isRegion());
+    assertTrue(buf2.isBuffer());
+    assertTrue(buf2.isDuplicate());
     assertTrue(buf2.isReadOnly());
 
     Memory mem2 = buf1.asMemory(); //
-    assertTrue(((BaseStateImpl)mem2).isRegionType());
-    assertFalse(((BaseStateImpl)mem2).isBufferType());
-    assertFalse(((BaseStateImpl)mem2).isDuplicateType());
+    assertTrue(mem2.isRegion());
+    assertFalse(mem2.isBuffer());
+    assertFalse(mem2.isDuplicate());
     assertTrue(mem2.isReadOnly());
 
     Buffer buf3 = buf1.duplicate(BaseState.NON_NATIVE_BYTE_ORDER);
-    assertTrue(((BaseStateImpl)buf3).isRegionType());
-    assertTrue(((BaseStateImpl)buf3).isBufferType());
-    assertTrue(((BaseStateImpl)buf3).isDuplicateType());
-    assertTrue(((BaseStateImpl)buf3).isNonNativeType());
+    assertTrue(buf3.isRegion());
+    assertTrue(buf3.isBuffer());
+    assertTrue(buf3.isDuplicate());
+    assertEquals(buf3.getByteOrder(), BaseState.NON_NATIVE_BYTE_ORDER);
     assertTrue(buf3.isReadOnly());
 
     Memory mem3 = buf3.asMemory();
-    assertTrue(((BaseStateImpl)mem3).isRegionType());
-    assertFalse(((BaseStateImpl)mem3).isBufferType());
-    assertTrue(((BaseStateImpl)mem3).isDuplicateType());
-    assertTrue(((BaseStateImpl)mem3).isNonNativeType());
+    assertTrue(mem3.isRegion());
+    assertFalse(mem3.isBuffer());
+    assertTrue(mem3.isDuplicate());
+    assertEquals(mem3.getByteOrder(), BaseState.NON_NATIVE_BYTE_ORDER);
     assertTrue(mem3.isReadOnly());
   }
 
diff --git a/src/test/java/org/apache/datasketches/memory/internal/WritableMemoryTest.java b/src/test/java/org/apache/datasketches/memory/internal/WritableMemoryTest.java
index ee104fa..6c24668 100644
--- a/src/test/java/org/apache/datasketches/memory/internal/WritableMemoryTest.java
+++ b/src/test/java/org/apache/datasketches/memory/internal/WritableMemoryTest.java
@@ -37,9 +37,9 @@ public class WritableMemoryTest {
   public void wrapBigEndian() {
     ByteBuffer bb = ByteBuffer.allocate(64); //big endian
     WritableMemory wmem = WritableMemory.writableWrap(bb);
-    assertEquals(wmem.getTypeByteOrder(), ByteOrder.LITTLE_ENDIAN); //ignore BB endianness
+    assertEquals(wmem.getByteOrder(), ByteOrder.LITTLE_ENDIAN); //ignore BB endianness
     wmem = WritableMemory.writableWrap(bb, ByteOrder.nativeOrder());
-    assertEquals(wmem.getTypeByteOrder(), ByteOrder.LITTLE_ENDIAN);
+    assertEquals(wmem.getByteOrder(), ByteOrder.LITTLE_ENDIAN);
   }
 
   @Test
@@ -53,11 +53,11 @@ public class WritableMemoryTest {
   @Test
   public void allocateWithByteOrder() {
     WritableMemory wmem = WritableMemory.allocate(64, ByteOrder.BIG_ENDIAN);
-    assertEquals(wmem.getTypeByteOrder(), ByteOrder.BIG_ENDIAN);
+    assertEquals(wmem.getByteOrder(), ByteOrder.BIG_ENDIAN);
     wmem = WritableMemory.allocate(64, ByteOrder.LITTLE_ENDIAN);
-    assertEquals(wmem.getTypeByteOrder(), ByteOrder.LITTLE_ENDIAN);
+    assertEquals(wmem.getByteOrder(), ByteOrder.LITTLE_ENDIAN);
     wmem = WritableMemory.writableWrap(new byte[64], 32, 32, ByteOrder.BIG_ENDIAN);
-    assertEquals(wmem.getTypeByteOrder(), ByteOrder.BIG_ENDIAN);
+    assertEquals(wmem.getByteOrder(), ByteOrder.BIG_ENDIAN);
   }
 
   @Test
@@ -148,11 +148,11 @@ public class WritableMemoryTest {
   @Test
   public void checkWrapWithBO() {
     WritableMemory wmem = WritableMemory.writableWrap(new byte[0], ByteOrder.BIG_ENDIAN);
-    boolean nativeBO = wmem.getTypeByteOrder() == ByteOrder.nativeOrder();
+    boolean nativeBO = wmem.getByteOrder() == ByteOrder.nativeOrder();
     assertFalse(nativeBO);
     println("" + nativeBO);
     wmem = WritableMemory.writableWrap(new byte[8], ByteOrder.BIG_ENDIAN);
-    nativeBO = wmem.getTypeByteOrder() == ByteOrder.nativeOrder();
+    nativeBO = wmem.getByteOrder() == ByteOrder.nativeOrder();
     assertFalse(nativeBO);
     println("" + nativeBO);
   }


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