X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/6164d85e896743b16a0cf8b0610f5d17ceb47f36..38d24a39d3269c5b595ec313475c2fb04ac9a353:/src/common/list.cpp?ds=sidebyside diff --git a/src/common/list.cpp b/src/common/list.cpp index f7b1ab0543..457a48aa14 100644 --- a/src/common/list.cpp +++ b/src/common/list.cpp @@ -49,6 +49,27 @@ // implementation // ============================================================================= +// ----------------------------------------------------------------------------- +// wxListKey +// ----------------------------------------------------------------------------- + +bool wxListKey::operator==(wxListKeyValue value) const +{ + switch ( m_keyType ) + { + default: + wxFAIL_MSG("bad key type."); + // let compiler optimize the line above away in release build + // by not putting return here... + + case wxKEY_STRING: + return strcmp(m_key.string, value.string) == 0; + + case wxKEY_INTEGER: + return m_key.integer == value.integer; + } +} + // ----------------------------------------------------------------------------- // wxNodeBase // ----------------------------------------------------------------------------- @@ -61,28 +82,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; } @@ -98,6 +119,25 @@ wxNodeBase::~wxNodeBase() } } +int wxNodeBase::IndexOf() const +{ + wxCHECK_MSG( m_list, NOT_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 // ----------------------------------------------------------------------------- @@ -206,16 +246,26 @@ wxNodeBase *wxListBase::Insert(wxNodeBase *position, void *object) wxCHECK_MSG( m_keyType == wxKEY_NONE, (wxNodeBase *)NULL, "need a key for the object to insert" ); - wxNodeBase *prev = (wxNodeBase *)NULL; + wxCHECK_MSG( !position || position->m_list == this, (wxNodeBase *)NULL, + "can't insert before a node from another list" ); + + // previous and next node for the node being inserted + wxNodeBase *prev, *next; if ( position ) + { prev = position->GetPrevious(); - //else - // inserting in the beginning of the list + next = position; + } + else + { + // inserting in the beginning of the list + prev = (wxNodeBase *)NULL; + next = m_nodeFirst; + } - wxNodeBase *node = CreateNode(prev, position, object); + wxNodeBase *node = CreateNode(prev, next, object); if ( !m_nodeFirst ) { - m_nodeFirst = node; m_nodeLast = node; } @@ -273,6 +323,13 @@ wxNodeBase *wxListBase::Find(void *object) const return (wxNodeBase *)NULL; } +int wxListBase::IndexOf(void *object) const +{ + wxNodeBase *node = Find( object ); + + return node ? node->IndexOf() : NOT_FOUND; +} + void wxListBase::DoDeleteNode(wxNodeBase *node) { // free node's data @@ -440,23 +497,6 @@ void wxListBase::Sort(const wxSortCompareFunction compfunc) delete[] objArray; } -bool wxListKey::operator==(wxListKeyValue value) const - { - switch ( m_keyType ) - { - default: - wxFAIL_MSG("bad key type."); - // let compiler optimize the line above away in release build - // by not putting return here... - - case wxKEY_STRING: - return strcmp(m_key.string, value.string) == 0; - - case wxKEY_INTEGER: - return m_key.integer == value.integer; - } - } - // ----------------------------------------------------------------------------- // wxList (a.k.a. wxObjectList) // ----------------------------------------------------------------------------- @@ -477,6 +517,17 @@ void wxStringListNode::DeleteData() delete [] (char *)GetData(); } +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, ...)