diff options
Diffstat (limited to 'doll.h')
-rw-r--r-- | doll.h | 88 |
1 files changed, 88 insertions, 0 deletions
@@ -0,0 +1,88 @@ +/* + * doll - Doubly linked list implementation + * Copyright (c) 2012 Guillermo Ramos GutiƩrrez <0xwille@gmail.com> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of copyright holders nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __DOLL_H +#define __DOLL_H + + +typedef struct doll { + struct doll_node *head; + struct doll_node *tail; + int length; +} doll_t; + +typedef struct doll_node { + struct doll_node *prev; + struct doll_node *next; + void *data; +} doll_node_t; + + +struct doll_node *doll_iter; + +struct doll *doll_new(void); +void doll_destroy(struct doll *list); +int doll_prepend(struct doll *list, void *data); +int doll_append(struct doll *list, void *data); +int doll_remove(struct doll *list, void *data); +void *doll_first(struct doll *list); +void *doll_last(struct doll *list); +void *doll_at(struct doll *list, int idx); + +#define doll_push(list, data) (doll_append((list), (data))) +void *doll_pop(struct doll *list); + + +#define doll_foreach(elem, list) \ + for (doll_iter = (list)->head, \ + (elem) = doll_iter ? (__typeof__(elem))doll_iter->data : NULL; \ + doll_iter; \ + doll_iter = doll_iter->next, \ + (elem) = doll_iter ? (__typeof__(elem))doll_iter->data : NULL) + +#define doll_foreach_r(elem, list) \ + for (doll_iter = (list)->tail, \ + (elem) = doll_iter ? (__typeof__(elem))doll_iter->data : NULL; \ + doll_iter; \ + doll_iter = doll_iter->prev, \ + (elem) = doll_iter ? (__typeof__(elem))doll_iter->data : NULL) + +#define doll_foreach_node(node, list) \ + for (node = (list)->head; \ + node; \ + node = node->next) + +#define doll_foreach_node_r(node, list) \ + for (node = (list)->tail; \ + node; \ + node = node->prev) + + +#endif /* __DOLL_H */ |