///////////////////////////////////////////////////////////////////////////// // Name: wx/cocoa/ObjcRef.h // Purpose: wxObjcAutoRef template class // Author: David Elliott // Modified by: // Created: 2004/03/28 // RCS-ID: $Id$ // Copyright: (c) 2004 David Elliott // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// /* wxObjcAutoRefFromAlloc: construct a reference to an object that was [NSObject -alloc]'ed and thus does not need a retain wxObjcAutoRef: construct a reference to an object that was either autoreleased or is retained by something else. */ struct objc_object; // We must do any calls to Objective-C from an Objective-C++ source file class wxObjcAutoRefBase { protected: static struct objc_object* ObjcRetain(struct objc_object*); static struct objc_object* ObjcRelease(struct objc_object*); }; // T should be a pointer like NSObject* template class wxObjcAutoRefFromAlloc: wxObjcAutoRefBase { public: wxObjcAutoRefFromAlloc(T p = 0) : m_ptr(p) // NOTE: this is from alloc. Do NOT retain {} wxObjcAutoRefFromAlloc(const wxObjcAutoRefFromAlloc& otherRef) : m_ptr(otherRef.m_ptr) { ObjcRetain(m_ptr); } ~wxObjcAutoRefFromAlloc() { ObjcRelease(m_ptr); } wxObjcAutoRefFromAlloc& operator=(const wxObjcAutoRefFromAlloc& otherRef) { ObjcRetain(otherRef.m_ptr); ObjcRelease(m_ptr); m_ptr = otherRef.m_ptr; return *this; } operator T() const { return m_ptr; } T operator->() const { return m_ptr; } protected: T m_ptr; }; // The only thing wxObjcAutoRef has to do is retain an initial object template class wxObjcAutoRef: public wxObjcAutoRefFromAlloc { public: wxObjcAutoRef(T p = 0) : wxObjcAutoRefFromAlloc(p) { ObjcRetain(m_ptr); } ~wxObjcAutoRef() {} wxObjcAutoRef(const wxObjcAutoRef& otherRef) : wxObjcAutoRefFromAlloc(otherRef) {} wxObjcAutoRef(const wxObjcAutoRefFromAlloc& otherRef) : wxObjcAutoRefFromAlloc(otherRef) {} wxObjcAutoRef& operator=(const wxObjcAutoRef& otherRef) { return wxObjcAutoRefFromAlloc::operator=(otherRef); } };