wrappers.scm 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  1. ;;; SPDX-License-Identifier: MIT
  2. ;;; SPDX-FileCopyrightText: 2020 Wolfgang Corcoran-Mathe
  3. ;;;; SRFI 178 procedures that are just wrappers
  4. (define make-bitvector
  5. (case-lambda
  6. ((size) (W (make-u8vector size)))
  7. ((size bit) (W (make-u8vector size (I bit))))))
  8. (define bitvector-copy
  9. (case-lambda
  10. ((bvec) (W (u8vector-copy (U bvec))))
  11. ((bvec start) (W (u8vector-copy (U bvec) start)))
  12. ((bvec start end) (W (u8vector-copy (U bvec) start end)))))
  13. (define bitvector-reverse-copy
  14. (case-lambda
  15. ((bvec) (W (u8vector-reverse-copy (U bvec))))
  16. ((bvec start) (W (u8vector-reverse-copy (U bvec) start)))
  17. ((bvec start end) (W (u8vector-reverse-copy (U bvec) start end)))))
  18. (define (bitvector-append . bvecs)
  19. (bitvector-concatenate bvecs))
  20. (define (bitvector-concatenate bvecs)
  21. (W (u8vector-concatenate (map U bvecs))))
  22. (define (bitvector-append-subbitvectors . args)
  23. (W (apply u8vector-append-subvectors
  24. (map (lambda (x) (if (bitvector? x) (U x) x)) args))))
  25. (define (bitvector-empty? bvec)
  26. (eqv? 0 (u8vector-length (U bvec))))
  27. (define (bitvector=? . bvecs)
  28. (apply u8vector= (map U bvecs)))
  29. (define (bitvector-ref/int bvec i)
  30. (u8vector-ref (U bvec) i))
  31. (define (bitvector-ref/bool bvec i)
  32. (B (u8vector-ref (U bvec) i)))
  33. (define (bitvector-length bvec)
  34. (u8vector-length (U bvec)))
  35. (define (bitvector-take bvec n)
  36. (W (u8vector-take (U bvec) n)))
  37. (define (bitvector-take-right bvec n)
  38. (W (u8vector-take-right (U bvec) n)))
  39. (define (bitvector-drop bvec n)
  40. (W (u8vector-drop (U bvec) n)))
  41. (define (bitvector-drop-right bvec n)
  42. (W (u8vector-drop-right (U bvec) n)))
  43. (define (bitvector-segment bvec n)
  44. (unless (and (integer? n) (positive? n))
  45. (error "bitvector-segment: not a positive integer" n))
  46. (map W (u8vector-segment (U bvec) n)))
  47. (define bitvector-fold/int
  48. (case-lambda
  49. ((kons knil bvec)
  50. (u8vector-fold kons knil (U bvec))) ; fast path
  51. ((kons knil . bvecs)
  52. (apply u8vector-fold kons knil (map U bvecs)))))
  53. (define bitvector-fold/bool
  54. (case-lambda
  55. ((kons knil bvec)
  56. (u8vector-fold (lambda (x b) (kons x (B b))) ; fast path
  57. knil
  58. (U bvec)))
  59. ((kons knil . bvecs)
  60. (apply u8vector-fold
  61. (lambda (x . bits)
  62. (apply kons x (map bit->boolean bits)))
  63. knil
  64. (map U bvecs)))))
  65. (define bitvector-fold-right/int
  66. (case-lambda
  67. ((kons knil bvec)
  68. (u8vector-fold-right kons knil (U bvec))) ; fast path
  69. ((kons knil . bvecs)
  70. (apply u8vector-fold-right kons knil (map U bvecs)))))
  71. (define bitvector-fold-right/bool
  72. (case-lambda
  73. ((kons knil bvec)
  74. (u8vector-fold-right (lambda (x bit) (kons x (B bit))) ; fast path
  75. knil
  76. (U bvec)))
  77. ((kons knil . bvecs)
  78. (apply u8vector-fold-right
  79. (lambda (x . bits)
  80. (apply kons x (map bit->boolean bits)))
  81. knil
  82. (map U bvecs)))))
  83. (define bitvector-map/int
  84. (case-lambda
  85. ((f bvec)
  86. (W (u8vector-map f (U bvec)))) ; one-bitvector fast path
  87. ((f bvec1 bvec2)
  88. (%bitvector-map2/int f bvec1 bvec2)) ; two-bitvector fast path
  89. ((f . bvecs)
  90. (W (apply u8vector-map f (map U bvecs)))))) ; normal path
  91. ;; Tuned two-bitvector version, mainly for binary logical ops.
  92. (define (%bitvector-map2/int f bvec1 bvec2)
  93. (let ((u8vec1 (U bvec1))
  94. (u8vec2 (U bvec2)))
  95. (bitvector-unfold
  96. (lambda (i)
  97. (f (u8vector-ref u8vec1 i) (u8vector-ref u8vec2 i)))
  98. (bitvector-length bvec1))))
  99. (define bitvector-map/bool
  100. (case-lambda
  101. ((f bvec) ; one-bitvector fast path
  102. (W (u8vector-map (lambda (n) (I (f (B n)))) (U bvec))))
  103. ((f bvec1 bvec2) ; two-bitvector fast path
  104. (%bitvector-map2/int (lambda (n m) (I (f (B n) (B m)))) bvec1 bvec2))
  105. ((f . bvecs) ; normal path (ugh)
  106. (W (apply u8vector-map
  107. (lambda ns (I (apply f (map bit->boolean ns))))
  108. (map U bvecs))))))
  109. (define bitvector-map!/int
  110. (case-lambda
  111. ((f bvec)
  112. (u8vector-map! f (U bvec))) ; one-bitvector fast path
  113. ((f bvec1 bvec2)
  114. (%bitvector-map2!/int f bvec1 bvec2)) ; two-bitvector fast path
  115. ((f . bvecs)
  116. (apply u8vector-map! f (map U bvecs))))) ; normal path
  117. ;; Tuned two-bitvector version, mainly for binary logical ops.
  118. (define (%bitvector-map2!/int f bvec1 bvec2)
  119. (let ((len (bitvector-length bvec1))
  120. (u8vec1 (U bvec1))
  121. (u8vec2 (U bvec2)))
  122. (let lp ((i 0))
  123. (unless (>= i len)
  124. (u8vector-set! u8vec1 i (f (u8vector-ref u8vec1 i)
  125. (u8vector-ref u8vec2 i)))
  126. (lp (+ i 1))))
  127. bvec1))
  128. (define bitvector-map!/bool
  129. (case-lambda
  130. ((f bvec) ; one-bitvector fast path
  131. (u8vector-map! (lambda (n) (I (f (B n)))) (U bvec)))
  132. ((f bvec1 bvec2) ; two-bitvector fast path
  133. (%bitvector-map2!/int (lambda (n m) (I (f (B n) (B m)))) bvec1 bvec2))
  134. ((f . bvecs) ; normal path (ugh)
  135. (apply u8vector-map!
  136. (lambda ns (I (apply f (map bit->boolean ns))))
  137. (map U bvecs)))))
  138. (define bitvector-for-each/int
  139. (case-lambda
  140. ((f bvec)
  141. (u8vector-for-each f (U bvec))) ; fast path
  142. ((f . bvecs)
  143. (apply u8vector-for-each f (map U bvecs)))))
  144. (define bitvector-for-each/bool
  145. (case-lambda
  146. ((f bvec)
  147. (u8vector-for-each (lambda (n) (f (B n))) (U bvec))) ; fast path
  148. ((f . bvecs)
  149. (apply u8vector-for-each
  150. (lambda ns (apply f (map bit->boolean ns)))
  151. (map U bvecs)))))
  152. (define (bitvector-set! bvec i bit)
  153. (u8vector-set! (U bvec) i (I bit)))
  154. (define (bitvector-swap! bvec i j)
  155. (u8vector-swap! (U bvec) i j))
  156. (define bitvector-reverse!
  157. (case-lambda
  158. ((bvec)
  159. (u8vector-reverse! (U bvec)))
  160. ((bvec start)
  161. (u8vector-reverse! (U bvec) start))
  162. ((bvec start end)
  163. (u8vector-reverse! (U bvec) start end))))
  164. (define bitvector-copy!
  165. (case-lambda
  166. ((to at from)
  167. (u8vector-copy! (U to) at (U from)))
  168. ((to at from start)
  169. (u8vector-copy! (U to) at (U from) start))
  170. ((to at from start end)
  171. (u8vector-copy! (U to) at (U from) start end))))
  172. (define bitvector-reverse-copy!
  173. (case-lambda
  174. ((to at from)
  175. (u8vector-reverse-copy! (U to) at (U from)))
  176. ((to at from start)
  177. (u8vector-reverse-copy! (U to) at (U from) start))
  178. ((to at from start end)
  179. (u8vector-reverse-copy! (U to) at (U from) start end))))
  180. (define bitvector->list/int
  181. (case-lambda
  182. ((bvec)
  183. (u8vector->list (U bvec)))
  184. ((bvec start)
  185. (u8vector->list (U bvec) start))
  186. ((bvec start end)
  187. (u8vector->list (U bvec) start end))))
  188. (define bitvector->list/bool
  189. (case-lambda
  190. ((bvec)
  191. (map bit->boolean (u8vector->list (U bvec))))
  192. ((bvec start)
  193. (map bit->boolean (u8vector->list (U bvec) start)))
  194. ((bvec start end)
  195. (map bit->boolean (u8vector->list (U bvec) start end)))))
  196. (define reverse-bitvector->list/int
  197. (case-lambda
  198. ((bvec)
  199. (reverse-u8vector->list (U bvec)))
  200. ((bvec start)
  201. (reverse-u8vector->list (U bvec) start))
  202. ((bvec start end)
  203. (reverse-u8vector->list (U bvec) start end))))
  204. (define reverse-bitvector->list/bool
  205. (case-lambda
  206. ((bvec)
  207. (map bit->boolean (reverse-u8vector->list (U bvec))))
  208. ((bvec start)
  209. (map bit->boolean (reverse-u8vector->list (U bvec) start)))
  210. ((bvec start end)
  211. (map bit->boolean (reverse-u8vector->list (U bvec) start end)))))
  212. (define bitvector->vector/int
  213. (case-lambda
  214. ((bvec)
  215. (u8vector->vector (U bvec)))
  216. ((bvec start)
  217. (u8vector->vector (U bvec) start))
  218. ((bvec start end)
  219. (u8vector->vector (U bvec) start end))))
  220. (define bitvector->vector/bool
  221. (case-lambda
  222. ((bvec)
  223. (vector-map bit->boolean (u8vector->vector (U bvec))))
  224. ((bvec start)
  225. (vector-map bit->boolean (u8vector->vector (U bvec) start)))
  226. ((bvec start end)
  227. (vector-map bit->boolean (u8vector->vector (U bvec) start end)))))
  228. (define (list->bitvector list)
  229. (W (list->u8vector (map bit->integer list))))
  230. (define (reverse-list->bitvector list)
  231. (W (reverse-list->u8vector (map bit->integer list))))
  232. (define (bitvector . bits) (list->bitvector bits))
  233. (define vector->bitvector
  234. (case-lambda
  235. ((vec)
  236. (W (vector->u8vector (vector-map bit->integer vec))))
  237. ((vec start)
  238. (W (vector->u8vector (vector-map bit->integer vec) start)))
  239. ((vec start end)
  240. (W (vector->u8vector (vector-map bit->integer vec) start end)))))