Returns the first node in the list (NULL if the list is empty).
+\membersection{wxList::IndexOf}
+
+\func{int}{IndexOf}{\param{wxObject*}{ obj }}
+
+Returns the index of {\it obj} within the list or NOT\_FOUND if {\it obj}
+is not found in the list.
+
\membersection{wxList::Insert}
\func{wxNode *}{Insert}{\param{wxObject *}{object}}
Sets the data associated with the node (usually the pointer will have been
set when the node was created).
+\membersection{wxNode::IndexOf}
+
+\func{int}{IndexOf}{\void}
+
+Returns the zero-based index of this node within the list. The return value
+will be NOT\_FOUND if the node has not been added to a list yet.
// Created: 29/01/98
// RCS-ID: $Id$
// Copyright: (c) 1998 Julian Smart
-// Licence: wxWindows license
+// Licence: wxWindows license
/////////////////////////////////////////////////////////////////////////////
/*
void *GetData() const { return m_data; }
void SetData(void *data) { m_data = data; }
+ // get 0-based index of this node within the list or NOT_FOUND
+ int IndexOf() const;
+
virtual void DeleteData() { }
private:
bool DeleteNode(wxNodeBase *node);
// finds object pointer and deletes node (and object if DeleteContents
// is on), returns FALSE if object not found
- bool DeleteObject(void *object);
+ bool DeleteObject(void *object);
// search (all return NULL if item not found)
// by data
// by key
wxNodeBase *Find(const wxListKey& key) const;
+ // get 0-based index of object or NOT_FOUND
+ int IndexOf( void *object ) const;
+
// this function allows the sorting of arbitrary lists by giving
// a function to compare two list elements. The list is sorted in place.
void Sort(const wxSortCompareFunction compfunc);
virtual nodetype *Find(const wxListKey& key) const \
{ return (nodetype *)wxListBase::Find(key); } \
\
+ int IndexOf( T *object ) const \
+ { return wxListBase::IndexOf(object); } \
+ \
void Sort(wxSortFuncFor_##name func) \
{ wxListBase::Sort((wxSortCompareFunction)func); } \
\
// -----------------------------------------------------------------------------
// wxStringList class for compatibility with the old code
// -----------------------------------------------------------------------------
-
+
WX_DECLARE_LIST_2(char, wxStringListBase, wxStringListNode);
class WXDLLEXPORT wxStringList : public wxStringListBase
case wxKEY_INTEGER:
return m_key.integer == value.integer;
}
-}
+}
// -----------------------------------------------------------------------------
// wxNodeBase
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;
}
}
}
+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
// -----------------------------------------------------------------------------
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
size_t count = other.GetCount();
for ( size_t n = 0; n < count; n++ )
{
- Add(other.Item(n)->GetData());
+ Add(other.Item(n)->GetData());
}
}