struct mill_slist_item {
struct mill_slist_item *next;
};
struct mill_slist {
struct mill_slist_item *first;
struct mill_slist_item *last;
};
/* Initialise the list. To statically initialise the list use = {0}. */
void mill_slist_init(struct mill_slist *self);
/* True is the list has no items. */
#define mill_slist_empty(self) (!((self)->first))
/* Returns iterator to the first item in the list or NULL if the list is empty. */
#define mill_slist_begin(self) ((self)->first)
/* Returns iterator to one past the item pointed to by 'it'. If there are no more items returns NULL. */
#define mill_slist_next(it) ((it)->next)
/* Push the item to the beginning of the list. */
void mill_slist_push(struct mill_slist *self, struct mill_slist_item *item);
/* Push the item to the end of the list. */
void mill_slist_push_back(struct mill_slist *self, struct mill_slist_item *item);
/* Pop an item from the beginning of the list. */
struct mill_slist_item *mill_slist_pop(struct mill_slist *self);