OSDN Git Service

add functions for tree oparations.
authorornse01 <ornse01@users.sourceforge.jp>
Fri, 21 Nov 2014 17:38:05 +0000 (17:38 +0000)
committerornse01 <ornse01@users.sourceforge.jp>
Fri, 21 Nov 2014 17:38:05 +0000 (17:38 +0000)
git-svn-id: http://svn.sourceforge.jp/svnroot/bchan/bchanf/trunk@644 20a0b8eb-f62a-4a12-8fe1-b598822500fb

src/css/cssrendering_box.c
src/css/cssrendering_box.h
src/css/test_cssrendering_box.c

index 1a87f28..db26470 100644 (file)
@@ -53,6 +53,39 @@ LOCAL VOID cssrendering_basebox_appendchild(cssrendering_basebox_t *box, cssrend
        treebase_node_appendchild(&box->base, &child->base);
 }
 
+LOCAL W cssrendering_basebox_insertbefore(cssrendering_basebox_t *box, cssrendering_basebox_t *child, cssrendering_basebox_t *ref)
+{
+       return treebase_node_insertbefore(&box->base, &child->base, (ref != NULL) ? &ref->base : NULL);
+}
+
+LOCAL cssrendering_basebox_t* cssrendering_basebox_getparent(cssrendering_basebox_t *box)
+{
+       return (cssrendering_basebox_t*)treebase_node_getparent(&box->base);
+}
+
+LOCAL W cssrendering_basebox_removechild(cssrendering_basebox_t *box, cssrendering_basebox_t *child)
+{
+       cssrendering_basebox_t *parent;
+
+       parent = cssrendering_basebox_getparent(child);
+       if (parent != box) {
+               return -1; /* TODO */
+       }
+       treebase_node_remove(&child->base);
+
+       return 0;
+}
+
+LOCAL cssrendering_basebox_t* cssrendering_basebox_getfirstchild(cssrendering_basebox_t *box)
+{
+       return (cssrendering_basebox_t*)treebase_node_getfirstchild(&box->base);
+}
+
+LOCAL cssrendering_basebox_t* cssrendering_basebox_getnextsibling(cssrendering_basebox_t *box)
+{
+       return (cssrendering_basebox_t*)treebase_node_getnextsibling(&box->base);
+}
+
 LOCAL VOID cssrendering_basebox_setuserdata(cssrendering_basebox_t *box, VP data)
 {
        box->userdata = data;
@@ -76,6 +109,11 @@ LOCAL VOID cssrendering_basebox_finalize(cssrendering_basebox_t *box)
 
 /* cssrendering_linebox */
 
+EXPORT cssrendering_linebox_t* cssrendering_linebox_getnextsibling(cssrendering_linebox_t *box)
+{
+       return (cssrendering_linebox_t*)cssrendering_basebox_getnextsibling(&box->base);
+}
+
 EXPORT VOID cssrendering_linebox_setuserdata(cssrendering_linebox_t *box, VP data)
 {
        cssrendering_basebox_setuserdata(&box->base, data);
@@ -98,6 +136,21 @@ EXPORT VOID cssrendering_anonymousbox_appendchild(cssrendering_anonymousbox_t *b
        cssrendering_basebox_appendchild(&box->base, &child->base);
 }
 
+EXPORT W cssrendering_anonymousbox_insertbefore(cssrendering_anonymousbox_t *box, cssrendering_linebox_t *child, cssrendering_linebox_t *ref)
+{
+       return cssrendering_basebox_insertbefore(&box->base, &child->base, (ref != NULL) ? &ref->base : NULL);
+}
+
+EXPORT W cssrendering_anonymousbox_removechild(cssrendering_anonymousbox_t *box, cssrendering_linebox_t *child)
+{
+       return cssrendering_basebox_removechild(&box->base, &child->base);
+}
+
+EXPORT cssrendering_linebox_t* cssrendering_anonymousbox_getfirstchild(cssrendering_anonymousbox_t *box)
+{
+       return (cssrendering_linebox_t*)cssrendering_basebox_getfirstchild(&box->base);
+}
+
 EXPORT VOID cssrendering_anonymousbox_setuserdata(cssrendering_anonymousbox_t *box, VP data)
 {
        cssrendering_basebox_setuserdata(&box->base, data);
index fcac14e..153493e 100644 (file)
@@ -143,11 +143,15 @@ typedef struct cssrendering_hittraversal_result_ cssrendering_hittraversal_resul
 
 IMPORT VOID cssrendering_linebox_initialize(cssrendering_linebox_t *box);
 IMPORT VOID cssrendering_linebox_finalize(cssrendering_linebox_t *box);
+IMPORT cssrendering_linebox_t* cssrendering_linebox_getnextsibling(cssrendering_linebox_t *box);
 IMPORT VOID cssrendering_linebox_setuserdata(cssrendering_linebox_t *box, VP data);
 
 IMPORT VOID cssrendering_anonymousbox_initialize(cssrendering_anonymousbox_t *box);
 IMPORT VOID cssrendering_anonymousbox_finalize(cssrendering_anonymousbox_t *box);
 IMPORT VOID cssrendering_anonymousbox_appendchild(cssrendering_anonymousbox_t *box, cssrendering_linebox_t *child);
+IMPORT W cssrendering_anonymousbox_insertbefore(cssrendering_anonymousbox_t *box, cssrendering_linebox_t *child, cssrendering_linebox_t *ref);
+IMPORT W cssrendering_anonymousbox_removechild(cssrendering_anonymousbox_t *box, cssrendering_linebox_t *child);
+IMPORT cssrendering_linebox_t* cssrendering_anonymousbox_getfirstchild(cssrendering_anonymousbox_t *box);
 IMPORT VOID cssrendering_anonymousbox_setuserdata(cssrendering_anonymousbox_t *box, VP data);
 
 IMPORT VOID cssrendering_blockbox_initialize(cssrendering_blockbox_t *box);
index 20cd5d9..36b2aa2 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * test_cssrendering_box.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
@@ -469,6 +469,131 @@ LOCAL UNITTEST_RESULT test_cssrendering_anonymousbox_appendchild1()
        return result;
 }
 
+LOCAL UNITTEST_RESULT test_cssrendering_anonymousbox_appendchild2()
+{
+       cssrendering_anonymousbox_t anon;
+       cssrendering_linebox_t *line, line0, line1, line2;
+       UNITTEST_RESULT result = UNITTEST_RESULT_PASS;
+
+       cssrendering_anonymousbox_initialize(&anon);
+       cssrendering_linebox_initialize(&line0);
+       cssrendering_linebox_initialize(&line1);
+       cssrendering_linebox_initialize(&line2);
+
+       anon.base.content_edge = (cssmetric_rectangle_t){{0, 0, 100, 100}};
+       cssrendering_anonymousbox_appendchild(&anon, &line0);
+       cssrendering_anonymousbox_appendchild(&anon, &line1);
+       cssrendering_anonymousbox_appendchild(&anon, &line2);
+
+       line = cssrendering_anonymousbox_getfirstchild(&anon);
+       if (line != &line0) {
+               result = UNITTEST_RESULT_FAIL;
+       }
+       line = cssrendering_linebox_getnextsibling(&line0);
+       if (line != &line1) {
+               result = UNITTEST_RESULT_FAIL;
+       }
+       line = cssrendering_linebox_getnextsibling(&line1);
+       if (line != &line2) {
+               result = UNITTEST_RESULT_FAIL;
+       }
+       line = cssrendering_linebox_getnextsibling(&line2);
+       if (line != NULL) {
+               result = UNITTEST_RESULT_FAIL;
+       }
+
+       cssrendering_linebox_finalize(&line2);
+       cssrendering_linebox_finalize(&line1);
+       cssrendering_linebox_finalize(&line0);
+       cssrendering_anonymousbox_finalize(&anon);
+
+       return result;
+}
+
+LOCAL UNITTEST_RESULT test_cssrendering_anonymousbox_insertbefore1()
+{
+       cssrendering_anonymousbox_t anon;
+       cssrendering_linebox_t *line, line0, line1, line2;
+       UNITTEST_RESULT result = UNITTEST_RESULT_PASS;
+
+       cssrendering_anonymousbox_initialize(&anon);
+       cssrendering_linebox_initialize(&line0);
+       cssrendering_linebox_initialize(&line1);
+       cssrendering_linebox_initialize(&line2);
+
+       anon.base.content_edge = (cssmetric_rectangle_t){{0, 0, 100, 100}};
+       cssrendering_anonymousbox_insertbefore(&anon, &line0, NULL);
+       cssrendering_anonymousbox_insertbefore(&anon, &line1, &line0);
+       cssrendering_anonymousbox_insertbefore(&anon, &line2, NULL);
+
+       line = cssrendering_anonymousbox_getfirstchild(&anon);
+       if (line != &line1) {
+               result = UNITTEST_RESULT_FAIL;
+       }
+       line = cssrendering_linebox_getnextsibling(&line1);
+       if (line != &line0) {
+               result = UNITTEST_RESULT_FAIL;
+       }
+       line = cssrendering_linebox_getnextsibling(&line0);
+       if (line != &line2) {
+               result = UNITTEST_RESULT_FAIL;
+       }
+       line = cssrendering_linebox_getnextsibling(&line2);
+       if (line != NULL) {
+               result = UNITTEST_RESULT_FAIL;
+       }
+
+       cssrendering_linebox_finalize(&line2);
+       cssrendering_linebox_finalize(&line1);
+       cssrendering_linebox_finalize(&line0);
+       cssrendering_anonymousbox_finalize(&anon);
+
+       return result;
+}
+
+LOCAL UNITTEST_RESULT test_cssrendering_anonymousbox_removechild1()
+{
+       cssrendering_anonymousbox_t anon;
+       cssrendering_linebox_t *line, line0, line1, line2;
+       UNITTEST_RESULT result = UNITTEST_RESULT_PASS;
+
+       cssrendering_anonymousbox_initialize(&anon);
+       cssrendering_linebox_initialize(&line0);
+       cssrendering_linebox_initialize(&line1);
+       cssrendering_linebox_initialize(&line2);
+
+       anon.base.content_edge = (cssmetric_rectangle_t){{0, 0, 100, 100}};
+       cssrendering_anonymousbox_appendchild(&anon, &line0);
+       cssrendering_anonymousbox_appendchild(&anon, &line1);
+       cssrendering_anonymousbox_appendchild(&anon, &line2);
+       cssrendering_anonymousbox_removechild(&anon, &line1);
+
+       line = cssrendering_anonymousbox_getfirstchild(&anon);
+       if (line != &line0) {
+               result = UNITTEST_RESULT_FAIL;
+       }
+       line = cssrendering_linebox_getnextsibling(&line0);
+       if (line != &line2) {
+               result = UNITTEST_RESULT_FAIL;
+       }
+       line = cssrendering_linebox_getnextsibling(&line2);
+       if (line != NULL) {
+               result = UNITTEST_RESULT_FAIL;
+       }
+
+       line = cssrendering_linebox_getnextsibling(&line1);
+       if (line != NULL) {
+               result = UNITTEST_RESULT_FAIL;
+       }
+
+       cssrendering_linebox_finalize(&line2);
+       cssrendering_linebox_finalize(&line1);
+       cssrendering_linebox_finalize(&line0);
+       cssrendering_anonymousbox_finalize(&anon);
+
+       return result;
+}
+
 EXPORT VOID test_cssrendering_box_main(unittest_driver_t *driver)
 {
        UNITTEST_DRIVER_REGIST(driver, test_cssrendering_drawtraversal_1);
@@ -478,4 +603,7 @@ EXPORT VOID test_cssrendering_box_main(unittest_driver_t *driver)
        UNITTEST_DRIVER_REGIST(driver, test_cssrendering_blockbox_appendchild1);
        UNITTEST_DRIVER_REGIST(driver, test_cssrendering_blockbox_appendchild2);
        UNITTEST_DRIVER_REGIST(driver, test_cssrendering_anonymousbox_appendchild1);
+       UNITTEST_DRIVER_REGIST(driver, test_cssrendering_anonymousbox_appendchild2);
+       UNITTEST_DRIVER_REGIST(driver, test_cssrendering_anonymousbox_insertbefore1);
+       UNITTEST_DRIVER_REGIST(driver, test_cssrendering_anonymousbox_removechild1);
 }