From: J. Ali Harlow Date: Thu, 9 Feb 2012 20:43:58 +0000 (+0000) Subject: Add deque_length() X-Git-Tag: 0.5.3~1 X-Git-Url: http://project.juiblex.co.uk/git/?a=commitdiff_plain;h=a83ae5ecd152ffe2277ce2f9214e3c1b99fd5dc0;p=razor2.git%2F.git Add deque_length() --- diff --git a/librazor/types/deque.c b/librazor/types/deque.c index e377b99..7955278 100644 --- a/librazor/types/deque.c +++ b/librazor/types/deque.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009 J. Ali Harlow + * Copyright (C) 2009, 2012 J. Ali Harlow * * 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; diff --git a/librazor/types/test-deque.c b/librazor/types/test-deque.c index d5be4f2..b7fad9d 100644 --- a/librazor/types/test-deque.c +++ b/librazor/types/test-deque.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009 J. Ali Harlow + * Copyright (C) 2009, 2012 J. Ali Harlow * * 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); diff --git a/librazor/types/types.h b/librazor/types/types.h index 9cf253c..8739257 100644 --- a/librazor/types/types.h +++ b/librazor/types/types.h @@ -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);