From 852ff5c25c9eaaab4fde01b9a1c26b4778c47bcc Mon Sep 17 00:00:00 2001 From: Sean McDirmid Date: Wed, 7 Feb 2007 12:22:04 +0000 Subject: Adding wrappers around Java's reference classes. --- src/library/scala/ref/PhantomReference.scala | 5 +++++ src/library/scala/ref/Reference.scala | 11 +++++++++++ src/library/scala/ref/ReferenceQueue.scala | 14 ++++++++++++++ src/library/scala/ref/ReferenceWrapper.scala | 14 ++++++++++++++ src/library/scala/ref/SoftReference.scala | 8 ++++++++ src/library/scala/ref/WeakReference.scala | 8 ++++++++ 6 files changed, 60 insertions(+) create mode 100644 src/library/scala/ref/PhantomReference.scala create mode 100644 src/library/scala/ref/Reference.scala create mode 100644 src/library/scala/ref/ReferenceQueue.scala create mode 100644 src/library/scala/ref/ReferenceWrapper.scala create mode 100644 src/library/scala/ref/SoftReference.scala create mode 100644 src/library/scala/ref/WeakReference.scala 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) "" 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); +} -- cgit v1.2.3