Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Add the possibility to remove an item in the middle of the list.
[simgrid.git] / src / xbt / fifo.c
index fc0bb91..2f191af 100644 (file)
@@ -3,8 +3,9 @@
 /* This program is free software; you can redistribute it and/or modify it
    under the terms of the license (GNU LGPL) which comes with this package. */
 
-#include <stdlib.h>
-#include "xbt_fifo_private.h"
+#include "xbt/sysdep.h"
+#include "xbt/error.h"
+#include "fifo_private.h"
 
 /*
  * xbt_fifo_new()
@@ -12,7 +13,7 @@
 xbt_fifo_t xbt_fifo_new(void)
 {
   xbt_fifo_t fifo;
-  fifo = (xbt_fifo_t) calloc(1, sizeof(struct xbt_fifo));
+  fifo = xbt_new0(struct xbt_fifo,1);
   return fifo;
 }
 
@@ -33,13 +34,72 @@ void xbt_fifo_free(xbt_fifo_t l)
  * xbt_fifo_push()
  * at the tail
  */
-void xbt_fifo_push(xbt_fifo_t l, void *t)
+xbt_fifo_item_t xbt_fifo_push(xbt_fifo_t l, void *t)
+{
+  xbt_fifo_item_t new;
+
+  new = xbt_fifo_newitem();
+  new->content = t;
+
+  xbt_fifo_push_item(l,new);
+  return new;
+}
+
+/*
+ * xbt_fifo_pop()
+ * from the tail
+ */
+void *xbt_fifo_pop(xbt_fifo_t l)
+{
+  xbt_fifo_item_t item;
+  void *content;
+
+  item = xbt_fifo_pop_item(l);
+  if(item==NULL) return NULL;
+
+  content = item->content;
+  xbt_fifo_freeitem(item);
+  return content;
+}
+
+/*
+ * xbt_fifo_unshift()
+ * at the head
+ */
+xbt_fifo_item_t xbt_fifo_unshift(xbt_fifo_t l, void *t)
 {
   xbt_fifo_item_t new;
 
-  (l->count)++;
   new = xbt_fifo_newitem();
   new->content = t;
+  xbt_fifo_unshift_item(l,new);
+  return new;
+}
+
+/*
+ * xbt_fifo_shift()
+ * from the head
+ */
+void *xbt_fifo_shift(xbt_fifo_t l)
+{
+  xbt_fifo_item_t item;
+  void *content;
+
+  item = xbt_fifo_shift_item(l);
+  if(l==NULL) return NULL;
+
+  content = item->content;
+  xbt_fifo_freeitem(item);
+  return content;
+}
+
+/*
+ * xbt_fifo_push_item()
+ * at the tail
+ */
+void xbt_fifo_push_item(xbt_fifo_t l, xbt_fifo_item_t new)
+{
+  (l->count)++;
   if (l->head == NULL) {
     l->head = new;
     l->tail = new;
@@ -48,23 +108,20 @@ void xbt_fifo_push(xbt_fifo_t l, void *t)
   new->prev = l->tail;
   new->prev->next = new;
   l->tail = new;
-  return;
 }
 
 /*
- * xbt_fifo_pop()
+ * xbt_fifo_pop_item()
  * from the tail
  */
-void *xbt_fifo_pop(xbt_fifo_t l)
+xbt_fifo_item_t xbt_fifo_pop_item(xbt_fifo_t l)
 {
   xbt_fifo_item_t item;
-  void *content;
 
   if (l->tail == NULL)
     return NULL;
 
   item = l->tail;
-  content = item->content;
 
   l->tail = item->prev;
   if (l->tail == NULL)
@@ -72,22 +129,17 @@ void *xbt_fifo_pop(xbt_fifo_t l)
   else
     l->tail->next = NULL;
 
-  xbt_fifo_freeitem(item);
   (l->count)--;
-  return content;
+  return item;
 }
 
 /*
- * xbt_fifo_unshift()
+ * xbt_fifo_unshift_item()
  * at the head
  */
-void xbt_fifo_unshift(xbt_fifo_t l, void *t)
+void xbt_fifo_unshift_item(xbt_fifo_t l, xbt_fifo_item_t new)
 {
-  xbt_fifo_item_t new;
-
   (l->count)++;
-  new = xbt_fifo_newitem();
-  new->content = t;
   if (l->head == NULL) {
     l->head = new;
     l->tail = new;
@@ -100,19 +152,17 @@ void xbt_fifo_unshift(xbt_fifo_t l, void *t)
 }
 
 /*
- * xbt_fifo_shift()
+ * xbt_fifo_shift_item()
  * from the head
  */
-void *xbt_fifo_shift(xbt_fifo_t l)
+xbt_fifo_item_t xbt_fifo_shift_item(xbt_fifo_t l)
 {
   xbt_fifo_item_t item;
-  void *content;
 
   if (l->head == NULL)
     return NULL;
 
   item = l->head;
-  content = item->content;
 
   l->head = item->next;
   if (l->head == NULL)
@@ -120,9 +170,8 @@ void *xbt_fifo_shift(xbt_fifo_t l)
   else
     l->head->prev = NULL;
 
-  xbt_fifo_freeitem(item);
   (l->count)--;
-  return content;
+  return item;
 }
 
 /*
@@ -140,6 +189,7 @@ void xbt_fifo_remove(xbt_fifo_t l, void *t)
       continue;
     /* remove the item */
     xbt_fifo_remove_item(l, current);
+    xbt_fifo_freeitem(current);
     /* WILL NOT REMOVE DUPLICATES */
     break;
   }
@@ -155,7 +205,6 @@ void xbt_fifo_remove_item(xbt_fifo_t l, xbt_fifo_item_t current)
   if (l->head == l->tail) {    /* special case */
       l->head = NULL;
       l->tail = NULL;
-      xbt_fifo_freeitem(current);
       (l->count)--;
       return;
     }
@@ -163,15 +212,12 @@ void xbt_fifo_remove_item(xbt_fifo_t l, xbt_fifo_item_t current)
     if (current == l->head) {  /* It's the head */
       l->head = current->next;
       l->head->prev = NULL;
-      xbt_fifo_freeitem(current);
     } else if (current == l->tail) {   /* It's the tail */
       l->tail = current->prev;
       l->tail->next = NULL;
-      xbt_fifo_freeitem(current);
     } else {                   /* It's in the middle */
       current->prev->next = current->next;
       current->next->prev = current->prev;
-      xbt_fifo_freeitem(current);
     }
     (l->count)--;
 }
@@ -202,7 +248,7 @@ void **xbt_fifo_to_array(xbt_fifo_t f)
   if (f->count == 0)
     return NULL;
   else
-    array = (void **) calloc(f->count, sizeof(void *));
+    array = xbt_new0(void *, f->count);
 
   for (i = 0, b = xbt_fifo_getFirstitem(f); b; i++, b = b->next) {
     array[i] = b->content;
@@ -231,7 +277,7 @@ xbt_fifo_t xbt_fifo_copy(xbt_fifo_t f)
  */
 xbt_fifo_item_t xbt_fifo_newitem(void)
 {
-  return (xbt_fifo_item_t) calloc(1, sizeof(struct xbt_fifo_item));
+  return xbt_new0(struct xbt_fifo_item,1);
 }
 
 void xbt_fifo_set_item_content(xbt_fifo_item_t i , void *v)