changeset 9:abdba37f67a2

Red-black tree in progress. Linked list needs iterators redone, also in progress. Sleepy.
author Eris Caffee <discordia@eldalin.com>
date Fri, 28 Sep 2012 03:08:25 -0500
parents 6605a342e8f8
children 68f85ffc6029
files src/bst.c src/bst.h src/dequeue.c src/dequeue.h src/dequeue_test.c src/list.c src/list.h src/list_test.c src/pqueue.c src/pqueue.h src/queue.c src/queue.h src/rbtree.c src/rbtree.h src/ring_buffer.c src/ring_buffer.h src/stack.c src/stack.h
diffstat 18 files changed, 860 insertions(+), 138 deletions(-) [+]
line diff
     1.1 --- a/src/bst.c	Thu Sep 27 10:57:41 2012 -0500
     1.2 +++ b/src/bst.c	Fri Sep 28 03:08:25 2012 -0500
     1.3 @@ -3,6 +3,28 @@
     1.4  
     1.5  #include "bst.h"
     1.6  
     1.7 +struct bst_node
     1.8 +   {
     1.9 +   struct bst_node * parent;
    1.10 +   struct bst_node * left;
    1.11 +   struct bst_node * right;
    1.12 +   void * data;
    1.13 +   };
    1.14 +
    1.15 +struct bst
    1.16 +   {
    1.17 +   struct bst_node * root;
    1.18 +   size_t size;
    1.19 +   bool (*le)(void * a, void * b);
    1.20 +   bool (*eq)(void * a, void * b);
    1.21 +   };
    1.22 +
    1.23 +struct bst_iterator
    1.24 +   {
    1.25 +   struct bst * bst;
    1.26 +   struct bst_node * curr;
    1.27 +   };
    1.28 +
    1.29  // Private functions.
    1.30  void bst_data_walk_inorder(struct bst_node * node, void (*op)(void * data));
    1.31  void bst_data_walk_preorder(struct bst_node * node, void (*op)(void * data));
    1.32 @@ -77,6 +99,7 @@
    1.33     if (NULL == bst->root)
    1.34        {
    1.35        bst->root = new;
    1.36 +      bst->size = 1;
    1.37        return new->data;
    1.38        }
    1.39  
     2.1 --- a/src/bst.h	Thu Sep 27 10:57:41 2012 -0500
     2.2 +++ b/src/bst.h	Fri Sep 28 03:08:25 2012 -0500
     2.3 @@ -4,50 +4,25 @@
     2.4  #include <stddef.h>
     2.5  #include <stdbool.h>
     2.6  
     2.7 -struct bst_node
     2.8 -   {
     2.9 -   struct bst_node * parent;
    2.10 -   struct bst_node * left;
    2.11 -   struct bst_node * right;
    2.12 -   void * data;
    2.13 -   };
    2.14 -
    2.15 -struct bst
    2.16 -   {
    2.17 -   struct bst_node * root;
    2.18 -   size_t size;
    2.19 -   bool (*le)(void * a, void * b);
    2.20 -   bool (*eq)(void * a, void * b);
    2.21 -   };
    2.22 -
    2.23 -struct bst_iterator
    2.24 -   {
    2.25 -   struct bst * bst;
    2.26 -   struct bst_node * curr;
    2.27 -   };
    2.28 +struct bst_node;
    2.29 +struct bst;
    2.30 +struct bst_iterator;
    2.31  
    2.32  struct bst * bst_new(bool (*le)(void * a, void * b), bool (*eq)(void * a, void * b));
    2.33  void bst_delete(struct bst * bst);
    2.34 -
    2.35  void * bst_insert(struct bst * bst, void * data);
    2.36 -
    2.37  void * bst_search(struct bst * bst, void * data);
    2.38  void * bst_search_iterative(struct bst * bst, void * data);
    2.39 -
    2.40  void * bst_minimum(struct bst * bst);
    2.41  void * bst_maximum(struct bst * bst);
    2.42 -
    2.43  void bst_walk_inorder(struct bst * bst, void (*op)(void * data));
    2.44  void bst_walk_preorder(struct bst * bst, void (*op)(void * data));
    2.45  void bst_walk_postorder(struct bst * bst, void (*op)(void * data));
    2.46 -
    2.47 -
    2.48  struct bst_iterator * bst_begin(struct bst * bst);
    2.49  struct bst_iterator * bst_end(struct bst * bst);
    2.50  struct bst_iterator * bst_next(struct bst_iterator * it);
    2.51  struct bst_iterator * bst_prev(struct bst_iterator * it);
    2.52  void * bst_value(struct bst_iterator * it);
    2.53 -
    2.54  void * bst_find(struct bst_iterator * it, void * data);
    2.55  void * bst_remove(struct bst_iterator * it);
    2.56  
     3.1 --- a/src/dequeue.c	Thu Sep 27 10:57:41 2012 -0500
     3.2 +++ b/src/dequeue.c	Fri Sep 28 03:08:25 2012 -0500
     3.3 @@ -1,16 +1,21 @@
     3.4  #include <stdlib.h>
     3.5 -#include <errno.h>
     3.6  
     3.7  #include "dequeue.h"
     3.8  
     3.9 +struct dequeue
    3.10 +   {
    3.11 +   void ** data;
    3.12 +   size_t max;
    3.13 +   size_t bottom;
    3.14 +   size_t top;
    3.15 +   size_t count;
    3.16 +   };
    3.17 +
    3.18  ////////////////////////////////////////////////////////////////////////////////
    3.19  struct dequeue * dequeue_new(size_t const max)
    3.20     {
    3.21     if (max < 1)
    3.22 -      {
    3.23 -      errno = EINVAL;
    3.24        return NULL;
    3.25 -      }
    3.26  
    3.27     struct dequeue * deq = malloc(sizeof(struct dequeue));
    3.28     if (NULL == deq)
    3.29 @@ -37,16 +42,10 @@
    3.30  void * dequeue_push_top(struct dequeue * deq, void * elem)
    3.31     {
    3.32     if ((NULL == deq) || (NULL == elem))
    3.33 -      {
    3.34 -      errno = EINVAL;
    3.35        return NULL;
    3.36 -      }
    3.37  
    3.38     if (deq->count == deq->max)
    3.39 -      {
    3.40 -      errno = ENOMEM;
    3.41        return NULL;
    3.42 -      }
    3.43  
    3.44     if (deq->max - 1 == deq->top)
    3.45        deq->top = 0;
    3.46 @@ -63,16 +62,10 @@
    3.47  void * dequeue_push_bottom(struct dequeue * deq, void * elem)
    3.48     {
    3.49     if ((NULL == deq) || (NULL == elem))
    3.50 -      {
    3.51 -      errno = EINVAL;
    3.52        return NULL;
    3.53 -      }
    3.54  
    3.55     if (deq->count == deq->max)
    3.56 -      {
    3.57 -      errno = ENOMEM;
    3.58        return NULL;
    3.59 -      }
    3.60  
    3.61     if (0 == deq->bottom)
    3.62        deq->bottom = deq->max - 1;
    3.63 @@ -89,10 +82,7 @@
    3.64  void * dequeue_pop_top(struct dequeue * deq)
    3.65     {
    3.66     if (NULL == deq)
    3.67 -      {
    3.68 -      errno = EINVAL;
    3.69        return NULL;
    3.70 -      }
    3.71  
    3.72     if (deq->count == 0)
    3.73        return NULL;
    3.74 @@ -113,10 +103,7 @@
    3.75  void * dequeue_pop_bottom(struct dequeue * deq)
    3.76     {
    3.77     if (NULL == deq)
    3.78 -      {
    3.79 -      errno = EINVAL;
    3.80        return NULL;
    3.81 -      }
    3.82  
    3.83     if (deq->count == 0)
    3.84        return NULL;
    3.85 @@ -138,10 +125,7 @@
    3.86  size_t dequeue_size(struct dequeue * deq)
    3.87     {
    3.88     if (NULL == deq)
    3.89 -      {
    3.90 -      errno = EINVAL;
    3.91        return 0;
    3.92 -      }
    3.93     return deq->count;
    3.94     }
    3.95  
     4.1 --- a/src/dequeue.h	Thu Sep 27 10:57:41 2012 -0500
     4.2 +++ b/src/dequeue.h	Fri Sep 28 03:08:25 2012 -0500
     4.3 @@ -3,14 +3,7 @@
     4.4  
     4.5  #include <stddef.h>
     4.6  
     4.7 -struct dequeue
     4.8 -   {
     4.9 -   void ** data;
    4.10 -   size_t max;
    4.11 -   size_t bottom;
    4.12 -   size_t top;
    4.13 -   size_t count;
    4.14 -   };
    4.15 +struct dequeue;
    4.16  
    4.17  struct dequeue * dequeue_new(size_t const size);
    4.18  void dequeue_delete(struct dequeue * deq);
     5.1 --- a/src/dequeue_test.c	Thu Sep 27 10:57:41 2012 -0500
     5.2 +++ b/src/dequeue_test.c	Fri Sep 28 03:08:25 2012 -0500
     5.3 @@ -1,5 +1,6 @@
     5.4  #include <stdio.h>
     5.5  #include <stdlib.h>
     5.6 +#include <errno.h>
     5.7  
     5.8  #include "dequeue.h"
     5.9  
    5.10 @@ -40,10 +41,16 @@
    5.11     for (i=MAX; i < 2*MAX; i++)
    5.12        {
    5.13         ip = malloc(sizeof(int));
    5.14 +       if (NULL == ip)
    5.15 +	  {
    5.16 +	  perror("malloc");
    5.17 +	  exit(EXIT_FAILURE);
    5.18 +	  }
    5.19        *ip = i;
    5.20 +      errno = 0;
    5.21        if (NULL == dequeue_push_top(deq, (void *) ip))
    5.22           {
    5.23 -         perror("dequeue_push");
    5.24 +         perror("dequeue_push_top");
    5.25           free(ip);
    5.26           }
    5.27        }
     6.1 --- a/src/list.c	Thu Sep 27 10:57:41 2012 -0500
     6.2 +++ b/src/list.c	Fri Sep 28 03:08:25 2012 -0500
     6.3 @@ -2,6 +2,25 @@
     6.4  
     6.5  #include "list.h"
     6.6  
     6.7 +struct list_node
     6.8 +   {
     6.9 +   struct list_node * next;
    6.10 +   struct list_node * prev;
    6.11 +   void * data;
    6.12 +   };
    6.13 +
    6.14 +struct list
    6.15 +   {
    6.16 +   struct list_node * head;
    6.17 +   struct list_node * tail;
    6.18 +   size_t size;
    6.19 +   };
    6.20 +
    6.21 +struct list_iterator
    6.22 +   {
    6.23 +   struct list * l;
    6.24 +   struct list_node * curr;
    6.25 +   };
    6.26  
    6.27  ////////////////////////////////////////////////////////////////////////////////
    6.28  // Allocates new list and returns poitner to it.
    6.29 @@ -159,38 +178,38 @@
    6.30  
    6.31  ////////////////////////////////////////////////////////////////////////////////
    6.32  // Intialize an iterator to point to the first element of the list
    6.33 -// Returns the elements value.
    6.34 -void *
    6.35 -list_begin(struct list * l, struct list_iterator * lit)
    6.36 +struct list_iterator *
    6.37 +list_begin(struct list * l)
    6.38     {
    6.39 -   if ( (NULL == l) || (NULL == lit) )
    6.40 +   if ( (NULL == l) || (NULL == l->head) )
    6.41        return NULL;
    6.42  
    6.43 -   lit->l = l;
    6.44 -   lit->curr = l->head;
    6.45 +   struct list_iterator * it = malloc(sizeof(struct list_iterator));
    6.46 +   if (NULL == it)
    6.47 +      return NULL;
    6.48  
    6.49 -   if (lit->curr)
    6.50 -      return lit->curr->data;
    6.51 +   it->l = l;
    6.52 +   it->curr = l->head;
    6.53  
    6.54 -   return NULL;
    6.55 +   return it;
    6.56     }
    6.57  
    6.58  ////////////////////////////////////////////////////////////////////////////////
    6.59  // Intialize an iterator to point to the last element of the list
    6.60 -// Returns the elements value.
    6.61 -void *
    6.62 -list_end(struct list * l, struct list_iterator * lit)
    6.63 +struct list_iterator *
    6.64 +list_end(struct list * l)
    6.65     {
    6.66 -   if ( (NULL == l) || (NULL == lit) )
    6.67 +   if ( (NULL == l) || (NULL == l->head) )
    6.68        return NULL;
    6.69  
    6.70 -   lit->l = l;
    6.71 -   lit->curr = l->tail;
    6.72 +   struct list_iterator * it = malloc(sizeof(struct list_iterator));
    6.73 +   if (NULL == it)
    6.74 +      return NULL;
    6.75  
    6.76 -   if (lit->curr)
    6.77 -      return lit->curr->data;
    6.78 +   it->l = l;
    6.79 +   it->curr = l->tail;
    6.80  
    6.81 -   return NULL;
    6.82 +   return it;
    6.83     }
    6.84  
    6.85  ////////////////////////////////////////////////////////////////////////////////
     7.1 --- a/src/list.h	Thu Sep 27 10:57:41 2012 -0500
     7.2 +++ b/src/list.h	Fri Sep 28 03:08:25 2012 -0500
     7.3 @@ -3,41 +3,22 @@
     7.4  
     7.5  #include <stddef.h>
     7.6  
     7.7 -struct list_node
     7.8 -   {
     7.9 -   struct list_node * next;
    7.10 -   struct list_node * prev;
    7.11 -   void * data;
    7.12 -   };
    7.13 -
    7.14 -struct list
    7.15 -   {
    7.16 -   struct list_node * head;
    7.17 -   struct list_node * tail;
    7.18 -   size_t size;
    7.19 -   };
    7.20 -
    7.21 -struct list_iterator
    7.22 -   {
    7.23 -   struct list * l;
    7.24 -   struct list_node * curr;
    7.25 -   };
    7.26 +struct list_node;
    7.27 +struct list;
    7.28 +struct list_iterator;
    7.29  
    7.30  struct list * list_new(void);
    7.31  void list_delete(struct list * l);
    7.32 -
    7.33  size_t list_size(struct list * l);
    7.34 -
    7.35  void * list_push_back(struct list * l, void * elem);
    7.36  void * list_pop_back(struct list * l);
    7.37  void * list_push_front(struct list * l, void * elem);
    7.38  void * list_pop_front(struct list * l);
    7.39  
    7.40 -
    7.41 -// The iterators are different that their c++ STL counterparts.
    7.42 +// The iterators are different than their c++ STL counterparts.
    7.43  // They are bi-directional, and list_end points to the last element, not the empty space beyond the last elem.
    7.44 -void * list_begin(struct list * l, struct list_iterator * lit);
    7.45 -void * list_end(struct list * l, struct list_iterator * lit);
    7.46 +struct list_iterator * list_begin(struct list * l);
    7.47 +struct list_iterator * list_end(struct list * l);
    7.48  void * list_next(struct list_iterator * lit);
    7.49  void * list_prev(struct list_iterator * lit);
    7.50  void * list_erase(struct list_iterator * lit);
     8.1 --- a/src/list_test.c	Thu Sep 27 10:57:41 2012 -0500
     8.2 +++ b/src/list_test.c	Fri Sep 28 03:08:25 2012 -0500
     8.3 @@ -118,11 +118,11 @@
     8.4  
     8.5     printf("size %zd\n", list_size(l));
     8.6  
     8.7 -   struct list_iterator lit;
     8.8 +   struct list_iterator * lit;
     8.9     int * ip;
    8.10  
    8.11     printf("Walking front to back\n");
    8.12 -   for (ip = list_begin(l, &lit); NULL != ip; ip = list_next( &lit))
    8.13 +   for (lit = list_begin(l); NULL != ip; ip = list_next( &lit))
    8.14        printf("%d\n", *ip);
    8.15  
    8.16     printf("Inserting 15 after 5\n");
     9.1 --- a/src/pqueue.c	Thu Sep 27 10:57:41 2012 -0500
     9.2 +++ b/src/pqueue.c	Fri Sep 28 03:08:25 2012 -0500
     9.3 @@ -2,6 +2,14 @@
     9.4  
     9.5  #include "pqueue.h"
     9.6  
     9.7 +struct pqueue
     9.8 +   {
     9.9 +   void ** data;
    9.10 +   size_t max;
    9.11 +   size_t size;
    9.12 +   bool (*comp)(void const * const a, void const * const b);
    9.13 +   };
    9.14 +
    9.15  ////////////////////////////////////////////////////////////////////////////////
    9.16  // comp should return true if *a comp *b.
    9.17  // So, for a min priority queue, comp will be defined to return true if *a < *b,
    10.1 --- a/src/pqueue.h	Thu Sep 27 10:57:41 2012 -0500
    10.2 +++ b/src/pqueue.h	Fri Sep 28 03:08:25 2012 -0500
    10.3 @@ -4,22 +4,13 @@
    10.4  #include <stddef.h>
    10.5  #include <stdbool.h>
    10.6  
    10.7 -struct pqueue
    10.8 -   {
    10.9 -   void ** data;
   10.10 -   size_t max;
   10.11 -   size_t size;
   10.12 -   bool (*comp)(void const * const a, void const * const b);
   10.13 -   };
   10.14 +struct pqueue;
   10.15  
   10.16 -struct pqueue * pqueue_new(size_t max, 
   10.17 -			   bool (*comp)(void const * const a, void const * const b));
   10.18 +struct pqueue * pqueue_new(size_t max, bool (*comp)(void const * const a, void const * const b));
   10.19  void pqueue_delete(struct pqueue * pq);
   10.20 -
   10.21  void * pqueue_push(struct pqueue * pq, void * elem);
   10.22  void * pqueue_pop(struct pqueue * pq);
   10.23  void * pqueue_peek(struct pqueue * pq);
   10.24 -
   10.25  size_t  pqueue_size(struct pqueue * pq);
   10.26  
   10.27  #endif // ndef PQUEUE_
    11.1 --- a/src/queue.c	Thu Sep 27 10:57:41 2012 -0500
    11.2 +++ b/src/queue.c	Fri Sep 28 03:08:25 2012 -0500
    11.3 @@ -3,6 +3,14 @@
    11.4  
    11.5  #include "queue.h"
    11.6  
    11.7 +struct queue
    11.8 +   {
    11.9 +   void ** data;
   11.10 +   size_t max;
   11.11 +   size_t start;
   11.12 +   size_t count;
   11.13 +   };
   11.14 +
   11.15  ////////////////////////////////////////////////////////////////////////////////
   11.16  struct queue * queue_new(size_t const max)
   11.17     {
    12.1 --- a/src/queue.h	Thu Sep 27 10:57:41 2012 -0500
    12.2 +++ b/src/queue.h	Fri Sep 28 03:08:25 2012 -0500
    12.3 @@ -3,13 +3,7 @@
    12.4  
    12.5  #include <stddef.h>
    12.6  
    12.7 -struct queue
    12.8 -   {
    12.9 -   void ** data;
   12.10 -   size_t max;
   12.11 -   size_t start;
   12.12 -   size_t count;
   12.13 -   };
   12.14 +struct queue;
   12.15  
   12.16  struct queue * queue_new(size_t const size);
   12.17  void queue_delete(struct queue * queue);
    13.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    13.2 +++ b/src/rbtree.c	Fri Sep 28 03:08:25 2012 -0500
    13.3 @@ -0,0 +1,704 @@
    13.4 +#include <stdio.h>
    13.5 +#include <stdlib.h>
    13.6 +
    13.7 +#include "rbtree.h"
    13.8 +
    13.9 +enum rbtree_color { RED, BLACK };
   13.10 +
   13.11 +struct rbtree_node
   13.12 +   {
   13.13 +   enum rbtree_color color;
   13.14 +   struct rbtree_node * parent;
   13.15 +   struct rbtree_node * left;
   13.16 +   struct rbtree_node * right;
   13.17 +   void * data;
   13.18 +   };
   13.19 +
   13.20 +struct rbtree
   13.21 +   {
   13.22 +   struct rbtree_node nil_node;
   13.23 +   struct rbtree_node * nil;
   13.24 +   struct rbtree_node * root;
   13.25 +   size_t size;
   13.26 +   bool (*le)(void * a, void * b);
   13.27 +   bool (*eq)(void * a, void * b);
   13.28 +   };
   13.29 +
   13.30 +struct rbtree_iterator
   13.31 +   {
   13.32 +   struct rbtree * rbtree;
   13.33 +   struct rbtree_node * curr;
   13.34 +   };
   13.35 +
   13.36 +// Private functions.
   13.37 +void rbtree_data_walk_inorder(struct rbtree * rbtree, struct rbtree_node * node, void (*op)(void * data));
   13.38 +void rbtree_data_walk_preorder(struct rbtree * rbtree, struct rbtree_node * node, void (*op)(void * data));
   13.39 +void rbtree_data_walk_postorder(struct rbtree * rbtree, struct rbtree_node * node, void (*op)(void * data));
   13.40 +void rbtree_node_walk_postorder(struct rbtree * rbtree, struct rbtree_node * node, void (*op)(struct rbtree_node * n));
   13.41 +void * rbtree_data_search(struct rbtree * rbtree, struct rbtree_node * node, void * data);
   13.42 +void * rbtree_node_minimum(struct rbtree * rbtree, struct rbtree_node * node);
   13.43 +void * rbtree_node_maximum(struct rbtree * rbtree, struct rbtree_node * node);
   13.44 +void rbtree_node_free(struct rbtree_node * node);
   13.45 +struct rbtree_node * rbtree_node_search(struct rbtree * rbtree, struct rbtree_node * node, void * data);
   13.46 +struct rbtree_node * rbtree_transplant(struct rbtree * rbtree, struct rbtree_node * a, struct rbtree_node * b);
   13.47 +void rbtree_rotate_left(struct rbtree * rbtree, struct rbtree_node * node);
   13.48 +void rbtree_rotate_right(struct rbtree * rbtree, struct rbtree_node * node);
   13.49 +void rbtree_insert_fixup(struct rbtree * rbtree, struct rbtree_node * node);
   13.50 +void rbtree_remove_fixup(struct rbtree * rbtree, struct rbtree_node * node);
   13.51 +
   13.52 +////////////////////////////////////////////////////////////////////////////////
   13.53 +struct rbtree *
   13.54 +rbtree_new(bool (*le)(void * a, void * b),
   13.55 +	bool (*eq)(void * a, void * b))
   13.56 +   {
   13.57 +   if ( (NULL == le) || (NULL == eq) )
   13.58 +      return NULL;
   13.59 +
   13.60 +   struct rbtree * rbtree = malloc(sizeof(struct rbtree));
   13.61 +   if (NULL == rbtree)
   13.62 +      return NULL;
   13.63 +
   13.64 +   rbtree->nil_node = (struct rbtree_node) { BLACK, &rbtree->nil_node, &rbtree->nil_node, &rbtree->nil_node, NULL };
   13.65 +   rbtree->nil = &(rbtree->nil_node);
   13.66 +   rbtree->root = rbtree->nil;
   13.67 +   rbtree->size = 0;
   13.68 +   rbtree->le = le;
   13.69 +   rbtree->eq = eq;
   13.70 +   return rbtree;
   13.71 +   }
   13.72 +
   13.73 +
   13.74 +////////////////////////////////////////////////////////////////////////////////
   13.75 +void
   13.76 +rbtree_delete(struct rbtree * rbtree)
   13.77 +   {
   13.78 +   if (NULL == rbtree) return;
   13.79 +   if (0 < rbtree->size)
   13.80 +      {
   13.81 +      // Walk the tree and delete the nodes.
   13.82 +      // This may cause memory leaks, so hopefully the user has already
   13.83 +      // emptied the tree.
   13.84 +      rbtree_node_walk_postorder(rbtree, rbtree->root, rbtree_node_free);
   13.85 +      }
   13.86 +   free(rbtree);
   13.87 +   }
   13.88 +
   13.89 +////////////////////////////////////////////////////////////////////////////////
   13.90 +void
   13.91 +rbtree_node_free(struct rbtree_node * node)
   13.92 +   {
   13.93 +   free(node);
   13.94 +   }
   13.95 +
   13.96 +////////////////////////////////////////////////////////////////////////////////
   13.97 +void *
   13.98 +rbtree_insert(struct rbtree * rbtree, void * data)
   13.99 +   {
  13.100 +   if ( (NULL == rbtree) || (NULL == data) )
  13.101 +      return NULL;
  13.102 +
  13.103 +   struct rbtree_node * new = malloc(sizeof(struct rbtree_node));
  13.104 +   if (NULL == new)
  13.105 +      return NULL;
  13.106 +   new->left = new->right = new->parent = rbtree->nil;
  13.107 +   new->color = RED;
  13.108 +   new->data = data;
  13.109 +
  13.110 +   if (rbtree->nil == rbtree->root)
  13.111 +      {
  13.112 +      rbtree->root = new;
  13.113 +      new->color = BLACK;
  13.114 +      new->parent = rbtree->nil;
  13.115 +      rbtree->size = 1;
  13.116 +      return new->data;
  13.117 +      }
  13.118 +
  13.119 +   struct rbtree_node * p = rbtree->nil;
  13.120 +   struct rbtree_node * c = rbtree->root;
  13.121 +
  13.122 +   while (rbtree->nil != c)
  13.123 +      {
  13.124 +      p = c;
  13.125 +      if (rbtree->le(new->data, c->data))
  13.126 +	 c = c->left;
  13.127 +      else
  13.128 +	 c = c->right;
  13.129 +      }
  13.130 +   new->parent = p;
  13.131 +   if (rbtree->le(new->data, p->data))
  13.132 +      p->left = new;
  13.133 +   else
  13.134 +      p->right = new;
  13.135 +
  13.136 +   rbtree_insert_fixup(rbtree, new);
  13.137 +
  13.138 +   rbtree->size++;
  13.139 +   return new->data;
  13.140 +   }
  13.141 +
  13.142 +
  13.143 +////////////////////////////////////////////////////////////////////////////////
  13.144 +void
  13.145 +rbtree_insert_fixup(struct rbtree * rbtree, struct rbtree_node * node)
  13.146 +   {
  13.147 +   if ( (NULL == rbtree) || (NULL == node) )
  13.148 +      return;
  13.149 +
  13.150 +   while (RED == node->parent->color)
  13.151 +      {
  13.152 +      if (node->parent == node->parent->parent->left)
  13.153 +	 {
  13.154 +	 struct rbtree_node * y = node->parent->parent->right;
  13.155 +	 if (RED == y->color)
  13.156 +	    {
  13.157 +	    node->parent->color = BLACK;
  13.158 +	    y->color = BLACK;
  13.159 +	    node->parent->parent->color = RED;
  13.160 +	    node = node->parent->parent;
  13.161 +	    }
  13.162 +	 else 
  13.163 +	    {
  13.164 +	    if (node == node->parent->right)
  13.165 +	       {
  13.166 +	       node = node->parent;
  13.167 +	       rbtree_rotate_left(rbtree, node);
  13.168 +	       }
  13.169 +	    node->parent->color = BLACK;
  13.170 +	    node->parent->parent->color = RED;
  13.171 +	    rbtree_rotate_right(rbtree, node->parent->parent);
  13.172 +	    }
  13.173 +	 }
  13.174 +      else
  13.175 +	 {
  13.176 +	 struct rbtree_node * y = node->parent->parent->left;
  13.177 +	 if (RED == y->color)
  13.178 +	    {
  13.179 +	    node->parent->color = BLACK;
  13.180 +	    y->color = BLACK;
  13.181 +	    node->parent->parent->color = RED;
  13.182 +	    node = node->parent->parent;
  13.183 +	    }
  13.184 +	 else 
  13.185 +	    {
  13.186 +	    if (node == node->parent->left)
  13.187 +	       {
  13.188 +	       node = node->parent;
  13.189 +	       rbtree_rotate_right(rbtree, node);
  13.190 +	       }
  13.191 +	    node->parent->color = BLACK;
  13.192 +	    node->parent->parent->color = RED;
  13.193 +	    rbtree_rotate_left(rbtree, node->parent->parent);
  13.194 +	    }
  13.195 +	 }
  13.196 +      }
  13.197 +   rbtree->root->color = BLACK;
  13.198 +   }
  13.199 +
  13.200 +////////////////////////////////////////////////////////////////////////////////
  13.201 +void
  13.202 +rbtree_walk_inorder(struct rbtree * rbtree, void (*op)(void * data))
  13.203 +   {
  13.204 +   if ( (NULL == rbtree) || (rbtree->nil == rbtree->root) || (NULL == op) )
  13.205 +      return;
  13.206 +
  13.207 +   rbtree_data_walk_inorder(rbtree, rbtree->root, op);
  13.208 +   }
  13.209 +
  13.210 +////////////////////////////////////////////////////////////////////////////////
  13.211 +void
  13.212 +rbtree_walk_postorder(struct rbtree * rbtree, void (*op)(void * data))
  13.213 +   {
  13.214 +   if ( (NULL == rbtree) || (rbtree->nil == rbtree->root) || (NULL == op) )
  13.215 +      return;
  13.216 +
  13.217 +   rbtree_data_walk_postorder(rbtree, rbtree->root, op);
  13.218 +   }
  13.219 +
  13.220 +////////////////////////////////////////////////////////////////////////////////
  13.221 +void
  13.222 +rbtree_walk_preorder(struct rbtree * rbtree, void (*op)(void * data))
  13.223 +   {
  13.224 +   if ( (NULL == rbtree) || (rbtree->nil == rbtree->root) || (NULL == op) )
  13.225 +      return;
  13.226 +
  13.227 +   rbtree_data_walk_preorder(rbtree, rbtree->root, op);
  13.228 +   }
  13.229 +
  13.230 +////////////////////////////////////////////////////////////////////////////////
  13.231 +void
  13.232 +rbtree_data_walk_inorder(struct rbtree * rbtree, struct rbtree_node * node, void (*op)(void * data))
  13.233 +   {
  13.234 +   if (rbtree->nil != node)
  13.235 +      {
  13.236 +      rbtree_data_walk_inorder(rbtree, node->left, op);
  13.237 +      op(node->data);
  13.238 +      rbtree_data_walk_inorder(rbtree, node->right, op);
  13.239 +      }
  13.240 +   }
  13.241 +
  13.242 +////////////////////////////////////////////////////////////////////////////////
  13.243 +void
  13.244 +rbtree_data_walk_postorder(struct rbtree * rbtree, struct rbtree_node * node, void (*op)(void * data))
  13.245 +   {
  13.246 +   if (rbtree->nil != node)
  13.247 +      {
  13.248 +      rbtree_data_walk_postorder(rbtree, node->left, op);
  13.249 +      rbtree_data_walk_postorder(rbtree, node->right, op);
  13.250 +      op(node->data);
  13.251 +      }
  13.252 +   }
  13.253 +
  13.254 +////////////////////////////////////////////////////////////////////////////////
  13.255 +void
  13.256 +rbtree_data_walk_preorder(struct rbtree * rbtree, struct rbtree_node * node, void (*op)(void * data))
  13.257 +   {
  13.258 +   if (rbtree->nil != node)
  13.259 +      {
  13.260 +      op(node->data);
  13.261 +      rbtree_data_walk_preorder(rbtree, node->left, op);
  13.262 +      rbtree_data_walk_preorder(rbtree, node->right, op);
  13.263 +      }
  13.264 +   }
  13.265 +
  13.266 +////////////////////////////////////////////////////////////////////////////////
  13.267 +void
  13.268 +rbtree_node_walk_postorder(struct rbtree * rbtree, struct rbtree_node * node, void (*op)(struct rbtree_node * n))
  13.269 +   {
  13.270 +   if (rbtree->nil != node)
  13.271 +      {
  13.272 +      rbtree_node_walk_postorder(rbtree, node->left, op);
  13.273 +      rbtree_node_walk_postorder(rbtree, node->right, op);
  13.274 +      op(node);
  13.275 +      }
  13.276 +   }
  13.277 +
  13.278 +////////////////////////////////////////////////////////////////////////////////
  13.279 +void *
  13.280 +rbtree_search(struct rbtree * rbtree, void * data)
  13.281 +   {
  13.282 +   if ( (NULL == rbtree) || (rbtree->nil == rbtree->root) || (NULL == data) )
  13.283 +      return NULL;
  13.284 +
  13.285 +   return rbtree_data_search(rbtree, rbtree->root, data);
  13.286 +   }
  13.287 +
  13.288 +////////////////////////////////////////////////////////////////////////////////
  13.289 +// Recursive
  13.290 +void *
  13.291 +rbtree_data_search(struct rbtree * rbtree, struct rbtree_node * node, void * data)
  13.292 +   {
  13.293 +   if (rbtree->nil == node)
  13.294 +      return NULL;
  13.295 +
  13.296 +   if (rbtree->eq(data, node->data))
  13.297 +      return node->data;
  13.298 +
  13.299 +   if (rbtree->le(data, node->data))
  13.300 +      return rbtree_data_search(rbtree, node->left, data);
  13.301 +   else
  13.302 +      return rbtree_data_search(rbtree, node->right, data);
  13.303 +   }
  13.304 +
  13.305 +////////////////////////////////////////////////////////////////////////////////
  13.306 +// Iterative
  13.307 +void *
  13.308 +rbtree_search_iterative(struct rbtree * rbtree, void * data)
  13.309 +   {
  13.310 +   if ( (NULL == rbtree) || (rbtree->nil == rbtree->root) || (NULL == data) )
  13.311 +      return NULL;
  13.312 +
  13.313 +   struct rbtree_node * node = rbtree->root;
  13.314 +   while (1)
  13.315 +      {
  13.316 +      if (rbtree->nil == node)
  13.317 +	 return NULL;
  13.318 +      
  13.319 +      if (rbtree->eq(data, node->data))
  13.320 +	 return node->data;
  13.321 +      
  13.322 +      if (rbtree->le(data, node->data))
  13.323 +	 node = node->left;
  13.324 +      else
  13.325 +	 node = node->right;
  13.326 +      }
  13.327 +   }
  13.328 +
  13.329 +////////////////////////////////////////////////////////////////////////////////
  13.330 +void *
  13.331 +rbtree_minimum(struct rbtree * rbtree)
  13.332 +   {
  13.333 +   if (NULL == rbtree)
  13.334 +      return NULL;
  13.335 +
  13.336 +   return rbtree_node_minimum(rbtree, rbtree->root);
  13.337 +   }
  13.338 +
  13.339 +////////////////////////////////////////////////////////////////////////////////
  13.340 +void *
  13.341 +rbtree_node_minimum(struct rbtree * rbtree, struct rbtree_node * node)
  13.342 +   {
  13.343 +   while ( (rbtree->nil != node) && (rbtree->nil != node->left) )
  13.344 +      node = node->left;
  13.345 +   if (rbtree->nil == node)
  13.346 +      return NULL;
  13.347 +   return node->data;
  13.348 +   }
  13.349 +
  13.350 +////////////////////////////////////////////////////////////////////////////////
  13.351 +void *
  13.352 +rbtree_maximum(struct rbtree * rbtree)
  13.353 +   {
  13.354 +   if (NULL == rbtree)
  13.355 +      return NULL;
  13.356 +
  13.357 +   return rbtree_node_maximum(rbtree, rbtree->root);
  13.358 +   }
  13.359 +
  13.360 +////////////////////////////////////////////////////////////////////////////////
  13.361 +void *
  13.362 +rbtree_node_maximum(struct rbtree * rbtree, struct rbtree_node * node)
  13.363 +   {
  13.364 +   while ( (rbtree->nil != node) && (rbtree->nil != node->right) )
  13.365 +      node = node->right;
  13.366 +   if (rbtree->nil == node)
  13.367 +      return NULL;
  13.368 +   return node->data;
  13.369 +   }
  13.370 +
  13.371 +////////////////////////////////////////////////////////////////////////////////
  13.372 +struct rbtree_iterator *
  13.373 +rbtree_begin(struct rbtree * rbtree)
  13.374 +   {
  13.375 +   if ( (NULL == rbtree) || (rbtree->nil == rbtree->root) )
  13.376 +      return NULL;
  13.377 +
  13.378 +   struct rbtree_node * min = rbtree->root;
  13.379 +   while (min->left)
  13.380 +      min = min->left;
  13.381 +
  13.382 +   struct rbtree_iterator * it = malloc(sizeof(struct rbtree_iterator));
  13.383 +   if (NULL == it)
  13.384 +      return NULL;
  13.385 +
  13.386 +   it->rbtree = rbtree;
  13.387 +   it->curr = min;
  13.388 +   return it;
  13.389 +   }
  13.390 +
  13.391 +////////////////////////////////////////////////////////////////////////////////
  13.392 +struct rbtree_iterator *
  13.393 +rbtree_end(struct rbtree * rbtree)
  13.394 +   {
  13.395 +   if ( (NULL == rbtree) || (rbtree->nil == rbtree->root) )
  13.396 +      return NULL;
  13.397 +
  13.398 +   struct rbtree_node * max = rbtree->root;
  13.399 +   while (max->right)
  13.400 +      max = max->right;
  13.401 +
  13.402 +   struct rbtree_iterator * it = malloc(sizeof(struct rbtree_iterator));
  13.403 +   if (NULL == it)
  13.404 +      return NULL;
  13.405 +
  13.406 +   it->rbtree = rbtree;
  13.407 +   it->curr = max;
  13.408 +   return it;
  13.409 +   }
  13.410 +
  13.411 +////////////////////////////////////////////////////////////////////////////////
  13.412 +struct rbtree_iterator *
  13.413 +rbtree_next(struct rbtree_iterator * it)
  13.414 +   {
  13.415 +   if ( (NULL == it) || (NULL == it->rbtree) || (it->rbtree->nil == it->curr) )
  13.416 +      return NULL;
  13.417 +
  13.418 +   if (it->rbtree->nil == it->curr->right)
  13.419 +      {
  13.420 +      struct rbtree_node * p = it->curr;
  13.421 +      it->curr = it->curr->parent;
  13.422 +      while ( (it->rbtree->nil != it->curr) && (p == it->curr->right) )
  13.423 +	 {
  13.424 +	 p = it->curr;
  13.425 +	 it->curr = it->curr->parent;
  13.426 +	 }
  13.427 +
  13.428 +      if (it->curr == it->rbtree->nil)
  13.429 +	 return NULL;
  13.430 +      }
  13.431 +   else
  13.432 +      {
  13.433 +      struct rbtree_node * min = it->curr->right;
  13.434 +      while (min->left)
  13.435 +	 min = min->left;
  13.436 +      it->curr = min;
  13.437 +      }
  13.438 +   return it;
  13.439 +   }
  13.440 +
  13.441 +////////////////////////////////////////////////////////////////////////////////
  13.442 +struct rbtree_iterator *
  13.443 +rbtree_prev(struct rbtree_iterator * it)
  13.444 +   {
  13.445 +   if ( (NULL == it) || (NULL == it->rbtree) || (it->rbtree->nil == it->curr) )
  13.446 +      return NULL;
  13.447 +
  13.448 +   if (it->rbtree->nil == it->curr->left)
  13.449 +      {
  13.450 +      struct rbtree_node * p = it->curr;
  13.451 +      it->curr = it->curr->parent;
  13.452 +      while ( (it->rbtree->nil != it->curr) && (p == it->curr->left) )
  13.453 +	 {
  13.454 +	 p = it->curr;
  13.455 +	 it->curr = it->curr->parent;
  13.456 +	 }
  13.457 +
  13.458 +      if (it->curr == it->rbtree->nil)
  13.459 +	 return NULL;
  13.460 +      }
  13.461 +   else
  13.462 +      {
  13.463 +      struct rbtree_node * max = it->curr->left;
  13.464 +      while (max->right)
  13.465 +	 max = max->right;
  13.466 +      it->curr = max;
  13.467 +      }
  13.468 +   return it;
  13.469 +   }
  13.470 +
  13.471 +////////////////////////////////////////////////////////////////////////////////
  13.472 +void *
  13.473 +rbtree_value(struct rbtree_iterator * it)
  13.474 +   {
  13.475 +   if ( (NULL == it) || (NULL == it->rbtree) || (it->rbtree->nil == it->curr) )
  13.476 +      return NULL;
  13.477 +
  13.478 +   return it->curr->data;
  13.479 +   }
  13.480 +
  13.481 +////////////////////////////////////////////////////////////////////////////////
  13.482 +void *
  13.483 +rbtree_find(struct rbtree_iterator * it, void * data)
  13.484 +   {
  13.485 +   if ( (NULL == it) || (NULL == it->rbtree) || (it->rbtree->nil == it->rbtree->root) || (NULL == data) )
  13.486 +      return NULL;
  13.487 +
  13.488 +   return rbtree_node_search(it->rbtree, it->rbtree->root, data);
  13.489 +   }
  13.490 +
  13.491 +////////////////////////////////////////////////////////////////////////////////
  13.492 +// Recursive
  13.493 +struct rbtree_node *
  13.494 +rbtree_node_search(struct rbtree * rbtree, struct rbtree_node * node, void * data)
  13.495 +   {
  13.496 +   if (rbtree->nil == node)
  13.497 +      return NULL;
  13.498 +
  13.499 +   if (rbtree->eq(data, node->data))
  13.500 +      return node;
  13.501 +
  13.502 +   if (rbtree->le(data, node->data))
  13.503 +      return rbtree_node_search(rbtree, node->left, data);
  13.504 +   else
  13.505 +      return rbtree_node_search(rbtree, node->right, data);
  13.506 +   }
  13.507 +
  13.508 +////////////////////////////////////////////////////////////////////////////////
  13.509 +struct rbtree_node *
  13.510 +rbtree_transplant(struct rbtree * rbtree, struct rbtree_node * a, struct rbtree_node * b)
  13.511 +   {
  13.512 +   if ( (NULL == a) || (NULL == b) )
  13.513 +      return NULL;
  13.514 +
  13.515 +   if (rbtree->nil == a->parent)
  13.516 +      rbtree->root = b;
  13.517 +   else if (a == a->parent->left)
  13.518 +      a->parent->left = b;
  13.519 +   else
  13.520 +      a->parent->right = b;
  13.521 +
  13.522 +   b->parent = a->parent;
  13.523 +
  13.524 +   return a;
  13.525 +   }
  13.526 +
  13.527 +////////////////////////////////////////////////////////////////////////////////
  13.528 +void *
  13.529 +rbtree_remove(struct rbtree_iterator * it)
  13.530 +   {
  13.531 +   if ( (NULL == it) || (NULL == it->curr) )
  13.532 +      return NULL;
  13.533 +
  13.534 +   // Get predecessor and save it
  13.535 +   struct rbtree_iterator pred;
  13.536 +   pred.curr = it->curr;
  13.537 +   pred.rbtree = it->rbtree;
  13.538 +   rbtree_prev(&pred);
  13.539 +
  13.540 +   struct rbtree_node * x;
  13.541 +   struct rbtree_node * y = it->curr;
  13.542 +   enum rbtree_color original_color = y->color;
  13.543 +
  13.544 +   if (it->rbtree->nil == it->curr->left)
  13.545 +      {
  13.546 +      x = it->curr->right;
  13.547 +      rbtree_transplant(it->rbtree, it->curr, it->curr->right);
  13.548 +      }
  13.549 +   else if (it->rbtree->nil == it->curr->right)
  13.550 +      {
  13.551 +      x = it->curr->left;
  13.552 +      rbtree_transplant(it->rbtree, it->curr, it->curr->left);
  13.553 +      }
  13.554 +   else
  13.555 +      {
  13.556 +      y = rbtree_node_minimum(it->rbtree, it->curr->right);
  13.557 +      original_color = y->color;
  13.558 +      x = y->right;
  13.559 +      if (it->curr == y->parent)
  13.560 +	 x->parent = y;
  13.561 +      else
  13.562 +	 {
  13.563 +	 rbtree_transplant(it->rbtree, y, y->right);
  13.564 +	 y->right = it->curr->right;
  13.565 +	 y->right->parent = y;
  13.566 +	 }
  13.567 +      rbtree_transplant(it->rbtree, it->curr, y);
  13.568 +      y->left = it->curr->left;
  13.569 +      y->left->parent = y;
  13.570 +      y->color = it->curr->color;
  13.571 +      }
  13.572 +
  13.573 +   if (BLACK == original_color)
  13.574 +      rbtree_remove_fixup(it->rbtree, x);
  13.575 +
  13.576 +   void * data = it->curr->data;
  13.577 +   free(it->curr);
  13.578 +
  13.579 +   // Update it to point to pred's successor
  13.580 +   rbtree_next(&pred);
  13.581 +   it->curr = pred.curr;
  13.582 +
  13.583 +   return data;
  13.584 +   }
  13.585 +
  13.586 +////////////////////////////////////////////////////////////////////////////////
  13.587 +void
  13.588 +rbtree_remove_fixup(struct rbtree * rbtree, struct rbtree_node * node)
  13.589 +   {
  13.590 +   while ( (rbtree->root != node) && (BLACK == node->color) )
  13.591 +      {
  13.592 +      if (node == node->parent->left)
  13.593 +	 {
  13.594 +	 struct rbtree_node * w = node->parent->right;
  13.595 +	 if (RED == w->color)
  13.596 +	    {
  13.597 +	    w->color = BLACK;
  13.598 +	    node->parent->color = RED;
  13.599 +	    rbtree_rotate_left(rbtree, node->parent);
  13.600 +	    w = node->parent->right;
  13.601 +	    }
  13.602 +	 if ( (BLACK == w->left->color) && (BLACK == w->right->color) )
  13.603 +	    {
  13.604 +	    w->left->color = RED;
  13.605 +	    node = node->parent;
  13.606 +	    }
  13.607 +	 else
  13.608 +	    {
  13.609 +	    if (BLACK == w->right->color)
  13.610 +	       {
  13.611 +	       w->left->color = BLACK;
  13.612 +	       w->color = RED;
  13.613 +	       rbtree_rotate_right(rbtree, w);
  13.614 +	       w = node->parent->right;
  13.615 +	       }
  13.616 +	    w->color = node->parent->color;
  13.617 +	    node->parent->color = BLACK;
  13.618 +	    w->right->color = BLACK;
  13.619 +	    rbtree_rotate_left(rbtree, node->parent);
  13.620 +	    node = rbtree->root;
  13.621 +	    }
  13.622 +	 }
  13.623 +      else
  13.624 +	 {
  13.625 +	 struct rbtree_node * w = node->parent->left;
  13.626 +	 if (RED == w->color)
  13.627 +	    {
  13.628 +	    w->color = BLACK;
  13.629 +	    node->parent->color = RED;
  13.630 +	    rbtree_rotate_right(rbtree, node->parent);
  13.631 +	    w = node->parent->left;
  13.632 +	    }
  13.633 +	 if ( (BLACK == w->right->color) && (BLACK == w->left->color) )
  13.634 +	    {
  13.635 +	    w->right->color = RED;
  13.636 +	    node = node->parent;
  13.637 +	    }
  13.638 +	 else
  13.639 +	    {
  13.640 +	    if (BLACK == w->left->color)
  13.641 +	       {
  13.642 +	       w->right->color = BLACK;
  13.643 +	       w->color = RED;
  13.644 +	       rbtree_rotate_left(rbtree, w);
  13.645 +	       w = node->parent->left;
  13.646 +	       }
  13.647 +	    w->color = node->parent->color;
  13.648 +	    node->parent->color = BLACK;
  13.649 +	    w->left->color = BLACK;
  13.650 +	    rbtree_rotate_right(rbtree, node->parent);
  13.651 +	    node = rbtree->root;
  13.652 +	    }
  13.653 +	 }
  13.654 +      }
  13.655 +   node->color = BLACK;
  13.656 +   }
  13.657 +
  13.658 +////////////////////////////////////////////////////////////////////////////////
  13.659 +void
  13.660 +rbtree_rotate_left(struct rbtree * rbtree, struct rbtree_node * node)
  13.661 +   {
  13.662 +   if ( (NULL == rbtree) || (rbtree->nil == node) || (rbtree->nil == node->right) )
  13.663 +      return;
  13.664 +
  13.665 +   struct rbtree_node * y = node->right;
  13.666 +
  13.667 +   node->right = y->left;
  13.668 +   if (rbtree->nil != y->left)
  13.669 +      y->left->parent = node;
  13.670 +
  13.671 +   y->parent = node->parent;
  13.672 +   if (rbtree->nil == node->parent)
  13.673 +      rbtree->root = y;
  13.674 +   else if (node == node->parent->left)
  13.675 +      node->parent->left = y;
  13.676 +   else
  13.677 +      node->parent->right = y;
  13.678 +
  13.679 +   y->left = node;
  13.680 +   node->parent = y;
  13.681 +   }
  13.682 +
  13.683 +////////////////////////////////////////////////////////////////////////////////
  13.684 +void
  13.685 +rbtree_rotate_right(struct rbtree * rbtree, struct rbtree_node * node)
  13.686 +   {
  13.687 +   if ( (NULL == rbtree) || (rbtree->nil == node) || (rbtree->nil == node->left) )
  13.688 +      return;
  13.689 +
  13.690 +   struct rbtree_node * y = node->left;
  13.691 +
  13.692 +   node->left = y->right;
  13.693 +   if (rbtree->nil != y->right)
  13.694 +      y->right->parent = node;
  13.695 +
  13.696 +   y->parent = node->parent;
  13.697 +   if (rbtree->nil == node->parent)
  13.698 +      rbtree->root = y;
  13.699 +   else if (node == node->parent->right)
  13.700 +      node->parent->right = y;
  13.701 +   else
  13.702 +      node->parent->left = y;
  13.703 +
  13.704 +   y->right = node;
  13.705 +   node->parent = y;
  13.706 +   }
  13.707 +
    14.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    14.2 +++ b/src/rbtree.h	Fri Sep 28 03:08:25 2012 -0500
    14.3 @@ -0,0 +1,31 @@
    14.4 +#ifndef RBTREE_H_
    14.5 +#define RBTREE_H_
    14.6 +
    14.7 +#include <stddef.h>
    14.8 +#include <stdbool.h>
    14.9 +
   14.10 +struct rbtree;
   14.11 +struct rbtree_node;
   14.12 +struct rbtree_iterator;
   14.13 +
   14.14 +struct rbtree * rbtree_new(bool (*le)(void * a, void * b), bool (*eq)(void * a, void * b));
   14.15 +void rbtree_delete(struct rbtree * rbtree);
   14.16 +void * rbtree_insert(struct rbtree * rbtree, void * data);
   14.17 +void * rbtree_search(struct rbtree * rbtree, void * data);
   14.18 +void * rbtree_search_iterative(struct rbtree * rbtree, void * data);
   14.19 +void * rbtree_minimum(struct rbtree * rbtree);
   14.20 +void * rbtree_maximum(struct rbtree * rbtree);
   14.21 +
   14.22 +void rbtree_walk_inorder(struct rbtree * rbtree, void (*op)(void * data));
   14.23 +void rbtree_walk_preorder(struct rbtree * rbtree, void (*op)(void * data));
   14.24 +void rbtree_walk_postorder(struct rbtree * rbtree, void (*op)(void * data));
   14.25 +
   14.26 +struct rbtree_iterator * rbtree_begin(struct rbtree * rbtree);
   14.27 +struct rbtree_iterator * rbtree_end(struct rbtree * rbtree);
   14.28 +struct rbtree_iterator * rbtree_next(struct rbtree_iterator * it);
   14.29 +struct rbtree_iterator * rbtree_prev(struct rbtree_iterator * it);
   14.30 +void * rbtree_value(struct rbtree_iterator * it);
   14.31 +void * rbtree_find(struct rbtree_iterator * it, void * data);
   14.32 +void * rbtree_remove(struct rbtree_iterator * it);
   14.33 +
   14.34 +#endif
    15.1 --- a/src/ring_buffer.c	Thu Sep 27 10:57:41 2012 -0500
    15.2 +++ b/src/ring_buffer.c	Fri Sep 28 03:08:25 2012 -0500
    15.3 @@ -3,6 +3,14 @@
    15.4  
    15.5  #include "ring_buffer.h"
    15.6  
    15.7 +struct ring_buffer
    15.8 +   {
    15.9 +   void ** data;
   15.10 +   size_t max;
   15.11 +   size_t start;
   15.12 +   size_t count;
   15.13 +   };
   15.14 +
   15.15  ////////////////////////////////////////////////////////////////////////////////
   15.16  struct ring_buffer * ring_buffer_new(size_t const max)
   15.17     {
    16.1 --- a/src/ring_buffer.h	Thu Sep 27 10:57:41 2012 -0500
    16.2 +++ b/src/ring_buffer.h	Fri Sep 28 03:08:25 2012 -0500
    16.3 @@ -3,13 +3,7 @@
    16.4  
    16.5  #include <stddef.h>
    16.6  
    16.7 -struct ring_buffer
    16.8 -   {
    16.9 -   void ** data;
   16.10 -   size_t max;
   16.11 -   size_t start;
   16.12 -   size_t count;
   16.13 -   };
   16.14 +struct ring_buffer;
   16.15  
   16.16  struct ring_buffer * ring_buffer_new(size_t const size);
   16.17  void ring_buffer_delete(struct ring_buffer * rb);
    17.1 --- a/src/stack.c	Thu Sep 27 10:57:41 2012 -0500
    17.2 +++ b/src/stack.c	Fri Sep 28 03:08:25 2012 -0500
    17.3 @@ -3,6 +3,13 @@
    17.4  
    17.5  #include "stack.h"
    17.6  
    17.7 +struct stack
    17.8 +   {
    17.9 +   void ** data;
   17.10 +   size_t size;
   17.11 +   size_t max;
   17.12 +   };
   17.13 +
   17.14  ////////////////////////////////////////////////////////////////////////////////
   17.15  struct stack * stack_new(size_t const max)
   17.16     {
    18.1 --- a/src/stack.h	Thu Sep 27 10:57:41 2012 -0500
    18.2 +++ b/src/stack.h	Fri Sep 28 03:08:25 2012 -0500
    18.3 @@ -3,12 +3,7 @@
    18.4  
    18.5  #include <stddef.h>
    18.6  
    18.7 -struct stack
    18.8 -   {
    18.9 -   void ** data;
   18.10 -   size_t size;
   18.11 -   size_t max;
   18.12 -   };
   18.13 +struct stack;
   18.14  
   18.15  struct stack * stack_new(size_t const max);
   18.16  void stack_delete(struct stack * s);