diff --git a/m-rbtree.h b/m-rbtree.h index 06972284..5854a54b 100644 --- a/m-rbtree.h +++ b/m-rbtree.h @@ -59,6 +59,7 @@ CLEAR(M_C3(rbtree_, name, _clear)), \ INIT_MOVE(M_C3(rbtree_, name, _init_move)), \ MOVE(M_C3(rbtree_, name, _move)), \ + SWAP(M_C3(rbtree_, name, _swap)), \ TYPE(M_C3(rbtree_,name,_t)), \ SUBTYPE(M_C3(rbtree_type_,name,_t)), \ IT_TYPE(M_C3(rbtree_it_,name,_t)), \ @@ -572,6 +573,21 @@ typedef enum { RBTREEI_CONTRACT (tree); \ } \ \ + static inline void \ + M_C3(rbtree_, name, _swap)(tree_t tree1, tree_t tree2) \ + { \ + RBTREEI_CONTRACT (tree1); \ + RBTREEI_CONTRACT (tree2); \ + size_t size = tree1->size; \ + tree1->size = tree2->size; \ + tree2->size = size; \ + node_t *node = tree1->node; \ + tree1->node = tree2->node; \ + tree2->node = node; \ + RBTREEI_CONTRACT (tree1); \ + RBTREEI_CONTRACT (tree2); \ + } \ + \ static inline bool \ M_C3(rbtree_, name, _empty_p)(const tree_t tree) \ { \ diff --git a/tests/test-mrbtree.c b/tests/test-mrbtree.c index 837ad340..d5db3a7a 100644 --- a/tests/test-mrbtree.c +++ b/tests/test-mrbtree.c @@ -94,7 +94,19 @@ static void test_uint(void) assert (ptr == NULL); } } + + rbtree_uint_init (tree); + assert(rbtree_uint_empty_p(tree)); + rbtree_uint_clean(tree2); + rbtree_uint_push(tree2, 17421); + assert(rbtree_uint_size(tree2) == 1); + rbtree_uint_swap(tree, tree2); + assert(rbtree_uint_empty_p(tree2)); + assert(rbtree_uint_size(tree) == 1); + unsigned int *ptr = rbtree_uint_get(tree, 17421); + assert(ptr != NULL && *ptr == 17421); + rbtree_uint_clear(tree); rbtree_uint_clear(tree2); }