1 /****************************************************************************** 2 3 copyright: Copyright (c) 2009 Tango. All rights reserved 4 5 license: BSD style: $(LICENSE) 6 7 version: Jan 2010: Initial release 8 9 authors: wm4, kris 10 11 ******************************************************************************/ 12 13 module tango.core.WeakRef; 14 15 private import tango.core.Memory; 16 17 /****************************************************************************** 18 19 A generic WeakReference. 20 21 ******************************************************************************/ 22 23 alias WeakReference!(Object) WeakRef; 24 25 /****************************************************************************** 26 27 Implements a Weak reference. The get() method returns null once 28 the object pointed to has been collected. 29 30 ******************************************************************************/ 31 32 class WeakReference (T : Object) 33 { 34 public alias get opCall; /// Alternative get() call. 35 private void* weakpointer; // what the GC gives us back 36 37 /********************************************************************** 38 39 Initializes a weak reference. 40 41 **********************************************************************/ 42 43 this (T obj) 44 { 45 weakpointer = GC.weakPointerCreate (obj); 46 } 47 48 /********************************************************************** 49 50 Clean up when we are no longer referenced. 51 52 **********************************************************************/ 53 54 ~this () 55 { 56 clear; 57 } 58 59 /********************************************************************** 60 61 Host a different object reference. 62 63 **********************************************************************/ 64 65 final void set (T obj) 66 { 67 clear; 68 weakpointer = GC.weakPointerCreate (obj); 69 } 70 71 /********************************************************************** 72 73 Clear the weak reference - get() will always return null. 74 75 **********************************************************************/ 76 77 final void clear () 78 { 79 GC.weakPointerDestroy (weakpointer); 80 weakpointer = null; 81 } 82 83 /********************************************************************** 84 85 Returns the weak reference - returns null if the object 86 was deallocated in the meantime. 87 88 **********************************************************************/ 89 90 final T get () 91 { 92 return cast(T) GC.weakPointerGet (weakpointer); 93 } 94 } 95 96 97 /****************************************************************************** 98 99 Note this requires -g (with dmd) in order for the GC.collect call 100 to operate as desired 101 102 ******************************************************************************/ 103 104 debug (WeakRef) 105 { 106 import tango.core.Memory; 107 108 WeakRef make () 109 { 110 return new WeakRef (new Object); 111 } 112 113 void main() 114 { 115 auto o = new Object; 116 auto r = new WeakRef (o); 117 assert (r() is o); 118 delete o; 119 assert (r() is null); 120 121 auto r1 = make; 122 assert (r1.get); 123 GC.collect; 124 assert (r1() is null); 125 } 126 }