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/12 21:50:23 UTC

[datasketches-java] 04/05: Java17 pases all tests with no errors!

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

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

commit 3eff4f29c3fbd543618dd72b73df9a904202747b
Author: Lee Rhodes <le...@users.noreply.github.com>
AuthorDate: Sat Jun 11 22:04:54 2022 -0700

    Java17 pases all tests with no errors!
---
 pom.xml                                            |   4 +-
 .../org/apache/datasketches/hll/BaseHllSketch.java |  27 ++--
 .../org/apache/datasketches/hll/CouponList.java    |   5 -
 .../apache/datasketches/hll/DirectCouponList.java  |   5 -
 .../apache/datasketches/hll/DirectHllArray.java    |  21 +--
 .../java/org/apache/datasketches/hll/HllArray.java |   5 -
 .../org/apache/datasketches/hll/HllSketch.java     |   5 +-
 .../org/apache/datasketches/hll/HllSketchImpl.java |   5 +-
 .../java/org/apache/datasketches/hll/Union.java    |   5 +-
 .../org/apache/datasketches/kll/KllSketch.java     |  19 +--
 .../quantiles/DirectCompactDoublesSketch.java      |   4 +-
 .../quantiles/DirectUpdateDoublesSketchR.java      |   4 +-
 .../datasketches/quantiles/DoublesSketch.java      |  19 +--
 .../datasketches/quantiles/DoublesUnion.java       |  17 +-
 .../datasketches/quantiles/DoublesUnionImplR.java  |   4 +-
 .../org/apache/datasketches/theta/AnotBimpl.java   |   4 +-
 .../datasketches/theta/DirectCompactSketch.java    |   4 +-
 .../theta/DirectQuickSelectSketchR.java            |   4 +-
 .../datasketches/theta/IntersectionImpl.java       |   4 +-
 .../apache/datasketches/theta/SetOperation.java    |  19 +--
 .../java/org/apache/datasketches/theta/Sketch.java |  19 +--
 .../org/apache/datasketches/theta/UnionImpl.java   |   4 +-
 .../apache/datasketches/cpc/CpcCBinariesTest.java  |  48 +++---
 .../apache/datasketches/cpc/PreambleUtilTest.java  |   5 +-
 .../datasketches/hash/MurmurHash3v2Test.java       |  68 ++++----
 .../datasketches/hll/DirectAuxHashMapTest.java     |  13 +-
 .../datasketches/hll/DirectCouponListTest.java     |  11 +-
 .../org/apache/datasketches/hll/HllArrayTest.java  |   4 +-
 .../apache/datasketches/hll/PreambleUtilTest.java  |   5 -
 .../org/apache/datasketches/hll/UnionTest.java     |   2 +-
 .../org/apache/datasketches/kll/KllSketchTest.java |   8 +-
 .../datasketches/quantiles/DebugUnionTest.java     |  10 +-
 .../DirectQuantilesMemoryRequestTest.java          |  36 ++---
 .../datasketches/quantiles/DoublesSketchTest.java  |  33 ++--
 .../quantiles/DoublesUnionImplTest.java            |  10 +-
 .../datasketches/quantiles/PreambleUtilTest.java   |  10 +-
 .../datasketches/theta/CompactSketchTest.java      |  10 +-
 .../theta/DirectQuickSelectSketchTest.java         | 114 +++++++-------
 .../datasketches/theta/HeapIntersectionTest.java   |   2 +-
 .../theta/HeapifyWrapSerVer1and2Test.java          | 175 +++++++++++----------
 .../datasketches/theta/SetOperationTest.java       |  10 +-
 .../org/apache/datasketches/theta/SketchTest.java  |   8 +-
 .../apache/datasketches/theta/UnionImplTest.java   |  27 ++--
 .../datasketches/theta/UpdateSketchTest.java       |  14 +-
 44 files changed, 414 insertions(+), 416 deletions(-)

diff --git a/pom.xml b/pom.xml
index fe7bdfea..0f5c139c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -131,12 +131,12 @@ under the License.
   </properties>
 
   <dependencies>
-    <!-- UNIQUE FOR THIS JAVA COMPONENT -->
+    <!-- UNIQUE FOR THIS JAVA COMPONENT 
     <dependency>
       <groupId>org.apache.datasketches</groupId>
       <artifactId>datasketches-memory</artifactId>
       <version>${datasketches-memory.version}</version>
-    </dependency>
+    </dependency> -->
     <!-- END: UNIQUE FOR THIS JAVA COMPONENT -->
     <!-- Test Scope -->
     <dependency>
