WvStreams
|
A linked list container class. More...
#include <wvlinklist.h>
Classes | |
class | Iter |
The iterator type for linked lists. More... | |
Public Types | |
typedef class WvSorter< T, WvListBase, WvListBase::IterBase > | Sorter |
The sorted iterator type for linked lists. | |
Public Member Functions | |
WvList () | |
Creates an empty linked list. | |
~WvList () | |
Destroys the linked list. More... | |
void | setup () |
Invoked by subclasses after the linked list is first created. | |
void | shutdown () |
Invoked by subclasses before the linked list is destroyed. | |
void | zap (bool destroy=true) |
Clears the linked list. More... | |
T * | first () const |
Returns a pointer to the first element in the linked list. More... | |
T * | last () const |
Returns a pointer to the last element in the linked list. More... | |
void | add_after (WvLink *after, T *data, bool autofree, const char *id=NULL) |
Adds the element after the specified link in the list. More... | |
void | append (T *data, bool autofree, const char *id=NULL) |
Appends the element to the end of the list. More... | |
void | add (T *data, bool autofree, const char *id=NULL) |
Synonym for append(T*, bool, char*). More... | |
void | prepend (T *data, bool autofree, const char *id=NULL) |
Prepends the element to the beginning of the list. More... | |
void | unlink (T *data) |
Unlinks the specified element from the list. More... | |
void | unlink_first () |
Unlinks the first element from the list. More... | |
void | unlink_after (WvLink *after, bool destroy=true) |
Unlinks the element that follows the specified link in the list. More... | |
size_t | count () const |
Returns the number of elements in the list. More... | |
void | reverse () |
Reverses the order of elements in the list. More... | |
bool | isempty () const |
Quickly determines if the list is empty. More... | |
Public Attributes | |
WvLink | head |
WvLink * | tail |
A linked list container class.
Some rather horrible macros are used to declare actual concrete list types.
Example:
DeclareWvList(WvString);
int main() { WvStringList l; WvStringList::Iter i(l);
... fill the list ...
i.rewind(); while (i.next()) printf("%s\\n", i.str); }
Deallocating list will free all of the WvLinks in the list, but will only free the user objects that were added with autofree set to true.
We need to malloc memory for each WvLink as well as the data it stores; this is unnecessarily slow. I would rather have made a base "Link" class for object types that could be stored as links in a list, and then used object->next instead of all the List Iterator stuff, but the end result was pure ugliness, so I gave up. At least this way, the same object can be in multiple lists.
List type construction is facilitated by the following macros:
"T" is the object type
Definition at line 197 of file wvlinklist.h.
Destroys the linked list.
Destroys any elements that were added with autofree == true.
Definition at line 213 of file wvlinklist.h.
|
inline |
Clears the linked list.
If destroy is true, destroys any elements that were added with autofree == true.
Definition at line 228 of file wvlinklist.h.
Referenced by WvList< UniGenMount >::~WvList().
|
inline |
Returns a pointer to the first element in the linked list.
The list must be non-empty.
Returns: the element pointer, possibly null
Definition at line 241 of file wvlinklist.h.
Referenced by WvDBusMsg::append(), WvDBusMsg::array_start(), WvDBusMsg::struct_start(), and WvDBusMsg::variant_start().
|
inline |
Returns a pointer to the last element in the linked list.
The list must be non-empty.
Returns: the element pointer, possibly null
Definition at line 251 of file wvlinklist.h.
|
inline |
Adds the element after the specified link in the list.
"link" is the link preceeding the desired location of the element to be inserted, non-null "data" is the element pointer, may be null "autofree" is if true, takes ownership of the element "id" is an optional string to associate with the element, or null
Definition at line 263 of file wvlinklist.h.
Referenced by WvList< UniGenMount >::append(), and WvList< UniGenMount >::prepend().
|
inline |
Appends the element to the end of the list.
"data" is the element pointer, may be null "autofree" is if true, takes ownership of the element "id" is an optional string to associate with the element, or null
Definition at line 276 of file wvlinklist.h.
Referenced by WvList< UniGenMount >::add(), and wvtcl_decode().
|
inline |
Synonym for append(T*, bool, char*).
Definition at line 283 of file wvlinklist.h.
|
inline |
Prepends the element to the beginning of the list.
"data" is the element pointer, may be null "autofree" is if true, takes ownership of the element "id" is an optional string to associate with the element, or null
Definition at line 293 of file wvlinklist.h.
Referenced by WvDBusMsg::array_start(), WvDBusMsg::struct_start(), WvDBusMsg::variant_start(), and WvDBusMsg::WvDBusMsg().
|
inline |
Unlinks the specified element from the list.
Destroys the element if it was added with autofree == true.
"data" is the element pointer, may be null
Definition at line 303 of file wvlinklist.h.
|
inline |
Unlinks the first element from the list.
Destroys the element if it was added with autofree == true.
Definition at line 312 of file wvlinklist.h.
Referenced by WvDBusMsg::variant_end().
Unlinks the element that follows the specified link in the list.
Destroys the element if it was added with autofree == true and destroy == true.
"after" is the link preceeding the element to be removed, non-null
Definition at line 325 of file wvlinklist.h.
Referenced by WvList< UniGenMount >::zap().
|
inherited |
Returns the number of elements in the list.
This function causes a full traversal of the list which may be overly inefficient depending on how and when it is used.
Returns: the number of elements
Definition at line 24 of file wvlinklist.cc.
Referenced by WvDBusMsg::variant_end(), and WvDBusMsg::varray_end().
|
inherited |
Reverses the order of elements in the list.
This function traverses the list and rearranges the pointers and updates the pointers to head & tail appropriately.
It does nothing for lists of count<2
Definition at line 35 of file wvlinklist.cc.
|
inlineinherited |
Quickly determines if the list is empty.
This is much faster than checking count() == 0.
Returns: true if empty
Definition at line 62 of file wvlinklist.h.