00001 /* 00002 * Copyright 2006 Sony Computer Entertainment Inc. 00003 * 00004 * Licensed under the MIT Open Source License, for details please see license.txt or the website 00005 * http://www.opensource.org/licenses/mit-license.php 00006 * 00007 */ 00008 00009 #ifndef __DAE_SMARTREF_H__ 00010 #define __DAE_SMARTREF_H__ 00011 00012 #include <assert.h> 00013 #include <dae/daeRefCountedObj.h> 00014 00019 template<class T> class daeSmartRef 00020 { 00021 public: 00025 inline daeSmartRef() : _ptr(NULL) { } 00026 00030 inline ~daeSmartRef() { 00031 checkedRelease(_ptr); 00032 } 00033 00038 template<class U> 00039 inline daeSmartRef(const daeSmartRef<U>& smartRef) : _ptr(smartRef.cast()) { 00040 checkedRef(_ptr); 00041 } 00042 00047 inline T* cast() const { return _ptr; } 00048 00053 inline daeSmartRef(const daeSmartRef<T>& smartRef) : _ptr(smartRef._ptr) { 00054 checkedRef(_ptr); 00055 } 00056 00061 inline daeSmartRef(T* ptr) : _ptr(ptr) { 00062 checkedRef(_ptr); 00063 } 00064 00070 template<class U> 00071 inline const daeSmartRef<T>& operator=(const daeSmartRef<U>& smartRef) { 00072 T* ptr = smartRef.cast(); 00073 checkedRef(ptr); 00074 checkedRelease(_ptr); 00075 _ptr = ptr; 00076 return *this; } 00077 00083 inline const daeSmartRef<T>& operator=(const daeSmartRef<T>& other) { 00084 T* ptr = other._ptr; 00085 checkedRef(ptr); 00086 checkedRelease(_ptr); 00087 _ptr = ptr; 00088 return *this; } 00089 00095 inline const daeSmartRef<T>& operator=(T* ptr) { 00096 checkedRef(ptr); 00097 checkedRelease(_ptr); 00098 _ptr = ptr; 00099 return *this; } 00100 00105 inline T* operator->() const { 00106 assert (_ptr != (T*)NULL); return _ptr; } 00107 00112 inline operator T*() const { 00113 return _ptr; } 00114 00120 template<class U> 00121 inline static T* staticCast(const daeSmartRef<U>& smartRef) { 00122 return static_cast<T*>(smartRef.cast()); } 00123 00124 private: 00125 /* The pointer to the element which is being reference counted */ 00126 T* _ptr; 00127 }; 00128 00129 #endif // __DAE_SMARTREF_H__ 00130 00131 00132 00133 00134