You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by mt...@apache.org on 2009/07/02 09:49:32 UTC
svn commit: r790485 - in /commons/sandbox/runtime/trunk/src:
main/java/org/apache/commons/runtime/ main/native/shared/
test/org/apache/commons/runtime/
Author: mturk
Date: Thu Jul 2 07:49:32 2009
New Revision: 790485
URL: http://svn.apache.org/viewvc?rev=790485&view=rev
Log:
Implement Pointer Comparable using memcmp
Modified:
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Pointer.java
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Pointer32.java
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Pointer64.java
commons/sandbox/runtime/trunk/src/main/native/shared/pointer.c
commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestMemory.java
Modified: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Pointer.java
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Pointer.java?rev=790485&r1=790484&r2=790485&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Pointer.java (original)
+++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Pointer.java Thu Jul 2 07:49:32 2009
@@ -22,7 +22,7 @@
* </p>
* @since Runtime 1.0
*/
-public abstract class Pointer
+public abstract class Pointer implements Comparable<Pointer>
{
/**
@@ -138,6 +138,17 @@
public abstract boolean equals(Object other);
/**
+ * Compares this {@code Pointer} to the specified object for order
+ *
+ * @param other the {@code Pointer} to be Compared
+ * @return a negative integer, zero or positive integer as this object
+ * is less then, equal, or greater then the specified object.
+ */
+ @Override
+ public abstract int compareTo(Pointer other)
+ throws ClassCastException;
+
+ /**
* Called by the garbage collector when the object is destroyed.
* The class will free internal resources allocated by the Operating system.
* @see Object#finalize()
Modified: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Pointer32.java
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Pointer32.java?rev=790485&r1=790484&r2=790485&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Pointer32.java (original)
+++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Pointer32.java Thu Jul 2 07:49:32 2009
@@ -143,5 +143,26 @@
}
}
+ private static native int memcmp0(int a, int n, int length);
+ public int compareTo(Pointer other)
+ throws ClassCastException
+ {
+ if (other == null)
+ throw new ClassCastException();
+ if (other instanceof Pointer32) {
+ Pointer32 d32 = (Pointer32)other;
+ if (POINTER == 0)
+ return -1;
+ if (d32.POINTER == 0)
+ return 1;
+ if (PLENGTH > d32.PLENGTH)
+ return 1;
+ else
+ return memcmp0(POINTER, d32.POINTER, PLENGTH);
+ }
+ else
+ throw new ClassCastException();
+ }
+
}
Modified: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Pointer64.java
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Pointer64.java?rev=790485&r1=790484&r2=790485&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Pointer64.java (original)
+++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Pointer64.java Thu Jul 2 07:49:32 2009
@@ -132,6 +132,27 @@
move0(s64.POINTER + dstPos, POINTER + srcPos, length);
}
+ private static native int memcmp0(long a, long b, long length);
+ public int compareTo(Pointer other)
+ throws ClassCastException
+ {
+ if (other == null)
+ throw new ClassCastException();
+ if (other instanceof Pointer64) {
+ Pointer64 d64 = (Pointer64)other;
+ if (POINTER == 0L)
+ return -1;
+ if (d64.POINTER == 0L)
+ return 1;
+ if (PLENGTH > d64.PLENGTH)
+ return 1;
+ else
+ return memcmp0(POINTER, d64.POINTER, PLENGTH);
+ }
+ else
+ throw new ClassCastException();
+ }
+
public String toString()
{
if (POINTER != 0L) {
Modified: commons/sandbox/runtime/trunk/src/main/native/shared/pointer.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/shared/pointer.c?rev=790485&r1=790484&r2=790485&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/shared/pointer.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/shared/pointer.c Thu Jul 2 07:49:32 2009
@@ -211,6 +211,18 @@
}
}
+ACR_PTR_EXPORT_DECLARE(int, memcmp0)(ACR_JNISTDARGS, jniptr a,
+ jniptr b, jniptr n)
+{
+ UNREFERENCED_STDARGS;
+ ACR_TRY {
+ return memcmp(N2P(a, void *), N2P(b, const void *), (size_t)n);
+ } ACR_CATCH() {
+ ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ERUNTIME, EFAULT);
+ return -1;
+ }
+}
+
ACR_DECLARE(jobject) ACR_PointerCreate(JNIEnv *_E, void *p, size_t len,
acr_pointer_cleanup_fn_t *cb)
{
Modified: commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestMemory.java
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestMemory.java?rev=790485&r1=790484&r2=790485&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestMemory.java (original)
+++ commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestMemory.java Thu Jul 2 07:49:32 2009
@@ -374,5 +374,92 @@
p.free();
}
+ public void testCompare()
+ throws Throwable
+ {
+ Pointer a = Memory.calloc(1000);
+ assertNotNull("Pointer", a);
+ Memory.set(a, 0, 1000, 0xFF);
+ a.poke(1, 23);
+
+ Pointer b = Memory.calloc(1000);
+ assertNotNull("Pointer", b);
+ Memory.set(b, 0, 1000, 0xFF);
+ b.poke(1, 23);
+ assertEquals("Compare", 0, a.compareTo(b));
+ a.free();
+ b.free();
+ }
+
+ public void testCompareLen()
+ throws Throwable
+ {
+ Pointer a = Memory.calloc(500);
+ assertNotNull("Pointer", a);
+ Memory.set(a, 0, 500, 0xFF);
+ a.poke(1, 23);
+
+ Pointer b = Memory.calloc(1000);
+ assertNotNull("Pointer", b);
+ Memory.set(b, 0, 1000, 0xFF);
+ b.poke(1, 23);
+ assertEquals("Compare", 0, a.compareTo(b));
+ a.free();
+ b.free();
+ }
+
+ public void testCompareLess()
+ throws Throwable
+ {
+ Pointer a = Memory.calloc(500);
+ assertNotNull("Pointer", a);
+ Memory.set(a, 0, 500, 0xFF);
+ a.poke(1, 23);
+
+ Pointer b = Memory.calloc(1000);
+ assertNotNull("Pointer", b);
+ Memory.set(b, 0, 1000, 0xFF);
+ b.poke(1, 64);
+ assertEquals("Compare", -1, a.compareTo(b));
+ a.free();
+ b.free();
+ }
+
+ public void testCompareGreater()
+ throws Throwable
+ {
+ Pointer a = Memory.calloc(500);
+ assertNotNull("Pointer", a);
+ Memory.set(a, 0, 500, 0xFF);
+ a.poke(1, 23);
+
+ Pointer b = Memory.calloc(500);
+ assertNotNull("Pointer", b);
+ Memory.set(b, 0, 500, 0xFF);
+ b.poke(1, 3);
+ assertEquals("Compare A", 1, a.compareTo(b));
+ assertEquals("Compare B", -1, b.compareTo(a));
+ a.free();
+ b.free();
+ }
+
+ public void testCompareSmaller()
+ throws Throwable
+ {
+ Pointer a = Memory.calloc(500);
+ assertNotNull("Pointer", a);
+ Memory.set(a, 0, 500, 0xFF);
+ a.poke(1, 23);
+
+ Pointer b = Memory.calloc(400);
+ assertNotNull("Pointer", b);
+ Memory.set(b, 0, 400, 0xFF);
+ b.poke(1, 64);
+ assertEquals("Smaller size", 1, a.compareTo(b));
+ assertEquals("Greater then", 1, b.compareTo(a));
+ a.free();
+ b.free();
+ }
+
}