X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/5c33522fca7cddc441a316f5b9fb50d7685435ba..801423ee3454d200581cd51d35fbcdad19f2208a:/include/wx/list.h diff --git a/include/wx/list.h b/include/wx/list.h index 5f9b4d1fa0..8f0c86f276 100644 --- a/include/wx/list.h +++ b/include/wx/list.h @@ -186,7 +186,7 @@ inline const void *wxListCastElementToVoidPtr(const wxString& str) bool operator==(const compatibility_iterator& i) const \ { \ wxASSERT_MSG( m_list && i.m_list, \ - _T("comparing invalid iterators is illegal") ); \ + wxT("comparing invalid iterators is illegal") ); \ return (m_list == i.m_list) && (m_iter == i.m_iter); \ } \ bool operator!=(const compatibility_iterator& i) const \ @@ -258,7 +258,7 @@ inline const void *wxListCastElementToVoidPtr(const wxString& str) iterator i = const_cast< liT* >(this)->end(); \ return compatibility_iterator( this, !empty() ? --i : i ); \ } \ - compatibility_iterator Member( elT e ) const \ + bool Member( elT e ) const \ { return Find( e ); } \ compatibility_iterator Nth( int n ) const \ { return Item( n ); } \ @@ -275,7 +275,7 @@ inline const void *wxListCastElementToVoidPtr(const wxString& str) push_front( e ); \ return compatibility_iterator( this, begin() ); \ } \ - compatibility_iterator Insert( compatibility_iterator & i, elT e ) \ + compatibility_iterator Insert(const compatibility_iterator & i, elT e)\ { \ return compatibility_iterator( this, insert( i.m_iter, e ) ); \ } \ @@ -420,9 +420,9 @@ class WXDLLIMPEXP_BASE wxNodeBase friend class wxListBase; public: // ctor - wxNodeBase(wxListBase *list = (wxListBase *)NULL, - wxNodeBase *previous = (wxNodeBase *)NULL, - wxNodeBase *next = (wxNodeBase *)NULL, + wxNodeBase(wxListBase *list = NULL, + wxNodeBase *previous = NULL, + wxNodeBase *next = NULL, void *data = NULL, const wxListKey& key = wxDefaultListKey); @@ -468,7 +468,7 @@ private: wxListBase *m_list; // list we belong to - DECLARE_NO_COPY_CLASS(wxNodeBase) + wxDECLARE_NO_COPY_CLASS(wxNodeBase); }; // ----------------------------------------------------------------------------- @@ -559,7 +559,7 @@ protected: { wxNodeBase *node = Item(n); - return node ? node->GetData() : (wxNodeBase *)NULL; + return node ? node->GetData() : NULL; } // operations @@ -569,7 +569,8 @@ protected: // append to beginning of list wxNodeBase *Append(void *object); // insert a new item at the beginning of the list - wxNodeBase *Insert(void *object) { return Insert( (wxNodeBase*)NULL, object); } + wxNodeBase *Insert(void *object) + { return Insert(static_cast(NULL), object); } // insert a new item at the given position wxNodeBase *Insert(size_t pos, void *object) { return pos == GetCount() ? Append(object) @@ -673,10 +674,10 @@ private: classexp nodetype : public wxNodeBase \ { \ public: \ - nodetype(wxListBase *list = (wxListBase *)NULL, \ - nodetype *previous = (nodetype *)NULL, \ - nodetype *next = (nodetype *)NULL, \ - T *data = (T *)NULL, \ + nodetype(wxListBase *list = NULL, \ + nodetype *previous = NULL, \ + nodetype *next = NULL, \ + T *data = NULL, \ const wxListKey& key = wxDefaultListKey) \ : wxNodeBase(list, previous, next, data, key) { } \ \ @@ -733,13 +734,14 @@ private: T *operator[](size_t index) const \ { \ nodetype *node = Item(index); \ - return node ? (T*)(node->GetData()) : (T*)NULL; \ + return node ? (T*)(node->GetData()) : NULL; \ } \ \ nodetype *Append(Tbase *object) \ { return (nodetype *)wxListBase::Append(object); } \ nodetype *Insert(Tbase *object) \ - { return (nodetype *)Insert((nodetype*)NULL, object); } \ + { return (nodetype *)Insert(static_cast(NULL), \ + object); } \ nodetype *Insert(size_t pos, Tbase *object) \ { return (nodetype *)wxListBase::Insert(pos, object); } \ nodetype *Insert(nodetype *prev, Tbase *object) \ @@ -765,6 +767,9 @@ private: virtual nodetype *Find(const wxListKey& key) const \ { return (nodetype *)wxListBase::Find(key); } \ \ + bool Member(const Tbase *object) const \ + { return Find(object) != NULL; } \ + \ int IndexOf(Tbase *object) const \ { return wxListBase::IndexOf(object); } \ \ @@ -814,9 +819,19 @@ private: reference_type operator*() const \ { return *(pointer_type)m_node->GetDataPtr(); } \ ptrop \ - itor& operator++() { m_node = m_node->GetNext(); return *this; }\ + itor& operator++() \ + { \ + wxASSERT_MSG( m_node, wxT("uninitialized iterator") ); \ + m_node = m_node->GetNext(); \ + return *this; \ + } \ const itor operator++(int) \ - { itor tmp = *this; m_node = m_node->GetNext(); return tmp; }\ + { \ + itor tmp = *this; \ + wxASSERT_MSG( m_node, wxT("uninitialized iterator") ); \ + m_node = m_node->GetNext(); \ + return tmp; \ + } \ itor& operator--() \ { \ m_node = m_node ? m_node->GetPrevious() : m_init; \ @@ -857,9 +872,19 @@ private: reference_type operator*() const \ { return *(pointer_type)m_node->GetDataPtr(); } \ ptrop \ - itor& operator++() { m_node = m_node->GetNext(); return *this; }\ + itor& operator++() \ + { \ + wxASSERT_MSG( m_node, wxT("uninitialized iterator") ); \ + m_node = m_node->GetNext(); \ + return *this; \ + } \ const itor operator++(int) \ - { itor tmp = *this; m_node = m_node->GetNext(); return tmp; }\ + { \ + itor tmp = *this; \ + wxASSERT_MSG( m_node, wxT("uninitialized iterator") ); \ + m_node = m_node->GetNext(); \ + return tmp; \ + } \ itor& operator--() \ { \ m_node = m_node ? m_node->GetPrevious() : m_init; \ @@ -1008,22 +1033,33 @@ private: iterator insert(const iterator& it, const_reference v) \ { \ if ( it == end() ) \ + { \ Append((const_base_reference)v); \ + /* \ + note that this is the new end(), the old one was \ + invalidated by the Append() call, and this is why we \ + can't use the same code as in the normal case below \ + */ \ + iterator itins(end()); \ + return --itins; \ + } \ else \ + { \ Insert(it.m_node, (const_base_reference)v); \ - iterator itprev(it); \ - return itprev--; \ + iterator itins(it); \ + return --itins; \ + } \ } \ void insert(const iterator& it, size_type n, const_reference v) \ { \ for(size_type i = 0; i < n; ++i) \ - Insert(it.m_node, (const_base_reference)v); \ + insert(it, v); \ } \ void insert(const iterator& it, \ const_iterator first, const const_iterator& last) \ { \ for(; first != last; ++first) \ - Insert(it.m_node, (const_base_reference)*first); \ + insert(it, *first); \ } \ iterator erase(const iterator& it) \ { \ @@ -1032,7 +1068,9 @@ private: } \ iterator erase(const iterator& first, const iterator& last) \ { \ - iterator next = last; ++next; \ + iterator next = last; \ + if ( next != end() ) \ + ++next; \ DeleteNodes(first.m_node, last.m_node); \ return next; \ } \ @@ -1043,10 +1081,11 @@ private: { splice(it, l, l.begin(), l.end() ); } \ void splice(const iterator& it, name& l, const iterator& first) \ { \ - iterator tmp = first; ++tmp; \ - if(it == first || it == tmp) return; \ - insert(it, *first); \ - l.erase(first); \ + if ( it != first ) \ + { \ + insert(it, *first); \ + l.erase(first); \ + } \ } \ void remove(const_reference v) \ { DeleteObject((const_base_reference)v); } \ @@ -1174,12 +1213,7 @@ public: // compatibility methods void Sort(wxSortCompareFunction compfunc) { wxListBase::Sort(compfunc); } -#endif - -#if wxUSE_STL -#else - wxNode *Member(wxObject *object) const { return (wxNode *)Find(object); } -#endif +#endif // !wxUSE_STL }; #if !wxUSE_STL @@ -1275,4 +1309,15 @@ public: (list).clear(); \ } +// append all element of one list to another one +#define WX_APPEND_LIST(list, other) \ + { \ + wxList::compatibility_iterator node = other->GetFirst(); \ + while ( node ) \ + { \ + (list)->push_back(node->GetData()); \ + node = node->GetNext(); \ + } \ + } + #endif // _WX_LISTH__