Refcounting smart pointer?

Jason House jason.james.house at gmail.com
Wed Sep 3 17:33:33 PDT 2008


Your implementation is not thread safe...

Sönke Ludwig Wrote:

> Bill Baxter schrieb:
> > Has anyone made a reference counting smart pointer using D2 structs yet?
> > It should be possible now with the opDot, destructors, postblit thingy
> > and constructor.
> > 
> > Is anything missing to make it work?  Actually I don't even think the
> > constructor was necessary.  So someone probably could have done this a
> > while ago.
> > 
> > --bb
> 
> Just implemented this today, and it seems to work fine:
> 
> struct CountedRef(T) {
> 	static if( is(T == class) ){
> 		alias T T_ref;
> 	} else {
> 		alias T* T_ref;
> 	}
> 
> 	private {
> 		T_ref m_object;
> 		int* m_refcount;
> 	}
> 
> 	this(T_ref obj){
> 		m_object = obj;
> 		m_refcount = new int;
> 		*m_refcount = 1;
> 	}
> 
> 	~this(){
> 		if( m_refcount && --(*m_refcount) <= 0 ){
> 			delete m_object;
> 			delete m_refcount;
> 		}
> 	}
> 
> 	this(this){
> 		if( m_refcount )
> 			(*m_refcount)++;
> 	}
> 
> 	T_ref get(){ return m_object; }
> 	const(T_ref) get() const { return m_object; }
> 
> 	T_ref opDot(){ return m_object; }
> 	const(T_ref) opDot() const { return m_object; }
> }
> 
> struct IntrusiveCountedRef(T) {
> 	static if( is(T == class) ){
> 		alias T T_ref;
> 	} else {
> 		alias T* T_ref;
> 	}
> 
> 	private {
> 		T_ref m_object;
> 	}
> 
> 	this(T_ref obj){
> 		m_object = obj;
> 		obj.addRef();
> 	}
> 
> 	~this(){
> 		if( m_object )
> 			m_object.releaseRef();
> 	}
> 
> 	this(this){
> 		if( m_object )
> 			m_object.addRef();
> 	}
> 
> 	T_ref get(){ return m_object; }
> 	const(T_ref) get() const { return m_object; }
> 
> 	T_ref opDot(){ return m_object; }
> 	const(T_ref) opDot() const { return m_object; }
> }




More information about the Digitalmars-d mailing list