From fc31181d2cff6ca1e05b6a820c18b87d8915344b Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Thu, 9 Oct 2008 11:27:59 +0000 Subject: [PATCH] use wxScopeGuard instead of an explicit try/catch(...)/throw: this suppresses wxUSE_EXCEPTIONS tests and also avoids MSVC unreachable code warnings git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@56195 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/vector.h | 44 +++++++++++++++++--------------------------- 1 file changed, 17 insertions(+), 27 deletions(-) diff --git a/include/wx/vector.h b/include/wx/vector.h index d77962d778..e2faf83569 100644 --- a/include/wx/vector.h +++ b/include/wx/vector.h @@ -22,6 +22,7 @@ #else // !wxUSE_STL #include "wx/utils.h" +#include "wx/scopeguard.h" #include "wx/meta/movable.h" #include "wx/meta/if.h" @@ -291,39 +292,28 @@ public: reserve(size() + 1); + // the place where the new element is going to be inserted + value_type * const place = m_values + idx; + // unless we're inserting at the end, move following elements out of // the way: if ( after > 0 ) - { - Ops::MemmoveForward(m_values + idx + 1, m_values + idx, after); - } + Ops::MemmoveForward(place + 1, place, after); -#if wxUSE_EXCEPTIONS - try - { -#endif - // use placement new to initialize new object in preallocated place - // in m_values and store 'v' in it: - void* const place = m_values + idx; - new(place) value_type(v); -#if wxUSE_EXCEPTIONS - } - catch ( ... ) - { - // if the ctor threw an exception, we need to move all the elements - // back to their original positions in m_values - if ( after > 0 ) - { - Ops::MemmoveBackward(m_values + idx, m_values + idx + 1, after); - } + // if the ctor called below throws an exception, we need to move all + // the elements back to their original positions in m_values + wxScopeGuard moveBack = wxMakeGuard( + Ops::MemmoveBackward, place, place + 1, after); + if ( !after ) + moveBack.Dismiss(); - throw; // rethrow the exception - } -#endif // wxUSE_EXCEPTIONS + // use placement new to initialize new object in preallocated place in + // m_values and store 'v' in it: + new(place) value_type(v); - // increment m_size only if ctor didn't throw -- if it did, we'll be - // left with m_values larger than necessary, but number of elements will - // be the same + // now that we did successfully add the new element, increment the size + // and disable moving the items back + moveBack.Dismiss(); m_size++; return begin() + idx;