From f2c44cae8d4fe6cee34cf4cc1890d3330bca536e Mon Sep 17 00:00:00 2001 From: Michael Raitza Date: Tue, 23 Apr 2019 09:36:06 +0200 Subject: [PATCH] WIP Initial code --- critbit/critbit-tests.factor | 8 +++++ critbit/critbit.factor | 69 ++++++++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+) create mode 100644 critbit/critbit-tests.factor create mode 100644 critbit/critbit.factor diff --git a/critbit/critbit-tests.factor b/critbit/critbit-tests.factor new file mode 100644 index 0000000..afed130 --- /dev/null +++ b/critbit/critbit-tests.factor @@ -0,0 +1,8 @@ +USING: critbit tools.test ; + +IN: critbit.tests + +{ t } [ empty? ] unit-test + +{ 0 } [ 0 0b11111011 direction ] unit-test +{ 1 } [ 4 0b11111011 direction ] unit-test diff --git a/critbit/critbit.factor b/critbit/critbit.factor new file mode 100644 index 0000000..b20a6d9 --- /dev/null +++ b/critbit/critbit.factor @@ -0,0 +1,69 @@ +USING: accessors kernel math sequences serialize ; + +IN: critbit + +TUPLE: critbit root ; + +>root ; inline + +PRIVATE> + +: ( -- critbit ) + critbit new-critbit ; + +>byte# + swap >>bits ; inline + +: ( byte# bits -- node ) + node new-node ; + +PRIVATE> + +: empty? ( tree -- ? ) + root>> f = ; inline + +! : walk-crit ( obj node -- ? ) +! ; + +: direction ( byte bits -- direction ) + bitor 1 + -8 shift ; + +> ] [ 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 ;