z-set.scm 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. ; Copyright (c) 1993-2008 by Richard Kelsey. See file COPYING.
  2. ; Sets of integers implemented as integers.
  3. (define (make-empty-integer-set)
  4. 0)
  5. (define (add-to-integer-set set integer)
  6. (bitwise-ior set (arithmetic-shift 1 integer)))
  7. (define integer-set-chunk-size 24)
  8. (define word-mask (- (arithmetic-shift 1 integer-set-chunk-size) 1))
  9. ; The nested loop reduces the amount of bignum arithmetic needed (and reduces
  10. ; the time by as much as a factor of 10).
  11. (define (map-over-integer-set proc set)
  12. (do ((set set (arithmetic-shift set (- integer-set-chunk-size)))
  13. (i 0 (+ i integer-set-chunk-size))
  14. (l '() (do ((set (bitwise-and set word-mask) (arithmetic-shift set -1))
  15. (j 0 (+ j 1))
  16. (l l (if (odd? set)
  17. (cons (proc (+ i j)) l)
  18. l)))
  19. ((or (= 0 set) (>= j integer-set-chunk-size))
  20. l))))
  21. ((= 0 set)
  22. (reverse l))))
  23. (define integer-set-and bitwise-and)
  24. (define integer-set-ior bitwise-ior)
  25. (define integer-set-not bitwise-not)
  26. (define (integer-set-subtract set1 set2)
  27. (bitwise-and set1 (bitwise-not set2)))
  28. (define integer-set-equal? =)