OSDN Git Service

add treebase_node_insertbefore
authorornse01 <ornse01@users.sourceforge.jp>
Thu, 20 Nov 2014 17:08:57 +0000 (17:08 +0000)
committerornse01 <ornse01@users.sourceforge.jp>
Thu, 20 Nov 2014 17:08:57 +0000 (17:08 +0000)
and fix bug in finalize.

git-svn-id: http://svn.sourceforge.jp/svnroot/bchan/bchanf/trunk@642 20a0b8eb-f62a-4a12-8fe1-b598822500fb

src/coll/test_treebase.c
src/coll/treebase.c
src/coll/treebase.h

index 256e5cb..2eab809 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * test_treebase.c
  *
- * Copyright (c) 2013 project bchan
+ * Copyright (c) 2013-2014 project bchan
  *
  * This software is provided 'as-is', without any express or implied
  * warranty. In no event will the authors be held liable for any damages
@@ -309,6 +309,75 @@ LOCAL UNITTEST_RESULT test_treebase_node_6()
        return ret;
 }
 
+LOCAL UNITTEST_RESULT test_treebase_node_7()
+{
+       treebase_node_t node0, node1, node2, node3;
+       test_treebase_node_expected_t expected;
+       Bool ok;
+       UNITTEST_RESULT ret = UNITTEST_RESULT_PASS;
+
+       treebase_node_initialize(&node0);
+       treebase_node_initialize(&node1);
+       treebase_node_initialize(&node2);
+       treebase_node_initialize(&node3);
+
+       treebase_node_insertbefore(&node0, &node1, NULL);
+       treebase_node_insertbefore(&node0, &node2, NULL);
+       treebase_node_insertbefore(&node0, &node3, &node2);
+
+       /**/
+       expected.parent = NULL;
+       expected.next = NULL;
+       expected.prev = NULL;
+       expected.first = &node1;
+       expected.last = &node2;
+       expected.has_child = True;
+       ok = test_treebase_node_commoncheck(&node0, &expected, "node0");
+       if (ok == False) {
+               ret = UNITTEST_RESULT_FAIL;
+       }
+       /**/
+       expected.parent = &node0;
+       expected.next = &node3;
+       expected.prev = NULL;
+       expected.first = NULL;
+       expected.last = NULL;
+       expected.has_child = False;
+       ok = test_treebase_node_commoncheck(&node1, &expected, "node1");
+       if (ok == False) {
+               ret = UNITTEST_RESULT_FAIL;
+       }
+       /**/
+       expected.parent = &node0;
+       expected.next = NULL;
+       expected.prev = &node3;
+       expected.first = NULL;
+       expected.last = NULL;
+       expected.has_child = False;
+       ok = test_treebase_node_commoncheck(&node2, &expected, "node2");
+       if (ok == False) {
+               ret = UNITTEST_RESULT_FAIL;
+       }
+       /**/
+       expected.parent = &node0;
+       expected.next = &node2;
+       expected.prev = &node1;
+       expected.first = NULL;
+       expected.last = NULL;
+       expected.has_child = False;
+       ok = test_treebase_node_commoncheck(&node3, &expected, "node3");
+       if (ok == False) {
+               ret = UNITTEST_RESULT_FAIL;
+       }
+
+       treebase_node_finalize(&node3);
+       treebase_node_finalize(&node2);
+       treebase_node_finalize(&node1);
+       treebase_node_finalize(&node0);
+
+       return ret;
+}
+
 /* treebase_preordertraversal_t */
 
 typedef struct {
@@ -408,5 +477,6 @@ EXPORT VOID test_treebase_main(unittest_driver_t *driver)
        UNITTEST_DRIVER_REGIST(driver, test_treebase_node_4);
        UNITTEST_DRIVER_REGIST(driver, test_treebase_node_5);
        UNITTEST_DRIVER_REGIST(driver, test_treebase_node_6);
+       UNITTEST_DRIVER_REGIST(driver, test_treebase_node_7);
        UNITTEST_DRIVER_REGIST(driver, test_treebase_preordertraversal_1);
 }
index 7597755..a599a06 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * treebase.c
  *
- * Copyright (c) 2013 project bchan
+ * Copyright (c) 2013-2014 project bchan
  *
  * This software is provided 'as-is', without any express or implied
  * warranty. In no event will the authors be held liable for any damages
@@ -43,6 +43,22 @@ EXPORT VOID treebase_node_appendchild(treebase_node_t *node, treebase_node_t *ch
        child->parent = node;
 }
 
+EXPORT W treebase_node_insertbefore(treebase_node_t *node, treebase_node_t *child, treebase_node_t *ref)
+{
+       if (ref == NULL) {
+               treebase_node_appendchild(node, child);
+               return 0;
+       }
+       if (ref->parent != node) {
+               return -1; /* TODO */
+       }
+
+       QueInsert(&child->sibling, &ref->sibling);
+       child->parent = node;
+
+       return 0;
+}
+
 EXPORT VOID treebase_node_remove(treebase_node_t *node)
 {
        if (node->parent == NULL) { /* root node */
@@ -128,6 +144,7 @@ EXPORT VOID treebase_node_initialize(treebase_node_t *node)
 
 EXPORT VOID treebase_node_finalize(treebase_node_t *node)
 {
+       treebase_node_remove(node);
 }
 
 
index cdf7427..13b2cbb 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * treebase.h
  *
- * Copyright (c) 2013 project bchan
+ * Copyright (c) 2013-2014 project bchan
  *
  * This software is provided 'as-is', without any express or implied
  * warranty. In no event will the authors be held liable for any damages
@@ -46,6 +46,7 @@ typedef struct treebase_node_t_ treebase_node_t;
 IMPORT VOID treebase_node_initialize(treebase_node_t *node);
 IMPORT VOID treebase_node_finalize(treebase_node_t *node);
 IMPORT VOID treebase_node_appendchild(treebase_node_t *node, treebase_node_t *child);
+IMPORT W treebase_node_insertbefore(treebase_node_t *node, treebase_node_t *child, treebase_node_t *ref);
 IMPORT VOID treebase_node_remove(treebase_node_t *node);
 IMPORT treebase_node_t* treebase_node_getparent(treebase_node_t *node);
 IMPORT treebase_node_t* treebase_node_getnextsibling(treebase_node_t *node);