X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/371a5b4e62eb415107e045588f614fa49e866e78..b6e2eddeaf7e559589ce41ac41e88f9bd71c5a08:/include/wx/ptr_scpd.h diff --git a/include/wx/ptr_scpd.h b/include/wx/ptr_scpd.h index b574491359..84b3da0f84 100644 --- a/include/wx/ptr_scpd.h +++ b/include/wx/ptr_scpd.h @@ -30,22 +30,28 @@ #include "wx/defs.h" -/* checked deleters are used to make sure that the - type being deleted is really a complete type. - - Jesse Lovelace +/* + checked deleters are used to make sure that the type being deleted is really + a complete type.: otherwise sizeof() would result in a compile-time error + + do { ... } while ( 0 ) construct is used to have an anonymous scope + (otherwise we could have name clashes between different "complete"s) but + still force a semicolon after the macro */ -#define wxCHECKED_DELETE(ptr) \ - if (true) { \ - typedef char complete[sizeof(*ptr)]; \ - delete ptr; \ - } +#define wxCHECKED_DELETE(ptr) \ + do \ + { \ + typedef char complete[sizeof(*ptr)]; \ + delete ptr; \ + } while ( 0 ) -#define wxCHECKED_DELETE_ARRAY(ptr) \ - if (true) { \ - typedef char complete[sizeof(*ptr)]; \ - delete [] ptr; \ - } +#define wxCHECKED_DELETE_ARRAY(ptr) \ + do \ + { \ + typedef char complete[sizeof(*ptr)]; \ + delete [] ptr; \ + } while ( 0 ) /* These scoped pointers are *not* assignable and cannot be used within a container. Look for wxDECLARE_SHARED_PTR for this @@ -68,7 +74,7 @@ private: \ name & operator=(name const &); \ \ public: \ - wxEXPLICIT name(T * ptr = NULL) \ + wxEXPLICIT name(T * ptr = NULL) \ : m_ptr(ptr) { } \ \ ~name(); \ @@ -82,6 +88,13 @@ public: \ } \ } \ \ + T *release() \ + { \ + T *ptr = m_ptr; \ + m_ptr = NULL; \ + return ptr; \ + } \ + \ T & operator*() const \ { \ wxASSERT(m_ptr != NULL); \ @@ -110,7 +123,7 @@ public: \ #define wxDEFINE_SCOPED_PTR(T, name)\ name::~name() \ { \ - wxCHECKED_DELETE(m_ptr) \ + wxCHECKED_DELETE(m_ptr); \ } #define wxDECLARE_SCOPED_ARRAY(T, name)\ @@ -149,16 +162,16 @@ public: \ }; #define wxDEFINE_SCOPED_ARRAY(T, name) \ -name::~name() \ -{ \ - wxCHECKED_DELETE_ARRAY(m_ptr) \ -} \ -void name::reset(T * p){ \ - if (m_ptr != p) \ - { \ - wxCHECKED_DELETE_ARRAY(m_ptr); \ - m_ptr = p; \ - } \ +name::~name() \ +{ \ + wxCHECKED_DELETE_ARRAY(m_ptr); \ +} \ +void name::reset(T * p){ \ + if (m_ptr != p) \ + { \ + wxCHECKED_DELETE_ARRAY(m_ptr); \ + m_ptr = p; \ + } \ } #endif