You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by tr...@apache.org on 2016/03/02 18:20:41 UTC
[3/4] qpid-dispatch git commit: DISPATCH-228 - Added named DEQ macros
for multi-list membership.
DISPATCH-228 - Added named DEQ macros for multi-list membership.
Conflicts:
include/qpid/dispatch/ctools.h
Project: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/commit/c72e179e
Tree: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/tree/c72e179e
Diff: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/diff/c72e179e
Branch: refs/heads/tross-DISPATCH-179-1
Commit: c72e179ef297d4b94ebda5c025d3eb2f87936bfe
Parents: 1dffeb6
Author: Ted Ross <tr...@redhat.com>
Authored: Mon Feb 29 15:54:22 2016 -0500
Committer: Ted Ross <tr...@redhat.com>
Committed: Mon Feb 29 15:58:34 2016 -0500
----------------------------------------------------------------------
include/qpid/dispatch/ctools.h | 128 ++++++++++++++++++++----------------
tests/tool_test.c | 56 ++++++++++++++++
2 files changed, 126 insertions(+), 58 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/c72e179e/include/qpid/dispatch/ctools.h
----------------------------------------------------------------------
diff --git a/include/qpid/dispatch/ctools.h b/include/qpid/dispatch/ctools.h
index 3ac5998..9ab1c70 100644
--- a/include/qpid/dispatch/ctools.h
+++ b/include/qpid/dispatch/ctools.h
@@ -41,134 +41,146 @@
size_t size; \
} d
-#define DEQ_LINKS(t) t *prev; t *next
+#define DEQ_LINKS_N(n,t) t *prev##n; t *next##n
+#define DEQ_LINKS(t) DEQ_LINKS_N(,t)
#define DEQ_EMPTY {0,0,0,0}
#define DEQ_INIT(d) do { (d).head = 0; (d).tail = 0; (d).scratch = 0; (d).size = 0; } while (0)
#define DEQ_IS_EMPTY(d) ((d).head == 0)
-#define DEQ_ITEM_INIT(i) do { (i)->next = 0; (i)->prev = 0; } while(0)
+#define DEQ_ITEM_INIT_N(n,i) do { (i)->next##n = 0; (i)->prev##n = 0; } while(0)
+#define DEQ_ITEM_INIT(i) DEQ_ITEM_INIT_N(,i)
#define DEQ_HEAD(d) ((d).head)
#define DEQ_TAIL(d) ((d).tail)
#define DEQ_SIZE(d) ((d).size)
-#define DEQ_NEXT(i) (i)->next
-#define DEQ_PREV(i) (i)->prev
+#define DEQ_NEXT_N(n,i) (i)->next##n
+#define DEQ_NEXT(i) DEQ_NEXT_N(,i)
+#define DEQ_PREV_N(n,i) (i)->prev##n
+#define DEQ_PREV(i) DEQ_PREV_N(,i)
#define DEQ_MOVE(d1,d2) do {d2 = d1; DEQ_INIT(d1);} while (0)
/**
*@pre ptr points to first element of deq
*@post ptr points to first element of deq that passes test, or 0. Test should involve ptr.
*/
-#define DEQ_FIND(ptr,test) while((ptr) && !(test)) ptr = DEQ_NEXT(ptr);
+#define DEQ_FIND_N(n,ptr,test) while((ptr) && !(test)) ptr = DEQ_NEXT_N(n,ptr);
+#define DEQ_FIND(ptr,test) DEQ_FIND_N(,ptr,test)
-#define DEQ_INSERT_HEAD(d,i) \
+#define DEQ_INSERT_HEAD_N(n,d,i) \
do { \
- CT_ASSERT((i)->next == 0); \
- CT_ASSERT((i)->prev == 0); \
+ CT_ASSERT((i)->next##n == 0); \
+ CT_ASSERT((i)->prev##n == 0); \
if ((d).head) { \
- (i)->next = (d).head; \
- (d).head->prev = i; \
+ (i)->next##n = (d).head; \
+ (d).head->prev##n = i; \
} else { \
(d).tail = i; \
- (i)->next = 0; \
+ (i)->next##n = 0; \
CT_ASSERT((d).size == 0); \
} \
- (i)->prev = 0; \
+ (i)->prev##n = 0; \
(d).head = i; \
(d).size++; \
} while (0)
+#define DEQ_INSERT_HEAD(d,i) DEQ_INSERT_HEAD_N(,d,i)
-#define DEQ_INSERT_TAIL(d,i) \
+#define DEQ_INSERT_TAIL_N(n,d,i) \
do { \
- CT_ASSERT((i)->next == 0); \
- CT_ASSERT((i)->prev == 0); \
+ CT_ASSERT((i)->next##n == 0); \
+ CT_ASSERT((i)->prev##n == 0); \
if ((d).tail) { \
- (i)->prev = (d).tail; \
- (d).tail->next = i; \
+ (i)->prev##n = (d).tail; \
+ (d).tail->next##n = i; \
} else { \
(d).head = i; \
- (i)->prev = 0; \
+ (i)->prev##n = 0; \
CT_ASSERT((d).size == 0); \
} \
- (i)->next = 0; \
+ (i)->next##n = 0; \
(d).tail = i; \
(d).size++; \
} while (0)
+#define DEQ_INSERT_TAIL(d,i) DEQ_INSERT_TAIL_N(,d,i)
-#define DEQ_REMOVE_HEAD(d) \
+#define DEQ_REMOVE_HEAD_N(n,d) \
do { \
CT_ASSERT((d).head); \
if ((d).head) { \
(d).scratch = (d).head; \
- (d).head = (d).head->next; \
+ (d).head = (d).head->next##n; \
if ((d).head == 0) { \
(d).tail = 0; \
CT_ASSERT((d).size == 1); \
- } else \
- (d).head->prev = 0; \
- (d).size--; \
- (d).scratch->next = 0; \
- (d).scratch->prev = 0; \
- } \
+ } else \
+ (d).head->prev##n = 0; \
+ (d).size--; \
+ (d).scratch->next##n = 0; \
+ (d).scratch->prev##n = 0; \
+ } \
} while (0)
+#define DEQ_REMOVE_HEAD(d) DEQ_REMOVE_HEAD_N(,d)
-#define DEQ_REMOVE_TAIL(d) \
+#define DEQ_REMOVE_TAIL_N(n,d) \
do { \
CT_ASSERT((d).tail); \
if ((d).tail) { \
(d).scratch = (d).tail; \
- (d).tail = (d).tail->prev; \
+ (d).tail = (d).tail->prev##n; \
if ((d).tail == 0) { \
(d).head = 0; \
CT_ASSERT((d).size == 1); \
} else \
- (d).tail->next = 0; \
+ (d).tail->next##n = 0; \
(d).size--; \
- (d).scratch->next = 0; \
- (d).scratch->prev = 0; \
+ (d).scratch->next##n = 0; \
+ (d).scratch->prev##n = 0; \
} \
} while (0)
-
-#define DEQ_INSERT_AFTER(d,i,a) \
-do { \
- CT_ASSERT((i)->next == 0); \
- CT_ASSERT((i)->prev == 0); \
- CT_ASSERT(a); \
- if ((a)->next) \
- (a)->next->prev = (i); \
- else \
- (d).tail = (i); \
- (i)->next = (a)->next; \
- (i)->prev = (a); \
- (a)->next = (i); \
- (d).size++; \
+#define DEQ_REMOVE_TAIL(d) DEQ_REMOVE_TAIL_N(,d)
+
+#define DEQ_INSERT_AFTER_N(n,d,i,a) \
+do { \
+ CT_ASSERT((i)->next##n == 0); \
+ CT_ASSERT((i)->prev##n == 0); \
+ CT_ASSERT(a); \
+ if ((a)->next##n) \
+ (a)->next##n->prev##n = (i); \
+ else \
+ (d).tail = (i); \
+ (i)->next##n = (a)->next##n; \
+ (i)->prev##n = (a); \
+ (a)->next##n = (i); \
+ (d).size++; \
} while (0)
+#define DEQ_INSERT_AFTER(d,i,a) DEQ_INSERT_AFTER_N(,d,i,a)
-#define DEQ_REMOVE(d,i) \
+#define DEQ_REMOVE_N(n,d,i) \
do { \
- if ((i)->next) \
- (i)->next->prev = (i)->prev; \
+ if ((i)->next##n) \
+ (i)->next##n->prev##n = (i)->prev##n; \
else \
- (d).tail = (i)->prev; \
- if ((i)->prev) \
- (i)->prev->next = (i)->next; \
+ (d).tail = (i)->prev##n; \
+ if ((i)->prev##n) \
+ (i)->prev##n->next##n = (i)->next##n; \
else \
- (d).head = (i)->next; \
+ (d).head = (i)->next##n; \
(d).size--; \
- (i)->next = 0; \
- (i)->prev = 0; \
+ (i)->next##n = 0; \
+ (i)->prev##n = 0; \
CT_ASSERT((d).size || (!(d).head && !(d).tail)); \
} while (0)
+#define DEQ_REMOVE(d,i) DEQ_REMOVE_N(,d,i)
-#define DEQ_APPEND(d1,d2) \
+#define DEQ_APPEND_N(n,d1,d2) \
do { \
if (!(d1).head) \
(d1) = (d2); \
else if ((d2).head) { \
- (d1).tail->next = (d2).head; \
- (d2).head->prev = (d1).tail; \
+ (d1).tail->next##n = (d2).head; \
+ (d2).head->prev##n = (d1).tail; \
(d1).tail = (d2).tail; \
(d1).size += (d2).size; \
} \
DEQ_INIT(d2); \
} while (0)
+#define DEQ_APPEND(d1,d2) DEQ_APPEND_N(,d1,d2)
#endif
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/c72e179e/tests/tool_test.c
----------------------------------------------------------------------
diff --git a/tests/tool_test.c b/tests/tool_test.c
index a4ce830..4b68edc 100644
--- a/tests/tool_test.c
+++ b/tests/tool_test.c
@@ -32,6 +32,15 @@ typedef struct item_t {
DEQ_DECLARE(item_t, item_list_t);
+typedef struct multi_item_t {
+ DEQ_LINKS(struct multi_item_t);
+ DEQ_LINKS_N(second, struct multi_item_t);
+ char letter;
+} multi_item_t;
+
+DEQ_DECLARE(multi_item_t, multi_item_list_t);
+
+
static char* list_well_formed(item_list_t list, char *key)
{
item_t *ptr;
@@ -190,6 +199,52 @@ static char* test_deq_basic2(void *context)
}
+static char* test_deq_multi(void *context)
+{
+ multi_item_list_t list1;
+ multi_item_list_t list2;
+ multi_item_t item[10];
+ multi_item_t *ptr;
+ int idx;
+
+ DEQ_INIT(list1);
+ DEQ_INIT(list2);
+ if (DEQ_SIZE(list1) != 0) return "Expected zero initial size 1";
+ if (DEQ_SIZE(list2) != 0) return "Expected zero initial size 2";
+
+ for (idx = 0; idx < 10; idx++) {
+ DEQ_ITEM_INIT(&item[idx]);
+ DEQ_ITEM_INIT_N(second, &item[idx]);
+ item[idx].letter = '0' + idx;
+
+ DEQ_INSERT_TAIL(list1, &item[idx]);
+ if ((idx & 1) == 0) // even index
+ DEQ_INSERT_TAIL_N(second, list2, &item[idx]);
+ }
+
+ if (DEQ_SIZE(list1) != 10) return "Expected list 1 size to be 10";
+ if (DEQ_SIZE(list2) != 5) return "Expected list 2 size to be 5";
+
+ idx = 0;
+ while (DEQ_HEAD(list1)) {
+ ptr = DEQ_HEAD(list1);
+ DEQ_REMOVE_HEAD(list1);
+ if (ptr->letter != '0' + idx) return "Incorrect value in list 1";
+ idx++;
+ }
+
+ idx = 0;
+ while (DEQ_HEAD(list2)) {
+ ptr = DEQ_HEAD(list2);
+ DEQ_REMOVE_HEAD_N(second, list2);
+ if (ptr->letter != '0' + idx) return "Incorrect value in list 2";
+ idx += 2;
+ }
+
+ return 0;
+}
+
+
static char* test_bitmask(void *context)
{
qd_bitmask_t *bm;
@@ -257,6 +312,7 @@ int tool_tests(void)
TEST_CASE(test_deq_basic, 0);
TEST_CASE(test_deq_basic2, 0);
+ TEST_CASE(test_deq_multi, 0);
TEST_CASE(test_bitmask, 0);
return result;
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org