b3c861501a
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@40865 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
117 lines
3.0 KiB
C++
117 lines
3.0 KiB
C++
/////////////////////////////////////////////////////////////////////////////
|
|
// Name: wx/dfb/ifacehelpers.h
|
|
// Purpose: helpers for dealing with DFB interfaces
|
|
// Author: Vaclav Slavik
|
|
// Created: 2006-08-09
|
|
// RCS-ID: $Id$
|
|
// Copyright: (c) 2006 REA Elektronik GmbH
|
|
// Licence: wxWindows licence
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
#ifndef _WX_DFB_IFACEHELPERS_H_
|
|
#define _WX_DFB_IFACEHELPERS_H_
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// wxDFB_DECLARE_INTERFACE
|
|
//-----------------------------------------------------------------------------
|
|
|
|
/**
|
|
Forward declares DirectFB interface @a name.
|
|
|
|
Also declares name##Ptr typedef for wxDfbPtr<name> pointer.
|
|
|
|
@param name name of the DirectFB interface
|
|
*/
|
|
#define wxDFB_DECLARE_INTERFACE(name) \
|
|
struct _##name; \
|
|
typedef _##name name; \
|
|
typedef wxDfbPtr<name> name##Ptr;
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// wxDfbPtr
|
|
//-----------------------------------------------------------------------------
|
|
|
|
// base class for wxDfbPtr
|
|
class wxDfbPtrBase
|
|
{
|
|
protected:
|
|
// increment/decrement refcount; see ifacehelpers.cpp for why using
|
|
// void* is safe
|
|
static void DoAddRef(void *ptr);
|
|
static void DoRelease(void *ptr);
|
|
};
|
|
|
|
/**
|
|
This template implements smart pointer for keeping pointers to DirectFB
|
|
interfaces. Interface's reference count is increased on copying and the
|
|
interface is released when the pointer is deleted.
|
|
*/
|
|
template<typename T>
|
|
class wxDfbPtr : private wxDfbPtrBase
|
|
{
|
|
public:
|
|
/**
|
|
Creates the pointer from raw interface pointer.
|
|
|
|
Takes ownership of @a ptr, i.e. AddRef() is @em not called on it.
|
|
*/
|
|
wxDfbPtr(T *ptr = NULL) : m_ptr(ptr) {}
|
|
|
|
/// Copy ctor
|
|
wxDfbPtr(const wxDfbPtr& ptr) { InitFrom(ptr); }
|
|
|
|
/// Dtor. Releases the interface
|
|
~wxDfbPtr() { Reset(); }
|
|
|
|
/// Resets the pointer to NULL, decreasing reference count of the interface.
|
|
void Reset()
|
|
{
|
|
if ( m_ptr )
|
|
{
|
|
DoRelease(m_ptr);
|
|
m_ptr = NULL;
|
|
}
|
|
}
|
|
|
|
/// Cast to raw pointer
|
|
operator T*() const { return m_ptr; }
|
|
|
|
/**
|
|
Cast to @em writeable raw pointer so that code like
|
|
"dfb->CreateFont(dfb, NULL, &desc, &fontPtr)" works.
|
|
|
|
Note that this operator calls Reset(), so using it looses the value.
|
|
*/
|
|
T** operator&()
|
|
{
|
|
Reset();
|
|
return &m_ptr;
|
|
}
|
|
|
|
// standard operators:
|
|
|
|
wxDfbPtr& operator=(const wxDfbPtr& ptr)
|
|
{
|
|
Reset();
|
|
InitFrom(ptr);
|
|
return *this;
|
|
}
|
|
|
|
T& operator*() const { return *m_ptr; }
|
|
T* operator->() const { return m_ptr; }
|
|
|
|
private:
|
|
void InitFrom(const wxDfbPtr& ptr)
|
|
{
|
|
m_ptr = ptr.m_ptr;
|
|
if ( m_ptr )
|
|
DoAddRef(m_ptr);
|
|
}
|
|
|
|
private:
|
|
T *m_ptr;
|
|
};
|
|
|
|
#endif // _WX_DFB_IFACEHELPERS_H_
|