X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e2985da8315e73dcf77872d7abc03d7b00cc484c..4ed85025f3ba537206f70f3dd10466e16da926d4:/include/wx/stack.h diff --git a/include/wx/stack.h b/include/wx/stack.h index 53f5121c2c..b4e8ed2f8a 100644 --- a/include/wx/stack.h +++ b/include/wx/stack.h @@ -1,10 +1,10 @@ /////////////////////////////////////////////////////////////////////////////// // Name: wx/stack.h // Purpose: STL stack clone -// Author: Lindsay Mathieson -// Modified by: +// Author: Lindsay Mathieson, Vadim Zeitlin // Created: 30.07.2001 -// Copyright: (c) 2001 Lindsay Mathieson +// Copyright: (c) 2001 Lindsay Mathieson (WX_DECLARE_STACK) +// 2011 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -13,32 +13,71 @@ #include "wx/vector.h" -#define WX_DECLARE_STACK(obj, cls)\ -class cls : public wxVectorBase\ +#if wxUSE_STD_CONTAINERS + +#include +#define wxStack std::stack + +#else // !wxUSE_STD_CONTAINERS + +// Notice that unlike std::stack, wxStack currently always uses wxVector and +// can't be used with any other underlying container type. +// +// Another difference is that comparison operators between stacks are not +// implemented (but they should be, see 23.2.3.3 of ISO/IEC 14882:1998). + +template +class wxStack +{ +public: + typedef wxVector container_type; + typedef typename container_type::size_type size_type; + typedef typename container_type::value_type value_type; + + wxStack() { } + explicit wxStack(const container_type& cont) : m_cont(cont) { } + + // Default copy ctor, assignment operator and dtor are ok. + + + bool empty() const { return m_cont.empty(); } + size_type size() const { return m_cont.size(); } + + value_type& top() { return m_cont.back(); } + const value_type& top() const { return m_cont.back(); } + + void push(const value_type& val) { m_cont.push_back(val); } + void pop() { m_cont.pop_back(); } + +private: + container_type m_cont; +}; + +#endif // wxUSE_STD_CONTAINERS/!wxUSE_STD_CONTAINERS + + +// Deprecated macro-based class for compatibility only, don't use any more. +#define WX_DECLARE_STACK(obj, cls) \ +class cls : public wxVector \ {\ - WX_DECLARE_VECTORBASE(obj, cls);\ public:\ void push(const obj& o)\ {\ - if ( !Alloc(size() + 1) )\ - {\ - wxFAIL_MSG(_T("failed to extend stack"));\ - }\ - Append(new obj(o));\ + push_back(o); \ };\ \ void pop()\ {\ - RemoveAt(size() - 1);\ + pop_back(); \ };\ \ obj& top()\ {\ - return *(obj *) GetItem(size() - 1);\ + return at(size() - 1);\ };\ const obj& top() const\ {\ - return *(obj *) GetItem(size() - 1);\ + return at(size() - 1); \ };\ }