X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b1d4dd7add411ebff1ce4a8d1d992e0e43ee26b1..769c3372a2bd68c45d1a4afc8462d3b7939decb1:/src/common/list.cpp diff --git a/src/common/list.cpp b/src/common/list.cpp index 0eba6e5010..01fb9664bb 100644 --- a/src/common/list.cpp +++ b/src/common/list.cpp @@ -1,12 +1,12 @@ //////////////////////////////////////////////////////////////////////////////// -// Name: list.cpp +// Name: src/common/list.cpp // Purpose: wxList implementation // Author: Julian Smart // 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 //////////////////////////////////////////////////////////////////////////////// // ============================================================================= @@ -17,10 +17,6 @@ // headers // ----------------------------------------------------------------------------- -#ifdef __GNUG__ - #pragma implementation "list.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -33,11 +29,12 @@ #include #ifndef WX_PRECOMP - #include "wx/defs.h" #include "wx/list.h" - #include "wx/utils.h" // for copystring() (beurk...) + #include "wx/crt.h" #endif +#if !wxUSE_STD_CONTAINERS + // ============================================================================= // implementation // ============================================================================= @@ -45,7 +42,6 @@ // ----------------------------------------------------------------------------- // wxListKey // ----------------------------------------------------------------------------- - wxListKey wxDefaultListKey; bool wxListKey::operator==(wxListKeyValue value) const @@ -58,7 +54,7 @@ bool wxListKey::operator==(wxListKeyValue value) const // by not putting return here... case wxKEY_STRING: - return wxStrcmp(m_key.string, value.string) == 0; + return *m_key.string == *value.string; case wxKEY_INTEGER: return m_key.integer == value.integer; @@ -89,7 +85,7 @@ wxNodeBase::wxNodeBase(wxListBase *list, case wxKEY_STRING: // to be free()d later - m_key.string = wxStrdup(key.GetString()); + m_key.string = new wxString(key.GetString()); break; default: @@ -112,7 +108,7 @@ wxNodeBase::~wxNodeBase() { if ( m_list->m_keyType == wxKEY_STRING ) { - free(m_key.string); + delete m_key.string; } m_list->DetachNode(this); @@ -145,9 +141,9 @@ int wxNodeBase::IndexOf() const void wxListBase::Init(wxKeyType keyType) { m_nodeFirst = - m_nodeLast = (wxNodeBase *) NULL; + m_nodeLast = NULL; m_count = 0; - m_destroy = FALSE; + m_destroy = false; m_keyType = keyType; } @@ -169,28 +165,24 @@ void wxListBase::DoCopy(const wxListBase& list) m_destroy = list.m_destroy; m_keyType = list.m_keyType; m_nodeFirst = - m_nodeLast = (wxNodeBase *) NULL; + m_nodeLast = NULL; switch (m_keyType) { case wxKEY_INTEGER: { - long key; for ( wxNodeBase *node = list.GetFirst(); node; node = node->GetNext() ) { - key = node->GetKeyInteger(); - Append(key, node->GetData()); + Append(node->GetKeyInteger(), 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()); + Append(node->GetKeyString(), node->GetData()); } break; } @@ -205,7 +197,7 @@ void wxListBase::DoCopy(const wxListBase& list) } } - wxASSERT_MSG( m_count == list.m_count, _T("logic error in wxList::DoCopy") ); + wxASSERT_MSG( m_count == list.m_count, wxT("logic error in wxList::DoCopy") ); } wxListBase::~wxListBase() @@ -240,12 +232,12 @@ wxNodeBase *wxListBase::AppendCommon(wxNodeBase *node) wxNodeBase *wxListBase::Append(void *object) { // all objects in a keyed list should have a key - wxCHECK_MSG( m_keyType == wxKEY_NONE, (wxNodeBase *)NULL, + wxCHECK_MSG( m_keyType == wxKEY_NONE, NULL, wxT("need a key for the object to append") ); // 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, + wxNodeBase *node = CreateNode(m_nodeLast, NULL, object, wxDefaultListKey); return AppendCommon(node); @@ -255,31 +247,31 @@ wxNodeBase *wxListBase::Append(long key, void *object) { wxCHECK_MSG( (m_keyType == wxKEY_INTEGER) || (m_keyType == wxKEY_NONE && m_count == 0), - (wxNodeBase *)NULL, + NULL, wxT("can't append object with numeric key to this list") ); - wxNodeBase *node = CreateNode(m_nodeLast, (wxNodeBase *)NULL, object, key); + wxNodeBase *node = CreateNode(m_nodeLast, NULL, object, key); return AppendCommon(node); } -wxNodeBase *wxListBase::Append (const wxChar *key, void *object) +wxNodeBase *wxListBase::Append (const wxString& key, void *object) { wxCHECK_MSG( (m_keyType == wxKEY_STRING) || (m_keyType == wxKEY_NONE && m_count == 0), - (wxNodeBase *)NULL, + NULL, wxT("can't append object with string key to this list") ); - wxNodeBase *node = CreateNode(m_nodeLast, (wxNodeBase *)NULL, object, key); + wxNodeBase *node = CreateNode(m_nodeLast, NULL, object, key); return AppendCommon(node); } 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, + wxCHECK_MSG( m_keyType == wxKEY_NONE, NULL, wxT("need a key for the object to insert") ); - wxCHECK_MSG( !position || position->m_list == this, (wxNodeBase *)NULL, + wxCHECK_MSG( !position || position->m_list == this, NULL, wxT("can't insert before a node from another list") ); // previous and next node for the node being inserted @@ -292,7 +284,7 @@ wxNodeBase *wxListBase::Insert(wxNodeBase *position, void *object) else { // inserting in the beginning of the list - prev = (wxNodeBase *)NULL; + prev = NULL; next = m_nodeFirst; } @@ -325,7 +317,7 @@ wxNodeBase *wxListBase::Item(size_t n) const wxFAIL_MSG( wxT("invalid index in wxListBase::Item") ); - return (wxNodeBase *)NULL; + return NULL; } wxNodeBase *wxListBase::Find(const wxListKey& key) const @@ -342,10 +334,10 @@ wxNodeBase *wxListBase::Find(const wxListKey& key) const } // not found - return (wxNodeBase *)NULL; + return NULL; } -wxNodeBase *wxListBase::Find(void *object) const +wxNodeBase *wxListBase::Find(const void *object) const { for ( wxNodeBase *current = GetFirst(); current; current = current->GetNext() ) { @@ -354,7 +346,7 @@ wxNodeBase *wxListBase::Find(void *object) const } // not found - return (wxNodeBase *)NULL; + return NULL; } int wxListBase::IndexOf(void *object) const @@ -408,11 +400,11 @@ wxNodeBase *wxListBase::DetachNode(wxNodeBase *node) bool wxListBase::DeleteNode(wxNodeBase *node) { if ( !DetachNode(node) ) - return FALSE; + return false; DoDeleteNode(node); - return TRUE; + return true; } bool wxListBase::DeleteObject(void *object) @@ -422,12 +414,12 @@ bool wxListBase::DeleteObject(void *object) if ( current->GetData() == object ) { DeleteNode(current); - return TRUE; + return true; } } // not found - return FALSE; + return false; } void wxListBase::Clear() @@ -441,7 +433,7 @@ void wxListBase::Clear() } m_nodeFirst = - m_nodeLast = (wxNodeBase *)NULL; + m_nodeLast = NULL; m_count = 0; } @@ -462,7 +454,7 @@ void *wxListBase::FirstThat(wxListIterateFunction F) return current->GetData(); } - return (wxNodeBase *)NULL; + return NULL; } void *wxListBase::LastThat(wxListIterateFunction F) @@ -473,7 +465,7 @@ void *wxListBase::LastThat(wxListIterateFunction F) return current->GetData(); } - return (wxNodeBase *)NULL; + return NULL; } // (stefan.hammes@urz.uni-heidelberg.de) @@ -519,7 +511,11 @@ void wxListBase::Sort(const wxSortCompareFunction compfunc) } // sort the array - qsort((void *)objArray,num,sizeof(wxObject *),compfunc); + qsort((void *)objArray,num,sizeof(wxObject *), +#ifdef __WXWINCE__ + (int (__cdecl *)(const void *,const void *)) +#endif + compfunc); // put the sorted pointers back into the list objPtr = objArray; @@ -532,36 +528,48 @@ void wxListBase::Sort(const wxSortCompareFunction compfunc) delete[] objArray; } -// ============================================================================ -// compatibility section from now on -// ============================================================================ +void wxListBase::Reverse() +{ + wxNodeBase* node = m_nodeFirst; + wxNodeBase* tmp; -#ifdef wxLIST_COMPATIBILITY + while (node) + { + // swap prev and next pointers + tmp = node->m_next; + node->m_next = node->m_previous; + node->m_previous = tmp; -// ----------------------------------------------------------------------------- -// wxNodeBase deprecated methods -// ----------------------------------------------------------------------------- + // this is the node that was next before swapping + node = tmp; + } -wxNode *wxNodeBase::Next() const { return (wxNode *)GetNext(); } -wxNode *wxNodeBase::Previous() const { return (wxNode *)GetPrevious(); } -wxObject *wxNodeBase::Data() const { return (wxObject *)GetData(); } + // swap first and last node + tmp = m_nodeFirst; m_nodeFirst = m_nodeLast; m_nodeLast = tmp; +} -// ----------------------------------------------------------------------------- -// wxListBase deprecated methods -// ----------------------------------------------------------------------------- +void wxListBase::DeleteNodes(wxNodeBase* first, wxNodeBase* last) +{ + wxNodeBase* node = first; + + while (node != last) + { + wxNodeBase* next = node->GetNext(); + DeleteNode(node); + node = next; + } +} -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; } +// ============================================================================ +// compatibility section from now on +// ============================================================================ + +#ifdef wxLIST_COMPATIBILITY // ----------------------------------------------------------------------------- // wxList (a.k.a. wxObjectList) // ----------------------------------------------------------------------------- -IMPLEMENT_DYNAMIC_CLASS(wxList, wxObject) - wxList::wxList( int key_type ) : wxObjectList( (wxKeyType)key_type ) { @@ -572,11 +580,15 @@ void wxObjectListNode::DeleteData() delete (wxObject *)GetData(); } -// ----------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- // wxStringList -// ----------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- -IMPLEMENT_DYNAMIC_CLASS(wxStringList, wxObject) +static inline wxChar* MYcopystring(const wxChar* s) +{ + wxChar* copy = new wxChar[wxStrlen(s) + 1]; + return wxStrcpy(copy, s); +} // instead of WX_DEFINE_LIST(wxStringListBase) we define this function // ourselves @@ -594,12 +606,12 @@ bool wxStringList::Delete(const wxChar *s) if ( wxStrcmp(current->GetData(), s) == 0 ) { DeleteNode(current); - return TRUE; + return true; } } // not found - return FALSE; + return false; } void wxStringList::DoCopy(const wxStringList& other) @@ -615,14 +627,14 @@ void wxStringList::DoCopy(const wxStringList& other) wxStringList::wxStringList() { - DeleteContents(TRUE); + DeleteContents(true); } // Variable argument list, terminated by a zero // Makes new storage for the strings wxStringList::wxStringList (const wxChar *first, ...) { - DeleteContents(TRUE); + DeleteContents(true); if ( !first ) return; @@ -634,20 +646,26 @@ wxStringList::wxStringList (const wxChar *first, ...) { Add(s); + // icc gives this warning in its own va_arg() macro, argh +#ifdef __INTELC__ + #pragma warning(push) + #pragma warning(disable: 1684) +#endif + s = va_arg(ap, const wxChar *); - // if (s == NULL) -#ifdef __WXMSW__ - if ((int)(long) s == 0) -#else - if ((long) s == 0) + +#ifdef __INTELC__ + #pragma warning(pop) #endif + + if ( !s ) break; } va_end(ap); } -// Only makes new strings if arg is TRUE +// Only makes new strings if arg is true wxChar **wxStringList::ListToArray(bool new_copies) const { wxChar **string_array = new wxChar *[GetCount()]; @@ -656,7 +674,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(); @@ -672,13 +690,22 @@ bool wxStringList::Member(const wxChar *s) const { const wxChar *s1 = node->GetData(); if (s == s1 || wxStrcmp (s, s1) == 0) - return TRUE; + return true; } - return FALSE; + return false; } -extern "C" int LINKAGEMODE +#ifdef __WXWINCE__ +extern "C" +{ +static int __cdecl +#else +extern "C" +{ +static int LINKAGEMODE +#endif + wx_comparestrings(const void *arg1, const void *arg2) { wxChar **s1 = (wxChar **) arg1; @@ -687,6 +714,8 @@ wx_comparestrings(const void *arg1, const void *arg2) return wxStrcmp (*s1, *s2); } +} // end of extern "C" (required because of GCC Bug c++/33078 + // Sort a list of strings - deallocates old nodes, allocates new void wxStringList::Sort() { @@ -709,5 +738,30 @@ void wxStringList::Sort() delete [] array; } +wxNode *wxStringList::Add(const wxChar *s) +{ + return (wxNode *)(wxStringListBase::Node *) + wxStringListBase::Append(MYcopystring(s)); +} + +wxNode *wxStringList::Prepend(const wxChar *s) +{ + return (wxNode *)(wxStringListBase::Node *) + wxStringListBase::Insert(MYcopystring(s)); +} + #endif // wxLIST_COMPATIBILITY +#else // wxUSE_STD_CONTAINERS = 1 + + #include "wx/listimpl.cpp" + WX_DEFINE_LIST(wxObjectList) + +// with wxUSE_STD_CONTAINERS wxStringList contains wxString objects, not pointers +void _WX_LIST_HELPER_wxStringListBase::DeleteFunction( wxString WXUNUSED(X) ) +{ +} + +wxStringListBase::BaseListType wxStringListBase::EmptyList; + +#endif // !wxUSE_STD_CONTAINERS