WIP Initial code
parent
0f4884bd8b
commit
f2c44cae8d
|
@ -0,0 +1,8 @@
|
||||||
|
USING: critbit tools.test ;
|
||||||
|
|
||||||
|
IN: critbit.tests
|
||||||
|
|
||||||
|
{ t } [ <critbit> empty? ] unit-test
|
||||||
|
|
||||||
|
{ 0 } [ 0 0b11111011 direction ] unit-test
|
||||||
|
{ 1 } [ 4 0b11111011 direction ] unit-test
|
|
@ -0,0 +1,69 @@
|
||||||
|
USING: accessors kernel math sequences serialize ;
|
||||||
|
|
||||||
|
IN: critbit
|
||||||
|
|
||||||
|
TUPLE: critbit root ;
|
||||||
|
|
||||||
|
<PRIVATE
|
||||||
|
|
||||||
|
: new-critbit ( class -- critbit )
|
||||||
|
new
|
||||||
|
f >>root ; inline
|
||||||
|
|
||||||
|
PRIVATE>
|
||||||
|
|
||||||
|
: <critbit> ( -- critbit )
|
||||||
|
critbit new-critbit ;
|
||||||
|
|
||||||
|
<PRIVATE
|
||||||
|
|
||||||
|
TUPLE: node left right { byte# integer } { bits integer } ;
|
||||||
|
|
||||||
|
: new-node ( byte# bits class -- node )
|
||||||
|
new
|
||||||
|
swap >>byte#
|
||||||
|
swap >>bits ; inline
|
||||||
|
|
||||||
|
: <node> ( byte# bits -- node )
|
||||||
|
node new-node ;
|
||||||
|
|
||||||
|
PRIVATE>
|
||||||
|
|
||||||
|
: empty? ( tree -- ? )
|
||||||
|
root>> f = ; inline
|
||||||
|
|
||||||
|
! : walk-crit ( obj node -- ? )
|
||||||
|
! ;
|
||||||
|
|
||||||
|
: direction ( byte bits -- direction )
|
||||||
|
bitor 1 + -8 shift ;
|
||||||
|
|
||||||
|
<PRIVATE
|
||||||
|
|
||||||
|
: successor ( bytes node -- bytes successor )
|
||||||
|
2dup [ byte#>> ] [ bits>> ] bi
|
||||||
|
[ 2dup swap length < [ swap nth ] [ 2drop 0 ] if ] dip
|
||||||
|
direction 0 = [ left>> ] [ right>> ] if ;
|
||||||
|
|
||||||
|
: walk-critbit ( bytes obj -- bytes obj )
|
||||||
|
[ dup node? ] [ successor ] while ;
|
||||||
|
|
||||||
|
PRIVATE>
|
||||||
|
|
||||||
|
: member? ( obj tree -- ? )
|
||||||
|
dup critbit?
|
||||||
|
[ [ object>bytes ] [ root>> ] bi* walk-critbit = ]
|
||||||
|
[ 2drop f ] if ;
|
||||||
|
|
||||||
|
: find-byte ( newbytes oldbytes -- x )
|
||||||
|
2dup [ bitxor dup 0 = ] 2all?
|
||||||
|
[ [ length ] dip nth ]
|
||||||
|
[ ] if;
|
||||||
|
|
||||||
|
: put ( obj tree -- tree )
|
||||||
|
dup critbit?
|
||||||
|
[ dup empty?
|
||||||
|
[ swap object>bytes >>root ]
|
||||||
|
[ [ object>bytes ] [ root>> ] bi* walk-critbit
|
||||||
|
] if ]
|
||||||
|
[ 2drop "Not a critbit tree" throw ] if ;
|
Loading…
Reference in New Issue