Mercurial > hg > audiodb
comparison bindings/sb-alien/interface.lisp @ 636:9cda689dcc20
Use an appropriate data copier for the platform's bit width
Dispatch on sb-vm:n-word-bits, though I think sbcl itself should
probably define a system-area-double-float-copy bit-bash function.
This also fixes a thinko, where only half of the times data was being
copied, even on 64-bit platforms. Sheesh. Fixes #32
author | mas01cr |
---|---|
date | Tue, 29 Sep 2009 16:23:42 +0000 |
parents | 641daceae79c |
children | 368c8c72e723 |
comparison
equal
deleted
inserted
replaced
635:641daceae79c | 636:9cda689dcc20 |
---|---|
114 (nvectors (slot d 'nvectors)) | 114 (nvectors (slot d 'nvectors)) |
115 (data (make-array (list nvectors dim) :element-type 'double-float)) | 115 (data (make-array (list nvectors dim) :element-type 'double-float)) |
116 (vector (sb-ext:array-storage-vector data)) | 116 (vector (sb-ext:array-storage-vector data)) |
117 ;; FIXME: this shares KEY | 117 ;; FIXME: this shares KEY |
118 (datum (%make-datum :key key :data data))) | 118 (datum (%make-datum :key key :data data))) |
119 (sb-kernel:system-area-ub64-copy (alien-sap (slot d 'data)) 0 | 119 (flet ((system-area-dfloat-copy (from-sap from-offset to-sap to-offset ndfloats) |
120 (sb-sys:vector-sap vector) 0 | 120 ;; FIXME: the horror |
121 (* dim nvectors)) | 121 #+#.(cl:if (cl:= sb-vm:n-word-bits 64) '(:and) '(:or)) |
122 (unless (null-alien (slot d 'times)) | 122 (sb-kernel:system-area-ub64-copy |
123 (let ((times (make-array nvectors :element-type 'double-float))) | 123 from-sap from-offset to-sap to-offset ndfloats) |
124 (sb-kernel:system-area-ub64-copy (alien-sap (slot d 'times)) 0 | 124 #-#.(cl:if (cl:= sb-vm:n-word-bits 64) '(:and) '(:or)) |
125 (sb-sys:vector-sap times) 0 | 125 (sb-kernel:system-area-ub32-copy |
126 nvectors) | 126 from-sap from-offset to-sap to-offset (* 2 ndfloats)))) |
127 (setf (datum-times datum) times))) | 127 (system-area-dfloat-copy (alien-sap (slot d 'data)) 0 |
128 (unless (null-alien (slot d 'power)) | 128 (sb-sys:vector-sap vector) 0 |
129 (let ((power (make-array nvectors :element-type 'double-float))) | 129 (* dim nvectors)) |
130 (sb-kernel:system-area-ub64-copy (alien-sap (slot d 'power)) 0 | 130 (unless (null-alien (slot d 'times)) |
131 (sb-sys:vector-sap power) 0 | 131 (let ((times (make-array (* 2 nvectors) :element-type 'double-float))) |
132 nvectors) | 132 (system-area-dfloat-copy (alien-sap (slot d 'times)) 0 |
133 (setf (datum-power datum) power))) | 133 (sb-sys:vector-sap times) 0 |
134 (%free-datum (slot-value db 'alien) (addr d)) | 134 (* 2 nvectors)) |
135 datum))) | 135 (setf (datum-times datum) times))) |
136 (unless (null-alien (slot d 'power)) | |
137 (let ((power (make-array nvectors :element-type 'double-float))) | |
138 (system-area-dfloat-copy (alien-sap (slot d 'power)) 0 | |
139 (sb-sys:vector-sap power) 0 | |
140 nvectors) | |
141 (setf (datum-power datum) power))) | |
142 (%free-datum (slot-value db 'alien) (addr d)) | |
143 datum)))) | |
136 | 144 |
137 (defstruct result | 145 (defstruct result |
138 (key "" :type string) | 146 (key "" :type string) |
139 (distance 0d0 :type double-float) | 147 (distance 0d0 :type double-float) |
140 (qpos 0 :type (and unsigned-byte fixnum)) | 148 (qpos 0 :type (and unsigned-byte fixnum)) |