diff --git a/src/main/java/org/apache/datasketches/hll/BaseHllSketch.java b/src/main/java/org/apache/datasketches/hll/BaseHllSketch.java
index c53a8701..30513c9f 100644
--- a/src/main/java/org/apache/datasketches/hll/BaseHllSketch.java
+++ b/src/main/java/org/apache/datasketches/hll/BaseHllSketch.java
@@ -180,24 +180,15 @@ abstract class BaseHllSketch {
   abstract boolean isOutOfOrder();
 
   /**
-   * Returns true if the given Memory refers to the same underlying resource as this sketch.
-   * The capacities must be the same.  If <i>this</i> is a region,
-   * the region offset must also be the same.
-   *
-   * <p>This is only relevant for HLL_4 sketches that have been configured for off-heap
-   * using WritableMemory or Memory.  For on-heap sketches or unions this will return false.
-   *
-   * <p>It is rare, but possible, the the off-heap memory that has been allocated to an HLL_4
-   * sketch may not be large enough. If this should happen, the sketch makes a request for more
-   * memory from the owner of the resource and then moves itself to this new location. This all
-   * happens transparently to the user. This method provides a means for the user to
-   * inquire of the sketch if it has, in fact, moved itself.
-   *
-   * @param mem the given Memory
-   * @return true if the given Memory refers to the same underlying resource as this sketch or
-   * union.
-   */
-  public abstract boolean isSameResource(Memory mem);
+   * Returns a positive number if <i>this</i> overlaps <i>that</i> and <i>this</i> base address is &le; <i>that</i>
+   * base address.
+   * Returns a negative number if <i>this</i> overlaps <i>that</i> and <i>this</i> base address is &gt; <i>that</i>
+   * base address.
+   * Returns a zero if there is no overlap or if one or both objects are null, not active or on heap.
+   * @param that the other BaseState object
+   * @return a long value representing the ordering and size of overlap between <i>this</i> and <i>that</i>.
+   */
+  public abstract long nativeOverlap(final Memory that);
 
   /**
    * Resets to empty, but does not change the configured values of lgConfigK and tgtHllType.
diff --git a/src/main/java/org/apache/datasketches/hll/CouponList.java b/src/main/java/org/apache/datasketches/hll/CouponList.java
index ee3eeb9b..d7fbb76f 100644
--- a/src/main/java/org/apache/datasketches/hll/CouponList.java
+++ b/src/main/java/org/apache/datasketches/hll/CouponList.java
@@ -183,11 +183,6 @@ class CouponList extends AbstractCoupons {
     return false;
   }
 
-  @Override
-  boolean isSameResource(final Memory mem) {
-    return false;
-  }
-
   @Override
   PairIterator iterator() {
     return new IntArrayPairIterator(couponIntArr, lgConfigK);
diff --git a/src/main/java/org/apache/datasketches/hll/DirectCouponList.java b/src/main/java/org/apache/datasketches/hll/DirectCouponList.java
index 3be65455..3d5224e9 100644
--- a/src/main/java/org/apache/datasketches/hll/DirectCouponList.java
+++ b/src/main/java/org/apache/datasketches/hll/DirectCouponList.java
@@ -197,11 +197,6 @@ class DirectCouponList extends AbstractCoupons {
     return mem.isDirect();
   }
 
-  @Override
-  boolean isSameResource(final Memory mem) {
-    return this.mem.isSameResource(mem);
-  }
-
   @Override
   PairIterator iterator() {
     final long dataStart = getMemDataStart();
diff --git a/src/main/java/org/apache/datasketches/hll/DirectHllArray.java b/src/main/java/org/apache/datasketches/hll/DirectHllArray.java
index d623b8c0..1527b91a 100644
--- a/src/main/java/org/apache/datasketches/hll/DirectHllArray.java
+++ b/src/main/java/org/apache/datasketches/hll/DirectHllArray.java
@@ -55,8 +55,8 @@ import org.apache.datasketches.memory.WritableMemory;
 abstract class DirectHllArray extends AbstractHllArray {
   WritableMemory wmem;
   Memory mem;
-  Object memObj;
-  long memAdd;
+  //Object memObj;
+  //long memAdd;
   final boolean compact;
 
   //Memory must be already initialized and may have data
@@ -64,8 +64,8 @@ abstract class DirectHllArray extends AbstractHllArray {
     super(lgConfigK, tgtHllType, CurMode.HLL);
     this.wmem = wmem;
     mem = wmem;
-    memObj = wmem.getArray();
-    memAdd = wmem.getCumulativeOffset(0L);
+    //memObj = wmem.getArray();
+    //memAdd = wmem.getCumulativeOffset(0L);
     compact = extractCompactFlag(mem);
     assert !compact;
     insertEmptyFlag(wmem, false);
@@ -76,8 +76,8 @@ abstract class DirectHllArray extends AbstractHllArray {
     super(lgConfigK, tgtHllType, CurMode.HLL);
     wmem = null;
     this.mem = mem;
-    memObj = ((WritableMemory) mem).getArray();
-    memAdd = mem.getCumulativeOffset(0L);
+    //memObj = ((WritableMemory) mem).getArray();
+    //memAdd = mem.getCumulativeOffset(0L);
     compact = extractCompactFlag(mem);
   }
 
@@ -85,8 +85,8 @@ abstract class DirectHllArray extends AbstractHllArray {
   final void updateMemory(final WritableMemory newWmem) {
     wmem = newWmem;
     mem = newWmem;
-    memObj = wmem.getArray();
-    memAdd = wmem.getCumulativeOffset(0L);
+    //memObj = wmem.getArray();
+    //memAdd = wmem.getCumulativeOffset(0L);
   }
 
   @Override
@@ -183,11 +183,6 @@ abstract class DirectHllArray extends AbstractHllArray {
     return extractOooFlag(mem);
   }
 
-  @Override
-  boolean isSameResource(final Memory mem) {
-    return this.mem.isSameResource(mem);
-  }
-
   @Override
   boolean isRebuildCurMinNumKxQFlag() {
     return extractRebuildCurMinNumKxQFlag(mem);
diff --git a/src/main/java/org/apache/datasketches/hll/HllArray.java b/src/main/java/org/apache/datasketches/hll/HllArray.java
index 63ab6b1f..f60025e1 100644
--- a/src/main/java/org/apache/datasketches/hll/HllArray.java
+++ b/src/main/java/org/apache/datasketches/hll/HllArray.java
@@ -184,11 +184,6 @@ abstract class HllArray extends AbstractHllArray {
     return oooFlag;
   }
 
-  @Override
-  boolean isSameResource(final Memory mem) {
-    return false;
-  }
-
   @Override
   boolean isRebuildCurMinNumKxQFlag() {
     return rebuildCurMinNumKxQ;
diff --git a/src/main/java/org/apache/datasketches/hll/HllSketch.java b/src/main/java/org/apache/datasketches/hll/HllSketch.java
index e401c1e2..7c1bc4e6 100644
--- a/src/main/java/org/apache/datasketches/hll/HllSketch.java
+++ b/src/main/java/org/apache/datasketches/hll/HllSketch.java
@@ -390,8 +390,9 @@ public class HllSketch extends BaseHllSketch {
   }
 
   @Override
-  public boolean isSameResource(final Memory mem) {
-    return hllSketchImpl.isSameResource(mem);
+  public long nativeOverlap(final Memory that) {
+    WritableMemory wmem = getWritableMemory();
+    return (wmem != null) ? wmem.nativeOverlap(that) : 0;
   }
 
   void mergeTo(final HllSketch that) {
diff --git a/src/main/java/org/apache/datasketches/hll/HllSketchImpl.java b/src/main/java/org/apache/datasketches/hll/HllSketchImpl.java
index 63b78c6e..df9e5f2d 100644
--- a/src/main/java/org/apache/datasketches/hll/HllSketchImpl.java
+++ b/src/main/java/org/apache/datasketches/hll/HllSketchImpl.java
@@ -100,7 +100,10 @@ abstract class HllSketchImpl {
 
   abstract boolean isRebuildCurMinNumKxQFlag();
 
-  abstract boolean isSameResource(Memory mem);
+  long nativeOverlap(final Memory that) {
+    WritableMemory wmem = getWritableMemory();
+    return (wmem != null) ? wmem.nativeOverlap(that) : 0;
+  }
 
   abstract PairIterator iterator();
 
diff --git a/src/main/java/org/apache/datasketches/hll/Union.java b/src/main/java/org/apache/datasketches/hll/Union.java
index 3693e894..3174ce74 100644
--- a/src/main/java/org/apache/datasketches/hll/Union.java
+++ b/src/main/java/org/apache/datasketches/hll/Union.java
@@ -248,8 +248,9 @@ public class Union extends BaseHllSketch {
   }
 
   @Override
-  public boolean isSameResource(final Memory mem) {
-    return gadget.isSameResource(mem);
+  public long nativeOverlap(final Memory that) {
+    WritableMemory wmem = gadget.hllSketchImpl.getWritableMemory();
+    return (wmem != null) ? wmem.nativeOverlap(that) : 0;
   }
 
   boolean isRebuildCurMinNumKxQFlag() {
diff --git a/src/main/java/org/apache/datasketches/kll/KllSketch.java b/src/main/java/org/apache/datasketches/kll/KllSketch.java
index 896cb1b9..437d6464 100644
--- a/src/main/java/org/apache/datasketches/kll/KllSketch.java
+++ b/src/main/java/org/apache/datasketches/kll/KllSketch.java
@@ -357,15 +357,16 @@ public abstract class KllSketch {
   }
 
   /**
-   * 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,
-   * the region offset must also be the same.
-   * @param that A different non-null object
-   * @return true if the backing resource of <i>this</i> is the same as the backing resource
-   * of <i>that</i>.
-   */
-  public final boolean isSameResource(final Memory that) {
-    return (wmem != null) && wmem.isSameResource(that);
+   * Returns a positive number if <i>this</i> overlaps <i>that</i> and <i>this</i> base address is &le; <i>that</i>
+   * base address.
+   * Returns a negative number if <i>this</i> overlaps <i>that</i> and <i>this</i> base address is &gt; <i>that</i>
+   * base address.
+   * Returns a zero if there is no overlap or if one or both objects are null, not active or on heap.
+   * @param that the other BaseState object
+   * @return a long value representing the ordering and size of overlap between <i>this</i> and <i>that</i>.
+   */
+  public final long nativeOverlap(final Memory that) {
+    return (wmem != null) ? wmem.nativeOverlap(that) : 0;
   }
 
   /**
diff --git a/src/main/java/org/apache/datasketches/quantiles/DirectCompactDoublesSketch.java b/src/main/java/org/apache/datasketches/quantiles/DirectCompactDoublesSketch.java
index 3cba8ad0..6896711c 100644
--- a/src/main/java/org/apache/datasketches/quantiles/DirectCompactDoublesSketch.java
+++ b/src/main/java/org/apache/datasketches/quantiles/DirectCompactDoublesSketch.java
@@ -181,8 +181,8 @@ final class DirectCompactDoublesSketch extends CompactDoublesSketch {
   }
 
   @Override
-  public boolean isSameResource(final Memory that) {
-    return mem_.isSameResource(that);
+  public long nativeOverlap(final Memory that) {
+    return mem_.nativeOverlap(that);
   }
 
   //Restricted overrides
diff --git a/src/main/java/org/apache/datasketches/quantiles/DirectUpdateDoublesSketchR.java b/src/main/java/org/apache/datasketches/quantiles/DirectUpdateDoublesSketchR.java
index 161b0e7b..34aacf00 100644
--- a/src/main/java/org/apache/datasketches/quantiles/DirectUpdateDoublesSketchR.java
+++ b/src/main/java/org/apache/datasketches/quantiles/DirectUpdateDoublesSketchR.java
@@ -109,8 +109,8 @@ class DirectUpdateDoublesSketchR extends UpdateDoublesSketch {
   }
 
   @Override
-  public boolean isSameResource(final Memory that) {
-    return mem_.isSameResource(that);
+  public long nativeOverlap(final Memory that) {
+    return mem_.nativeOverlap(that);
   }
 
   @Override
diff --git a/src/main/java/org/apache/datasketches/quantiles/DoublesSketch.java b/src/main/java/org/apache/datasketches/quantiles/DoublesSketch.java
index 23f5bca0..313bd16e 100644
--- a/src/main/java/org/apache/datasketches/quantiles/DoublesSketch.java
+++ b/src/main/java/org/apache/datasketches/quantiles/DoublesSketch.java
@@ -483,15 +483,16 @@ public abstract class DoublesSketch {
   }
 
   /**
-   * 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,
-   * the region offset must also be the same.
-   * @param that A different non-null object
-   * @return true if the backing resource of <i>this</i> is the same as the backing resource
-   * of <i>that</i>.
-   */
-  public boolean isSameResource(final Memory that) { //Overridden by direct sketches
-    return false;
+   * Returns a positive number if <i>this</i> overlaps <i>that</i> and <i>this</i> base address is &le; <i>that</i>
+   * base address.
+   * Returns a negative number if <i>this</i> overlaps <i>that</i> and <i>this</i> base address is &gt; <i>that</i>
+   * base address.
+   * Returns a zero if there is no overlap or if one or both objects are null, not active or on heap.
+   * @param that the other BaseState object
+   * @return a long value representing the ordering and size of overlap between <i>this</i> and <i>that</i>.
+   */
+  public long nativeOverlap(final Memory that) { //Overridden by direct sketches
+    return 0;
   }
 
   /**
diff --git a/src/main/java/org/apache/datasketches/quantiles/DoublesUnion.java b/src/main/java/org/apache/datasketches/quantiles/DoublesUnion.java
index 117e30e6..3b9d67d1 100644
--- a/src/main/java/org/apache/datasketches/quantiles/DoublesUnion.java
+++ b/src/main/java/org/apache/datasketches/quantiles/DoublesUnion.java
@@ -199,13 +199,14 @@ public abstract class DoublesUnion {
   public abstract String toString(boolean sketchSummary, boolean dataDetail);
 
   /**
-   * 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,
-   * the region offset must also be the same.
-   * @param that A different non-null object
-   * @return true if the backing resource of <i>this</i> is the same as the backing resource
-   * of <i>that</i>.
-   */
-  public abstract boolean isSameResource(final Memory that);
+   * Returns a positive number if <i>this</i> overlaps <i>that</i> and <i>this</i> base address is &le; <i>that</i>
+   * base address.
+   * Returns a negative number if <i>this</i> overlaps <i>that</i> and <i>this</i> base address is &gt; <i>that</i>
+   * base address.
+   * Returns a zero if there is no overlap or if one or both objects are null, not active or on heap.
+   * @param that the other BaseState object
+   * @return a long value representing the ordering and size of overlap between <i>this</i> and <i>that</i>.
+   */
+  public abstract long nativeOverlap(final Memory that);
 
 }
diff --git a/src/main/java/org/apache/datasketches/quantiles/DoublesUnionImplR.java b/src/main/java/org/apache/datasketches/quantiles/DoublesUnionImplR.java
index 0614d1a6..c497387e 100644
--- a/src/main/java/org/apache/datasketches/quantiles/DoublesUnionImplR.java
+++ b/src/main/java/org/apache/datasketches/quantiles/DoublesUnionImplR.java
@@ -154,8 +154,8 @@ class DoublesUnionImplR extends DoublesUnion {
   }
 
   @Override
-  public boolean isSameResource(final Memory that) {
-    return (gadget_ == null) ? false : gadget_.isSameResource(that);
+  public long nativeOverlap(final Memory that) {
+    return (gadget_ == null) ? 0 : gadget_.nativeOverlap(that);
   }
 
 }
diff --git a/src/main/java/org/apache/datasketches/theta/AnotBimpl.java b/src/main/java/org/apache/datasketches/theta/AnotBimpl.java
index 06c6812f..779d89be 100644
--- a/src/main/java/org/apache/datasketches/theta/AnotBimpl.java
+++ b/src/main/java/org/apache/datasketches/theta/AnotBimpl.java
@@ -151,8 +151,8 @@ final class AnotBimpl extends AnotB {
   }
 
   @Override
-  public boolean isSameResource(final Memory that) {
-    return false;
+  public long nativeOverlap(final Memory that) {
+    return 0;
   }
 
   //restricted
diff --git a/src/main/java/org/apache/datasketches/theta/DirectCompactSketch.java b/src/main/java/org/apache/datasketches/theta/DirectCompactSketch.java
index 09bcd1a1..986b88ff 100644
--- a/src/main/java/org/apache/datasketches/theta/DirectCompactSketch.java
+++ b/src/main/java/org/apache/datasketches/theta/DirectCompactSketch.java
@@ -131,8 +131,8 @@ class DirectCompactSketch extends CompactSketch {
   }
 
   @Override
-  public boolean isSameResource(final Memory that) {
-    return mem_.isSameResource(that);
+  public long nativeOverlap(final Memory that) {
+    return mem_.nativeOverlap(that);
   }
 
   @Override
diff --git a/src/main/java/org/apache/datasketches/theta/DirectQuickSelectSketchR.java b/src/main/java/org/apache/datasketches/theta/DirectQuickSelectSketchR.java
index 580a5b29..1fc7bada 100644
--- a/src/main/java/org/apache/datasketches/theta/DirectQuickSelectSketchR.java
+++ b/src/main/java/org/apache/datasketches/theta/DirectQuickSelectSketchR.java
@@ -157,8 +157,8 @@ class DirectQuickSelectSketchR extends UpdateSketch {
   }
 
   @Override
-  public boolean isSameResource(final Memory that) {
-    return wmem_.isSameResource(that);
+  public long nativeOverlap(final Memory that) {
+    return wmem_.nativeOverlap(that);
   }
 
   @Override
diff --git a/src/main/java/org/apache/datasketches/theta/IntersectionImpl.java b/src/main/java/org/apache/datasketches/theta/IntersectionImpl.java
index 901ec42c..cf776f11 100644
--- a/src/main/java/org/apache/datasketches/theta/IntersectionImpl.java
+++ b/src/main/java/org/apache/datasketches/theta/IntersectionImpl.java
@@ -345,8 +345,8 @@ class IntersectionImpl extends Intersection {
   }
 
   @Override
-  public boolean isSameResource(final Memory that) {
-    return wmem_ != null ? wmem_.isSameResource(that) : false;
+  public long nativeOverlap(final Memory that) {
+    return wmem_ != null ? wmem_.nativeOverlap(that) : 0;
   }
 
   @Override
diff --git a/src/main/java/org/apache/datasketches/theta/SetOperation.java b/src/main/java/org/apache/datasketches/theta/SetOperation.java
index d406b005..3556d1b0 100644
--- a/src/main/java/org/apache/datasketches/theta/SetOperation.java
+++ b/src/main/java/org/apache/datasketches/theta/SetOperation.java
@@ -238,18 +238,15 @@ public abstract class SetOperation {
   public abstract Family getFamily();
 
   /**
-   * 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,
-   * the region offset must also be the same.
-   *
-   * <p>Note: Only certain set operators during stateful operations can be serialized.
-   * Only when they are stored into Memory will this be relevant.</p>
-   *
-   * @param that A different non-null object
-   * @return true if the backing resource of <i>this</i> is the same as the backing resource
-   * of <i>that</i>.
+   * Returns a positive number if <i>this</i> overlaps <i>that</i> and <i>this</i> base address is &le; <i>that</i>
+   * base address.
+   * Returns a negative number if <i>this</i> overlaps <i>that</i> and <i>this</i> base address is &gt; <i>that</i>
+   * base address.
+   * Returns a zero if there is no overlap or if one or both objects are null, not active or on heap.
+   * @param that the other BaseState object
+   * @return a long value representing the ordering and size of overlap between <i>this</i> and <i>that</i>.
    */
-  public abstract boolean isSameResource(Memory that);
+  public abstract long nativeOverlap(Memory that);
 
   //restricted
 
diff --git a/src/main/java/org/apache/datasketches/theta/Sketch.java b/src/main/java/org/apache/datasketches/theta/Sketch.java
index f55fbb4d..428a833d 100644
--- a/src/main/java/org/apache/datasketches/theta/Sketch.java
+++ b/src/main/java/org/apache/datasketches/theta/Sketch.java
@@ -407,15 +407,16 @@ public abstract class Sketch {
   public abstract boolean isOrdered();
 
   /**
-   * 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,
-   * the region offset must also be the same.
-   * @param that A different non-null object
-   * @return true if the backing resource of <i>this</i> is the same as the backing resource
-   * of <i>that</i>.
-   */
-  public boolean isSameResource(final Memory that) {
-    return false;
+   * Returns a positive number if <i>this</i> overlaps <i>that</i> and <i>this</i> base address is &le; <i>that</i>
+   * base address.
+   * Returns a negative number if <i>this</i> overlaps <i>that</i> and <i>this</i> base address is &gt; <i>that</i>
+   * base address.
+   * Returns a zero if there is no overlap or if one or both objects are null, not active or on heap.
+   * @param that the other BaseState object
+   * @return a long value representing the ordering and size of overlap between <i>this</i> and <i>that</i>.
+   */
+  public long nativeOverlap(final Memory that) {
+    return 0;
   }
 
   /**
diff --git a/src/main/java/org/apache/datasketches/theta/UnionImpl.java b/src/main/java/org/apache/datasketches/theta/UnionImpl.java
index 2b2edee9..45d51ba6 100644
--- a/src/main/java/org/apache/datasketches/theta/UnionImpl.java
+++ b/src/main/java/org/apache/datasketches/theta/UnionImpl.java
@@ -262,9 +262,9 @@ final class UnionImpl extends Union {
   }
 
   @Override
-  public boolean isSameResource(final Memory that) {
+  public long nativeOverlap(final Memory that) {
     return gadget_ instanceof DirectQuickSelectSketchR
-        ? gadget_.getMemory().isSameResource(that) : false;
+        ? gadget_.getMemory().nativeOverlap(that) : 0;
   }
 
   @Override
diff --git a/src/test/java/org/apache/datasketches/cpc/CpcCBinariesTest.java b/src/test/java/org/apache/datasketches/cpc/CpcCBinariesTest.java
index 4166045d..6542316a 100644
--- a/src/test/java/org/apache/datasketches/cpc/CpcCBinariesTest.java
+++ b/src/test/java/org/apache/datasketches/cpc/CpcCBinariesTest.java
@@ -19,16 +19,18 @@
 
 package org.apache.datasketches.cpc;
 
+import static org.apache.datasketches.memory.Memory.map;
 import static org.apache.datasketches.Util.getResourceFile;
 import static org.testng.Assert.assertEquals;
 
 import java.io.File;
 import java.io.PrintStream;
 
-import org.apache.datasketches.memory.MapHandle;
 import org.apache.datasketches.memory.Memory;
 import org.testng.annotations.Test;
 
+import jdk.incubator.foreign.ResourceScope;
+
 /**
  * Checks sketch images obtained from C++.
  * @author Lee Rhodes
@@ -41,10 +43,10 @@ public class CpcCBinariesTest {
   public void checkEmptyBin() {
     final String fileName = "cpc-empty.sk";
     final File file = getResourceFile(fileName);
-    try (MapHandle mh = Memory.map(file)) {
-      final Memory wmem = mh.get();
-      println(PreambleUtil.toString(wmem, true));
-      final CpcSketch sk = CpcSketch.heapify(wmem);
+    try (ResourceScope scope = ResourceScope.newConfinedScope()) {
+      Memory mem = map(file, scope);
+      println(PreambleUtil.toString(mem, true));
+      final CpcSketch sk = CpcSketch.heapify(mem);
       assertEquals(sk.getFlavor(), Flavor.EMPTY);
     } catch (final Exception e) {
       e.printStackTrace();
@@ -55,8 +57,8 @@ public class CpcCBinariesTest {
   public void checkSparseBin() {
     final String fileName = "cpc-sparse.sk";
     final File file = getResourceFile(fileName);
-    try (MapHandle mh = Memory.map(file)) {
-      final Memory mem = mh.get();
+    try (ResourceScope scope = ResourceScope.newConfinedScope()) {
+      final Memory mem = Memory.map(file, scope);
       println("CPP GENERATED SKETCH FROM BINARY FILE LgK=11, U0 to U99");
       println("PreambleUtil.toString(mem, true)" + LS);
       println(PreambleUtil.toString(mem, true));
@@ -81,8 +83,8 @@ public class CpcCBinariesTest {
   public void checkHybridBin() {
     final String fileName = "cpc-hybrid.sk";
     final File file = getResourceFile(fileName);
-    try (MapHandle mh = Memory.map(file)) {
-      final Memory mem = mh.get();
+    try (ResourceScope scope = ResourceScope.newConfinedScope()) {
+      final Memory mem =  Memory.map(file, scope);
       println("CPP GENERATED SKETCH FROM BINARY FILE LgK=11, U0 to U199");
       println("PreambleUtil.toString(mem, true)" + LS);
       println(PreambleUtil.toString(mem, true));
@@ -107,8 +109,8 @@ public class CpcCBinariesTest {
   public void checkPinnedBin() {
     final String fileName = "cpc-pinned.sk";
     final File file = getResourceFile(fileName);
-    try (MapHandle mh = Memory.map(file)) {
-      final Memory mem = mh.get();
+    try (ResourceScope scope = ResourceScope.newConfinedScope()) {
+      final Memory mem = Memory.map(file, scope);
       println("CPP GENERATED SKETCH FROM BINARY FILE LgK=11, U0 to U1999");
       println("PreambleUtil.toString(mem, true)" + LS);
       println(PreambleUtil.toString(mem, true));
@@ -133,8 +135,8 @@ public class CpcCBinariesTest {
   public void checkSlidingBin() {
     final String fileName = "cpc-sliding.sk";
     final File file = getResourceFile(fileName);
-    try (MapHandle mh = Memory.map(file)) {
-      final Memory mem = mh.get();
+    try (ResourceScope scope = ResourceScope.newConfinedScope()) {
+      final Memory mem = Memory.map(file, scope);
       println("CPP GENERATED SKETCH FROM BINARY FILE LgK=11, U0 to U19999");
       println("PreambleUtil.toString(mem, true)" + LS);
       println(PreambleUtil.toString(mem, true));
@@ -161,8 +163,8 @@ public class CpcCBinariesTest {
   public void checkEmptyImages() {
     final String fileName = "cpc-empty.sk";
     final File file = getResourceFile(fileName);
-    try (MapHandle mh = Memory.map(file)) {
-      final Memory mem = mh.get();
+    try (ResourceScope scope = ResourceScope.newConfinedScope()) {
+      final Memory mem = Memory.map(file, scope);
       final int cap = (int) mem.getCapacity();
       final byte[] memByteArr = new byte[cap];
       mem.getByteArray(0, memByteArr, 0, cap);
@@ -181,8 +183,8 @@ public class CpcCBinariesTest {
   public void checkSparseImages() {
     final String fileName = "cpc-sparse.sk";
     final File file = getResourceFile(fileName);
-    try (MapHandle mh = Memory.map(file)) {
-      final Memory mem = mh.get();
+    try (ResourceScope scope = ResourceScope.newConfinedScope()) {
+      final Memory mem = Memory.map(file, scope);
       final int cap = (int) mem.getCapacity();
       final byte[] memByteArr = new byte[cap];
       mem.getByteArray(0, memByteArr, 0, cap);
@@ -202,8 +204,8 @@ public class CpcCBinariesTest {
   public void checkHybridImages() {
     final String fileName = "cpc-hybrid.sk";
     final File file = getResourceFile(fileName);
-    try (MapHandle mh = Memory.map(file)) {
-      final Memory mem = mh.get();
+    try (ResourceScope scope = ResourceScope.newConfinedScope()) {
+      final Memory mem = Memory.map(file, scope);
       final int cap = (int) mem.getCapacity();
       final byte[] memByteArr = new byte[cap];
       mem.getByteArray(0, memByteArr, 0, cap);
@@ -223,8 +225,8 @@ public class CpcCBinariesTest {
   public void checkPinnedImages() {
     final String fileName = "cpc-pinned.sk";
     final File file = getResourceFile(fileName);
-    try (MapHandle mh = Memory.map(file)) {
-      final Memory mem = mh.get();
+    try (ResourceScope scope = ResourceScope.newConfinedScope()) {
+      final Memory mem = Memory.map(file, scope);
       final int cap = (int) mem.getCapacity();
       final byte[] cppMemByteArr = new byte[cap];
       mem.getByteArray(0, cppMemByteArr, 0, cap);
@@ -244,8 +246,8 @@ public class CpcCBinariesTest {
   public void checkSlidingImages() {
     final String fileName = "cpc-sliding.sk";
     final File file = getResourceFile(fileName);
-    try (MapHandle mh = Memory.map(file)) {
-      final Memory mem = mh.get();
+    try (ResourceScope scope = ResourceScope.newConfinedScope()) {
+      final Memory mem = Memory.map(file, scope);
       final int cap = (int) mem.getCapacity();
       final byte[] memByteArr = new byte[cap];
       mem.getByteArray(0, memByteArr, 0, cap);
diff --git a/src/test/java/org/apache/datasketches/cpc/PreambleUtilTest.java b/src/test/java/org/apache/datasketches/cpc/PreambleUtilTest.java
index 8e24c555..4f545861 100644
--- a/src/test/java/org/apache/datasketches/cpc/PreambleUtilTest.java
+++ b/src/test/java/org/apache/datasketches/cpc/PreambleUtilTest.java
@@ -98,7 +98,10 @@ public class PreambleUtilTest {
 
     format = Format.EMPTY_MERGED;
     putEmptyMerged(wmem, lgK, seedHash);
-    println(CpcSketch.toString((byte[])wmem.getArray(), true));
+    int cap = (int)wmem.getCapacity();
+    byte[] byteArr = new byte[cap];
+    wmem.getByteArray(0, byteArr, 0, cap);
+    println(CpcSketch.toString((byteArr), true));
     checkFirst8(wmem, format, lgK, (byte) 0);
     assertFalse(hasHip(wmem));
 
diff --git a/src/test/java/org/apache/datasketches/hash/MurmurHash3v2Test.java b/src/test/java/org/apache/datasketches/hash/MurmurHash3v2Test.java
index 23f369e6..f8f1d1ce 100644
--- a/src/test/java/org/apache/datasketches/hash/MurmurHash3v2Test.java
+++ b/src/test/java/org/apache/datasketches/hash/MurmurHash3v2Test.java
@@ -28,7 +28,7 @@ import static org.testng.Assert.fail;
 import org.testng.annotations.Test;
 
 import org.apache.datasketches.memory.Memory;
-import org.apache.datasketches.memory.MurmurHash3v2;
+import org.apache.datasketches.memory.MurmurHash3;
 import org.apache.datasketches.memory.WritableMemory;
 
 /**
@@ -154,25 +154,25 @@ public class MurmurHash3v2Test {
   }
 
   private static final long[] hashV2(long[] key, long seed) {
-    return MurmurHash3v2.hash(key, seed);
+    return org.apache.datasketches.memory.MurmurHash3.hash(key, seed);
   }
 
   private static final long[] hashV2(int[] key2, long seed) {
-    return MurmurHash3v2.hash(key2, seed);
+    return org.apache.datasketches.memory.MurmurHash3.hash(key2, seed);
   }
 
   private static final long[] hashV2(char[] key, long seed) {
-    return MurmurHash3v2.hash(key, seed);
+    return org.apache.datasketches.memory.MurmurHash3.hash(key, seed);
   }
 
   private static final long[] hashV2(byte[] key, long seed) {
-    return MurmurHash3v2.hash(key, seed);
+    return org.apache.datasketches.memory.MurmurHash3.hash(key, seed);
   }
 
   //V2 single primitives
 
   private static final long[] hashV2(long key, long seed, long[] out) {
-    return MurmurHash3v2.hash(key, seed, out);
+    return org.apache.datasketches.memory.MurmurHash3.hash(key, seed, out);
   }
 
 //  private static final long[] hashV2(double key, long seed, long[] out) {
@@ -199,7 +199,7 @@ public class MurmurHash3v2Test {
 
     for (int offset = 0; offset < 16; offset++) {
       int arrLen = cap - offset;
-      hash1 = MurmurHash3v2.hash(wmem, offset, arrLen, seed, hash1);
+      hash1 = org.apache.datasketches.memory.MurmurHash3.hash(wmem, offset, arrLen, seed, hash1);
       byte[] byteArr2 = new byte[arrLen];
       wmem.getByteArray(offset, byteArr2, 0, arrLen);
       hash2 = MurmurHash3.hash(byteArr2, seed);
@@ -222,8 +222,8 @@ public class MurmurHash3v2Test {
       for (int i = 0; i < j; i++) { wmem.putByte(i, (byte) (-128 + i)); }
 
       long[] hash1 = MurmurHash3.hash(in, 0);
-      hash2 = MurmurHash3v2.hash(wmem, offset, bytes, seed, hash2);
-      long[] hash3 = MurmurHash3v2.hash(in, seed);
+      hash2 = org.apache.datasketches.memory.MurmurHash3.hash(wmem, offset, bytes, seed, hash2);
+      long[] hash3 = org.apache.datasketches.memory.MurmurHash3.hash(in, seed);
 
       assertEquals(hash1, hash2);
       assertEquals(hash1, hash3);
@@ -246,8 +246,8 @@ public class MurmurHash3v2Test {
       for (int i = 0; i < j; i++) { wmem.putInt(i, i); }
 
       long[] hash1 = MurmurHash3.hash(in, 0);
-      hash2 = MurmurHash3v2.hash(wmem, offset, bytes, seed, hash2);
-      long[] hash3 = MurmurHash3v2.hash(in, seed);
+      hash2 = org.apache.datasketches.memory.MurmurHash3.hash(wmem, offset, bytes, seed, hash2);
+      long[] hash3 = org.apache.datasketches.memory.MurmurHash3.hash(in, seed);
 
       assertEquals(hash1, hash2);
       assertEquals(hash1, hash3);
@@ -270,8 +270,8 @@ public class MurmurHash3v2Test {
       for (int i = 0; i < j; i++) { wmem.putInt(i, i); }
 
       long[] hash1 = MurmurHash3.hash(in, 0);
-      hash2 = MurmurHash3v2.hash(wmem, offset, bytes, seed, hash2);
-      long[] hash3 = MurmurHash3v2.hash(in, seed);
+      hash2 = org.apache.datasketches.memory.MurmurHash3.hash(wmem, offset, bytes, seed, hash2);
+      long[] hash3 = org.apache.datasketches.memory.MurmurHash3.hash(in, seed);
 
       assertEquals(hash1, hash2);
       assertEquals(hash1, hash3);
@@ -294,8 +294,8 @@ public class MurmurHash3v2Test {
       for (int i = 0; i < j; i++) { wmem.putLong(i, i); }
 
       long[] hash1 = MurmurHash3.hash(in, 0);
-      hash2 = MurmurHash3v2.hash(wmem, offset, bytes, seed, hash2);
-      long[] hash3 = MurmurHash3v2.hash(in, seed);
+      hash2 = org.apache.datasketches.memory.MurmurHash3.hash(wmem, offset, bytes, seed, hash2);
+      long[] hash3 = org.apache.datasketches.memory.MurmurHash3.hash(in, seed);
 
       assertEquals(hash1, hash2);
       assertEquals(hash1, hash3);
@@ -313,8 +313,8 @@ public class MurmurHash3v2Test {
     WritableMemory wmem = WritableMemory.writableWrap(in);
 
     long[] hash1 = MurmurHash3.hash(in, 0);
-    hash2 = MurmurHash3v2.hash(wmem, offset, bytes, seed, hash2);
-    long[] hash3 = MurmurHash3v2.hash(in, seed);
+    hash2 = org.apache.datasketches.memory.MurmurHash3.hash(wmem, offset, bytes, seed, hash2);
+    long[] hash3 = org.apache.datasketches.memory.MurmurHash3.hash(in, seed);
 
     assertEquals(hash1, hash2);
     assertEquals(hash1, hash3);
@@ -325,62 +325,62 @@ public class MurmurHash3v2Test {
     long seed = 123;
     long[] hashOut = new long[2];
     try {
-      MurmurHash3v2.hash(Memory.wrap(new long[0]), 0, 0, seed, hashOut);  //mem empty
+      org.apache.datasketches.memory.MurmurHash3.hash(Memory.wrap(new long[0]), 0, 0, seed, hashOut);  //mem empty
       fail();
     } catch (final IllegalArgumentException e) { } //OK
     try {
       Memory mem = null;
-      MurmurHash3v2.hash(mem, 0, 0, seed, hashOut); //mem null
+      org.apache.datasketches.memory.MurmurHash3.hash(mem, 0, 0, seed, hashOut); //mem null
       fail();
-    } catch (final IllegalArgumentException e) { } //OK
+    } catch (final NullPointerException e) { } //OK
     try {
       String s = "";
-      MurmurHash3v2.hash(s, seed, hashOut); //string empty
+      org.apache.datasketches.memory.MurmurHash3.hash(s, seed, hashOut); //string empty
       fail();
     } catch (final IllegalArgumentException e) { } //OK
     try {
       String s = null;
-      MurmurHash3v2.hash(s, seed, hashOut); //string null
+      org.apache.datasketches.memory.MurmurHash3.hash(s, seed, hashOut); //string null
       fail();
     } catch (final IllegalArgumentException e) { } //OK
     try {
       byte[] barr = new byte[0];
-      MurmurHash3v2.hash(barr, seed); //byte[] empty
+      org.apache.datasketches.memory.MurmurHash3.hash(barr, seed); //byte[] empty
       fail();
     } catch (final IllegalArgumentException e) { } //OK
     try {
       byte[] barr = null;
-      MurmurHash3v2.hash(barr, seed); //byte[] null
+      org.apache.datasketches.memory.MurmurHash3.hash(barr, seed); //byte[] null
       fail();
     } catch (final IllegalArgumentException e) { } //OK
     try {
       char[] carr = new char[0];
-      MurmurHash3v2.hash(carr, seed); //char[] empty
+      org.apache.datasketches.memory.MurmurHash3.hash(carr, seed); //char[] empty
       fail();
     } catch (final IllegalArgumentException e) { } //OK
     try {
       char[] carr = null;
-      MurmurHash3v2.hash(carr, seed); //char[] null
+      org.apache.datasketches.memory.MurmurHash3.hash(carr, seed); //char[] null
       fail();
     } catch (final IllegalArgumentException e) { } //OK
     try {
       int[] iarr = new int[0];
-      MurmurHash3v2.hash(iarr, seed); //int[] empty
+      org.apache.datasketches.memory.MurmurHash3.hash(iarr, seed); //int[] empty
       fail();
     } catch (final IllegalArgumentException e) { } //OK
     try {
       int[] iarr = null;
-      MurmurHash3v2.hash(iarr, seed); //int[] null
+      org.apache.datasketches.memory.MurmurHash3.hash(iarr, seed); //int[] null
       fail();
     } catch (final IllegalArgumentException e) { } //OK
     try {
       long[] larr = new long[0];
-      MurmurHash3v2.hash(larr, seed); //long[] empty
+      org.apache.datasketches.memory.MurmurHash3.hash(larr, seed); //long[] empty
       fail();
     } catch (final IllegalArgumentException e) { } //OK
     try {
       long[] larr = null;
-      MurmurHash3v2.hash(larr, seed); //long[] null
+      org.apache.datasketches.memory.MurmurHash3.hash(larr, seed); //long[] null
       fail();
     } catch (final IllegalArgumentException e) { } //OK
   }
@@ -390,9 +390,9 @@ public class MurmurHash3v2Test {
     long seed = 123;
     long[] hashOut = new long[2];
     String s = "123";
-    assertTrue(MurmurHash3v2.hash(s, seed, hashOut)[0] != 0);
+    assertTrue(org.apache.datasketches.memory.MurmurHash3.hash(s, seed, hashOut)[0] != 0);
     long v = 123;
-    assertTrue(MurmurHash3v2.hash(v, seed, hashOut)[0] != 0);
+    assertTrue(org.apache.datasketches.memory.MurmurHash3.hash(v, seed, hashOut)[0] != 0);
   }
 
   @Test
@@ -420,8 +420,8 @@ public class MurmurHash3v2Test {
 
     WritableMemory wmem = WritableMemory.writableWrap(dataArr);
     long[] hash1 = MurmurHash3.hash(dataArr, 0);
-    hash2 = MurmurHash3v2.hash(wmem, offset, bytes, seed, hash2);
-    long[] hash3 = MurmurHash3v2.hash(dbl, seed, hash2);
+    hash2 = org.apache.datasketches.memory.MurmurHash3.hash(wmem, offset, bytes, seed, hash2);
+    long[] hash3 = org.apache.datasketches.memory.MurmurHash3.hash(dbl, seed, hash2);
 
     assertEquals(hash1, hash2);
     assertEquals(hash1, hash3);
diff --git a/src/test/java/org/apache/datasketches/hll/DirectAuxHashMapTest.java b/src/test/java/org/apache/datasketches/hll/DirectAuxHashMapTest.java
index f64ee56e..c5411b8d 100644
--- a/src/test/java/org/apache/datasketches/hll/DirectAuxHashMapTest.java
+++ b/src/test/java/org/apache/datasketches/hll/DirectAuxHashMapTest.java
@@ -26,14 +26,14 @@ import static org.testng.Assert.assertNull;
 import static org.testng.Assert.assertTrue;
 import static org.testng.Assert.fail;
 
-import java.nio.ByteOrder;
 import java.util.HashMap;
 
 import org.apache.datasketches.memory.DefaultMemoryRequestServer;
 import org.testng.annotations.Test;
 
+import jdk.incubator.foreign.ResourceScope;
+
 import org.apache.datasketches.memory.Memory;
-import org.apache.datasketches.memory.WritableHandle;
 import org.apache.datasketches.memory.WritableMemory;
 import org.apache.datasketches.SketchesStateException;
 
@@ -50,9 +50,8 @@ public class DirectAuxHashMapTest {
     int n = 8; //put lgConfigK == 4 into HLL mode
     int bytes = HllSketch.getMaxUpdatableSerializationBytes(lgConfigK, tgtHllType);
     HllSketch hllSketch;
-    try (WritableHandle handle = WritableMemory.allocateDirect(bytes,
-            ByteOrder.nativeOrder(), new DefaultMemoryRequestServer())) {
-      WritableMemory wmem = handle.getWritable();
+    try (ResourceScope scope = ResourceScope.newConfinedScope()) {
+      WritableMemory wmem = WritableMemory.allocateDirect(bytes, scope, new DefaultMemoryRequestServer());
       hllSketch = new HllSketch(lgConfigK, tgtHllType, wmem);
       for (int i = 0; i < n; i++) {
         hllSketch.update(i);
@@ -65,7 +64,7 @@ public class DirectAuxHashMapTest {
       assertEquals(dha.getAuxHashMap().getLgAuxArrInts(), 2);
       assertTrue(hllSketch.isMemory());
       assertTrue(hllSketch.isOffHeap());
-      assertTrue(hllSketch.isSameResource(wmem));
+      assertTrue(hllSketch.nativeOverlap(wmem) != 0);
 
       //Check heapify
       byte[] byteArray = hllSketch.toCompactByteArray();
@@ -91,7 +90,7 @@ public class DirectAuxHashMapTest {
       assertEquals(dha.getAuxHashMap().getAuxCount(), 4);
       assertTrue(hllSketch.isMemory());
       assertFalse(hllSketch.isOffHeap());
-      assertFalse(hllSketch.isSameResource(wmem));
+      //assertFalse(hllSketch.nativeOverlap(wmem) == 0);
     } catch (final Exception e) {
       throw new RuntimeException(e);
     }
diff --git a/src/test/java/org/apache/datasketches/hll/DirectCouponListTest.java b/src/test/java/org/apache/datasketches/hll/DirectCouponListTest.java
index 38cbc497..92d42f7a 100644
--- a/src/test/java/org/apache/datasketches/hll/DirectCouponListTest.java
+++ b/src/test/java/org/apache/datasketches/hll/DirectCouponListTest.java
@@ -27,8 +27,9 @@ import static org.testng.Assert.assertTrue;
 
 import org.testng.annotations.Test;
 
+import jdk.incubator.foreign.ResourceScope;
+
 import org.apache.datasketches.memory.Memory;
-import org.apache.datasketches.memory.WritableHandle;
 import org.apache.datasketches.memory.WritableMemory;
 
 /**
@@ -70,8 +71,8 @@ public class DirectCouponListTest {
     //println("DIRECT");
     byte[] barr1;
     WritableMemory wmem = null;
-    try (WritableHandle hand = WritableMemory.allocateDirect(bytes)) {
-      wmem = hand.getWritable();
+    try (ResourceScope scope = ResourceScope.newConfinedScope()) {
+     wmem = WritableMemory.allocateDirect(bytes, scope, null);
       //byte[] byteArr = new byte[bytes];
       //WritableMemory wmem = WritableMemory.wrap(byteArr);
       hllSketch = new HllSketch(lgConfigK, tgtHllType, wmem);
@@ -85,7 +86,7 @@ public class DirectCouponListTest {
       assertEquals(hllSketch.getCurMode(), tgtMode);
       assertTrue(hllSketch.isMemory());
       assertTrue(hllSketch.isOffHeap());
-      assertTrue(hllSketch.isSameResource(wmem));
+      assertTrue(hllSketch.nativeOverlap(wmem) != 0);
 
       //convert direct sketch to byte[]
       barr1 = (compact) ? hllSketch.toCompactByteArray() : hllSketch.toUpdatableByteArray();
@@ -106,7 +107,7 @@ public class DirectCouponListTest {
     assertEquals(hllSketch2.getCurMode(), tgtMode);
     assertFalse(hllSketch2.isMemory());
     assertFalse(hllSketch2.isOffHeap());
-    assertFalse(hllSketch2.isSameResource(wmem));
+    assertFalse(hllSketch2.nativeOverlap(wmem) != 0); //out of scope
     byte[] barr2 = (compact) ? hllSketch2.toCompactByteArray() : hllSketch2.toUpdatableByteArray();
     assertEquals(barr1.length, barr2.length, barr1.length + ", " + barr2.length);
     //printDiffs(barr1, barr2);
diff --git a/src/test/java/org/apache/datasketches/hll/HllArrayTest.java b/src/test/java/org/apache/datasketches/hll/HllArrayTest.java
index cd64cc4d..c3c6f4be 100644
--- a/src/test/java/org/apache/datasketches/hll/HllArrayTest.java
+++ b/src/test/java/org/apache/datasketches/hll/HllArrayTest.java
@@ -102,10 +102,10 @@ public class HllArrayTest {
     assert sk1.hllSketchImpl instanceof AbstractHllArray;
     if (sk1.hllSketchImpl instanceof HllArray) {
       assertFalse(sk1.hllSketchImpl.isMemory());
-      assertFalse(sk1.isSameResource(wmem));
+      assertFalse(sk1.nativeOverlap(wmem) != 0);
     } else { //DirectHllArray
       assertTrue(sk1.hllSketchImpl.isMemory());
-      assertTrue(sk1.isSameResource(wmem));
+      assertTrue(sk1.nativeOverlap(wmem) != 0);
     }
 
     //sk1.update(u);
diff --git a/src/test/java/org/apache/datasketches/hll/PreambleUtilTest.java b/src/test/java/org/apache/datasketches/hll/PreambleUtilTest.java
index 6fbe287a..6b616e7e 100644
--- a/src/test/java/org/apache/datasketches/hll/PreambleUtilTest.java
+++ b/src/test/java/org/apache/datasketches/hll/PreambleUtilTest.java
@@ -110,7 +110,6 @@ public class PreambleUtilTest {
     HllSketch sk = new HllSketch(12);
     byte[] memObj = sk.toCompactByteArray();
     WritableMemory wmem = WritableMemory.writableWrap(memObj);
-    long memAdd = wmem.getCumulativeOffset(0);
     HllSketch bad;
 
     //checkFamily
@@ -149,7 +148,6 @@ public class PreambleUtilTest {
     for (int i = 1; i <= 15; i++) { sk.update(i); }
     memObj = sk.toCompactByteArray();
     wmem = WritableMemory.writableWrap(memObj);
-    memAdd = wmem.getCumulativeOffset(0);
 
     //check wrong PreInts and SET
     try {
@@ -163,7 +161,6 @@ public class PreambleUtilTest {
     for (int i = 15; i <= 1000; i++) { sk.update(i); }
     memObj = sk.toCompactByteArray();
     wmem = WritableMemory.writableWrap(memObj);
-    memAdd = wmem.getCumulativeOffset(0);
 
     //check wrong PreInts and HLL
     try {
@@ -179,8 +176,6 @@ public class PreambleUtilTest {
   public void checkExtractFlags() {
     int bytes = HllSketch.getMaxUpdatableSerializationBytes(4, TgtHllType.HLL_4);
     WritableMemory wmem = WritableMemory.allocate(bytes);
-    Object memObj = wmem.getArray();
-    long memAdd = wmem.getCumulativeOffset(0L);
     HllSketch sk = new HllSketch(4, TgtHllType.HLL_4, wmem);
     int flags = extractFlags(wmem);
     assertEquals(flags, EMPTY_FLAG_MASK);
diff --git a/src/test/java/org/apache/datasketches/hll/UnionTest.java b/src/test/java/org/apache/datasketches/hll/UnionTest.java
index ee58d902..ca201732 100644
--- a/src/test/java/org/apache/datasketches/hll/UnionTest.java
+++ b/src/test/java/org/apache/datasketches/hll/UnionTest.java
@@ -267,7 +267,7 @@ public class UnionTest {
     byte[] byteArr = srcU.toCompactByteArray();
     Memory mem = Memory.wrap(byteArr);
     Union dstU = Union.heapify(mem);
-    assertFalse(dstU.isSameResource(mem));
+    assertFalse(dstU.nativeOverlap(mem) != 0);
 
     assertEquals(dstU.getEstimate(), srcU.getEstimate(), 0.0);
   }
diff --git a/src/test/java/org/apache/datasketches/kll/KllSketchTest.java b/src/test/java/org/apache/datasketches/kll/KllSketchTest.java
index f99bf9cd..bb895387 100644
--- a/src/test/java/org/apache/datasketches/kll/KllSketchTest.java
+++ b/src/test/java/org/apache/datasketches/kll/KllSketchTest.java
@@ -133,11 +133,11 @@ public class KllSketchTest {
     WritableMemory reg1 = wmem.writableRegion(0, 64);
     WritableMemory reg2 = wmem.writableRegion(64, 64);
     assertFalse(reg1 == reg2);
-    assertFalse(reg1.isSameResource(reg2));
+    assertTrue(reg1.nativeOverlap(reg2) == 0); //on heap
 
     WritableMemory reg3 = wmem.writableRegion(0, 64);
     assertFalse(reg1 == reg3);
-    assertTrue(reg1.isSameResource(reg3));
+    assertTrue(reg1.nativeOverlap(reg3) == 0);  //on heap
 
     byte[] byteArr1 = KllFloatsSketch.newHeapInstance(20).toByteArray();
     reg1.putByteArray(0, byteArr1, 0, byteArr1.length);
@@ -145,13 +145,13 @@ public class KllSketchTest {
 
     byte[] byteArr2 = KllFloatsSketch.newHeapInstance(20).toByteArray();
     reg2.putByteArray(0, byteArr2, 0, byteArr2.length);
-    if (!sk1.isSameResource(reg2)) {
+    if (sk1.nativeOverlap(reg2) == 0) { //on heap
       KllFloatsSketch sk2 = KllFloatsSketch.wrap(reg2);
     }
 
     byte[] byteArr3 = KllFloatsSketch.newHeapInstance(20).toByteArray();
     reg3.putByteArray(0, byteArr3, 0, byteArr3.length);
-    if (!sk1.isSameResource(reg3)) {
+    if (sk1.nativeOverlap(reg3) != 0) { //on heap, so false
       KllFloatsSketch sk3 = KllFloatsSketch.wrap(reg3);
       fail();
     }
diff --git a/src/test/java/org/apache/datasketches/quantiles/DebugUnionTest.java b/src/test/java/org/apache/datasketches/quantiles/DebugUnionTest.java
index f480d698..6218d90d 100644
--- a/src/test/java/org/apache/datasketches/quantiles/DebugUnionTest.java
+++ b/src/test/java/org/apache/datasketches/quantiles/DebugUnionTest.java
@@ -27,13 +27,17 @@ import java.util.HashSet;
 
 import org.testng.annotations.Test;
 
-import org.apache.datasketches.memory.WritableHandle;
+import jdk.incubator.foreign.ResourceScope;
+
+import org.apache.datasketches.memory.DefaultMemoryRequestServer;
+import org.apache.datasketches.memory.MemoryRequestServer;
 import org.apache.datasketches.memory.WritableMemory;
 
 /**
  * @author Lee Rhodes
  */
 public class DebugUnionTest {
+  private MemoryRequestServer memReqSvr = new DefaultMemoryRequestServer();
 
   @Test
   public void test() {
@@ -61,8 +65,8 @@ public class DebugUnionTest {
     DoublesSketch.setRandom(1); //make deterministic for test
     DoublesUnion dUnion;
     DoublesSketch dSketch;
-    try ( WritableHandle wdh = WritableMemory.allocateDirect(10_000_000) ) {
-      WritableMemory wmem = wdh.getWritable();
+    try (ResourceScope scope = ResourceScope.newConfinedScope()) {
+        WritableMemory wmem = WritableMemory.allocateDirect(10_000_000, scope, memReqSvr);
       dUnion = DoublesUnion.builder().setMaxK(8).build(wmem);
       for (int s = 0; s < numSketches; s++) { dUnion.update(sketchArr[s]); }
       dSketch = dUnion.getResult(); //result is on heap
diff --git a/src/test/java/org/apache/datasketches/quantiles/DirectQuantilesMemoryRequestTest.java b/src/test/java/org/apache/datasketches/quantiles/DirectQuantilesMemoryRequestTest.java
index 5c2882c5..f4d921c3 100644
--- a/src/test/java/org/apache/datasketches/quantiles/DirectQuantilesMemoryRequestTest.java
+++ b/src/test/java/org/apache/datasketches/quantiles/DirectQuantilesMemoryRequestTest.java
@@ -29,8 +29,10 @@ import java.nio.ByteOrder;
 import org.apache.datasketches.memory.DefaultMemoryRequestServer;
 import org.testng.annotations.Test;
 
+import jdk.incubator.foreign.ResourceScope;
+
 import org.apache.datasketches.memory.Memory;
-import org.apache.datasketches.memory.WritableHandle;
+import org.apache.datasketches.memory.MemoryRequestServer;
 import org.apache.datasketches.memory.WritableMemory;
 
 /**
@@ -39,6 +41,7 @@ import org.apache.datasketches.memory.WritableMemory;
  * allocating larger Memory when requested and the actual freeing of the old memory allocations.
  */
 public class DirectQuantilesMemoryRequestTest {
+  private MemoryRequestServer memReqSvr = new DefaultMemoryRequestServer();
 
   @Test
   public void checkLimitedMemoryScenarios() { //Requesting application
@@ -48,9 +51,8 @@ public class DirectQuantilesMemoryRequestTest {
 
     //########## Owning Implementation
     // This part would actually be part of the Memory owning implemention so it is faked here
-    try (WritableHandle wdh = WritableMemory.allocateDirect(initBytes,
-            ByteOrder.nativeOrder(), new DefaultMemoryRequestServer())) {
-      final WritableMemory wmem = wdh.getWritable();
+    try (ResourceScope scope = ResourceScope.newConfinedScope()) {
+      WritableMemory wmem = WritableMemory.allocateDirect(initBytes, 8, scope, ByteOrder.nativeOrder(), memReqSvr);
       println("Initial mem size: " + wmem.getCapacity());
 
       //########## Receiving Application
@@ -84,11 +86,9 @@ public class DirectQuantilesMemoryRequestTest {
     final int u = 32; // don't need the BB to fill here
     final int initBytes = (4 + (u / 2)) << 3; // not enough to hold everything
 
-    try (WritableHandle memHandler = WritableMemory.allocateDirect(initBytes,
-            ByteOrder.nativeOrder(), new DefaultMemoryRequestServer())) {
-      //final MemoryManager memMgr = new MemoryManager();
-      //final WritableMemory mem1 = memMgr.request(initBytes);
-      final WritableMemory mem1 = memHandler.getWritable();
+    try (ResourceScope scope = ResourceScope.newConfinedScope()) {
+      WritableMemory mem1 = WritableMemory.allocateDirect(initBytes, 8, scope,
+            ByteOrder.nativeOrder(), memReqSvr);
       println("Initial mem size: " + mem1.getCapacity());
       final UpdateDoublesSketch usk1 = DoublesSketch.builder().setK(k).build(mem1);
       for (int i = 1; i <= u; i++) {
@@ -108,11 +108,9 @@ public class DirectQuantilesMemoryRequestTest {
     final int u = (2 * k) - 1; //just to fill the BB
     final int initBytes = ((2 * k) + 4) << 3; //just room for BB
 
-    try (WritableHandle memHandler = WritableMemory.allocateDirect(initBytes,
-            ByteOrder.nativeOrder(), new DefaultMemoryRequestServer())) {
-      //final MemoryManager memMgr = new MemoryManager();
-      //final WritableMemory mem1 = memMgr.request(initBytes);
-      final WritableMemory mem1 = memHandler.getWritable();
+    try (ResourceScope scope = ResourceScope.newConfinedScope()) {
+      WritableMemory mem1 = WritableMemory.allocateDirect(initBytes, 8, scope,
+            ByteOrder.nativeOrder(), memReqSvr);
       println("Initial mem size: " + mem1.getCapacity());
       final UpdateDoublesSketch usk1 = DoublesSketch.builder().setK(k).build(mem1);
       for (int i = 1; i <= u; i++) {
@@ -138,12 +136,12 @@ public class DirectQuantilesMemoryRequestTest {
     final UpdateDoublesSketch usk1 = DoublesSketch.builder().setK(k).build();
     final Memory origSketchMem = Memory.wrap(usk1.toByteArray());
 
-    try (WritableHandle memHandle = WritableMemory.allocateDirect(initBytes,
-            ByteOrder.nativeOrder(), new DefaultMemoryRequestServer())) {
-      WritableMemory mem = memHandle.getWritable();
+    try (ResourceScope scope = ResourceScope.newConfinedScope()) {
+      WritableMemory mem = WritableMemory.allocateDirect(initBytes, 8, scope,
+            ByteOrder.nativeOrder(), memReqSvr);
       origSketchMem.copyTo(0, mem, 0, initBytes);
       UpdateDoublesSketch usk2 = DirectUpdateDoublesSketch.wrapInstance(mem);
-      assertTrue(mem.isSameResource(usk2.getMemory()));
+      assertTrue(mem.nativeOverlap(usk2.getMemory()) != 0);
       assertEquals(mem.getCapacity(), initBytes);
       assertTrue(mem.isDirect());
       assertTrue(usk2.isEmpty());
@@ -152,7 +150,7 @@ public class DirectQuantilesMemoryRequestTest {
       for (int i = 1; i <= 5; i++) { usk2.update(i); }
       assertEquals(usk2.getN(), 5);
       WritableMemory mem2 = usk2.getMemory();
-      assertFalse(mem.isSameResource(mem2));
+      assertFalse(mem.nativeOverlap(mem2) != 0);
       assertFalse(mem2.isDirect()); //should now be on-heap
 
       final int expectedSize = COMBINED_BUFFER + ((2 * k) << 3);
diff --git a/src/test/java/org/apache/datasketches/quantiles/DoublesSketchTest.java b/src/test/java/org/apache/datasketches/quantiles/DoublesSketchTest.java
index b8c2cab5..301d61fc 100644
--- a/src/test/java/org/apache/datasketches/quantiles/DoublesSketchTest.java
+++ b/src/test/java/org/apache/datasketches/quantiles/DoublesSketchTest.java
@@ -27,12 +27,15 @@ import static org.testng.Assert.assertTrue;
 import java.nio.ByteOrder;
 
 import org.apache.datasketches.memory.DefaultMemoryRequestServer;
-import org.apache.datasketches.memory.WritableHandle;
+import org.apache.datasketches.memory.MemoryRequestServer;
 import org.apache.datasketches.memory.WritableMemory;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
+import jdk.incubator.foreign.ResourceScope;
+
 public class DoublesSketchTest {
+  private MemoryRequestServer memReqSvr = new DefaultMemoryRequestServer();
 
   @Test
   public void heapToDirect() {
@@ -116,12 +119,12 @@ public class DoublesSketchTest {
     WritableMemory cmem = WritableMemory.writableWrap(new byte[8]);
     DirectUpdateDoublesSketch duds =
             (DirectUpdateDoublesSketch) DoublesSketch.builder().setK(k).build(mem);
-    assertTrue(duds.isSameResource(mem));
+    assertTrue(duds.nativeOverlap(mem) != 0);
     DirectCompactDoublesSketch dcds = (DirectCompactDoublesSketch) duds.compact(cmem);
-    assertTrue(dcds.isSameResource(cmem));
+    assertTrue(dcds.nativeOverlap(cmem) != 0);
 
     UpdateDoublesSketch uds = DoublesSketch.builder().setK(k).build();
-    assertFalse(uds.isSameResource(mem));
+    assertFalse(uds.nativeOverlap(mem) != 0);
   }
 
   @Test
@@ -135,15 +138,14 @@ public class DoublesSketchTest {
 
   @Test
   public void directSketchShouldMoveOntoHeapEventually() {
-    try (WritableHandle wdh = WritableMemory.allocateDirect(1000,
-            ByteOrder.nativeOrder(), new DefaultMemoryRequestServer())) {
-      WritableMemory mem = wdh.getWritable();
+    try (ResourceScope scope = ResourceScope.newConfinedScope()) {
+      WritableMemory mem = WritableMemory.allocateDirect(1000, 8, scope, ByteOrder.nativeOrder(), memReqSvr);
       UpdateDoublesSketch sketch = DoublesSketch.builder().build(mem);
-      Assert.assertTrue(sketch.isSameResource(mem));
+      Assert.assertTrue(sketch.nativeOverlap(mem) != 0);
       for (int i = 0; i < 1000; i++) {
         sketch.update(i);
       }
-      Assert.assertFalse(sketch.isSameResource(mem));
+      Assert.assertFalse(sketch.nativeOverlap(mem) != 0);
     } catch (final Exception e) {
       throw new RuntimeException(e);
     }
@@ -152,13 +154,12 @@ public class DoublesSketchTest {
   @Test
   public void directSketchShouldMoveOntoHeapEventually2() {
     int i = 0;
-    try (WritableHandle wdh =
-        WritableMemory.allocateDirect(50, ByteOrder.LITTLE_ENDIAN, new DefaultMemoryRequestServer())) {
-      WritableMemory mem = wdh.getWritable();
+    try (ResourceScope scope = ResourceScope.newConfinedScope()) {
+      WritableMemory mem = WritableMemory.allocateDirect(50, 8, scope, ByteOrder.nativeOrder(), memReqSvr);
       UpdateDoublesSketch sketch = DoublesSketch.builder().build(mem);
-      Assert.assertTrue(sketch.isSameResource(mem));
+      Assert.assertTrue(sketch.nativeOverlap(mem) != 0);
       for (; i < 1000; i++) {
-        if (sketch.isSameResource(mem)) {
+        if (sketch.nativeOverlap(mem) != 0) {
           sketch.update(i);
         } else {
           //println("MOVED OUT at i = " + i);
@@ -172,8 +173,8 @@ public class DoublesSketchTest {
 
   @Test
   public void checkEmptyDirect() {
-    try (WritableHandle wdh = WritableMemory.allocateDirect(1000)) {
-      WritableMemory mem = wdh.getWritable();
+    try (ResourceScope scope = ResourceScope.newConfinedScope()) {
+      WritableMemory mem = WritableMemory.allocateDirect(1000, 8, scope, ByteOrder.nativeOrder(), memReqSvr);
       UpdateDoublesSketch sketch = DoublesSketch.builder().build(mem);
       sketch.toByteArray(); //exercises a specific path
     } catch (final Exception e) {
diff --git a/src/test/java/org/apache/datasketches/quantiles/DoublesUnionImplTest.java b/src/test/java/org/apache/datasketches/quantiles/DoublesUnionImplTest.java
index 59f01078..529e2f05 100644
--- a/src/test/java/org/apache/datasketches/quantiles/DoublesUnionImplTest.java
+++ b/src/test/java/org/apache/datasketches/quantiles/DoublesUnionImplTest.java
@@ -692,19 +692,13 @@ public class DoublesUnionImplTest {
     assertEquals(bytesOut, byteArr); // wrapped, so should be exact
   }
 
-  @Test
-  public void isSameResourceHeap() {
-    DoublesUnion union = DoublesUnion.builder().build();
-    Assert.assertFalse(union.isSameResource(null));
-  }
-
   @Test
   public void isSameResourceDirect() {
     WritableMemory mem1 = WritableMemory.writableWrap(new byte[1000000]);
     DoublesUnion union = DoublesUnion.builder().build(mem1);
-    Assert.assertTrue(union.isSameResource(mem1));
+    Assert.assertTrue(union.nativeOverlap(mem1) != 0);
     WritableMemory mem2 = WritableMemory.writableWrap(new byte[1000000]);
-    Assert.assertFalse(union.isSameResource(mem2));
+    Assert.assertFalse(union.nativeOverlap(mem2) != 0);
   }
 
   @Test
diff --git a/src/test/java/org/apache/datasketches/quantiles/PreambleUtilTest.java b/src/test/java/org/apache/datasketches/quantiles/PreambleUtilTest.java
index be2f328b..80e326da 100644
--- a/src/test/java/org/apache/datasketches/quantiles/PreambleUtilTest.java
+++ b/src/test/java/org/apache/datasketches/quantiles/PreambleUtilTest.java
@@ -39,17 +39,21 @@ import static org.testng.Assert.assertEquals;
 
 import org.testng.annotations.Test;
 
+import jdk.incubator.foreign.ResourceScope;
+
+import org.apache.datasketches.memory.DefaultMemoryRequestServer;
 import org.apache.datasketches.memory.Memory;
-import org.apache.datasketches.memory.WritableHandle;
+import org.apache.datasketches.memory.MemoryRequestServer;
 import org.apache.datasketches.memory.WritableMemory;
 
 public class PreambleUtilTest {
+  private MemoryRequestServer memReqSvr = new DefaultMemoryRequestServer();
 
   @Test
   public void checkInsertsAndExtracts() {
     final int bytes = 32;
-    try (WritableHandle offHeapMemHandler = WritableMemory.allocateDirect(bytes)) {
-      final WritableMemory offHeapMem = offHeapMemHandler.getWritable();
+    try (ResourceScope scope = ResourceScope.newConfinedScope()) {
+      WritableMemory offHeapMem = WritableMemory.allocateDirect(bytes, scope, memReqSvr);
       final WritableMemory onHeapMem = WritableMemory.writableWrap(new byte[bytes]);
 
       onHeapMem.clear();
diff --git a/src/test/java/org/apache/datasketches/theta/CompactSketchTest.java b/src/test/java/org/apache/datasketches/theta/CompactSketchTest.java
index f4c7f0b4..2cce419d 100644
--- a/src/test/java/org/apache/datasketches/theta/CompactSketchTest.java
+++ b/src/test/java/org/apache/datasketches/theta/CompactSketchTest.java
@@ -27,15 +27,19 @@ import static org.testng.Assert.assertTrue;
 
 import org.apache.datasketches.Family;
 import org.apache.datasketches.SketchesArgumentException;
+import org.apache.datasketches.memory.DefaultMemoryRequestServer;
 import org.apache.datasketches.memory.Memory;
-import org.apache.datasketches.memory.WritableHandle;
+import org.apache.datasketches.memory.MemoryRequestServer;
 import org.apache.datasketches.memory.WritableMemory;
 import org.testng.annotations.Test;
 
+import jdk.incubator.foreign.ResourceScope;
+
 /**
  * @author Lee Rhodes
  */
 public class CompactSketchTest {
+  private MemoryRequestServer memReqSvr = new DefaultMemoryRequestServer();
 
   @Test
   public void checkHeapifyWrap() {
@@ -77,8 +81,8 @@ public class CompactSketchTest {
     //Prepare Memory for direct
     int bytes = usk.getCompactBytes(); //for Compact
 
-    try (WritableHandle wdh = WritableMemory.allocateDirect(bytes)) {
-      WritableMemory directMem = wdh.getWritable();
+    try (ResourceScope scope = ResourceScope.newConfinedScope()) {
+      WritableMemory directMem = WritableMemory.allocateDirect(bytes, scope, memReqSvr);
 
       /**Via CompactSketch.compact**/
       refSk = usk.compact(ordered, directMem);
diff --git a/src/test/java/org/apache/datasketches/theta/DirectQuickSelectSketchTest.java b/src/test/java/org/apache/datasketches/theta/DirectQuickSelectSketchTest.java
index 266d7ef0..eff7a550 100644
--- a/src/test/java/org/apache/datasketches/theta/DirectQuickSelectSketchTest.java
+++ b/src/test/java/org/apache/datasketches/theta/DirectQuickSelectSketchTest.java
@@ -46,21 +46,25 @@ import org.apache.datasketches.HashOperations;
 import org.apache.datasketches.ResizeFactor;
 import org.apache.datasketches.SketchesArgumentException;
 import org.apache.datasketches.SketchesReadOnlyException;
+import org.apache.datasketches.memory.DefaultMemoryRequestServer;
 import org.apache.datasketches.memory.Memory;
-import org.apache.datasketches.memory.WritableHandle;
+import org.apache.datasketches.memory.MemoryRequestServer;
 import org.apache.datasketches.memory.WritableMemory;
 import org.testng.annotations.Test;
 
+import jdk.incubator.foreign.ResourceScope;
+
 /**
  * @author Lee Rhodes
  */
 public class DirectQuickSelectSketchTest {
+  private static  MemoryRequestServer memReqSvr = new DefaultMemoryRequestServer();
 
   @Test//(expectedExceptions = SketchesArgumentException.class)
   public void checkBadSerVer() {
     int k = 512;
-    try (WritableHandle h = makeNativeMemory(k)) {
-      WritableMemory mem = h.getWritable();
+    try (ResourceScope scope = ResourceScope.newConfinedScope()) {
+      WritableMemory mem = makeNativeMemory(k, scope);
 
       UpdateSketch usk = UpdateSketch.builder().setNominalEntries(k).build(mem);
       DirectQuickSelectSketch sk1 = (DirectQuickSelectSketch)usk; //for internal checks
@@ -85,8 +89,8 @@ public class DirectQuickSelectSketchTest {
   @Test//(expectedExceptions = SketchesArgumentException.class)
   public void checkConstructorKtooSmall() {
     int k = 8;
-    try (WritableHandle h = makeNativeMemory(k)) {
-      WritableMemory mem = h.getWritable();
+    try (ResourceScope scope = ResourceScope.newConfinedScope()) {
+      WritableMemory mem = makeNativeMemory(k, scope);
       UpdateSketch.builder().setNominalEntries(k).build(mem);
     } catch (final Exception e) {
       if (e instanceof SketchesArgumentException) {}
@@ -97,8 +101,8 @@ public class DirectQuickSelectSketchTest {
   @Test//(expectedExceptions = SketchesArgumentException.class)
   public void checkConstructorMemTooSmall() {
     int k = 16;
-    try (WritableHandle h = makeNativeMemory(k/2)) {
-      WritableMemory mem = h.getWritable();
+    try (ResourceScope scope = ResourceScope.newConfinedScope()) {
+      WritableMemory mem = makeNativeMemory(k/2, scope);
       UpdateSketch.builder().setNominalEntries(k).build(mem);
     } catch (final Exception e) {
       if (e instanceof SketchesArgumentException) {}
@@ -125,8 +129,8 @@ public class DirectQuickSelectSketchTest {
     int u = 2*k;
     boolean estimating = (u > k);
 
-    try (WritableHandle h = makeNativeMemory(k)) {
-      WritableMemory mem = h.getWritable();
+    try (ResourceScope scope = ResourceScope.newConfinedScope()) {
+      WritableMemory mem = makeNativeMemory(k, scope);
 
       UpdateSketch sk1 = UpdateSketch.builder().setNominalEntries(k).build(mem);
       for (int i=0; i<u; i++) { sk1.update(i); }
@@ -197,8 +201,8 @@ public class DirectQuickSelectSketchTest {
     int k = 512;
     long seed1 = 1021;
     long seed2 = DEFAULT_UPDATE_SEED;
-    try (WritableHandle h = makeNativeMemory(k)) {
-      WritableMemory mem = h.getWritable();
+    try (ResourceScope scope = ResourceScope.newConfinedScope()) {
+      WritableMemory mem = makeNativeMemory(k, scope);
 
       UpdateSketch usk = UpdateSketch.builder().setSeed(seed1).setNominalEntries(k).build(mem);
       byte[] byteArray = usk.toByteArray();
@@ -213,8 +217,8 @@ public class DirectQuickSelectSketchTest {
   @Test//(expectedExceptions = SketchesArgumentException.class)
   public void checkCorruptLgNomLongs() {
     int k = 16;
-    try (WritableHandle h = makeNativeMemory(k)) {
-      WritableMemory mem = h.getWritable();
+    try (ResourceScope scope = ResourceScope.newConfinedScope()) {
+      WritableMemory mem = makeNativeMemory(k, scope);
       UpdateSketch.builder().setNominalEntries(k).build(mem);
       mem.putByte(LG_NOM_LONGS_BYTE, (byte)2); //corrupt
       Sketch.heapify(mem, DEFAULT_UPDATE_SEED);
@@ -227,8 +231,8 @@ public class DirectQuickSelectSketchTest {
   @Test
   public void checkHeapifyByteArrayExact() {
     int k = 512;
-    try (WritableHandle h = makeNativeMemory(k)) {
-      WritableMemory mem = h.getWritable();
+    try (ResourceScope scope = ResourceScope.newConfinedScope()) {
+      WritableMemory mem = makeNativeMemory(k, scope);
 
       UpdateSketch usk = UpdateSketch.builder().setNominalEntries(k).build(mem);
 
@@ -260,8 +264,8 @@ public class DirectQuickSelectSketchTest {
   public void checkHeapifyByteArrayEstimating() {
     int k = 4096;
     int u = 2*k;
-    try (WritableHandle h = makeNativeMemory(k)) {
-      WritableMemory mem = h.getWritable();
+    try (ResourceScope scope = ResourceScope.newConfinedScope()) {
+      WritableMemory mem = makeNativeMemory(k, scope);
       UpdateSketch usk = UpdateSketch.builder().setNominalEntries(k).build(mem);
 
       for (int i=0; i<u; i++) { usk.update(i); }
@@ -291,8 +295,8 @@ public class DirectQuickSelectSketchTest {
     int u = 2*k;
     boolean estimating = (u > k);
 
-    try (WritableHandle h = makeNativeMemory(k)) {
-      WritableMemory mem = h.getWritable();
+    try (ResourceScope scope = ResourceScope.newConfinedScope()) {
+      WritableMemory mem = makeNativeMemory(k, scope);
       UpdateSketch sk1 = UpdateSketch.builder().setNominalEntries(k).build(mem);
       for (int i=0; i<u; i++) { sk1.update(i); }
 
@@ -318,8 +322,8 @@ public class DirectQuickSelectSketchTest {
     int k = 512;
     int u = 4*k;
     boolean estimating = (u > k);
-    try (WritableHandle h = makeNativeMemory(k)) {
-      WritableMemory mem = h.getWritable();
+    try (ResourceScope scope = ResourceScope.newConfinedScope()) {
+      WritableMemory mem = makeNativeMemory(k, scope);
 
       UpdateSketch usk = UpdateSketch.builder().setNominalEntries(k).build(mem);
       DirectQuickSelectSketch sk1 = (DirectQuickSelectSketch)usk; //for internal checks
@@ -388,8 +392,8 @@ public class DirectQuickSelectSketchTest {
   @Test
   public void checkDQStoCompactEmptyForms() {
     int k = 512;
-    try (WritableHandle h = makeNativeMemory(k)) {
-      WritableMemory mem = h.getWritable();
+    try (ResourceScope scope = ResourceScope.newConfinedScope()) {
+      WritableMemory mem = makeNativeMemory(k, scope);
 
       UpdateSketch usk = UpdateSketch.builder().setNominalEntries(k).build(mem);
 
@@ -434,8 +438,8 @@ public class DirectQuickSelectSketchTest {
     int k = 4096;
     int u = 2*k;
 
-    try (WritableHandle h = makeNativeMemory(k)) {
-      WritableMemory mem = h.getWritable();
+    try (ResourceScope scope = ResourceScope.newConfinedScope()) {
+      WritableMemory mem = makeNativeMemory(k, scope);
 
       UpdateSketch usk = UpdateSketch.builder().setNominalEntries(k).build(mem);
       DirectQuickSelectSketch sk1 = (DirectQuickSelectSketch)usk; //for internal checks
@@ -455,8 +459,8 @@ public class DirectQuickSelectSketchTest {
     int k = 4096;
     float p = (float)0.5;
 
-    try (WritableHandle h = makeNativeMemory(k)) {
-      WritableMemory mem = h.getWritable();
+    try (ResourceScope scope = ResourceScope.newConfinedScope()) {
+      WritableMemory mem = makeNativeMemory(k, scope);
 
       UpdateSketch usk = UpdateSketch.builder().setP(p).setNominalEntries(k).build(mem);
       DirectQuickSelectSketch sk1 = (DirectQuickSelectSketch)usk; //for internal checks
@@ -481,8 +485,8 @@ public class DirectQuickSelectSketchTest {
   @Test
   public void checkErrorBounds() {
     int k = 512;
-    try (WritableHandle h = makeNativeMemory(k)) {
-      WritableMemory mem = h.getWritable();
+    try (ResourceScope scope = ResourceScope.newConfinedScope()) {
+      WritableMemory mem = makeNativeMemory(k, scope);
 
       UpdateSketch usk = UpdateSketch.builder().setNominalEntries(k).build(mem);
 
@@ -517,8 +521,8 @@ public class DirectQuickSelectSketchTest {
     //virgin, p = 1.0
     int k = 1024;
     float p = (float)1.0;
-    try (WritableHandle h = makeNativeMemory(k)) {
-      WritableMemory mem = h.getWritable();
+    try (ResourceScope scope = ResourceScope.newConfinedScope()) {
+      WritableMemory mem = makeNativeMemory(k, scope);
 
       UpdateSketch usk = UpdateSketch.builder().setP(p).setNominalEntries(k).build(mem);
       DirectQuickSelectSketch sk1 = (DirectQuickSelectSketch)usk; //for internal checks
@@ -557,8 +561,8 @@ public class DirectQuickSelectSketchTest {
   public void checkUpperAndLowerBounds() {
     int k = 512;
     int u = 2*k;
-    try (WritableHandle h = makeNativeMemory(k)) {
-      WritableMemory mem = h.getWritable();
+    try (ResourceScope scope = ResourceScope.newConfinedScope()) {
+      WritableMemory mem = makeNativeMemory(k, scope);
 
       UpdateSketch usk = UpdateSketch.builder().setNominalEntries(k).build(mem);
 
@@ -578,8 +582,8 @@ public class DirectQuickSelectSketchTest {
   public void checkRebuild() {
     int k = 512;
     int u = 4*k;
-    try (WritableHandle h = makeNativeMemory(k)) {
-      WritableMemory mem = h.getWritable();
+    try (ResourceScope scope = ResourceScope.newConfinedScope()) {
+      WritableMemory mem = makeNativeMemory(k, scope);
 
       UpdateSketch usk = UpdateSketch.builder().setNominalEntries(k).build(mem);
       DirectQuickSelectSketch sk1 = (DirectQuickSelectSketch)usk; //for internal checks
@@ -607,8 +611,8 @@ public class DirectQuickSelectSketchTest {
   public void checkResetAndStartingSubMultiple() {
     int k = 512;
     int u = 4*k;
-    try (WritableHandle h = makeNativeMemory(k)) {
-      WritableMemory mem = h.getWritable();
+    try (ResourceScope scope = ResourceScope.newConfinedScope()) {
+      WritableMemory mem = makeNativeMemory(k, scope);
 
       UpdateSketch usk = UpdateSketch.builder().setNominalEntries(k).build(mem);
       DirectQuickSelectSketch sk1 = (DirectQuickSelectSketch)usk; //for internal checks
@@ -638,8 +642,8 @@ public class DirectQuickSelectSketchTest {
   public void checkExactModeMemoryArr() {
     int k = 4096;
     int u = 4096;
-    try (WritableHandle h = makeNativeMemory(k)) {
-      WritableMemory mem = h.getWritable();
+    try (ResourceScope scope = ResourceScope.newConfinedScope()) {
+      WritableMemory mem = makeNativeMemory(k, scope);
 
       UpdateSketch usk = UpdateSketch.builder().setNominalEntries(k).build(mem);
       DirectQuickSelectSketch sk1 = (DirectQuickSelectSketch)usk; //for internal checks
@@ -659,8 +663,8 @@ public class DirectQuickSelectSketchTest {
     int k = 4096;
     int u = 2*k;
 
-    try (WritableHandle h = makeNativeMemory(k)) {
-      WritableMemory mem = h.getWritable();
+    try (ResourceScope scope = ResourceScope.newConfinedScope()) {
+      WritableMemory mem = makeNativeMemory(k, scope);
 
       UpdateSketch usk = UpdateSketch.builder().setNominalEntries(k).build(mem);
       DirectQuickSelectSketch sk1 = (DirectQuickSelectSketch)usk; //for internal checks
@@ -680,10 +684,9 @@ public class DirectQuickSelectSketchTest {
     int k = 4096;
     int u = 2*k;
     int memCapacity = (k << 4) + (Family.QUICKSELECT.getMinPreLongs() << 3);
-
-    try(WritableHandle memHandler = WritableMemory.allocateDirect(memCapacity)) {
-
-      UpdateSketch usk = UpdateSketch.builder().setNominalEntries(k).build(memHandler.getWritable());
+    try (ResourceScope scope = ResourceScope.newConfinedScope()) {
+      WritableMemory wmem = WritableMemory.allocateDirect(memCapacity, scope, memReqSvr);
+      UpdateSketch usk = UpdateSketch.builder().setNominalEntries(k).build(wmem);
       DirectQuickSelectSketch sk1 = (DirectQuickSelectSketch)usk; //for internal checks
       assertTrue(usk.isEmpty());
 
@@ -702,8 +705,9 @@ public class DirectQuickSelectSketchTest {
     int k = 4096;
     int u = 2*k;
 
-    try (WritableHandle h = makeNativeMemory(k)) {
-      UpdateSketch usk = UpdateSketch.builder().setNominalEntries(k).build(h.getWritable());
+    try (ResourceScope scope = ResourceScope.newConfinedScope()) {
+      WritableMemory wmem = makeNativeMemory(k, scope);
+      UpdateSketch usk = UpdateSketch.builder().setNominalEntries(k).build(wmem);
       assertTrue(usk.isEmpty());
 
       for (int i = 0; i< u; i++) { usk.update(i); } //force estimation
@@ -871,12 +875,12 @@ public class DirectQuickSelectSketchTest {
     int k = 1 << 12;
     int u = 2 * k;
     int bytes = Sketches.getMaxUpdateSketchBytes(k);
-      try (WritableHandle wdh = WritableMemory.allocateDirect(bytes/2)) { //will request
-      WritableMemory wmem = wdh.getWritable();
+    try (ResourceScope scope = ResourceScope.newConfinedScope()) {
+      WritableMemory wmem = WritableMemory.allocateDirect(bytes/2, scope, memReqSvr); //will request
       UpdateSketch sketch = Sketches.updateSketchBuilder().setNominalEntries(k).build(wmem);
-      assertTrue(sketch.isSameResource(wmem));
+      assertTrue(sketch.nativeOverlap(wmem) != 0);
       for (int i = 0; i < u; i++) { sketch.update(i); }
-      assertFalse(sketch.isSameResource(wmem));
+      assertFalse(sketch.nativeOverlap(wmem) != 0);
     } catch (final Exception e) {
       throw new RuntimeException(e);
     }
@@ -887,8 +891,8 @@ public class DirectQuickSelectSketchTest {
     int k = 1 << 12;
     int u = 2 * k;
     int bytes = Sketches.getMaxUpdateSketchBytes(k);
-    try (WritableHandle wdh = WritableMemory.allocateDirect(bytes/2)) { //will request
-      WritableMemory wmem = wdh.getWritable();
+    try (ResourceScope scope = ResourceScope.newConfinedScope()) {
+      WritableMemory wmem = WritableMemory.allocateDirect(bytes/2, scope, memReqSvr); //will request
       UpdateSketch sketch = Sketches.updateSketchBuilder().setNominalEntries(k).build(wmem);
       for (int i = 0; i < u; i++) { sketch.update(i); }
       double est1 = sketch.getEstimate();
@@ -932,8 +936,8 @@ public class DirectQuickSelectSketchTest {
     return (k << 4) + (Family.QUICKSELECT.getMinPreLongs() << 3);
   }
 
-  private static WritableHandle makeNativeMemory(int k) {
-    return WritableMemory.allocateDirect(getMaxBytes(k));
+  private static WritableMemory makeNativeMemory(int k, ResourceScope scope) {
+    return WritableMemory.allocateDirect(getMaxBytes(k), scope, memReqSvr);
   }
 
 }
diff --git a/src/test/java/org/apache/datasketches/theta/HeapIntersectionTest.java b/src/test/java/org/apache/datasketches/theta/HeapIntersectionTest.java
index eb8376ce..74483a74 100644
--- a/src/test/java/org/apache/datasketches/theta/HeapIntersectionTest.java
+++ b/src/test/java/org/apache/datasketches/theta/HeapIntersectionTest.java
@@ -81,7 +81,7 @@ public class HeapIntersectionTest {
     rsk1 = inter.getResult(ordered, mem);
     assertEquals(rsk1.getEstimate(), 0.0);
 
-    assertFalse(inter.isSameResource(mem));
+    assertFalse(inter.nativeOverlap(mem) != 0);
   }
 
   @Test
diff --git a/src/test/java/org/apache/datasketches/theta/HeapifyWrapSerVer1and2Test.java b/src/test/java/org/apache/datasketches/theta/HeapifyWrapSerVer1and2Test.java
index 82b17d96..edd54ef2 100644
--- a/src/test/java/org/apache/datasketches/theta/HeapifyWrapSerVer1and2Test.java
+++ b/src/test/java/org/apache/datasketches/theta/HeapifyWrapSerVer1and2Test.java
@@ -24,14 +24,19 @@ import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertTrue;
 
+import org.apache.datasketches.memory.DefaultMemoryRequestServer;
 import org.apache.datasketches.memory.Memory;
-import org.apache.datasketches.memory.WritableHandle;
+import org.apache.datasketches.memory.MemoryRequestServer;
 import org.apache.datasketches.memory.WritableMemory;
 import org.apache.datasketches.tuple.Util;
 import org.testng.annotations.Test;
 
+import jdk.incubator.foreign.ResourceScope;
+
 public class HeapifyWrapSerVer1and2Test {
   private static final short defaultSeedHash = Util.computeSeedHash(DEFAULT_UPDATE_SEED);
+  private static MemoryRequestServer memReqSvr = new DefaultMemoryRequestServer();
+  //private static ResourceScope scope = ResourceScope.newImplicitScope();
 
   @Test
   public void checkHeapifyCompactSketchAssumedDefaultSeed() {
@@ -281,32 +286,32 @@ public class HeapifyWrapSerVer1and2Test {
     UpdateSketch sv3usk = UpdateSketch.builder().setNominalEntries(k).setSeed(seed).build();
     for (int i=0; i<k; i++) { sv3usk.update(i); }
     CompactSketch sv3cskResult;
-    WritableHandle wh;
     CompactSketch sv3csk = sv3usk.compact();
+    WritableMemory wmem;
 
     //SV3 test
-    wh = putOffHeap(Memory.wrap(sv3csk.toByteArray()));
-    sv3cskResult = Sketches.wrapCompactSketch(wh.getWritable());
+    wmem = putOffHeap(Memory.wrap(sv3csk.toByteArray()));
+    sv3cskResult = Sketches.wrapCompactSketch(wmem);
     assertEquals(sv3cskResult.getEstimate(), sv3usk.getEstimate());
     assertEquals(sv3cskResult.getSeedHash(), seedHash);
     assertTrue(sv3cskResult.isDirect());
-    try { wh.close(); } catch (Exception e) {}
+    try { wmem.close(); } catch (Exception e) {}
 
     //SV2 test
-    wh = putOffHeap(BackwardConversions.convertSerVer3toSerVer2(sv3csk, seed));
-    sv3cskResult = Sketches.wrapCompactSketch(wh.getWritable());
+    wmem = putOffHeap(BackwardConversions.convertSerVer3toSerVer2(sv3csk, seed));
+    sv3cskResult = Sketches.wrapCompactSketch(wmem);
     assertEquals(sv3cskResult.getEstimate(), sv3usk.getEstimate());
     assertEquals(sv3cskResult.getSeedHash(), seedHash);
     assertFalse(sv3cskResult.isDirect());
-    try { wh.close(); } catch (Exception e) {}
+    try { wmem.close(); } catch (Exception e) {}
 
     //SV1 test
-    wh = putOffHeap(BackwardConversions.convertSerVer3toSerVer1(sv3csk));
-    sv3cskResult = Sketches.wrapCompactSketch(wh.getWritable());
+    wmem = putOffHeap(BackwardConversions.convertSerVer3toSerVer1(sv3csk));
+    sv3cskResult = Sketches.wrapCompactSketch(wmem);
     assertEquals(sv3cskResult.getEstimate(), sv3usk.getEstimate());
     assertEquals(sv3cskResult.getSeedHash(), seedHash);
     assertFalse(sv3cskResult.isDirect());
-    try { wh.close(); } catch (Exception e) {}
+    try { wmem.close(); } catch (Exception e) {}
   }
 
   @Test
@@ -317,32 +322,32 @@ public class HeapifyWrapSerVer1and2Test {
     UpdateSketch sv3usk = UpdateSketch.builder().setNominalEntries(k).setSeed(seed).build();
     for (int i=0; i<k; i++) { sv3usk.update(i); }
     CompactSketch sv3cskResult;
-    WritableHandle wh;
+    WritableMemory wmem;
     CompactSketch sv3csk = sv3usk.compact();
 
     //SV3 test
-    wh = putOffHeap(Memory.wrap(sv3csk.toByteArray()));
-    sv3cskResult = Sketches.wrapCompactSketch(wh.getWritable());
+    wmem = putOffHeap(Memory.wrap(sv3csk.toByteArray()));
+    sv3cskResult = Sketches.wrapCompactSketch(wmem);
     assertEquals(sv3cskResult.getEstimate(), sv3usk.getEstimate());
     assertEquals(sv3cskResult.getSeedHash(), seedHash);
     assertTrue(sv3cskResult.isDirect());
-    try { wh.close(); } catch (Exception e) {}
+    try { wmem.close(); } catch (Exception e) {}
 
     //SV2 test
-    wh = putOffHeap(BackwardConversions.convertSerVer3toSerVer2(sv3csk, seed));
-    sv3cskResult = Sketches.wrapCompactSketch(wh.getWritable());
+    wmem = putOffHeap(BackwardConversions.convertSerVer3toSerVer2(sv3csk, seed));
+    sv3cskResult = Sketches.wrapCompactSketch(wmem);
     assertEquals(sv3cskResult.getEstimate(), sv3usk.getEstimate());
     assertEquals(sv3cskResult.getSeedHash(), seedHash);
     assertFalse(sv3cskResult.isDirect());
-    try { wh.close(); } catch (Exception e) {}
+    try { wmem.close(); } catch (Exception e) {}
 
     //SV1 test
-    wh = putOffHeap(BackwardConversions.convertSerVer3toSerVer1(sv3csk));
-    sv3cskResult = Sketches.wrapCompactSketch(wh.getWritable());
+    wmem = putOffHeap(BackwardConversions.convertSerVer3toSerVer1(sv3csk));
+    sv3cskResult = Sketches.wrapCompactSketch(wmem);
     assertEquals(sv3cskResult.getEstimate(), sv3usk.getEstimate());
     assertEquals(sv3cskResult.getSeedHash(), defaultSeedHash);
     assertFalse(sv3cskResult.isDirect());
-    try { wh.close(); } catch (Exception e) {}
+    try { wmem.close(); } catch (Exception e) {}
   }
 
   @Test
@@ -353,32 +358,32 @@ public class HeapifyWrapSerVer1and2Test {
     UpdateSketch sv3usk = UpdateSketch.builder().setNominalEntries(k).setSeed(seed).build();
     for (int i=0; i<k; i++) { sv3usk.update(i); }
     CompactSketch sv3cskResult;
-    WritableHandle wh;
+    WritableMemory wmem;
     CompactSketch sv3csk = sv3usk.compact();
 
     //SV3 test
-    wh = putOffHeap(Memory.wrap(sv3csk.toByteArray()));
-    sv3cskResult = Sketches.wrapCompactSketch(wh.getWritable(), seed);
+    wmem = putOffHeap(Memory.wrap(sv3csk.toByteArray()));
+    sv3cskResult = Sketches.wrapCompactSketch(wmem, seed);
     assertEquals(sv3cskResult.getEstimate(), sv3usk.getEstimate());
     assertEquals(sv3cskResult.getSeedHash(), seedHash);
     assertTrue(sv3cskResult.isDirect());
-    try { wh.close(); } catch (Exception e) {}
+    try { wmem.close(); } catch (Exception e) {}
 
     //SV2 test
-    wh = putOffHeap(BackwardConversions.convertSerVer3toSerVer2(sv3csk, seed));
-    sv3cskResult = Sketches.wrapCompactSketch(wh.getWritable(), seed);
+    wmem = putOffHeap(BackwardConversions.convertSerVer3toSerVer2(sv3csk, seed));
+    sv3cskResult = Sketches.wrapCompactSketch(wmem, seed);
     assertEquals(sv3cskResult.getEstimate(), sv3usk.getEstimate());
     assertEquals(sv3cskResult.getSeedHash(), seedHash);
     assertFalse(sv3cskResult.isDirect());
-    try { wh.close(); } catch (Exception e) {}
+    try { wmem.close(); } catch (Exception e) {}
 
     //SV1 test
-    wh = putOffHeap(BackwardConversions.convertSerVer3toSerVer1(sv3csk));
-    sv3cskResult = Sketches.wrapCompactSketch(wh.getWritable(), seed);
+    wmem = putOffHeap(BackwardConversions.convertSerVer3toSerVer1(sv3csk));
+    sv3cskResult = Sketches.wrapCompactSketch(wmem, seed);
     assertEquals(sv3cskResult.getEstimate(), sv3usk.getEstimate());
     assertEquals(sv3cskResult.getSeedHash(), seedHash);
     assertFalse(sv3cskResult.isDirect());
-    try { wh.close(); } catch (Exception e) {/* ignore */}
+    try { wmem.close(); } catch (Exception e) {/* ignore */}
   }
 
   @Test
@@ -389,32 +394,32 @@ public class HeapifyWrapSerVer1and2Test {
     UpdateSketch sv3usk = UpdateSketch.builder().setNominalEntries(k).setSeed(seed).build();
     for (int i=0; i<k; i++) { sv3usk.update(i); }
     CompactSketch sv3cskResult;
-    WritableHandle wh;
+    WritableMemory wmem;
     CompactSketch sv3csk = sv3usk.compact();
 
     //SV3 test
-    wh = putOffHeap(Memory.wrap(sv3csk.toByteArray()));
-    sv3cskResult = Sketches.wrapCompactSketch(wh.getWritable(), seed);
+    wmem = putOffHeap(Memory.wrap(sv3csk.toByteArray()));
+    sv3cskResult = Sketches.wrapCompactSketch(wmem, seed);
     assertEquals(sv3cskResult.getEstimate(), sv3usk.getEstimate());
     assertEquals(sv3cskResult.getSeedHash(), seedHash);
     assertTrue(sv3cskResult.isDirect());
-    try { wh.close(); } catch (Exception e) {}
+    try { wmem.close(); } catch (Exception e) {}
 
     //SV2 test
-    wh = putOffHeap(BackwardConversions.convertSerVer3toSerVer2(sv3csk, seed));
-    sv3cskResult = Sketches.wrapCompactSketch(wh.getWritable(), seed);
+    wmem = putOffHeap(BackwardConversions.convertSerVer3toSerVer2(sv3csk, seed));
+    sv3cskResult = Sketches.wrapCompactSketch(wmem, seed);
     assertEquals(sv3cskResult.getEstimate(), sv3usk.getEstimate());
     assertEquals(sv3cskResult.getSeedHash(), seedHash);
     assertFalse(sv3cskResult.isDirect());
-    try { wh.close(); } catch (Exception e) {}
+    try { wmem.close(); } catch (Exception e) {}
 
     //SV1 test
-    wh = putOffHeap(BackwardConversions.convertSerVer3toSerVer1(sv3csk));
-    sv3cskResult = Sketches.wrapCompactSketch(wh.getWritable(), seed);
+    wmem = putOffHeap(BackwardConversions.convertSerVer3toSerVer1(sv3csk));
+    sv3cskResult = Sketches.wrapCompactSketch(wmem, seed);
     assertEquals(sv3cskResult.getEstimate(), sv3usk.getEstimate());
     assertEquals(sv3cskResult.getSeedHash(), seedHash);
     assertFalse(sv3cskResult.isDirect());
-    try { wh.close(); } catch (Exception e) {}
+    try { wmem.close(); } catch (Exception e) {}
   }
 
   @Test
@@ -425,32 +430,32 @@ public class HeapifyWrapSerVer1and2Test {
     UpdateSketch sv3usk = UpdateSketch.builder().setNominalEntries(k).setSeed(seed).build();
     for (int i=0; i<k; i++) { sv3usk.update(i); }
     CompactSketch sv3cskResult;
-    WritableHandle wh;
+    WritableMemory wmem;
     CompactSketch sv3csk = sv3usk.compact();
 
     //SV3 test
-    wh = putOffHeap(Memory.wrap(sv3csk.toByteArray()));
-    sv3cskResult = (CompactSketch) Sketches.wrapSketch(wh.getWritable());
+    wmem = putOffHeap(Memory.wrap(sv3csk.toByteArray()));
+    sv3cskResult = (CompactSketch) Sketches.wrapSketch(wmem);
     assertEquals(sv3cskResult.getEstimate(), sv3usk.getEstimate());
     assertEquals(sv3cskResult.getSeedHash(), seedHash);
     assertTrue(sv3cskResult.isDirect());
-    try { wh.close(); } catch (Exception e) {}
+    try { wmem.close(); } catch (Exception e) {}
 
     //SV2 test
-    wh = putOffHeap(BackwardConversions.convertSerVer3toSerVer2(sv3csk, seed));
-    sv3cskResult = (CompactSketch) Sketches.wrapSketch(wh.getWritable());
+    wmem = putOffHeap(BackwardConversions.convertSerVer3toSerVer2(sv3csk, seed));
+    sv3cskResult = (CompactSketch) Sketches.wrapSketch(wmem);
     assertEquals(sv3cskResult.getEstimate(), sv3usk.getEstimate());
     assertEquals(sv3cskResult.getSeedHash(), seedHash);
     assertFalse(sv3cskResult.isDirect());
-    try { wh.close(); } catch (Exception e) {}
+    try { wmem.close(); } catch (Exception e) {}
 
     //SV1 test
-    wh = putOffHeap(BackwardConversions.convertSerVer3toSerVer1(sv3csk));
-    sv3cskResult = (CompactSketch) Sketches.wrapSketch(wh.getWritable());
+    wmem = putOffHeap(BackwardConversions.convertSerVer3toSerVer1(sv3csk));
+    sv3cskResult = (CompactSketch) Sketches.wrapSketch(wmem);
     assertEquals(sv3cskResult.getEstimate(), sv3usk.getEstimate());
     assertEquals(sv3cskResult.getSeedHash(), seedHash);
     assertFalse(sv3cskResult.isDirect());
-    try { wh.close(); } catch (Exception e) {}
+    try { wmem.close(); } catch (Exception e) {}
   }
 
   @Test
@@ -461,32 +466,32 @@ public class HeapifyWrapSerVer1and2Test {
     UpdateSketch sv3usk = UpdateSketch.builder().setNominalEntries(k).setSeed(seed).build();
     for (int i=0; i<k; i++) { sv3usk.update(i); }
     CompactSketch sv3cskResult;
-    WritableHandle wh;
+    WritableMemory wmem;
     CompactSketch sv3csk = sv3usk.compact();
 
     //SV3 test
-    wh = putOffHeap(Memory.wrap(sv3csk.toByteArray()));
-    sv3cskResult = (CompactSketch) Sketches.wrapSketch(wh.getWritable());
+    wmem = putOffHeap(Memory.wrap(sv3csk.toByteArray()));
+    sv3cskResult = (CompactSketch) Sketches.wrapSketch(wmem);
     assertEquals(sv3cskResult.getEstimate(), sv3usk.getEstimate());
     assertEquals(sv3cskResult.getSeedHash(), seedHash);
     assertTrue(sv3cskResult.isDirect());
-    try { wh.close(); } catch (Exception e) {}
+    try { wmem.close(); } catch (Exception e) {}
 
     //SV2 test
-    wh = putOffHeap(BackwardConversions.convertSerVer3toSerVer2(sv3csk, seed));
-    sv3cskResult = (CompactSketch) Sketches.wrapSketch(wh.getWritable());
+    wmem = putOffHeap(BackwardConversions.convertSerVer3toSerVer2(sv3csk, seed));
+    sv3cskResult = (CompactSketch) Sketches.wrapSketch(wmem);
     assertEquals(sv3cskResult.getEstimate(), sv3usk.getEstimate());
     assertEquals(sv3cskResult.getSeedHash(), seedHash);
     assertFalse(sv3cskResult.isDirect());
-    try { wh.close(); } catch (Exception e) {}
+    try { wmem.close(); } catch (Exception e) {}
 
     //SV1 test
-    wh = putOffHeap(BackwardConversions.convertSerVer3toSerVer1(sv3csk));
-    sv3cskResult = (CompactSketch) Sketches.wrapSketch(wh.getWritable());
+    wmem = putOffHeap(BackwardConversions.convertSerVer3toSerVer1(sv3csk));
+    sv3cskResult = (CompactSketch) Sketches.wrapSketch(wmem);
     assertEquals(sv3cskResult.getEstimate(), sv3usk.getEstimate());
     assertEquals(sv3cskResult.getSeedHash(), defaultSeedHash);
     assertFalse(sv3cskResult.isDirect());
-    try { wh.close(); } catch (Exception e) {}
+    try { wmem.close(); } catch (Exception e) {}
   }
 
   @Test
@@ -497,32 +502,32 @@ public class HeapifyWrapSerVer1and2Test {
     UpdateSketch sv3usk = UpdateSketch.builder().setNominalEntries(k).setSeed(seed).build();
     for (int i=0; i<k; i++) { sv3usk.update(i); }
     CompactSketch sv3cskResult;
-    WritableHandle wh;
+    WritableMemory wmem;
     CompactSketch sv3csk = sv3usk.compact();
 
     //SV3 test
-    wh = putOffHeap(Memory.wrap(sv3csk.toByteArray()));
-    sv3cskResult = (CompactSketch) Sketches.wrapSketch(wh.getWritable(), seed);
+    wmem = putOffHeap(Memory.wrap(sv3csk.toByteArray()));
+    sv3cskResult = (CompactSketch) Sketches.wrapSketch(wmem, seed);
     assertEquals(sv3cskResult.getEstimate(), sv3usk.getEstimate());
     assertEquals(sv3cskResult.getSeedHash(), seedHash);
     assertTrue(sv3cskResult.isDirect());
-    try { wh.close(); } catch (Exception e) {}
+    try { wmem.close(); } catch (Exception e) {}
 
     //SV2 test
-    wh = putOffHeap(BackwardConversions.convertSerVer3toSerVer2(sv3csk, seed));
-    sv3cskResult = (CompactSketch) Sketches.wrapSketch(wh.getWritable(), seed);
+    wmem = putOffHeap(BackwardConversions.convertSerVer3toSerVer2(sv3csk, seed));
+    sv3cskResult = (CompactSketch) Sketches.wrapSketch(wmem, seed);
     assertEquals(sv3cskResult.getEstimate(), sv3usk.getEstimate());
     assertEquals(sv3cskResult.getSeedHash(), seedHash);
     assertFalse(sv3cskResult.isDirect());
-    try { wh.close(); } catch (Exception e) {}
+    try { wmem.close(); } catch (Exception e) {}
 
     //SV1 test
-    wh = putOffHeap(BackwardConversions.convertSerVer3toSerVer1(sv3csk));
-    sv3cskResult = (CompactSketch) Sketches.wrapSketch(wh.getWritable(), seed);
+    wmem = putOffHeap(BackwardConversions.convertSerVer3toSerVer1(sv3csk));
+    sv3cskResult = (CompactSketch) Sketches.wrapSketch(wmem, seed);
     assertEquals(sv3cskResult.getEstimate(), sv3usk.getEstimate());
     assertEquals(sv3cskResult.getSeedHash(), seedHash);
     assertFalse(sv3cskResult.isDirect());
-    try { wh.close(); } catch (Exception e) {}
+    try { wmem.close(); } catch (Exception e) {}
   }
 
   @Test
@@ -533,40 +538,40 @@ public class HeapifyWrapSerVer1and2Test {
     UpdateSketch sv3usk = UpdateSketch.builder().setNominalEntries(k).setSeed(seed).build();
     for (int i=0; i<k; i++) { sv3usk.update(i); }
     CompactSketch sv3cskResult;
-    WritableHandle wh;
+    WritableMemory wmem;
     CompactSketch sv3csk = sv3usk.compact();
 
     //SV3 test
-    wh = putOffHeap(Memory.wrap(sv3csk.toByteArray()));
-    sv3cskResult = (CompactSketch) Sketches.wrapSketch(wh.getWritable(), seed);
+    wmem = putOffHeap(Memory.wrap(sv3csk.toByteArray()));
+    sv3cskResult = (CompactSketch) Sketches.wrapSketch(wmem, seed);
     assertEquals(sv3cskResult.getEstimate(), sv3usk.getEstimate());
     assertEquals(sv3cskResult.getSeedHash(), seedHash);
     assertTrue(sv3cskResult.isDirect());
-    try { wh.close(); } catch (Exception e) {}
+    try { wmem.close(); } catch (Exception e) {}
 
     //SV2 test
-    wh = putOffHeap(BackwardConversions.convertSerVer3toSerVer2(sv3csk, seed));
-    sv3cskResult = (CompactSketch) Sketches.wrapSketch(wh.getWritable(), seed);
+    wmem = putOffHeap(BackwardConversions.convertSerVer3toSerVer2(sv3csk, seed));
+    sv3cskResult = (CompactSketch) Sketches.wrapSketch(wmem, seed);
     assertEquals(sv3cskResult.getEstimate(), sv3usk.getEstimate());
     assertEquals(sv3cskResult.getSeedHash(), seedHash);
     assertFalse(sv3cskResult.isDirect());
-    try { wh.close(); } catch (Exception e) {}
+    try { wmem.close(); } catch (Exception e) {}
 
     //SV1 test
-    wh = putOffHeap(BackwardConversions.convertSerVer3toSerVer1(sv3csk));
-    sv3cskResult = (CompactSketch) Sketches.wrapSketch(wh.getWritable(), seed);
+    wmem = putOffHeap(BackwardConversions.convertSerVer3toSerVer1(sv3csk));
+    sv3cskResult = (CompactSketch) Sketches.wrapSketch(wmem, seed);
     assertEquals(sv3cskResult.getEstimate(), sv3usk.getEstimate());
     assertEquals(sv3cskResult.getSeedHash(), seedHash);
     assertFalse(sv3cskResult.isDirect());
-    try { wh.close(); } catch (Exception e) {}
+    try { wmem.close(); } catch (Exception e) {}
   }
 
-  private static WritableHandle putOffHeap(Memory heapMem) {
+  private static WritableMemory putOffHeap(Memory heapMem) {
     final long cap = heapMem.getCapacity();
-    WritableHandle wh = WritableMemory.allocateDirect(cap);
-    WritableMemory wmem = wh.getWritable();
+    ResourceScope scope = ResourceScope.newConfinedScope();
+    WritableMemory wmem = WritableMemory.allocateDirect(cap, scope, memReqSvr);
     heapMem.copyTo(0, wmem, 0, cap);
-    return wh;
+    return wmem;
   }
 
   @Test
diff --git a/src/test/java/org/apache/datasketches/theta/SetOperationTest.java b/src/test/java/org/apache/datasketches/theta/SetOperationTest.java
index 8ddac37a..a974fa40 100644
--- a/src/test/java/org/apache/datasketches/theta/SetOperationTest.java
+++ b/src/test/java/org/apache/datasketches/theta/SetOperationTest.java
@@ -320,16 +320,16 @@ public class SetOperationTest {
     final WritableMemory wmem = WritableMemory.writableWrap(new byte[k*16 + 32]);
     final Memory roCompactMem = Memory.wrap(new byte[8]);
     final Union union = Sketches.setOperationBuilder().setNominalEntries(k).buildUnion(wmem);
-    assertTrue(union.isSameResource(wmem));
-    assertFalse(union.isSameResource(roCompactMem));
+    assertTrue(union.nativeOverlap(wmem) != 0);
+    assertFalse(union.nativeOverlap(roCompactMem) != 0);
 
     final Intersection inter = Sketches.setOperationBuilder().buildIntersection(wmem);
-    assertTrue(inter.isSameResource(wmem));
-    assertFalse(inter.isSameResource(roCompactMem));
+    assertTrue(inter.nativeOverlap(wmem) != 0);
+    assertFalse(inter.nativeOverlap(roCompactMem) != 0);
 
     final AnotB aNotB = Sketches.setOperationBuilder().buildANotB();
 
-    assertFalse(aNotB.isSameResource(roCompactMem));
+    assertFalse(aNotB.nativeOverlap(roCompactMem) != 0);
   }
 
   @Test
diff --git a/src/test/java/org/apache/datasketches/theta/SketchTest.java b/src/test/java/org/apache/datasketches/theta/SketchTest.java
index d57632d8..d725d545 100644
--- a/src/test/java/org/apache/datasketches/theta/SketchTest.java
+++ b/src/test/java/org/apache/datasketches/theta/SketchTest.java
@@ -325,17 +325,17 @@ public class SketchTest {
     UpdateSketch sketch = Sketches.updateSketchBuilder().setNominalEntries(k).build(mem);
     sketch.update(1);
     sketch.update(2);
-    assertTrue(sketch.isSameResource(mem));
+    assertTrue(sketch.nativeOverlap(mem) != 0);
     DirectCompactSketch dcos = (DirectCompactSketch) sketch.compact(true, cmem);
-    assertTrue(dcos.isSameResource(cmem));
+    assertTrue(dcos.nativeOverlap(cmem) != 0);
     assertTrue(dcos.isOrdered());
     //never create 2 sketches with the same memory, so don't do as I do :)
     DirectCompactSketch dcs = (DirectCompactSketch) sketch.compact(false, cmem);
-    assertTrue(dcs.isSameResource(cmem));
+    assertTrue(dcs.nativeOverlap(cmem) != 0);
     assertFalse(dcs.isOrdered());
 
     Sketch sk = Sketches.updateSketchBuilder().setNominalEntries(k).build();
-    assertFalse(sk.isSameResource(mem));
+    assertFalse(sk.nativeOverlap(mem) != 0);
   }
 
   @Test
diff --git a/src/test/java/org/apache/datasketches/theta/UnionImplTest.java b/src/test/java/org/apache/datasketches/theta/UnionImplTest.java
index ffedc310..d68f64e3 100644
--- a/src/test/java/org/apache/datasketches/theta/UnionImplTest.java
+++ b/src/test/java/org/apache/datasketches/theta/UnionImplTest.java
@@ -28,12 +28,17 @@ import static org.testng.Assert.assertTrue;
 
 import org.apache.datasketches.SketchesArgumentException;
 import org.apache.datasketches.Util;
+import org.apache.datasketches.memory.DefaultMemoryRequestServer;
 import org.apache.datasketches.memory.Memory;
-import org.apache.datasketches.memory.WritableHandle;
+import org.apache.datasketches.memory.MemoryRequestServer;
 import org.apache.datasketches.memory.WritableMemory;
 import org.testng.annotations.Test;
 
+import jdk.incubator.foreign.ResourceScope;
+
 public class UnionImplTest {
+  private static  MemoryRequestServer memReqSvr = new DefaultMemoryRequestServer();
+
 
   @Test
   public void checkGetCurrentAndMaxBytes() {
@@ -176,21 +181,20 @@ public class UnionImplTest {
     final int k = 1 << 12;
     final int u = 2 * k;
     final int bytes = Sketches.getMaxUpdateSketchBytes(k);
-    try (WritableHandle wh = WritableMemory.allocateDirect(bytes/2);
-        WritableHandle wh2 = WritableMemory.allocateDirect(bytes/2) ) {
-      final WritableMemory wmem = wh.getWritable();
+    try (ResourceScope scope = ResourceScope.newConfinedScope()) {
+      WritableMemory wmem = WritableMemory.allocateDirect(bytes/2, scope, memReqSvr);
+      WritableMemory wmem2 = WritableMemory.allocateDirect(bytes/2, scope, memReqSvr);
       final UpdateSketch sketch = Sketches.updateSketchBuilder().setNominalEntries(k).build(wmem);
-      assertTrue(sketch.isSameResource(wmem));
+      assertTrue(sketch.nativeOverlap(wmem) != 0);
 
-      final WritableMemory wmem2 = wh2.getWritable();
       final Union union = SetOperation.builder().buildUnion(wmem2);
-      assertTrue(union.isSameResource(wmem2));
+      assertTrue(union.nativeOverlap(wmem2) != 0);
 
       for (int i = 0; i < u; i++) { union.update(i); }
-      assertFalse(union.isSameResource(wmem));
+      assertFalse(union.nativeOverlap(wmem) != 0);
 
       final Union union2 = SetOperation.builder().buildUnion(); //on-heap union
-      assertFalse(union2.isSameResource(wmem2));  //obviously not
+      assertFalse(union2.nativeOverlap(wmem2) != 0);  //obviously not
     } catch (final Exception e) {
       throw new RuntimeException(e);
     }
@@ -214,8 +218,9 @@ public class UnionImplTest {
     final double est1 = sk.getEstimate();
 
     final int bytes = Sketches.getMaxCompactSketchBytes(sk.getRetainedEntries(true));
-    try (WritableHandle h = WritableMemory.allocateDirect(bytes)) {
-      final WritableMemory wmem = h.getWritable();
+
+    try (ResourceScope scope = ResourceScope.newConfinedScope()) {
+      WritableMemory wmem = WritableMemory.allocateDirect(bytes, scope, memReqSvr);
       final CompactSketch csk = sk.compact(true, wmem); //ordered, direct
       final Union union = Sketches.setOperationBuilder().buildUnion();
       union.union(csk);
diff --git a/src/test/java/org/apache/datasketches/theta/UpdateSketchTest.java b/src/test/java/org/apache/datasketches/theta/UpdateSketchTest.java
index e1988a1a..bbc5ee92 100644
--- a/src/test/java/org/apache/datasketches/theta/UpdateSketchTest.java
+++ b/src/test/java/org/apache/datasketches/theta/UpdateSketchTest.java
@@ -199,7 +199,6 @@ public class UpdateSketchTest {
     }
   }
 
-
   @SuppressWarnings("unused")
   @Test
   public void checkCompactOpsMemoryToCompact() {
@@ -218,8 +217,11 @@ public class UpdateSketchTest {
     csk1 = sk.compact(true, cskwmem1);
     csk2 = CompactOperations.memoryToCompact(skwmem, true, cskwmem2);
     csk3 = CompactOperations.memoryToCompact(cskwmem1, true, cskwmem3);
-    assertTrue(cskwmem1.equals(cskwmem2));
-    assertTrue(cskwmem1.equals(cskwmem3));
+    long mismatch = cskwmem1.mismatch(cskwmem2);
+    println(mismatch);
+    boolean eq = cskwmem1.equalTo(cskwmem2);
+    assertTrue(cskwmem1.equalTo(cskwmem2));
+    assertTrue(cskwmem1.equalTo(cskwmem3));
   }
 
   @Test
@@ -228,9 +230,9 @@ public class UpdateSketchTest {
   }
 
   /**
-   * @param s value to print
+   * @param o value to print
    */
-  static void println(String s) {
-    //System.out.println(s); //disable here
+  static void println(Object o) {
+    //System.out.println(o.toString()); //disable here
   }
 }


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