X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/509201463dbd3bce8aff762c664b111a8f2c3412..e5c4c38b5d3523bfac08987b5ec09d34f4f61caa:/src/common/list.cpp diff --git a/src/common/list.cpp b/src/common/list.cpp index 49e3268059..b9c9e06388 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 //////////////////////////////////////////////////////////////////////////////// // ============================================================================= @@ -16,8 +16,9 @@ // ----------------------------------------------------------------------------- // headers // ----------------------------------------------------------------------------- + #ifdef __GNUG__ -#pragma implementation "list.h" + #pragma implementation "list.h" #endif // For compilers that support precompilation, includes "wx.h". @@ -37,13 +38,6 @@ #include "wx/utils.h" // for copystring() (beurk...) #endif -// ----------------------------------------------------------------------------- -// implementation of standard lists -// ----------------------------------------------------------------------------- - -#include "wx/listimpl.cpp" -WX_DEFINE_LIST(wxWindowList); - // ============================================================================= // implementation // ============================================================================= @@ -59,7 +53,7 @@ bool wxListKey::operator==(wxListKeyValue value) const switch ( m_keyType ) { default: - wxFAIL_MSG(_T("bad key type.")); + wxFAIL_MSG(wxT("bad key type.")); // let compiler optimize the line above away in release build // by not putting return here... @@ -99,7 +93,7 @@ wxNodeBase::wxNodeBase(wxListBase *list, break; default: - wxFAIL_MSG(_T("invalid key type")); + wxFAIL_MSG(wxT("invalid key type")); } if ( previous ) @@ -127,7 +121,7 @@ wxNodeBase::~wxNodeBase() int wxNodeBase::IndexOf() const { - wxCHECK_MSG( m_list, wxNOT_FOUND, _T("node doesn't belong to a list in IndexOf")); + wxCHECK_MSG( m_list, wxNOT_FOUND, wxT("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 @@ -170,18 +164,48 @@ wxListBase::wxListBase(size_t count, void *elements[]) void wxListBase::DoCopy(const wxListBase& list) { wxASSERT_MSG( !list.m_destroy, - _T("copying list which owns it's elements is a bad idea") ); + wxT("copying list which owns it's elements is a bad idea") ); - m_count = list.m_count; m_destroy = list.m_destroy; m_keyType = list.m_keyType; m_nodeFirst = m_nodeLast = (wxNodeBase *) NULL; - for ( wxNodeBase *node = list.GetFirst(); node; node = node->GetNext() ) + switch (m_keyType) { - Append(node); + case wxKEY_INTEGER: + { + long key; + for ( wxNodeBase *node = list.GetFirst(); node; node = node->GetNext() ) + { + key = node->GetKeyInteger(); + Append(key, node->GetData()); + } + break; + } + + case wxKEY_STRING: + { + const wxChar *key; + for ( wxNodeBase *node = list.GetFirst(); node; node = node->GetNext() ) + { + key = node->GetKeyString(); + Append(key, node->GetData()); + } + break; + } + + default: + { + for ( wxNodeBase *node = list.GetFirst(); node; node = node->GetNext() ) + { + Append(node->GetData()); + } + break; + } } + + wxASSERT_MSG( m_count == list.m_count, _T("logic error in wxList::DoCopy") ); } wxListBase::~wxListBase() @@ -217,9 +241,12 @@ wxNodeBase *wxListBase::Append(void *object) { // all objects in a keyed list should have a key wxCHECK_MSG( m_keyType == wxKEY_NONE, (wxNodeBase *)NULL, - _T("need a key for the object to append") ); + wxT("need a key for the object to append") ); - wxNodeBase *node = CreateNode(m_nodeLast, (wxNodeBase *)NULL, object); + // we use wxDefaultListKey even though it is the default parameter value + // because gcc under Mac OS X seems to miscompile this call otherwise + wxNodeBase *node = CreateNode(m_nodeLast, (wxNodeBase *)NULL, object, + wxDefaultListKey); return AppendCommon(node); } @@ -229,7 +256,7 @@ wxNodeBase *wxListBase::Append(long key, void *object) wxCHECK_MSG( (m_keyType == wxKEY_INTEGER) || (m_keyType == wxKEY_NONE && m_count == 0), (wxNodeBase *)NULL, - _T("can't append object with numeric key to this list") ); + wxT("can't append object with numeric key to this list") ); wxNodeBase *node = CreateNode(m_nodeLast, (wxNodeBase *)NULL, object, key); return AppendCommon(node); @@ -240,7 +267,7 @@ wxNodeBase *wxListBase::Append (const wxChar *key, void *object) wxCHECK_MSG( (m_keyType == wxKEY_STRING) || (m_keyType == wxKEY_NONE && m_count == 0), (wxNodeBase *)NULL, - _T("can't append object with string key to this list") ); + wxT("can't append object with string key to this list") ); wxNodeBase *node = CreateNode(m_nodeLast, (wxNodeBase *)NULL, object, key); return AppendCommon(node); @@ -250,10 +277,10 @@ wxNodeBase *wxListBase::Insert(wxNodeBase *position, void *object) { // all objects in a keyed list should have a key wxCHECK_MSG( m_keyType == wxKEY_NONE, (wxNodeBase *)NULL, - _T("need a key for the object to insert") ); + wxT("need a key for the object to insert") ); wxCHECK_MSG( !position || position->m_list == this, (wxNodeBase *)NULL, - _T("can't insert before a node from another list") ); + wxT("can't insert before a node from another list") ); // previous and next node for the node being inserted wxNodeBase *prev, *next; @@ -269,7 +296,8 @@ wxNodeBase *wxListBase::Insert(wxNodeBase *position, void *object) next = m_nodeFirst; } - wxNodeBase *node = CreateNode(prev, next, object); + // wxDefaultListKey: see comment in Append() above + wxNodeBase *node = CreateNode(prev, next, object, wxDefaultListKey); if ( !m_nodeFirst ) { m_nodeLast = node; @@ -295,7 +323,7 @@ wxNodeBase *wxListBase::Item(size_t n) const } } - wxFAIL_MSG( _T("invalid index in wxListBase::Item") ); + wxFAIL_MSG( wxT("invalid index in wxListBase::Item") ); return (wxNodeBase *)NULL; } @@ -303,7 +331,7 @@ wxNodeBase *wxListBase::Item(size_t n) const wxNodeBase *wxListBase::Find(const wxListKey& key) const { wxASSERT_MSG( m_keyType == key.GetKeyType(), - _T("this list is not keyed on the type of this key") ); + wxT("this list is not keyed on the type of this key") ); for ( wxNodeBase *current = GetFirst(); current; current = current->GetNext() ) { @@ -356,9 +384,9 @@ void wxListBase::DoDeleteNode(wxNodeBase *node) wxNodeBase *wxListBase::DetachNode(wxNodeBase *node) { - wxCHECK_MSG( node, NULL, _T("detaching NULL wxNodeBase") ); + wxCHECK_MSG( node, NULL, wxT("detaching NULL wxNodeBase") ); wxCHECK_MSG( node->m_list == this, NULL, - _T("detaching node which is not from this list") ); + wxT("detaching node which is not from this list") ); // update the list wxNodeBase **prevNext = node->GetPrevious() ? &node->GetPrevious()->m_next @@ -485,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 @@ -495,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++); } @@ -504,10 +532,41 @@ void wxListBase::Sort(const wxSortCompareFunction compfunc) delete[] objArray; } +// ============================================================================ +// 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(); @@ -517,6 +576,8 @@ void wxObjectListNode::DeleteData() // wxStringList // ----------------------------------------------------------------------------- +IMPLEMENT_DYNAMIC_CLASS(wxStringList, wxObject) + // instead of WX_DEFINE_LIST(wxStringListBase) we define this function // ourselves void wxStringListNode::DeleteData() @@ -552,10 +613,16 @@ 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, ...) { + DeleteContents(TRUE); if ( !first ) return; @@ -570,7 +637,7 @@ wxStringList::wxStringList (const wxChar *first, ...) s = va_arg(ap, const wxChar *); // if (s == NULL) #ifdef __WXMSW__ - if ((int) s == 0) + if ((int)(long) s == 0) #else if ((long) s == 0) #endif @@ -611,7 +678,7 @@ bool wxStringList::Member(const wxChar *s) const return FALSE; } -static int +extern "C" int LINKAGEMODE wx_comparestrings(const void *arg1, const void *arg2) { wxChar **s1 = (wxChar **) arg1; @@ -641,3 +708,6 @@ void wxStringList::Sort() delete [] array; } + +#endif // wxLIST_COMPATIBILITY +