hash-sets: faster subset? and set= when both are hash-sets.

db4
John Benediktsson 2013-03-26 16:11:06 -07:00
parent 200e37671f
commit ac8473e0ea
1 changed files with 28 additions and 2 deletions

View File

@ -136,12 +136,24 @@ INSTANCE: hash-set set
! Overrides for performance
<PRIVATE
: and-tombstones ( quot: ( elt -- ? ) -- quot: ( elt -- ? ) )
[ if ] curry [ dup tombstone? [ drop t ] ] prepose ; inline
: not-tombstones ( quot: ( elt -- ? ) -- quot: ( elt -- ? ) )
[ if ] curry [ dup tombstone? [ drop f ] ] prepose ; inline
: array/tester ( hash-set1 hash-set2 -- array quot )
[ array>> ] dip [ in? ] curry ; inline
PRIVATE>
M: hash-set intersect (intersect) >hash-set ;
M: hash-set intersects?
over hash-set? [
small/large [ array>> ] dip [ in? ] curry
[ if ] curry [ dup tombstone? [ drop t ] ] prepose any?
small/large array/tester not-tombstones any?
] [ small/large sequence/tester any? ] if ;
M: hash-set union
@ -154,6 +166,20 @@ M: hash-set union
M: hash-set diff (diff) >hash-set ;
M: hash-set subset?
over hash-set? [
2dup [ cardinality ] bi@ > [ 2drop f ] [
array/tester and-tombstones all?
] if
] [ call-next-method ] if ;
M: hash-set set=
over hash-set? [
2dup [ cardinality ] bi@ eq? [
array/tester and-tombstones all?
] [ 2drop f ] if
] [ call-next-method ] if ;
! Default methods
M: f fast-set drop 0 <hash-set> ;