wxWidgets/include/wx/cocoa/ObjcRef.h

77 lines
2.2 KiB
C
Raw Normal View History

/////////////////////////////////////////////////////////////////////////////
// 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 <dfe@cox.net>
// 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 T>
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 T>
class wxObjcAutoRef: public wxObjcAutoRefFromAlloc<T>
{
public:
wxObjcAutoRef(T p = 0)
: wxObjcAutoRefFromAlloc<T>(p)
{ ObjcRetain(m_ptr); }
~wxObjcAutoRef() {}
wxObjcAutoRef(const wxObjcAutoRef& otherRef)
: wxObjcAutoRefFromAlloc<T>(otherRef)
{}
wxObjcAutoRef(const wxObjcAutoRefFromAlloc<T>& otherRef)
: wxObjcAutoRefFromAlloc<T>(otherRef)
{}
wxObjcAutoRef& operator=(const wxObjcAutoRef& otherRef)
{ return wxObjcAutoRefFromAlloc<T>::operator=(otherRef); }
};