trees, change M\ tree clone to keep the shape of the tree

Without this, all base class and splay trees were becoming linked lists after cloning..
char-rename
Jon Harper 2017-01-06 15:20:06 +01:00 committed by John Benediktsson
parent 79a28e130e
commit 29ebeb5a26
2 changed files with 23 additions and 1 deletions

View File

@ -25,3 +25,14 @@ IN: trees.tests
{ "replaced four" } [ test-tree 9 over delete-at 4 of ] unit-test
{ "nine" "replaced four" } [ test-tree 7 over delete-at 9 over at 4 rot at ] unit-test
{ "nine" } [ test-tree 7 over delete-at 4 over delete-at 9 of ] unit-test
! test that cloning doesn't reshape the tree
{ TREE{
{ 7 "seven" }
{ 9 "nine" }
{ 4 "four" }
} } [ TREE{
{ 7 "seven" }
{ 9 "nine" }
{ 4 "four" }
} clone ] unit-test

View File

@ -202,7 +202,18 @@ M: tree delete-at
M: tree new-assoc
2drop <tree> ;
M: tree clone dup assoc-clone-like ;
<PRIVATE
: clone-nodes ( node -- node' )
dup [
clone
[ clone-nodes ] change-left
[ clone-nodes ] change-right
] when ;
PRIVATE>
M: tree clone (clone) [ clone-nodes ] change-root ;
: >tree ( assoc -- tree )
T{ tree f f 0 } assoc-clone-like ;