/* * Copyright 2006 Sony Computer Entertainment Inc. * * Licensed under the MIT Open Source License, for details please see license.txt or the website * http://www.opensource.org/licenses/mit-license.php * */ #ifndef __DAE_SMARTREF_H__ #define __DAE_SMARTREF_H__ #include #include /** * The @c daeSmartRef template class automates reference counting for * objects derived from @c daeRefCountedObj. */ template class daeSmartRef { public: /** * Constructor */ inline daeSmartRef() : _ptr(NULL) { } /** * Destructor */ inline ~daeSmartRef() { checkedRelease(_ptr); } /** * Copy Constructor that will convert from one template to the other. * @param smartRef a daeSmartRef to the object to copy from. */ template inline daeSmartRef(const daeSmartRef& smartRef) : _ptr(smartRef.cast()) { checkedRef(_ptr); } /** * Function that returns a pointer to object being reference counted. * @return the object being reference counted. */ inline T* cast() const { return _ptr; } /** * Copy Constructor. * @param smartRef a daeSmartRef of the same template type to copy from */ inline daeSmartRef(const daeSmartRef& smartRef) : _ptr(smartRef._ptr) { checkedRef(_ptr); } /** * Constructor * @param ptr a pointer to an object of the same template type. */ inline daeSmartRef(T* ptr) : _ptr(ptr) { checkedRef(_ptr); } /** * Overloaded assignment operator which will convert between template types. * @param smartRef a daeSmartRef to the object to copy from. * @return Returns a reference to this object. */ template inline const daeSmartRef& operator=(const daeSmartRef& smartRef) { T* ptr = smartRef.cast(); checkedRef(ptr); checkedRelease(_ptr); _ptr = ptr; return *this; } /** * Overloaded assignment operator. * @param other a daeSmartRef to the object to copy from. Must be of the same template type. * @return Returns a reference to this object. */ inline const daeSmartRef& operator=(const daeSmartRef& other) { T* ptr = other._ptr; checkedRef(ptr); checkedRelease(_ptr); _ptr = ptr; return *this; } /** * Overloaded assignment operator. * @param ptr a pointer to the object to copy from. Must be of the same template type. * @return Returns a reference to this object. */ inline const daeSmartRef& operator=(T* ptr) { checkedRef(ptr); checkedRelease(_ptr); _ptr = ptr; return *this; } /** * Overloaded member selection operator. * @return a pointer of the template class to the object. */ inline T* operator->() const { assert (_ptr != (T*)NULL); return _ptr; } /** * Overloaded cast operator. * @return a pointer of the template class to the object. */ inline operator T*() const { return _ptr; } /** * Static cast function. * @param smartRef a smartRef to cast from * @return a pointer to an object of this template class */ template inline static T* staticCast(const daeSmartRef& smartRef) { return static_cast(smartRef.cast()); } private: /* The pointer to the element which is being reference counted */ T* _ptr; }; #endif // __DAE_SMARTREF_H__