123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286 |
- ;;; SPDX-License-Identifier: MIT
- ;;; SPDX-FileCopyrightText: 2020 Wolfgang Corcoran-Mathe
- ;;;; SRFI 178 procedures that are just wrappers
- (define make-bitvector
- (case-lambda
- ((size) (W (make-u8vector size)))
- ((size bit) (W (make-u8vector size (I bit))))))
- (define bitvector-copy
- (case-lambda
- ((bvec) (W (u8vector-copy (U bvec))))
- ((bvec start) (W (u8vector-copy (U bvec) start)))
- ((bvec start end) (W (u8vector-copy (U bvec) start end)))))
- (define bitvector-reverse-copy
- (case-lambda
- ((bvec) (W (u8vector-reverse-copy (U bvec))))
- ((bvec start) (W (u8vector-reverse-copy (U bvec) start)))
- ((bvec start end) (W (u8vector-reverse-copy (U bvec) start end)))))
- (define (bitvector-append . bvecs)
- (bitvector-concatenate bvecs))
- (define (bitvector-concatenate bvecs)
- (W (u8vector-concatenate (map U bvecs))))
- (define (bitvector-append-subbitvectors . args)
- (W (apply u8vector-append-subvectors
- (map (lambda (x) (if (bitvector? x) (U x) x)) args))))
- (define (bitvector-empty? bvec)
- (eqv? 0 (u8vector-length (U bvec))))
- (define (bitvector=? . bvecs)
- (apply u8vector= (map U bvecs)))
- (define (bitvector-ref/int bvec i)
- (u8vector-ref (U bvec) i))
- (define (bitvector-ref/bool bvec i)
- (B (u8vector-ref (U bvec) i)))
- (define (bitvector-length bvec)
- (u8vector-length (U bvec)))
- (define (bitvector-take bvec n)
- (W (u8vector-take (U bvec) n)))
- (define (bitvector-take-right bvec n)
- (W (u8vector-take-right (U bvec) n)))
- (define (bitvector-drop bvec n)
- (W (u8vector-drop (U bvec) n)))
- (define (bitvector-drop-right bvec n)
- (W (u8vector-drop-right (U bvec) n)))
- (define (bitvector-segment bvec n)
- (unless (and (integer? n) (positive? n))
- (error "bitvector-segment: not a positive integer" n))
- (map W (u8vector-segment (U bvec) n)))
- (define bitvector-fold/int
- (case-lambda
- ((kons knil bvec)
- (u8vector-fold kons knil (U bvec))) ; fast path
- ((kons knil . bvecs)
- (apply u8vector-fold kons knil (map U bvecs)))))
- (define bitvector-fold/bool
- (case-lambda
- ((kons knil bvec)
- (u8vector-fold (lambda (x b) (kons x (B b))) ; fast path
- knil
- (U bvec)))
- ((kons knil . bvecs)
- (apply u8vector-fold
- (lambda (x . bits)
- (apply kons x (map bit->boolean bits)))
- knil
- (map U bvecs)))))
- (define bitvector-fold-right/int
- (case-lambda
- ((kons knil bvec)
- (u8vector-fold-right kons knil (U bvec))) ; fast path
- ((kons knil . bvecs)
- (apply u8vector-fold-right kons knil (map U bvecs)))))
- (define bitvector-fold-right/bool
- (case-lambda
- ((kons knil bvec)
- (u8vector-fold-right (lambda (x bit) (kons x (B bit))) ; fast path
- knil
- (U bvec)))
- ((kons knil . bvecs)
- (apply u8vector-fold-right
- (lambda (x . bits)
- (apply kons x (map bit->boolean bits)))
- knil
- (map U bvecs)))))
- (define bitvector-map/int
- (case-lambda
- ((f bvec)
- (W (u8vector-map f (U bvec)))) ; one-bitvector fast path
- ((f bvec1 bvec2)
- (%bitvector-map2/int f bvec1 bvec2)) ; two-bitvector fast path
- ((f . bvecs)
- (W (apply u8vector-map f (map U bvecs)))))) ; normal path
- ;; Tuned two-bitvector version, mainly for binary logical ops.
- (define (%bitvector-map2/int f bvec1 bvec2)
- (let ((u8vec1 (U bvec1))
- (u8vec2 (U bvec2)))
- (bitvector-unfold
- (lambda (i)
- (f (u8vector-ref u8vec1 i) (u8vector-ref u8vec2 i)))
- (bitvector-length bvec1))))
- (define bitvector-map/bool
- (case-lambda
- ((f bvec) ; one-bitvector fast path
- (W (u8vector-map (lambda (n) (I (f (B n)))) (U bvec))))
- ((f bvec1 bvec2) ; two-bitvector fast path
- (%bitvector-map2/int (lambda (n m) (I (f (B n) (B m)))) bvec1 bvec2))
- ((f . bvecs) ; normal path (ugh)
- (W (apply u8vector-map
- (lambda ns (I (apply f (map bit->boolean ns))))
- (map U bvecs))))))
- (define bitvector-map!/int
- (case-lambda
- ((f bvec)
- (u8vector-map! f (U bvec))) ; one-bitvector fast path
- ((f bvec1 bvec2)
- (%bitvector-map2!/int f bvec1 bvec2)) ; two-bitvector fast path
- ((f . bvecs)
- (apply u8vector-map! f (map U bvecs))))) ; normal path
- ;; Tuned two-bitvector version, mainly for binary logical ops.
- (define (%bitvector-map2!/int f bvec1 bvec2)
- (let ((len (bitvector-length bvec1))
- (u8vec1 (U bvec1))
- (u8vec2 (U bvec2)))
- (let lp ((i 0))
- (unless (>= i len)
- (u8vector-set! u8vec1 i (f (u8vector-ref u8vec1 i)
- (u8vector-ref u8vec2 i)))
- (lp (+ i 1))))
- bvec1))
- (define bitvector-map!/bool
- (case-lambda
- ((f bvec) ; one-bitvector fast path
- (u8vector-map! (lambda (n) (I (f (B n)))) (U bvec)))
- ((f bvec1 bvec2) ; two-bitvector fast path
- (%bitvector-map2!/int (lambda (n m) (I (f (B n) (B m)))) bvec1 bvec2))
- ((f . bvecs) ; normal path (ugh)
- (apply u8vector-map!
- (lambda ns (I (apply f (map bit->boolean ns))))
- (map U bvecs)))))
- (define bitvector-for-each/int
- (case-lambda
- ((f bvec)
- (u8vector-for-each f (U bvec))) ; fast path
- ((f . bvecs)
- (apply u8vector-for-each f (map U bvecs)))))
- (define bitvector-for-each/bool
- (case-lambda
- ((f bvec)
- (u8vector-for-each (lambda (n) (f (B n))) (U bvec))) ; fast path
- ((f . bvecs)
- (apply u8vector-for-each
- (lambda ns (apply f (map bit->boolean ns)))
- (map U bvecs)))))
- (define (bitvector-set! bvec i bit)
- (u8vector-set! (U bvec) i (I bit)))
- (define (bitvector-swap! bvec i j)
- (u8vector-swap! (U bvec) i j))
- (define bitvector-reverse!
- (case-lambda
- ((bvec)
- (u8vector-reverse! (U bvec)))
- ((bvec start)
- (u8vector-reverse! (U bvec) start))
- ((bvec start end)
- (u8vector-reverse! (U bvec) start end))))
- (define bitvector-copy!
- (case-lambda
- ((to at from)
- (u8vector-copy! (U to) at (U from)))
- ((to at from start)
- (u8vector-copy! (U to) at (U from) start))
- ((to at from start end)
- (u8vector-copy! (U to) at (U from) start end))))
- (define bitvector-reverse-copy!
- (case-lambda
- ((to at from)
- (u8vector-reverse-copy! (U to) at (U from)))
- ((to at from start)
- (u8vector-reverse-copy! (U to) at (U from) start))
- ((to at from start end)
- (u8vector-reverse-copy! (U to) at (U from) start end))))
- (define bitvector->list/int
- (case-lambda
- ((bvec)
- (u8vector->list (U bvec)))
- ((bvec start)
- (u8vector->list (U bvec) start))
- ((bvec start end)
- (u8vector->list (U bvec) start end))))
- (define bitvector->list/bool
- (case-lambda
- ((bvec)
- (map bit->boolean (u8vector->list (U bvec))))
- ((bvec start)
- (map bit->boolean (u8vector->list (U bvec) start)))
- ((bvec start end)
- (map bit->boolean (u8vector->list (U bvec) start end)))))
- (define reverse-bitvector->list/int
- (case-lambda
- ((bvec)
- (reverse-u8vector->list (U bvec)))
- ((bvec start)
- (reverse-u8vector->list (U bvec) start))
- ((bvec start end)
- (reverse-u8vector->list (U bvec) start end))))
- (define reverse-bitvector->list/bool
- (case-lambda
- ((bvec)
- (map bit->boolean (reverse-u8vector->list (U bvec))))
- ((bvec start)
- (map bit->boolean (reverse-u8vector->list (U bvec) start)))
- ((bvec start end)
- (map bit->boolean (reverse-u8vector->list (U bvec) start end)))))
- (define bitvector->vector/int
- (case-lambda
- ((bvec)
- (u8vector->vector (U bvec)))
- ((bvec start)
- (u8vector->vector (U bvec) start))
- ((bvec start end)
- (u8vector->vector (U bvec) start end))))
- (define bitvector->vector/bool
- (case-lambda
- ((bvec)
- (vector-map bit->boolean (u8vector->vector (U bvec))))
- ((bvec start)
- (vector-map bit->boolean (u8vector->vector (U bvec) start)))
- ((bvec start end)
- (vector-map bit->boolean (u8vector->vector (U bvec) start end)))))
- (define (list->bitvector list)
- (W (list->u8vector (map bit->integer list))))
- (define (reverse-list->bitvector list)
- (W (reverse-list->u8vector (map bit->integer list))))
- (define (bitvector . bits) (list->bitvector bits))
- (define vector->bitvector
- (case-lambda
- ((vec)
- (W (vector->u8vector (vector-map bit->integer vec))))
- ((vec start)
- (W (vector->u8vector (vector-map bit->integer vec) start)))
- ((vec start end)
- (W (vector->u8vector (vector-map bit->integer vec) start end)))))
|