X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/903506828b7d042350eae97b5014a63ffca17ef5..3bb63e5c806e7ef549673822dc6e4d40aa9dbec9:/src/common/list.cpp diff --git a/src/common/list.cpp b/src/common/list.cpp index 018d554add..62200c7e5e 100644 --- a/src/common/list.cpp +++ b/src/common/list.cpp @@ -5,8 +5,8 @@ // Modified by: VZ at 16/11/98: WX_DECLARE_LIST() and typesafe lists added // Created: 04/01/98 // RCS-ID: $Id$ -// Copyright: (c) Julian Smart and Markus Holzem -// Licence: wxWindows license +// Copyright: (c) Julian Smart +// Licence: wxWindows licence //////////////////////////////////////////////////////////////////////////////// // ============================================================================= @@ -35,9 +35,10 @@ #ifndef WX_PRECOMP #include "wx/defs.h" #include "wx/list.h" - #include "wx/utils.h" // for copystring() (beurk...) #endif +#if !wxUSE_STL + // ============================================================================= // implementation // ============================================================================= @@ -45,7 +46,6 @@ // ----------------------------------------------------------------------------- // wxListKey // ----------------------------------------------------------------------------- - wxListKey wxDefaultListKey; bool wxListKey::operator==(wxListKeyValue value) const @@ -513,9 +513,9 @@ void wxListBase::Sort(const wxSortCompareFunction compfunc) // go through the list and put the pointers into the array wxNodeBase *node; - for ( node = GetFirst(); node; node = node->Next() ) + for ( node = GetFirst(); node; node = node->GetNext() ) { - *objPtr++ = node->Data(); + *objPtr++ = node->GetData(); } // sort the array @@ -523,7 +523,7 @@ void wxListBase::Sort(const wxSortCompareFunction compfunc) // put the sorted pointers back into the list objPtr = objArray; - for ( node = GetFirst(); node; node = node->Next() ) + for ( node = GetFirst(); node; node = node->GetNext() ) { node->SetData(*objPtr++); } @@ -532,18 +532,95 @@ void wxListBase::Sort(const wxSortCompareFunction compfunc) delete[] objArray; } +void wxListBase::Reverse() +{ + wxNodeBase* node = m_nodeFirst; + wxNodeBase* tmp; + + while (node) + { + // swap prev and next pointers + tmp = node->m_next; + node->m_next = node->m_previous; + node->m_previous = tmp; + + // this is the node that was next before swapping + node = tmp; + } + + // swap first and last node + tmp = m_nodeFirst; m_nodeFirst = m_nodeLast; m_nodeLast = tmp; +} + +void wxListBase::DeleteNodes(wxNodeBase* first, wxNodeBase* last) +{ + wxNodeBase* node = first; + + while (node != last) + { + wxNodeBase* next = node->GetNext(); + DeleteNode(node); + node = next; + } +} + +// ============================================================================ +// compatibility section from now on +// ============================================================================ + +#ifdef wxLIST_COMPATIBILITY + +// ----------------------------------------------------------------------------- +// wxNodeBase deprecated methods +// ----------------------------------------------------------------------------- + +wxNode *wxNodeBase::Next() const { return (wxNode *)GetNext(); } +wxNode *wxNodeBase::Previous() const { return (wxNode *)GetPrevious(); } +wxObject *wxNodeBase::Data() const { return (wxObject *)GetData(); } + +// ----------------------------------------------------------------------------- +// wxListBase deprecated methods +// ----------------------------------------------------------------------------- + +int wxListBase::Number() const { return GetCount(); } +wxNode *wxListBase::First() const { return (wxNode *)GetFirst(); } +wxNode *wxListBase::Last() const { return (wxNode *)GetLast(); } +wxNode *wxListBase::Nth(size_t n) const { return (wxNode *)Item(n); } +wxListBase::operator wxList&() const { return *(wxList*)this; } + // ----------------------------------------------------------------------------- // wxList (a.k.a. wxObjectList) // ----------------------------------------------------------------------------- +IMPLEMENT_DYNAMIC_CLASS(wxList, wxObject) + +wxList::wxList( int key_type ) + : wxObjectList( (wxKeyType)key_type ) +{ +} + void wxObjectListNode::DeleteData() { delete (wxObject *)GetData(); } -// ----------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- // wxStringList -// ----------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- + +static inline wxChar* MYcopystring(const wxString& s) +{ + wxChar* copy = new wxChar[s.length() + 1]; + return wxStrcpy(copy, s.c_str()); +} + +static inline wxChar* MYcopystring(const wxChar* s) +{ + wxChar* copy = new wxChar[wxStrlen(s) + 1]; + return wxStrcpy(copy, s); +} + +IMPLEMENT_DYNAMIC_CLASS(wxStringList, wxObject) // instead of WX_DEFINE_LIST(wxStringListBase) we define this function // ourselves @@ -580,6 +657,11 @@ void wxStringList::DoCopy(const wxStringList& other) } } +wxStringList::wxStringList() +{ + DeleteContents(TRUE); +} + // Variable argument list, terminated by a zero // Makes new storage for the strings wxStringList::wxStringList (const wxChar *first, ...) @@ -618,7 +700,7 @@ wxChar **wxStringList::ListToArray(bool new_copies) const { wxChar *s = node->GetData(); if ( new_copies ) - string_array[i] = copystring(s); + string_array[i] = MYcopystring(s); else string_array[i] = s; node = node->GetNext(); @@ -670,3 +752,17 @@ void wxStringList::Sort() delete [] array; } + +wxNode *wxStringList::Add(const wxChar *s) +{ + return (wxNode *)wxStringListBase::Append(MYcopystring(s)); +} + +wxNode *wxStringList::Prepend(const wxChar *s) +{ + return (wxNode *)wxStringListBase::Insert(MYcopystring(s)); +} + +#endif // wxLIST_COMPATIBILITY + +#endif // !wxUSE_STL