123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
|
/******************************************************************************
copyright: Copyright (c) 2009 Tango. All rights reserved
license: BSD style: $(LICENSE)
version: Jan 2010: Initial release
author: wm4, kris
******************************************************************************/
module tango.core.WeakRef;
private import tango.core.Memory;
/******************************************************************************
A generic WeakReference
******************************************************************************/
alias WeakReference!(Object) WeakRef;
/******************************************************************************
Implements a Weak reference. The get() method returns null once
the object pointed to has been collected
******************************************************************************/
class WeakReference (T : Object)
{
public alias get opCall; /// alternative get() call
private void* weakpointer; // what the GC gives us back
/**********************************************************************
initializes a weak reference
**********************************************************************/
this (T obj)
{
weakpointer = GC.weakPointerCreate (obj);
}
/**********************************************************************
clean up when we are no longer referenced
**********************************************************************/
~this ()
{
clear;
}
/**********************************************************************
host a different object reference
**********************************************************************/
final void set (T obj)
{
clear;
weakpointer = GC.weakPointerCreate (obj);
}
/**********************************************************************
clear the weak reference - get() will always return null
**********************************************************************/
final void clear ()
{
GC.weakPointerDestroy (weakpointer);
weakpointer = null;
}
/**********************************************************************
returns the weak reference - returns null if the object
was deallocated in the meantime
**********************************************************************/
final T get ()
{
return cast(T) GC.weakPointerGet (weakpointer);
}
}
/******************************************************************************
Note this requires -g (with dmd) in order for the GC.collect call
to operate as desired
******************************************************************************/
debug (WeakRef)
{
import tango.core.Memory;
WeakRef make ()
{
return new WeakRef (new Object);
}
void main()
{
auto o = new Object;
auto r = new WeakRef (o);
assert (r() is o);
delete o;
assert (r() is null);
auto r1 = make;
assert (r1.get);
GC.collect;
assert (r1() is null);
}
}
|