fields.scm 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. ;;; SPDX-License-Identifier: MIT
  2. ;;; SPDX-FileCopyrightText: 2020 Wolfgang Corcoran-Mathe
  3. (define (bitvector-field-any? bvec start end)
  4. (let lp ((i start))
  5. (and (< i end)
  6. (or (bitvector-ref/bool bvec i)
  7. (lp (+ i 1))))))
  8. (define (bitvector-field-every? bvec start end)
  9. (let lp ((i start))
  10. (or (>= i end)
  11. (and (bitvector-ref/bool bvec i)
  12. (lp (+ i 1))))))
  13. (define (%bitvector-field-modify bvec bit start end)
  14. (bitvector-unfold
  15. (lambda (i)
  16. (if (and (>= i start) (< i end))
  17. bit
  18. (bitvector-ref/int bvec i)))
  19. (bitvector-length bvec)))
  20. (define (bitvector-field-clear bvec start end)
  21. (%bitvector-field-modify bvec 0 start end))
  22. (define (%bitvector-fill!/int bvec int start end)
  23. (u8vector-fill! (U bvec) int start end))
  24. (define (bitvector-field-clear! bvec start end)
  25. (%bitvector-fill!/int bvec 0 start end))
  26. (define (bitvector-field-set bvec start end)
  27. (%bitvector-field-modify bvec 1 start end))
  28. (define (bitvector-field-set! bvec start end)
  29. (%bitvector-fill!/int bvec 1 start end))
  30. (define (bitvector-field-replace dest source start end)
  31. (bitvector-unfold
  32. (lambda (i)
  33. (if (and (>= i start) (< i end))
  34. (bitvector-ref/int source (- i start))
  35. (bitvector-ref/int dest i)))
  36. (bitvector-length dest)))
  37. (define (bitvector-field-replace! dest source start end)
  38. (bitvector-copy! dest start source 0 (- end start)))
  39. (define (bitvector-field-replace-same dest source start end)
  40. (bitvector-unfold
  41. (lambda (i)
  42. (bitvector-ref/int (if (and (>= i start) (< i end))
  43. source
  44. dest)
  45. i))
  46. (bitvector-length dest)))
  47. (define (bitvector-field-replace-same! dest source start end)
  48. (bitvector-copy! dest start source start end))
  49. (define (bitvector-field-rotate bvec count start end)
  50. (if (zero? count)
  51. bvec
  52. (let ((field-len (- end start)))
  53. (bitvector-unfold
  54. (lambda (i)
  55. (if (and (>= i start) (< i end))
  56. (bitvector-ref/int
  57. bvec
  58. (+ start (floor-remainder (+ (- i start) count) field-len)))
  59. (bitvector-ref/int bvec i)))
  60. (bitvector-length bvec)))))
  61. (define (bitvector-field-flip bvec start end)
  62. (bitvector-unfold
  63. (lambda (i)
  64. (I (if (and (>= i start) (< i end))
  65. (not (bitvector-ref/bool bvec i))
  66. (bitvector-ref/bool bvec i))))
  67. (bitvector-length bvec)))
  68. (define (bitvector-field-flip! bvec start end)
  69. (let lp ((i start))
  70. (unless (>= i end)
  71. (bitvector-set! bvec i (not (bitvector-ref/bool bvec i)))
  72. (lp (+ i 1)))))