git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@27408 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			80 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			80 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/////////////////////////////////////////////////////////////////////////////
 | 
						|
// 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
 | 
						|
/////////////////////////////////////////////////////////////////////////////
 | 
						|
 | 
						|
#ifndef _WX_COCOA_OBJCREF_H__
 | 
						|
#define _WX_COCOA_OBJCREF_H__
 | 
						|
/*
 | 
						|
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 void 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); }
 | 
						|
};
 | 
						|
 | 
						|
#endif //ndef _WX_COCOA_OBJCREF_H__
 |