deprecate generalized vectors in favor of arrays
[bpt/guile.git] / module / srfi / srfi-4 / gnu.scm
1 ;;; Extensions to SRFI-4
2
3 ;; Copyright (C) 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc.
4 ;;
5 ;; This library is free software; you can redistribute it and/or
6 ;; modify it under the terms of the GNU Lesser General Public
7 ;; License as published by the Free Software Foundation; either
8 ;; version 3 of the License, or (at your option) any later version.
9 ;;
10 ;; This library is distributed in the hope that it will be useful,
11 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
12 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 ;; Lesser General Public License for more details.
14 ;;
15 ;; You should have received a copy of the GNU Lesser General Public
16 ;; License along with this library; if not, write to the Free Software
17 ;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18
19 ;;; Commentary:
20
21 ;; Extensions to SRFI-4. Fully documented in the Guile Reference Manual.
22
23 ;;; Code:
24
25 (define-module (srfi srfi-4 gnu)
26 #:use-module (rnrs bytevectors)
27 #:use-module (srfi srfi-4)
28 #:export (;; Complex numbers with 32- and 64-bit components.
29 c32vector? make-c32vector c32vector c32vector-length c32vector-ref
30 c32vector-set! c32vector->list list->c32vector
31
32 c64vector? make-c64vector c64vector c64vector-length c64vector-ref
33 c64vector-set! c64vector->list list->c64vector
34
35 make-srfi-4-vector
36
37 ;; Somewhat polymorphic conversions.
38 any->u8vector any->s8vector any->u16vector any->s16vector
39 any->u32vector any->s32vector any->u64vector any->s64vector
40 any->f32vector any->f64vector any->c32vector any->c64vector))
41
42
43 (define make-srfi-4-vector (@@ (srfi srfi-4) make-srfi-4-vector))
44
45 ;; Need quasisyntax to do this effectively using syntax-case
46 (define-macro (define-bytevector-type tag infix size)
47 `(begin
48 (define (,(symbol-append tag 'vector?) obj)
49 (and (uniform-vector? obj)
50 (eq? (uniform-vector-element-type obj) ',tag)))
51 (define (,(symbol-append 'make- tag 'vector) len . fill)
52 (apply make-srfi-4-vector ',tag len fill))
53 (define (,(symbol-append tag 'vector-length) v)
54 (let ((len (* (uniform-vector-length v)
55 (uniform-vector-element-size v)
56 (/ ,size))))
57 (if (integer? len)
58 len
59 (error "fractional length" v ',tag ,size))))
60 (define (,(symbol-append tag 'vector) . elts)
61 (,(symbol-append 'list-> tag 'vector) elts))
62 (define (,(symbol-append 'list-> tag 'vector) elts)
63 (let* ((len (length elts))
64 (v (,(symbol-append 'make- tag 'vector) len)))
65 (let lp ((i 0) (elts elts))
66 (if (and (< i len) (pair? elts))
67 (begin
68 (,(symbol-append tag 'vector-set!) v i (car elts))
69 (lp (1+ i) (cdr elts)))
70 v))))
71 (define (,(symbol-append tag 'vector->list) v)
72 (let lp ((i (1- (,(symbol-append tag 'vector-length) v))) (elts '()))
73 (if (< i 0)
74 elts
75 (lp (1- i) (cons (,(symbol-append tag 'vector-ref) v i) elts)))))
76 (define (,(symbol-append tag 'vector-ref) v i)
77 (,(symbol-append 'bytevector- infix '-ref) v (* i ,size)))
78 (define (,(symbol-append tag 'vector-set!) v i x)
79 (,(symbol-append 'bytevector- infix '-set!) v (* i ,size) x))
80 (define (,(symbol-append tag 'vector-set!) v i x)
81 (,(symbol-append 'bytevector- infix '-set!) v (* i ,size) x))))
82
83 (define (bytevector-c32-native-ref v i)
84 (make-rectangular (bytevector-ieee-single-native-ref v i)
85 (bytevector-ieee-single-native-ref v (+ i 4))))
86 (define (bytevector-c32-native-set! v i x)
87 (bytevector-ieee-single-native-set! v i (real-part x))
88 (bytevector-ieee-single-native-set! v (+ i 4) (imag-part x)))
89 (define (bytevector-c64-native-ref v i)
90 (make-rectangular (bytevector-ieee-double-native-ref v i)
91 (bytevector-ieee-double-native-ref v (+ i 8))))
92 (define (bytevector-c64-native-set! v i x)
93 (bytevector-ieee-double-native-set! v i (real-part x))
94 (bytevector-ieee-double-native-set! v (+ i 8) (imag-part x)))
95 (define-bytevector-type c32 c32-native 8)
96 (define-bytevector-type c64 c64-native 16)
97
98 (define-macro (define-any->vector . tags)
99 `(begin
100 ,@(map (lambda (tag)
101 `(define (,(symbol-append 'any-> tag 'vector) obj)
102 (cond ((,(symbol-append tag 'vector?) obj) obj)
103 ((pair? obj) (,(symbol-append 'list-> tag 'vector) obj))
104 ((and (array? obj) (eqv? 1 (array-rank obj)))
105 (let* ((len (array-length obj))
106 (v (,(symbol-append 'make- tag 'vector) len)))
107 (let lp ((i 0))
108 (if (< i len)
109 (begin
110 (,(symbol-append tag 'vector-set!)
111 v i (array-ref obj i))
112 (lp (1+ i)))
113 v))))
114 (else (scm-error 'wrong-type-arg #f "" '() (list obj))))))
115 tags)))
116
117 (define-any->vector u8 s8 u16 s16 u32 s32 u64 s64 f32 f64 c32 c64)