heaps: cleanup some code, faster heap-compare.
parent
4e04107e4f
commit
feb4dcae9a
|
@ -64,14 +64,15 @@ M: heap heap-size ( heap -- n )
|
||||||
[ right ] dip data-nth ; inline
|
[ right ] dip data-nth ; inline
|
||||||
|
|
||||||
: data-set-nth ( entry n heap -- )
|
: data-set-nth ( entry n heap -- )
|
||||||
[ [ >>index drop ] [ ] 2bi ] dip
|
[ [ swap index<< ] 2keep ] dip
|
||||||
data>> set-nth-unsafe ; inline
|
data>> set-nth-unsafe ; inline
|
||||||
|
|
||||||
: data-push ( entry heap -- n )
|
: data-push ( entry heap -- n )
|
||||||
dup heap-size [
|
dup heap-size [
|
||||||
swap 2dup data>> ensure 2drop data-set-nth
|
swap
|
||||||
] [
|
[ data>> ensure 2drop ]
|
||||||
] bi ; inline
|
[ data-set-nth ] 2bi
|
||||||
|
] keep ; inline
|
||||||
|
|
||||||
: data-first ( heap -- entry )
|
: data-first ( heap -- entry )
|
||||||
data>> first ; inline
|
data>> first ; inline
|
||||||
|
@ -82,12 +83,12 @@ M: heap heap-size ( heap -- n )
|
||||||
|
|
||||||
GENERIC: heap-compare ( entry1 entry2 heap -- ? )
|
GENERIC: heap-compare ( entry1 entry2 heap -- ? )
|
||||||
|
|
||||||
: (heap-compare) ( entry1 entry2 heap -- <=> )
|
: entry<=> ( entry1 entry2 -- <=> )
|
||||||
drop [ key>> ] compare ; inline
|
{ entry entry } declare [ key>> ] compare ; inline
|
||||||
|
|
||||||
M: min-heap heap-compare (heap-compare) +gt+ eq? ;
|
M: min-heap heap-compare drop entry<=> +gt+ eq? ;
|
||||||
|
|
||||||
M: max-heap heap-compare (heap-compare) +lt+ eq? ;
|
M: max-heap heap-compare drop entry<=> +lt+ eq? ;
|
||||||
|
|
||||||
: heap-bounds-check? ( m heap -- ? )
|
: heap-bounds-check? ( m heap -- ? )
|
||||||
heap-size >= ; inline
|
heap-size >= ; inline
|
||||||
|
@ -135,12 +136,13 @@ DEFER: down-heap
|
||||||
] if ; inline recursive
|
] if ; inline recursive
|
||||||
|
|
||||||
: down-heap ( m heap -- )
|
: down-heap ( m heap -- )
|
||||||
2dup left-bounds-check? [ 2drop ] [ (down-heap) ] if ; inline recursive
|
2dup left-bounds-check?
|
||||||
|
[ 2drop ] [ (down-heap) ] if ; inline recursive
|
||||||
|
|
||||||
PRIVATE>
|
PRIVATE>
|
||||||
|
|
||||||
M: heap heap-push* ( value key heap -- entry )
|
M: heap heap-push* ( value key heap -- entry )
|
||||||
[ <entry> dup ] [ data-push ] [ ] tri up-heap ;
|
[ <entry> dup ] [ data-push ] [ up-heap ] tri ;
|
||||||
|
|
||||||
: heap-push ( value key heap -- ) heap-push* drop ;
|
: heap-push ( value key heap -- ) heap-push* drop ;
|
||||||
|
|
||||||
|
@ -163,22 +165,20 @@ M: bad-heap-delete summary
|
||||||
index>> { fixnum } declare ; inline
|
index>> { fixnum } declare ; inline
|
||||||
|
|
||||||
M: heap heap-delete ( entry heap -- )
|
M: heap heap-delete ( entry heap -- )
|
||||||
[ entry>index ] [ ] bi
|
[ entry>index ] keep
|
||||||
2dup heap-size 1 - = [
|
2dup heap-size 1 - = [
|
||||||
nip data>> pop*
|
nip data>> pop*
|
||||||
] [
|
] [
|
||||||
[ nip data>> pop ]
|
[ nip data>> pop ]
|
||||||
[ data-set-nth ]
|
[ data-set-nth ]
|
||||||
[ ] 2tri
|
[ down-heap ] 2tri
|
||||||
down-heap
|
|
||||||
] if ;
|
] if ;
|
||||||
|
|
||||||
M: heap heap-pop* ( heap -- )
|
M: heap heap-pop* ( heap -- )
|
||||||
[ data-first ] keep heap-delete ;
|
[ data-first ] keep heap-delete ;
|
||||||
|
|
||||||
M: heap heap-pop ( heap -- value key )
|
M: heap heap-pop ( heap -- value key )
|
||||||
[ data-first ] keep
|
[ data-first dup ] keep heap-delete >entry< ;
|
||||||
[ heap-delete ] [ drop ] 2bi >entry< ;
|
|
||||||
|
|
||||||
: heap-pop-all ( heap -- alist )
|
: heap-pop-all ( heap -- alist )
|
||||||
[ dup heap-empty? not ]
|
[ dup heap-empty? not ]
|
||||||
|
|
Loading…
Reference in New Issue