Add deque_length()
authorJ. Ali Harlow <ali@juiblex.co.uk>
Thu, 9 Feb 2012 20:43:58 +0000 (20:43 +0000)
committerJ. Ali Harlow <ali@juiblex.co.uk>
Thu, 9 Feb 2012 20:43:58 +0000 (20:43 +0000)
librazor/types/deque.c
librazor/types/test-deque.c
librazor/types/types.h

index e377b99..7955278 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2009  J. Ali Harlow <ali@juiblex.co.uk>
+ * Copyright (C) 2009, 2012  J. Ali Harlow <ali@juiblex.co.uk>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -176,6 +176,18 @@ int deque_empty(struct deque *deque)
        return deque->front == deque->back;
 }
 
+int deque_length(struct deque *deque)
+{
+       int nb;
+
+       nb = deque->back - deque->front;
+
+       if (nb < 0)
+               nb += deque->alloc;
+
+       return nb / sizeof(uint32_t);
+}
+
 uint32_t deque_shift(struct deque *deque)
 {
        uint32_t datum;
index d5be4f2..b7fad9d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2009  J. Ali Harlow <ali@juiblex.co.uk>
+ * Copyright (C) 2009, 2012  J. Ali Harlow <ali@juiblex.co.uk>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -80,17 +80,25 @@ static int test_push_pop(struct array *array)
        items = array->data;
 
        DEQUE_TEST(deque_push, &deque, 0x25);
+       DEQUE_CHECK(deque_length, &deque, 1);
        DEQUE_TEST(deque_push, &deque, 0x2A);
+       DEQUE_CHECK(deque_length, &deque, 2);
 
        for(n = 1; n <= count; n++) {
-               for(i = 0; i < n; i++)
+               for(i = 0; i < n; i++) {
                        DEQUE_TEST(deque_push, &deque, items[i]);
-               for(i = n - 1; i >= 0; i--)
+                       DEQUE_CHECK(deque_length, &deque, 2 + i + 1);
+               }
+               for(i = n - 1; i >= 0; i--) {
                        DEQUE_CHECK(deque_pop, &deque, items[i]);
+                       DEQUE_CHECK(deque_length, &deque, 2 + i);
+               }
        }
 
        DEQUE_CHECK(deque_pop, &deque, 0x2A);
+       DEQUE_CHECK(deque_length, &deque, 1);
        DEQUE_CHECK(deque_pop, &deque, 0x25);
+       DEQUE_CHECK(deque_length, &deque, 0);
 
        DEQUE_ENSURE_EMPTY(&deque);
 
@@ -110,17 +118,25 @@ static int test_unshift_shift(struct array *array)
        items = array->data;
 
        DEQUE_TEST(deque_unshift, &deque, 0x25);
+       DEQUE_CHECK(deque_length, &deque, 1);
        DEQUE_TEST(deque_unshift, &deque, 0x2A);
+       DEQUE_CHECK(deque_length, &deque, 2);
 
        for(n = 1; n <= count; n++) {
-               for(i = 0; i < n; i++)
+               for(i = 0; i < n; i++) {
                        DEQUE_TEST(deque_unshift, &deque, items[i]);
-               for(i = n - 1; i >= 0; i--)
+                       DEQUE_CHECK(deque_length, &deque, 2 + i + 1);
+               }
+               for(i = n - 1; i >= 0; i--) {
                        DEQUE_CHECK(deque_shift, &deque, items[i]);
+                       DEQUE_CHECK(deque_length, &deque, 2 + i);
+               }
        }
 
        DEQUE_CHECK(deque_shift, &deque, 0x2A);
+       DEQUE_CHECK(deque_length, &deque, 1);
        DEQUE_CHECK(deque_shift, &deque, 0x25);
+       DEQUE_CHECK(deque_length, &deque, 0);
 
        DEQUE_ENSURE_EMPTY(&deque);
 
@@ -140,14 +156,22 @@ static int test_push_shift(struct array *array)
        items = array->data;
 
        for(n = 1; n <= count; n++) {
-               for(i = 0; i < n; i++)
+               for(i = 0; i < n; i++) {
                        DEQUE_TEST(deque_push, &deque, items[i]);
+                       DEQUE_CHECK(deque_length, &deque, i + 1);
+               }
                DEQUE_TEST(deque_push, &deque, 0x25);
+               DEQUE_CHECK(deque_length, &deque, n + 1);
                DEQUE_TEST(deque_push, &deque, 0x2A);
-               for(i = 0; i < n; i++)
+               DEQUE_CHECK(deque_length, &deque, n + 2);
+               for(i = 0; i < n; i++) {
                        DEQUE_CHECK(deque_shift, &deque, items[i]);
+                       DEQUE_CHECK(deque_length, &deque, n + 2 - i - 1);
+               }
                DEQUE_CHECK(deque_shift, &deque, 0x25);
+               DEQUE_CHECK(deque_length, &deque, 1);
                DEQUE_CHECK(deque_shift, &deque, 0x2A);
+               DEQUE_CHECK(deque_length, &deque, 0);
        }
 
        DEQUE_ENSURE_EMPTY(&deque);
@@ -168,14 +192,22 @@ static int test_unshift_pop(struct array *array)
        items = array->data;
 
        for(n = 1; n <= count; n++) {
-               for(i = 0; i < n; i++)
+               for(i = 0; i < n; i++) {
                        DEQUE_TEST(deque_unshift, &deque, items[i]);
+                       DEQUE_CHECK(deque_length, &deque, i + 1);
+               }
                DEQUE_TEST(deque_unshift, &deque, 0x25);
+               DEQUE_CHECK(deque_length, &deque, n + 1);
                DEQUE_TEST(deque_unshift, &deque, 0x2A);
-               for(i = 0; i < n; i++)
+               DEQUE_CHECK(deque_length, &deque, n + 2);
+               for(i = 0; i < n; i++) {
                        DEQUE_CHECK(deque_pop, &deque, items[i]);
+                       DEQUE_CHECK(deque_length, &deque, n + 2 - i - 1);
+               }
                DEQUE_CHECK(deque_pop, &deque, 0x25);
+               DEQUE_CHECK(deque_length, &deque, 1);
                DEQUE_CHECK(deque_pop, &deque, 0x2A);
+               DEQUE_CHECK(deque_length, &deque, 0);
        }
 
        DEQUE_ENSURE_EMPTY(&deque);
index 9cf253c..8739257 100644 (file)
@@ -92,6 +92,7 @@ struct deque *deque_dup(struct deque *deque);
 int deque_unshift(struct deque *deque, uint32_t datum);
 int deque_push(struct deque *deque, uint32_t datum);
 int deque_empty(struct deque *deque);
+int deque_length(struct deque *deque);
 uint32_t deque_shift(struct deque *deque);
 uint32_t deque_pop(struct deque *deque);