X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ff528365c8fdff9af65d3121d9f0954bf216b82f..a0d8a3052817fef6eef27e9a6ab8802495a39db8:/src/common/list.cpp diff --git a/src/common/list.cpp b/src/common/list.cpp index 2ee4089692..8bc94a8c64 100644 --- a/src/common/list.cpp +++ b/src/common/list.cpp @@ -37,13 +37,12 @@ #include "wx/utils.h" // for copystring() (beurk...) #endif -// Sun CC compatibility (interference with xview/pkg.h, apparently...) -#if defined(SUN_CC) && defined(__XVIEW__) - #undef va_start - #undef va_end - #undef va_arg - #undef va_list -#endif +// ----------------------------------------------------------------------------- +// implementation of standard lists +// ----------------------------------------------------------------------------- + +#include "wx/listimpl.cpp" +WX_DEFINE_LIST(wxWindowList); // ============================================================================= // implementation @@ -53,6 +52,8 @@ // wxListKey // ----------------------------------------------------------------------------- +wxListKey wxDefaultListKey; + bool wxListKey::operator==(wxListKeyValue value) const { switch ( m_keyType ) @@ -68,7 +69,7 @@ bool wxListKey::operator==(wxListKeyValue value) const case wxKEY_INTEGER: return m_key.integer == value.integer; } -} +} // ----------------------------------------------------------------------------- // wxNodeBase @@ -82,28 +83,28 @@ wxNodeBase::wxNodeBase(wxListBase *list, m_data = data; m_previous = previous; m_next = next; - + switch ( key.GetKeyType() ) { case wxKEY_NONE: break; - + case wxKEY_INTEGER: m_key.integer = key.GetNumber(); break; - + case wxKEY_STRING: // to be free()d later m_key.string = strdup(key.GetString()); break; - + default: wxFAIL_MSG("invalid key type"); } - + if ( previous ) previous->m_next = this; - + if ( next ) next->m_previous = this; } @@ -115,15 +116,39 @@ wxNodeBase::~wxNodeBase() // compatibility with old code if ( m_list != NULL ) { + if ( m_list->m_keyType == wxKEY_STRING ) + { + free(m_key.string); + } + m_list->DetachNode(this); } } +int wxNodeBase::IndexOf() const +{ + wxCHECK_MSG( m_list, wxNOT_FOUND, "node doesn't belong to a list in IndexOf"); + + // It would be more efficient to implement IndexOf() completely inside + // wxListBase (only traverse the list once), but this is probably a more + // reusable way of doing it. Can always be optimized at a later date (since + // IndexOf() resides in wxListBase as well) if efficiency is a problem. + int i; + wxNodeBase *prev = m_previous; + + for( i = 0; prev; i++ ) + { + prev = prev->m_previous; + } + + return i; +} + // ----------------------------------------------------------------------------- // wxListBase // ----------------------------------------------------------------------------- -void wxListBase::Init(wxKeyType keyType = wxKEY_NONE) +void wxListBase::Init(wxKeyType keyType) { m_nodeFirst = m_nodeLast = (wxNodeBase *) NULL; @@ -272,7 +297,7 @@ wxNodeBase *wxListBase::Item(size_t n) const wxFAIL_MSG( "invalid index in wxListBase::Item" ); - return NULL; + return (wxNodeBase *)NULL; } wxNodeBase *wxListBase::Find(const wxListKey& key) const @@ -304,6 +329,13 @@ wxNodeBase *wxListBase::Find(void *object) const return (wxNodeBase *)NULL; } +int wxListBase::IndexOf(void *object) const +{ + wxNodeBase *node = Find( object ); + + return node ? node->IndexOf() : wxNOT_FOUND; +} + void wxListBase::DoDeleteNode(wxNodeBase *node) { // free node's data @@ -317,6 +349,8 @@ void wxListBase::DoDeleteNode(wxNodeBase *node) node->DeleteData(); } + // so that the node knows that it's being deleted by the list + node->m_list = NULL; delete node; } @@ -368,7 +402,6 @@ bool wxListBase::DeleteObject(void *object) return FALSE; } - void wxListBase::Clear() { wxNodeBase *current = m_nodeFirst; @@ -491,6 +524,34 @@ void wxStringListNode::DeleteData() delete [] (char *)GetData(); } +bool wxStringList::Delete(const char *s) +{ + wxStringListNode *current; + + for ( current = GetFirst(); current; current = current->GetNext() ) + { + if ( strcmp(current->GetData(), s) == 0 ) + { + DeleteNode(current); + return TRUE; + } + } + + // not found + return FALSE; +} + +void wxStringList::DoCopy(const wxStringList& other) +{ + wxASSERT( GetCount() == 0 ); // this list must be empty before copying! + + size_t count = other.GetCount(); + for ( size_t n = 0; n < count; n++ ) + { + Add(other.Item(n)->GetData()); + } +} + // Variable argument list, terminated by a zero // Makes new storage for the strings wxStringList::wxStringList (const char *first, ...) @@ -564,19 +625,19 @@ void wxStringList::Sort() { size_t N = GetCount(); char **array = new char *[N]; + wxStringListNode *node; size_t i = 0; - for ( wxStringListNode *node = GetFirst(); node; node = node->GetNext() ) + for ( node = GetFirst(); node; node = node->GetNext() ) { array[i++] = node->GetData(); } qsort (array, N, sizeof (char *), wx_comparestrings); - Clear(); - for (i = 0; i < N; i++) - Append (array[i]); + i = 0; + for ( node = GetFirst(); node; node = node->GetNext() ) + node->SetData( array[i++] ); - delete[]array; + delete [] array; } -