/*
* linkedlist.h - a doubly-linked list
* Copyright (C) 2010 Martin Broadhurst
* www.martinbroadhurst.com
*/
#ifndef LINKEDLIST_H
#define LINKEDLIST_H
#include <mbcommon.h>
#include <iterator.h>
struct MBlistnode {
struct MBlistnode * next;
struct MBlistnode * previous;
void * data;
};
typedef struct MBlistnode MBlistnode;
struct MBlinkedlist {
MBlistnode * head;
MBlistnode * tail;
unsigned int count;
};
typedef struct MBlinkedlist MBlinkedlist;
MBlinkedlist * MBlinkedlist_create(void);
void MBlinkedlist_empty(MBlinkedlist * list);
void MBlinkedlist_delete(MBlinkedlist * list);
void MBlinkedlist_add_head(MBlinkedlist * list, void * data);
void MBlinkedlist_add_tail(MBlinkedlist * list, void * data);
void MBlinkedlist_insert_before(MBlinkedlist * list, MBlistnode * node, void * data);
void MBlinkedlist_insert_after(MBlinkedlist * list, MBlistnode * node, void * data);
void * MBlinkedlist_remove_head(MBlinkedlist * list);
void * MBlinkedlist_remove_tail(MBlinkedlist * list);
void * MBlinkedlist_remove_node(MBlinkedlist * list, MBlistnode * node);
void MBlinkedlist_for_each(const MBlinkedlist * list, MBforfn forfn);
unsigned int MBlinkedlist_get_count(const MBlinkedlist * list);
MBiterator * MBlinkedlist_iterator(const MBlinkedlist *list);
#endif /* LINKEDLIST_H */