summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSean McDirmid <sean.mcdirmid@gmail.com>2007-02-07 12:22:04 +0000
committerSean McDirmid <sean.mcdirmid@gmail.com>2007-02-07 12:22:04 +0000
commit852ff5c25c9eaaab4fde01b9a1c26b4778c47bcc (patch)
tree7df88c47d038991f01cfdc26f4d01cdc1d91dc35
parente3b42865333ed502b3e454c98eefbfc705e33d82 (diff)
downloadscala-852ff5c25c9eaaab4fde01b9a1c26b4778c47bcc.tar.gz
scala-852ff5c25c9eaaab4fde01b9a1c26b4778c47bcc.tar.bz2
scala-852ff5c25c9eaaab4fde01b9a1c26b4778c47bcc.zip
Adding wrappers around Java's reference classes.
-rw-r--r--src/library/scala/ref/PhantomReference.scala5
-rw-r--r--src/library/scala/ref/Reference.scala11
-rw-r--r--src/library/scala/ref/ReferenceQueue.scala14
-rw-r--r--src/library/scala/ref/ReferenceWrapper.scala14
-rw-r--r--src/library/scala/ref/SoftReference.scala8
-rw-r--r--src/library/scala/ref/WeakReference.scala8
6 files changed, 60 insertions, 0 deletions
diff --git a/src/library/scala/ref/PhantomReference.scala b/src/library/scala/ref/PhantomReference.scala
new file mode 100644
index 0000000000..06216df3eb
--- /dev/null
+++ b/src/library/scala/ref/PhantomReference.scala
@@ -0,0 +1,5 @@
+package scala.ref;
+
+class PhantomReference[+T <: AnyRef](value : T, queue : ReferenceQueue[T]) extends ReferenceWrapper[T] {
+ val underlying = new java.lang.ref.PhantomReference(value, queue.underlying);
+}
diff --git a/src/library/scala/ref/Reference.scala b/src/library/scala/ref/Reference.scala
new file mode 100644
index 0000000000..30ace06b31
--- /dev/null
+++ b/src/library/scala/ref/Reference.scala
@@ -0,0 +1,11 @@
+package scala.ref;
+
+trait Reference[+T <: AnyRef] extends Function0[T] {
+ def isValid : Boolean;
+ def apply() : T;
+ def get = if (!isValid) None else Some(apply());
+ override def toString = if (!isValid) "<deleted>" else apply().toString;
+ def clear : Unit;
+ def enqueue : Boolean;
+ def isEnqueued : Boolean;
+}
diff --git a/src/library/scala/ref/ReferenceQueue.scala b/src/library/scala/ref/ReferenceQueue.scala
new file mode 100644
index 0000000000..1ed4c20af3
--- /dev/null
+++ b/src/library/scala/ref/ReferenceQueue.scala
@@ -0,0 +1,14 @@
+package scala.ref;
+
+class ReferenceQueue[+T <: AnyRef] {
+ private[ref] val underlying = new java.lang.ref.ReferenceQueue;
+ override def toString = underlying.toString;
+ class Wrapper(val underlying : java.lang.ref.Reference) extends ReferenceWrapper[T];
+ def Wrapper(ref : java.lang.ref.Reference) = ref match {
+ case null => None;
+ case ref => new Wrapper(ref);
+ }
+ def poll = Wrapper(underlying.poll);
+ def remove = Wrapper(underlying.remove);
+ def remove(timeout : Long) = Wrapper(underlying.remove(timeout));
+}
diff --git a/src/library/scala/ref/ReferenceWrapper.scala b/src/library/scala/ref/ReferenceWrapper.scala
new file mode 100644
index 0000000000..95f0047efe
--- /dev/null
+++ b/src/library/scala/ref/ReferenceWrapper.scala
@@ -0,0 +1,14 @@
+package scala.ref;
+
+trait ReferenceWrapper[+T <: AnyRef] extends Reference[T] {
+ val underlying : java.lang.ref.Reference;
+ def isValid = underlying.get != null;
+ def apply() = {
+ val ret = underlying.get.asInstanceOf[T];
+ if (ret eq null) throw new NoSuchElementException;
+ ret;
+ }
+ def clear = underlying.clear;
+ def enqueue = underlying.enqueue;
+ def isEnqueued = underlying.isEnqueued;
+}
diff --git a/src/library/scala/ref/SoftReference.scala b/src/library/scala/ref/SoftReference.scala
new file mode 100644
index 0000000000..a19ae08f5d
--- /dev/null
+++ b/src/library/scala/ref/SoftReference.scala
@@ -0,0 +1,8 @@
+package scala.ref;
+
+class SoftReference[+T <: AnyRef](value : T, queue : ReferenceQueue[T]) extends ReferenceWrapper[T] {
+ def this(value : T) = this(value, null);
+ val underlying =
+ if (queue == null) new java.lang.ref.SoftReference(value);
+ else new java.lang.ref.SoftReference(value, queue.underlying);
+}
diff --git a/src/library/scala/ref/WeakReference.scala b/src/library/scala/ref/WeakReference.scala
new file mode 100644
index 0000000000..6a27bda409
--- /dev/null
+++ b/src/library/scala/ref/WeakReference.scala
@@ -0,0 +1,8 @@
+package scala.ref;
+
+class WeakReference[+T <: AnyRef](value : T, queue : ReferenceQueue[T]) extends ReferenceWrapper[T] {
+ def this(value : T) = this(value, null);
+ val underlying =
+ if (queue == null) new java.lang.ref.WeakReference(value);
+ else new java.lang.ref.WeakReference(value, queue.underlying);
+}