X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/d83eeece0ee86a3ad81096d894a560647cef0d3a..32485259c1342115488d219776dfebeb3d4d81b1:/include/wx/ptr_scpd.h diff --git a/include/wx/ptr_scpd.h b/include/wx/ptr_scpd.h index ff287cfad4..9f7c88de4b 100644 --- a/include/wx/ptr_scpd.h +++ b/include/wx/ptr_scpd.h @@ -10,8 +10,8 @@ ///////////////////////////////////////////////////////////////////////////// // This class closely follows the implementation of the boost -// library scoped_ptr and is an adaption for c++ macro's in -// the wxWindows project. The original authors of the boost +// library scoped_ptr and is an adaption for c++ macro's in +// the wxWidgets project. The original authors of the boost // scoped_ptr are given below with their respective copyrights. // (C) Copyright Greg Colvin and Beman Dawes 1998, 1999. @@ -39,19 +39,28 @@ still force a semicolon after the macro */ +#ifdef __WATCOMC__ + #define wxFOR_ONCE(name) for(int name=0; name<1; name++) + #define wxPRE_NO_WARNING_SCOPE(name) wxFOR_ONCE(wxMAKE_UNIQUE_NAME(name)) + #define wxPOST_NO_WARNING_SCOPE(name) +#else + #define wxPRE_NO_WARNING_SCOPE(name) do + #define wxPOST_NO_WARNING_SCOPE(name) while ( 0 ) +#endif + #define wxCHECKED_DELETE(ptr) \ - do \ + wxPRE_NO_WARNING_SCOPE(scope_var1) \ { \ typedef char complete[sizeof(*ptr)]; \ delete ptr; \ - } while ( 0 ) + } wxPOST_NO_WARNING_SCOPE(scope_var1) #define wxCHECKED_DELETE_ARRAY(ptr) \ - do \ + wxPRE_NO_WARNING_SCOPE(scope_var2) \ { \ typedef char complete[sizeof(*ptr)]; \ delete [] ptr; \ - } while ( 0 ) + } wxPOST_NO_WARNING_SCOPE(scope_var2) /* These scoped pointers are *not* assignable and cannot be used within a container. Look for wxDECLARE_SHARED_PTR for this @@ -129,8 +138,8 @@ name::~name() \ // this macro can be used for the most common case when you want to declare and // define the scoped pointer at the same time and want to use the standard // naming convention: auto pointer to Foo is called FooPtr -#define wxDEFINE_SCOPED_PTR_TYPE(T) \ - wxDECLARE_SCOPED_PTR(T, T ## Ptr); \ +#define wxDEFINE_SCOPED_PTR_TYPE(T) \ + wxDECLARE_SCOPED_PTR(T, T ## Ptr) \ wxDEFINE_SCOPED_PTR(T, T ## Ptr) // the same but for arrays instead of simple pointers @@ -182,5 +191,32 @@ void name::reset(T * p){ \ } \ } +// ---------------------------------------------------------------------------- +// "Tied" scoped pointer: same as normal one but also sets the value of +// some other variable to the pointer value +// ---------------------------------------------------------------------------- + +#define wxDEFINE_TIED_SCOPED_PTR_TYPE(T) \ + wxDEFINE_SCOPED_PTR_TYPE(T); \ + class T ## TiedPtr : public T ## Ptr \ + { \ + public: \ + T ## TiedPtr(T **pp, T *p) \ + : T ## Ptr(p), m_pp(pp) \ + { \ + m_pOld = *pp; \ + *pp = p; \ + } \ + \ + ~ T ## TiedPtr() \ + { \ + *m_pp = m_pOld; \ + } \ + \ + private: \ + T **m_pp; \ + T *m_pOld; \ + } + #endif // __WX_SCOPED_POINTER__