classes.union: unions of built-in types now have more efficient predicates. Fixes #292

db4
Slava Pestov 2011-10-29 17:09:56 -07:00
parent e5a308d56a
commit c14f0ef698
2 changed files with 59 additions and 17 deletions

View File

@ -1,9 +1,10 @@
USING: alien arrays definitions generic assocs hashtables io
kernel math namespaces parser prettyprint sequences strings
tools.test vectors words quotations classes
USING: accessors alien arrays definitions generic assocs
hashtables io kernel math namespaces parser prettyprint
sequences strings tools.test vectors words quotations classes
classes.private classes.union classes.mixin classes.predicate
classes.algebra source-files compiler.units kernel.private
sorting vocabs io.streams.string eval see ;
classes.algebra classes.union.private source-files
compiler.units kernel.private sorting vocabs io.streams.string
eval see math.private ;
IN: classes.union.tests
! DEFER: bah
@ -49,6 +50,8 @@ UNION: empty-union-2 ;
M: empty-union-2 empty-union-test ;
[ [ drop f ] ] [ \ empty-union-1? def>> ] unit-test
! Redefining a class didn't update containing unions
UNION: redefine-bug-1 fixnum ;
@ -90,3 +93,17 @@ M: a-union test-generic ;
[ ] [ [ \ a-tuple forget-class ] with-compilation-unit ] unit-test
[ t ] [ \ test-generic "methods" word-prop assoc-empty? ] unit-test
! Fast union predicates
[ t ] [ integer union-of-builtins? ] unit-test
[ t ] [ \ integer? def>> \ fixnum-bitand swap member? ] unit-test
[ ] [ "IN: classes.union.tests USE: math UNION: fast-union-1 fixnum ; UNION: fast-union-2 fast-union-1 bignum ;" eval( -- ) ] unit-test
[ t ] [ "fast-union-2?" "classes.union.tests" lookup def>> \ fixnum-bitand swap member? ] unit-test
[ ] [ "IN: classes.union.tests USE: vectors UNION: fast-union-1 vector ;" eval( -- ) ] unit-test
[ f ] [ "fast-union-2?" "classes.union.tests" lookup def>> \ fixnum-bitand swap member? ] unit-test

View File

@ -1,8 +1,9 @@
! Copyright (C) 2004, 2010 Slava Pestov.
! Copyright (C) 2004, 2011 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
USING: words sequences kernel assocs combinators classes
classes.private classes.algebra classes.algebra.private
namespaces arrays math quotations definitions ;
classes.builtin kernel.private math.private namespaces arrays
math quotations definitions ;
IN: classes.union
PREDICATE: union-class < class
@ -10,18 +11,42 @@ PREDICATE: union-class < class
<PRIVATE
: union-predicate-quot ( members -- quot )
[
[ drop f ]
] [
unclip "predicate" word-prop swap [
"predicate" word-prop [ dup ] prepend
[ drop t ]
] { } map>assoc alist>quot
] if-empty ;
GENERIC: union-of-builtins? ( class -- ? )
M: builtin-class union-of-builtins? drop t ;
M: union-class union-of-builtins?
members [ union-of-builtins? ] all? ;
M: class union-of-builtins?
drop f ;
: fast-union-mask ( class -- n )
[ 0 ] dip flatten-class
[ drop class>type 2^ bitor ] assoc-each ;
: empty-union-predicate-quot ( class -- quot )
drop [ drop f ] ;
: fast-union-predicate-quot ( class -- quot )
fast-union-mask 1quotation
[ tag 1 swap fixnum-shift-fast ]
[ fixnum-bitand 0 eq? not ]
surround ;
: slow-union-predicate-quot ( class -- quot )
members [ "predicate" word-prop ] map unclip swap
[ [ dup ] prepend [ drop t ] ] { } map>assoc alist>quot ;
: union-predicate-quot ( class -- quot )
{
{ [ dup members empty? ] [ empty-union-predicate-quot ] }
{ [ dup union-of-builtins? ] [ fast-union-predicate-quot ] }
[ slow-union-predicate-quot ]
} cond ;
: define-union-predicate ( class -- )
dup members union-predicate-quot define-predicate ;
dup union-predicate-quot define-predicate ;
M: union-class update-class define-union-predicate ;