/* [<][>][^][v][top][bottom][index][help] */
DEFINITIONS
This source file includes following definitions.
- ScmUVector
- ScmS8Vector
- ScmU8Vector
- ScmS16Vector
- ScmU16Vector
- ScmS32Vector
- ScmU32Vector
- ScmS64Vector
- ScmU64Vector
- ScmF32Vector
- ScmF64Vector
1 /*
2 * uvector - uniform (homogeneous) numeric vector types (SRFI-4)
3 *
4 * Copyright (c) 1999-2004 Shiro Kawai, All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 *
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 *
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 *
17 * 3. Neither the name of the authors nor the names of its contributors
18 * may be used to endorse or promote products derived from this
19 * software without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
27 * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
28 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
29 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
30 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
31 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 *
33 * This file is automatically generated. DO NOT EDIT.
34 * $Id: uvector.h.tmpl,v 1.3 2004/11/11 12:14:43 shirok Exp $
35 */
36
37 #ifndef GAUCHE_UVECT_H
38 #define GAUCHE_UVECT_H
39
40 #include <gauche.h>
41
42 /*
43 * This header file is for other extension modules which need
44 * to access uniform vectors in C level.
45 */
46
47 /*
48 * Common structure for generic uvector operation
49 */
50 typedef struct ScmUVectorRec {
51 SCM_HEADER;
52 unsigned int immutable : 1;
53 int size : (SIZEOF_INT*CHAR_BIT-1);
54 void *owner;
55 void *elements;
56 } ScmUVector;
57
58 SCM_CLASS_DECL(Scm_UVectorClass);
59 #define SCM_CLASS_UVECTOR (&Scm_UVectorClass)
60 #define SCM_UVECTOR(obj) ((ScmUVector*)(obj))
61 #define SCM_UVECTORP(obj) Scm_TypeP(obj, SCM_CLASS_UVECTOR)
62 #define SCM_UVECTOR_SIZE(obj) (SCM_UVECTOR(obj)->size)
63 #define SCM_UVECTOR_IMMUTABLE_P(obj) (SCM_UVECTOR(obj)->immutable)
64 #define SCM_UVECTOR_OWNER(obj) (SCM_UVECTOR(obj)->owner)
65 #define SCM_UVECTOR_ELEMENTS(obj) (SCM_UVECTOR(obj)->elements)
66
67 #define SCM_UVECTOR_CHECK_MUTABLE(obj) \
68 do { if (SCM_UVECTOR_IMMUTABLE_P(obj)) { \
69 Scm_Error("uniform vector is immutable: %S", obj); \
70 }} while (0)
71
72 extern int Scm_UVectorElementSize(ScmClass *klass);
73 extern ScmObj Scm_MakeUVector(ScmClass *klass, int size, void *init);
74 extern ScmObj Scm_MakeUVectorFull(ScmClass *klass, int size, void *init,
75 int immutablep, void *owner);
76
77 extern ScmObj Scm_UVectorAlias(ScmClass *klass, ScmUVector *v,
78 int start, int end);
79
80 extern ScmObj Scm_UVectorCopy(ScmUVector *v, int start, int end);
81 extern ScmObj Scm_UVectorSwapBytes(ScmUVector *v);
82 extern ScmObj Scm_UVectorSwapBytesX(ScmUVector *v);
83
84 extern ScmObj Scm_ReadBlockX(ScmUVector *v, ScmPort *port,
85 int start, int end, ScmObj endian);
86 extern ScmObj Scm_WriteBlock(ScmUVector *v, ScmPort *port,
87 int start, int end, ScmObj endian);
88
89 /* S8Vector */
90
91 typedef struct ScmS8VectorRec {
92 SCM_HEADER;
93 unsigned int immutable : 1;
94 int size : (SIZEOF_INT*CHAR_BIT-1);
95 void *owner;
96 signed char *elements;
97 } ScmS8Vector;
98
99 SCM_CLASS_DECL(Scm_S8VectorClass);
100 #define SCM_CLASS_S8VECTOR (&Scm_S8VectorClass)
101
102 #define SCM_S8VECTOR(obj) ((ScmS8Vector*)(obj))
103 #define SCM_S8VECTORP(obj) SCM_XTYPEP(obj, SCM_CLASS_S8VECTOR)
104 #define SCM_S8VECTOR_SIZE(obj) (SCM_S8VECTOR(obj)->size)
105 #define SCM_S8VECTOR_ELEMENTS(obj) (SCM_S8VECTOR(obj)->elements)
106
107 extern ScmObj Scm_MakeS8Vector(int size, signed char fill);
108 extern ScmObj Scm_MakeS8VectorFromArray(int size, const signed char array[]);
109 extern ScmObj Scm_MakeS8VectorFromArrayShared(int size, signed char array[]);
110 extern ScmObj Scm_S8VectorFill(ScmS8Vector *vec, signed char fill, int, int);
111 extern ScmObj Scm_S8VectorRef(ScmS8Vector *vec, int index, ScmObj fallback);
112 extern ScmObj Scm_S8VectorSet(ScmS8Vector *vec, int index, ScmObj val, int clamp);
113 extern ScmObj Scm_S8VectorToList(ScmS8Vector *vec, int start, int end);
114 extern ScmObj Scm_ListToS8Vector(ScmObj list, int clamp);
115 extern ScmObj Scm_S8VectorCopy(ScmS8Vector *vec, int start, int end);
116 extern ScmObj Scm_S8VectorCopyX(ScmS8Vector *dst, int dstart,
117 ScmS8Vector *src, int sstart, int send);
118 extern ScmObj Scm_S8VectorToVector(ScmS8Vector *vec, int start, int end);
119 extern ScmObj Scm_VectorToS8Vector(ScmVector *vec, int start, int end, int clamp);
120
121 /* arithmetics */
122 extern ScmObj Scm_S8VectorAdd(ScmS8Vector *s0, ScmObj s1, int clamp);
123 extern ScmObj Scm_S8VectorAddX(ScmS8Vector *s0, ScmObj s1, int clamp);
124 extern ScmObj Scm_S8VectorSub(ScmS8Vector *s0, ScmObj s1, int clamp);
125 extern ScmObj Scm_S8VectorSubX(ScmS8Vector *s0, ScmObj s1, int clamp);
126 extern ScmObj Scm_S8VectorMul(ScmS8Vector *s0, ScmObj s1, int clamp);
127 extern ScmObj Scm_S8VectorMulX(ScmS8Vector *s0, ScmObj s1, int clamp);
128 extern ScmObj Scm_S8VectorDiv(ScmS8Vector *s0, ScmObj s1, int clamp);
129 extern ScmObj Scm_S8VectorDivX(ScmS8Vector *s0, ScmObj s1, int clamp);
130
131 extern ScmObj Scm_S8VectorAnd(ScmS8Vector *s0, ScmObj s1);
132 extern ScmObj Scm_S8VectorAndX(ScmS8Vector *s0, ScmObj s1);
133 extern ScmObj Scm_S8VectorIor(ScmS8Vector *s0, ScmObj s1);
134 extern ScmObj Scm_S8VectorIorX(ScmS8Vector *s0, ScmObj s1);
135 extern ScmObj Scm_S8VectorXor(ScmS8Vector *s0, ScmObj s1);
136 extern ScmObj Scm_S8VectorXorX(ScmS8Vector *s0, ScmObj s1);
137
138 extern ScmObj Scm_S8VectorDotProd(ScmS8Vector *v0, ScmObj v1);
139 extern ScmObj Scm_S8VectorRangeCheck(ScmS8Vector *v0, ScmObj min, ScmObj max);
140 extern ScmObj Scm_S8VectorClamp(ScmS8Vector *v0, ScmObj min, ScmObj max);
141 extern ScmObj Scm_S8VectorClampX(ScmS8Vector *v0, ScmObj min, ScmObj max);
142
143 extern ScmObj Scm_S8VectorSwapBytes(ScmS8Vector *v0);
144 extern ScmObj Scm_S8VectorSwapBytesX(ScmS8Vector *v0);
145
146 /* U8Vector */
147
148 typedef struct ScmU8VectorRec {
149 SCM_HEADER;
150 unsigned int immutable : 1;
151 int size : (SIZEOF_INT*CHAR_BIT-1);
152 void *owner;
153 unsigned char *elements;
154 } ScmU8Vector;
155
156 SCM_CLASS_DECL(Scm_U8VectorClass);
157 #define SCM_CLASS_U8VECTOR (&Scm_U8VectorClass)
158
159 #define SCM_U8VECTOR(obj) ((ScmU8Vector*)(obj))
160 #define SCM_U8VECTORP(obj) SCM_XTYPEP(obj, SCM_CLASS_U8VECTOR)
161 #define SCM_U8VECTOR_SIZE(obj) (SCM_U8VECTOR(obj)->size)
162 #define SCM_U8VECTOR_ELEMENTS(obj) (SCM_U8VECTOR(obj)->elements)
163
164 extern ScmObj Scm_MakeU8Vector(int size, unsigned char fill);
165 extern ScmObj Scm_MakeU8VectorFromArray(int size, const unsigned char array[]);
166 extern ScmObj Scm_MakeU8VectorFromArrayShared(int size, unsigned char array[]);
167 extern ScmObj Scm_U8VectorFill(ScmU8Vector *vec, unsigned char fill, int, int);
168 extern ScmObj Scm_U8VectorRef(ScmU8Vector *vec, int index, ScmObj fallback);
169 extern ScmObj Scm_U8VectorSet(ScmU8Vector *vec, int index, ScmObj val, int clamp);
170 extern ScmObj Scm_U8VectorToList(ScmU8Vector *vec, int start, int end);
171 extern ScmObj Scm_ListToU8Vector(ScmObj list, int clamp);
172 extern ScmObj Scm_U8VectorCopy(ScmU8Vector *vec, int start, int end);
173 extern ScmObj Scm_U8VectorCopyX(ScmU8Vector *dst, int dstart,
174 ScmU8Vector *src, int sstart, int send);
175 extern ScmObj Scm_U8VectorToVector(ScmU8Vector *vec, int start, int end);
176 extern ScmObj Scm_VectorToU8Vector(ScmVector *vec, int start, int end, int clamp);
177
178 /* arithmetics */
179 extern ScmObj Scm_U8VectorAdd(ScmU8Vector *s0, ScmObj s1, int clamp);
180 extern ScmObj Scm_U8VectorAddX(ScmU8Vector *s0, ScmObj s1, int clamp);
181 extern ScmObj Scm_U8VectorSub(ScmU8Vector *s0, ScmObj s1, int clamp);
182 extern ScmObj Scm_U8VectorSubX(ScmU8Vector *s0, ScmObj s1, int clamp);
183 extern ScmObj Scm_U8VectorMul(ScmU8Vector *s0, ScmObj s1, int clamp);
184 extern ScmObj Scm_U8VectorMulX(ScmU8Vector *s0, ScmObj s1, int clamp);
185 extern ScmObj Scm_U8VectorDiv(ScmU8Vector *s0, ScmObj s1, int clamp);
186 extern ScmObj Scm_U8VectorDivX(ScmU8Vector *s0, ScmObj s1, int clamp);
187
188 extern ScmObj Scm_U8VectorAnd(ScmU8Vector *s0, ScmObj s1);
189 extern ScmObj Scm_U8VectorAndX(ScmU8Vector *s0, ScmObj s1);
190 extern ScmObj Scm_U8VectorIor(ScmU8Vector *s0, ScmObj s1);
191 extern ScmObj Scm_U8VectorIorX(ScmU8Vector *s0, ScmObj s1);
192 extern ScmObj Scm_U8VectorXor(ScmU8Vector *s0, ScmObj s1);
193 extern ScmObj Scm_U8VectorXorX(ScmU8Vector *s0, ScmObj s1);
194
195 extern ScmObj Scm_U8VectorDotProd(ScmU8Vector *v0, ScmObj v1);
196 extern ScmObj Scm_U8VectorRangeCheck(ScmU8Vector *v0, ScmObj min, ScmObj max);
197 extern ScmObj Scm_U8VectorClamp(ScmU8Vector *v0, ScmObj min, ScmObj max);
198 extern ScmObj Scm_U8VectorClampX(ScmU8Vector *v0, ScmObj min, ScmObj max);
199
200 extern ScmObj Scm_U8VectorSwapBytes(ScmU8Vector *v0);
201 extern ScmObj Scm_U8VectorSwapBytesX(ScmU8Vector *v0);
202
203 /* S16Vector */
204
205 typedef struct ScmS16VectorRec {
206 SCM_HEADER;
207 unsigned int immutable : 1;
208 int size : (SIZEOF_INT*CHAR_BIT-1);
209 void *owner;
210 short *elements;
211 } ScmS16Vector;
212
213 SCM_CLASS_DECL(Scm_S16VectorClass);
214 #define SCM_CLASS_S16VECTOR (&Scm_S16VectorClass)
215
216 #define SCM_S16VECTOR(obj) ((ScmS16Vector*)(obj))
217 #define SCM_S16VECTORP(obj) SCM_XTYPEP(obj, SCM_CLASS_S16VECTOR)
218 #define SCM_S16VECTOR_SIZE(obj) (SCM_S16VECTOR(obj)->size)
219 #define SCM_S16VECTOR_ELEMENTS(obj) (SCM_S16VECTOR(obj)->elements)
220
221 extern ScmObj Scm_MakeS16Vector(int size, short fill);
222 extern ScmObj Scm_MakeS16VectorFromArray(int size, const short array[]);
223 extern ScmObj Scm_MakeS16VectorFromArrayShared(int size, short array[]);
224 extern ScmObj Scm_S16VectorFill(ScmS16Vector *vec, short fill, int, int);
225 extern ScmObj Scm_S16VectorRef(ScmS16Vector *vec, int index, ScmObj fallback);
226 extern ScmObj Scm_S16VectorSet(ScmS16Vector *vec, int index, ScmObj val, int clamp);
227 extern ScmObj Scm_S16VectorToList(ScmS16Vector *vec, int start, int end);
228 extern ScmObj Scm_ListToS16Vector(ScmObj list, int clamp);
229 extern ScmObj Scm_S16VectorCopy(ScmS16Vector *vec, int start, int end);
230 extern ScmObj Scm_S16VectorCopyX(ScmS16Vector *dst, int dstart,
231 ScmS16Vector *src, int sstart, int send);
232 extern ScmObj Scm_S16VectorToVector(ScmS16Vector *vec, int start, int end);
233 extern ScmObj Scm_VectorToS16Vector(ScmVector *vec, int start, int end, int clamp);
234
235 /* arithmetics */
236 extern ScmObj Scm_S16VectorAdd(ScmS16Vector *s0, ScmObj s1, int clamp);
237 extern ScmObj Scm_S16VectorAddX(ScmS16Vector *s0, ScmObj s1, int clamp);
238 extern ScmObj Scm_S16VectorSub(ScmS16Vector *s0, ScmObj s1, int clamp);
239 extern ScmObj Scm_S16VectorSubX(ScmS16Vector *s0, ScmObj s1, int clamp);
240 extern ScmObj Scm_S16VectorMul(ScmS16Vector *s0, ScmObj s1, int clamp);
241 extern ScmObj Scm_S16VectorMulX(ScmS16Vector *s0, ScmObj s1, int clamp);
242 extern ScmObj Scm_S16VectorDiv(ScmS16Vector *s0, ScmObj s1, int clamp);
243 extern ScmObj Scm_S16VectorDivX(ScmS16Vector *s0, ScmObj s1, int clamp);
244
245 extern ScmObj Scm_S16VectorAnd(ScmS16Vector *s0, ScmObj s1);
246 extern ScmObj Scm_S16VectorAndX(ScmS16Vector *s0, ScmObj s1);
247 extern ScmObj Scm_S16VectorIor(ScmS16Vector *s0, ScmObj s1);
248 extern ScmObj Scm_S16VectorIorX(ScmS16Vector *s0, ScmObj s1);
249 extern ScmObj Scm_S16VectorXor(ScmS16Vector *s0, ScmObj s1);
250 extern ScmObj Scm_S16VectorXorX(ScmS16Vector *s0, ScmObj s1);
251
252 extern ScmObj Scm_S16VectorDotProd(ScmS16Vector *v0, ScmObj v1);
253 extern ScmObj Scm_S16VectorRangeCheck(ScmS16Vector *v0, ScmObj min, ScmObj max);
254 extern ScmObj Scm_S16VectorClamp(ScmS16Vector *v0, ScmObj min, ScmObj max);
255 extern ScmObj Scm_S16VectorClampX(ScmS16Vector *v0, ScmObj min, ScmObj max);
256
257 extern ScmObj Scm_S16VectorSwapBytes(ScmS16Vector *v0);
258 extern ScmObj Scm_S16VectorSwapBytesX(ScmS16Vector *v0);
259
260 /* U16Vector */
261
262 typedef struct ScmU16VectorRec {
263 SCM_HEADER;
264 unsigned int immutable : 1;
265 int size : (SIZEOF_INT*CHAR_BIT-1);
266 void *owner;
267 unsigned short *elements;
268 } ScmU16Vector;
269
270 SCM_CLASS_DECL(Scm_U16VectorClass);
271 #define SCM_CLASS_U16VECTOR (&Scm_U16VectorClass)
272
273 #define SCM_U16VECTOR(obj) ((ScmU16Vector*)(obj))
274 #define SCM_U16VECTORP(obj) SCM_XTYPEP(obj, SCM_CLASS_U16VECTOR)
275 #define SCM_U16VECTOR_SIZE(obj) (SCM_U16VECTOR(obj)->size)
276 #define SCM_U16VECTOR_ELEMENTS(obj) (SCM_U16VECTOR(obj)->elements)
277
278 extern ScmObj Scm_MakeU16Vector(int size, unsigned short fill);
279 extern ScmObj Scm_MakeU16VectorFromArray(int size, const unsigned short array[]);
280 extern ScmObj Scm_MakeU16VectorFromArrayShared(int size, unsigned short array[]);
281 extern ScmObj Scm_U16VectorFill(ScmU16Vector *vec, unsigned short fill, int, int);
282 extern ScmObj Scm_U16VectorRef(ScmU16Vector *vec, int index, ScmObj fallback);
283 extern ScmObj Scm_U16VectorSet(ScmU16Vector *vec, int index, ScmObj val, int clamp);
284 extern ScmObj Scm_U16VectorToList(ScmU16Vector *vec, int start, int end);
285 extern ScmObj Scm_ListToU16Vector(ScmObj list, int clamp);
286 extern ScmObj Scm_U16VectorCopy(ScmU16Vector *vec, int start, int end);
287 extern ScmObj Scm_U16VectorCopyX(ScmU16Vector *dst, int dstart,
288 ScmU16Vector *src, int sstart, int send);
289 extern ScmObj Scm_U16VectorToVector(ScmU16Vector *vec, int start, int end);
290 extern ScmObj Scm_VectorToU16Vector(ScmVector *vec, int start, int end, int clamp);
291
292 /* arithmetics */
293 extern ScmObj Scm_U16VectorAdd(ScmU16Vector *s0, ScmObj s1, int clamp);
294 extern ScmObj Scm_U16VectorAddX(ScmU16Vector *s0, ScmObj s1, int clamp);
295 extern ScmObj Scm_U16VectorSub(ScmU16Vector *s0, ScmObj s1, int clamp);
296 extern ScmObj Scm_U16VectorSubX(ScmU16Vector *s0, ScmObj s1, int clamp);
297 extern ScmObj Scm_U16VectorMul(ScmU16Vector *s0, ScmObj s1, int clamp);
298 extern ScmObj Scm_U16VectorMulX(ScmU16Vector *s0, ScmObj s1, int clamp);
299 extern ScmObj Scm_U16VectorDiv(ScmU16Vector *s0, ScmObj s1, int clamp);
300 extern ScmObj Scm_U16VectorDivX(ScmU16Vector *s0, ScmObj s1, int clamp);
301
302 extern ScmObj Scm_U16VectorAnd(ScmU16Vector *s0, ScmObj s1);
303 extern ScmObj Scm_U16VectorAndX(ScmU16Vector *s0, ScmObj s1);
304 extern ScmObj Scm_U16VectorIor(ScmU16Vector *s0, ScmObj s1);
305 extern ScmObj Scm_U16VectorIorX(ScmU16Vector *s0, ScmObj s1);
306 extern ScmObj Scm_U16VectorXor(ScmU16Vector *s0, ScmObj s1);
307 extern ScmObj Scm_U16VectorXorX(ScmU16Vector *s0, ScmObj s1);
308
309 extern ScmObj Scm_U16VectorDotProd(ScmU16Vector *v0, ScmObj v1);
310 extern ScmObj Scm_U16VectorRangeCheck(ScmU16Vector *v0, ScmObj min, ScmObj max);
311 extern ScmObj Scm_U16VectorClamp(ScmU16Vector *v0, ScmObj min, ScmObj max);
312 extern ScmObj Scm_U16VectorClampX(ScmU16Vector *v0, ScmObj min, ScmObj max);
313
314 extern ScmObj Scm_U16VectorSwapBytes(ScmU16Vector *v0);
315 extern ScmObj Scm_U16VectorSwapBytesX(ScmU16Vector *v0);
316
317 /* S32Vector */
318
319 typedef struct ScmS32VectorRec {
320 SCM_HEADER;
321 unsigned int immutable : 1;
322 int size : (SIZEOF_INT*CHAR_BIT-1);
323 void *owner;
324 ScmInt32 *elements;
325 } ScmS32Vector;
326
327 SCM_CLASS_DECL(Scm_S32VectorClass);
328 #define SCM_CLASS_S32VECTOR (&Scm_S32VectorClass)
329
330 #define SCM_S32VECTOR(obj) ((ScmS32Vector*)(obj))
331 #define SCM_S32VECTORP(obj) SCM_XTYPEP(obj, SCM_CLASS_S32VECTOR)
332 #define SCM_S32VECTOR_SIZE(obj) (SCM_S32VECTOR(obj)->size)
333 #define SCM_S32VECTOR_ELEMENTS(obj) (SCM_S32VECTOR(obj)->elements)
334
335 extern ScmObj Scm_MakeS32Vector(int size, ScmInt32 fill);
336 extern ScmObj Scm_MakeS32VectorFromArray(int size, const ScmInt32 array[]);
337 extern ScmObj Scm_MakeS32VectorFromArrayShared(int size, ScmInt32 array[]);
338 extern ScmObj Scm_S32VectorFill(ScmS32Vector *vec, ScmInt32 fill, int, int);
339 extern ScmObj Scm_S32VectorRef(ScmS32Vector *vec, int index, ScmObj fallback);
340 extern ScmObj Scm_S32VectorSet(ScmS32Vector *vec, int index, ScmObj val, int clamp);
341 extern ScmObj Scm_S32VectorToList(ScmS32Vector *vec, int start, int end);
342 extern ScmObj Scm_ListToS32Vector(ScmObj list, int clamp);
343 extern ScmObj Scm_S32VectorCopy(ScmS32Vector *vec, int start, int end);
344 extern ScmObj Scm_S32VectorCopyX(ScmS32Vector *dst, int dstart,
345 ScmS32Vector *src, int sstart, int send);
346 extern ScmObj Scm_S32VectorToVector(ScmS32Vector *vec, int start, int end);
347 extern ScmObj Scm_VectorToS32Vector(ScmVector *vec, int start, int end, int clamp);
348
349 /* arithmetics */
350 extern ScmObj Scm_S32VectorAdd(ScmS32Vector *s0, ScmObj s1, int clamp);
351 extern ScmObj Scm_S32VectorAddX(ScmS32Vector *s0, ScmObj s1, int clamp);
352 extern ScmObj Scm_S32VectorSub(ScmS32Vector *s0, ScmObj s1, int clamp);
353 extern ScmObj Scm_S32VectorSubX(ScmS32Vector *s0, ScmObj s1, int clamp);
354 extern ScmObj Scm_S32VectorMul(ScmS32Vector *s0, ScmObj s1, int clamp);
355 extern ScmObj Scm_S32VectorMulX(ScmS32Vector *s0, ScmObj s1, int clamp);
356 extern ScmObj Scm_S32VectorDiv(ScmS32Vector *s0, ScmObj s1, int clamp);
357 extern ScmObj Scm_S32VectorDivX(ScmS32Vector *s0, ScmObj s1, int clamp);
358
359 extern ScmObj Scm_S32VectorAnd(ScmS32Vector *s0, ScmObj s1);
360 extern ScmObj Scm_S32VectorAndX(ScmS32Vector *s0, ScmObj s1);
361 extern ScmObj Scm_S32VectorIor(ScmS32Vector *s0, ScmObj s1);
362 extern ScmObj Scm_S32VectorIorX(ScmS32Vector *s0, ScmObj s1);
363 extern ScmObj Scm_S32VectorXor(ScmS32Vector *s0, ScmObj s1);
364 extern ScmObj Scm_S32VectorXorX(ScmS32Vector *s0, ScmObj s1);
365
366 extern ScmObj Scm_S32VectorDotProd(ScmS32Vector *v0, ScmObj v1);
367 extern ScmObj Scm_S32VectorRangeCheck(ScmS32Vector *v0, ScmObj min, ScmObj max);
368 extern ScmObj Scm_S32VectorClamp(ScmS32Vector *v0, ScmObj min, ScmObj max);
369 extern ScmObj Scm_S32VectorClampX(ScmS32Vector *v0, ScmObj min, ScmObj max);
370
371 extern ScmObj Scm_S32VectorSwapBytes(ScmS32Vector *v0);
372 extern ScmObj Scm_S32VectorSwapBytesX(ScmS32Vector *v0);
373
374 /* U32Vector */
375
376 typedef struct ScmU32VectorRec {
377 SCM_HEADER;
378 unsigned int immutable : 1;
379 int size : (SIZEOF_INT*CHAR_BIT-1);
380 void *owner;
381 ScmUInt32 *elements;
382 } ScmU32Vector;
383
384 SCM_CLASS_DECL(Scm_U32VectorClass);
385 #define SCM_CLASS_U32VECTOR (&Scm_U32VectorClass)
386
387 #define SCM_U32VECTOR(obj) ((ScmU32Vector*)(obj))
388 #define SCM_U32VECTORP(obj) SCM_XTYPEP(obj, SCM_CLASS_U32VECTOR)
389 #define SCM_U32VECTOR_SIZE(obj) (SCM_U32VECTOR(obj)->size)
390 #define SCM_U32VECTOR_ELEMENTS(obj) (SCM_U32VECTOR(obj)->elements)
391
392 extern ScmObj Scm_MakeU32Vector(int size, ScmUInt32 fill);
393 extern ScmObj Scm_MakeU32VectorFromArray(int size, const ScmUInt32 array[]);
394 extern ScmObj Scm_MakeU32VectorFromArrayShared(int size, ScmUInt32 array[]);
395 extern ScmObj Scm_U32VectorFill(ScmU32Vector *vec, ScmUInt32 fill, int, int);
396 extern ScmObj Scm_U32VectorRef(ScmU32Vector *vec, int index, ScmObj fallback);
397 extern ScmObj Scm_U32VectorSet(ScmU32Vector *vec, int index, ScmObj val, int clamp);
398 extern ScmObj Scm_U32VectorToList(ScmU32Vector *vec, int start, int end);
399 extern ScmObj Scm_ListToU32Vector(ScmObj list, int clamp);
400 extern ScmObj Scm_U32VectorCopy(ScmU32Vector *vec, int start, int end);
401 extern ScmObj Scm_U32VectorCopyX(ScmU32Vector *dst, int dstart,
402 ScmU32Vector *src, int sstart, int send);
403 extern ScmObj Scm_U32VectorToVector(ScmU32Vector *vec, int start, int end);
404 extern ScmObj Scm_VectorToU32Vector(ScmVector *vec, int start, int end, int clamp);
405
406 /* arithmetics */
407 extern ScmObj Scm_U32VectorAdd(ScmU32Vector *s0, ScmObj s1, int clamp);
408 extern ScmObj Scm_U32VectorAddX(ScmU32Vector *s0, ScmObj s1, int clamp);
409 extern ScmObj Scm_U32VectorSub(ScmU32Vector *s0, ScmObj s1, int clamp);
410 extern ScmObj Scm_U32VectorSubX(ScmU32Vector *s0, ScmObj s1, int clamp);
411 extern ScmObj Scm_U32VectorMul(ScmU32Vector *s0, ScmObj s1, int clamp);
412 extern ScmObj Scm_U32VectorMulX(ScmU32Vector *s0, ScmObj s1, int clamp);
413 extern ScmObj Scm_U32VectorDiv(ScmU32Vector *s0, ScmObj s1, int clamp);
414 extern ScmObj Scm_U32VectorDivX(ScmU32Vector *s0, ScmObj s1, int clamp);
415
416 extern ScmObj Scm_U32VectorAnd(ScmU32Vector *s0, ScmObj s1);
417 extern ScmObj Scm_U32VectorAndX(ScmU32Vector *s0, ScmObj s1);
418 extern ScmObj Scm_U32VectorIor(ScmU32Vector *s0, ScmObj s1);
419 extern ScmObj Scm_U32VectorIorX(ScmU32Vector *s0, ScmObj s1);
420 extern ScmObj Scm_U32VectorXor(ScmU32Vector *s0, ScmObj s1);
421 extern ScmObj Scm_U32VectorXorX(ScmU32Vector *s0, ScmObj s1);
422
423 extern ScmObj Scm_U32VectorDotProd(ScmU32Vector *v0, ScmObj v1);
424 extern ScmObj Scm_U32VectorRangeCheck(ScmU32Vector *v0, ScmObj min, ScmObj max);
425 extern ScmObj Scm_U32VectorClamp(ScmU32Vector *v0, ScmObj min, ScmObj max);
426 extern ScmObj Scm_U32VectorClampX(ScmU32Vector *v0, ScmObj min, ScmObj max);
427
428 extern ScmObj Scm_U32VectorSwapBytes(ScmU32Vector *v0);
429 extern ScmObj Scm_U32VectorSwapBytesX(ScmU32Vector *v0);
430
431 /* S64Vector */
432
433 typedef struct ScmS64VectorRec {
434 SCM_HEADER;
435 unsigned int immutable : 1;
436 int size : (SIZEOF_INT*CHAR_BIT-1);
437 void *owner;
438 ScmInt64 *elements;
439 } ScmS64Vector;
440
441 SCM_CLASS_DECL(Scm_S64VectorClass);
442 #define SCM_CLASS_S64VECTOR (&Scm_S64VectorClass)
443
444 #define SCM_S64VECTOR(obj) ((ScmS64Vector*)(obj))
445 #define SCM_S64VECTORP(obj) SCM_XTYPEP(obj, SCM_CLASS_S64VECTOR)
446 #define SCM_S64VECTOR_SIZE(obj) (SCM_S64VECTOR(obj)->size)
447 #define SCM_S64VECTOR_ELEMENTS(obj) (SCM_S64VECTOR(obj)->elements)
448
449 extern ScmObj Scm_MakeS64Vector(int size, ScmInt64 fill);
450 extern ScmObj Scm_MakeS64VectorFromArray(int size, const ScmInt64 array[]);
451 extern ScmObj Scm_MakeS64VectorFromArrayShared(int size, ScmInt64 array[]);
452 extern ScmObj Scm_S64VectorFill(ScmS64Vector *vec, ScmInt64 fill, int, int);
453 extern ScmObj Scm_S64VectorRef(ScmS64Vector *vec, int index, ScmObj fallback);
454 extern ScmObj Scm_S64VectorSet(ScmS64Vector *vec, int index, ScmObj val, int clamp);
455 extern ScmObj Scm_S64VectorToList(ScmS64Vector *vec, int start, int end);
456 extern ScmObj Scm_ListToS64Vector(ScmObj list, int clamp);
457 extern ScmObj Scm_S64VectorCopy(ScmS64Vector *vec, int start, int end);
458 extern ScmObj Scm_S64VectorCopyX(ScmS64Vector *dst, int dstart,
459 ScmS64Vector *src, int sstart, int send);
460 extern ScmObj Scm_S64VectorToVector(ScmS64Vector *vec, int start, int end);
461 extern ScmObj Scm_VectorToS64Vector(ScmVector *vec, int start, int end, int clamp);
462
463 /* arithmetics */
464 extern ScmObj Scm_S64VectorAdd(ScmS64Vector *s0, ScmObj s1, int clamp);
465 extern ScmObj Scm_S64VectorAddX(ScmS64Vector *s0, ScmObj s1, int clamp);
466 extern ScmObj Scm_S64VectorSub(ScmS64Vector *s0, ScmObj s1, int clamp);
467 extern ScmObj Scm_S64VectorSubX(ScmS64Vector *s0, ScmObj s1, int clamp);
468 extern ScmObj Scm_S64VectorMul(ScmS64Vector *s0, ScmObj s1, int clamp);
469 extern ScmObj Scm_S64VectorMulX(ScmS64Vector *s0, ScmObj s1, int clamp);
470 extern ScmObj Scm_S64VectorDiv(ScmS64Vector *s0, ScmObj s1, int clamp);
471 extern ScmObj Scm_S64VectorDivX(ScmS64Vector *s0, ScmObj s1, int clamp);
472
473 extern ScmObj Scm_S64VectorAnd(ScmS64Vector *s0, ScmObj s1);
474 extern ScmObj Scm_S64VectorAndX(ScmS64Vector *s0, ScmObj s1);
475 extern ScmObj Scm_S64VectorIor(ScmS64Vector *s0, ScmObj s1);
476 extern ScmObj Scm_S64VectorIorX(ScmS64Vector *s0, ScmObj s1);
477 extern ScmObj Scm_S64VectorXor(ScmS64Vector *s0, ScmObj s1);
478 extern ScmObj Scm_S64VectorXorX(ScmS64Vector *s0, ScmObj s1);
479
480 extern ScmObj Scm_S64VectorDotProd(ScmS64Vector *v0, ScmObj v1);
481 extern ScmObj Scm_S64VectorRangeCheck(ScmS64Vector *v0, ScmObj min, ScmObj max);
482 extern ScmObj Scm_S64VectorClamp(ScmS64Vector *v0, ScmObj min, ScmObj max);
483 extern ScmObj Scm_S64VectorClampX(ScmS64Vector *v0, ScmObj min, ScmObj max);
484
485 extern ScmObj Scm_S64VectorSwapBytes(ScmS64Vector *v0);
486 extern ScmObj Scm_S64VectorSwapBytesX(ScmS64Vector *v0);
487
488 /* U64Vector */
489
490 typedef struct ScmU64VectorRec {
491 SCM_HEADER;
492 unsigned int immutable : 1;
493 int size : (SIZEOF_INT*CHAR_BIT-1);
494 void *owner;
495 ScmUInt64 *elements;
496 } ScmU64Vector;
497
498 SCM_CLASS_DECL(Scm_U64VectorClass);
499 #define SCM_CLASS_U64VECTOR (&Scm_U64VectorClass)
500
501 #define SCM_U64VECTOR(obj) ((ScmU64Vector*)(obj))
502 #define SCM_U64VECTORP(obj) SCM_XTYPEP(obj, SCM_CLASS_U64VECTOR)
503 #define SCM_U64VECTOR_SIZE(obj) (SCM_U64VECTOR(obj)->size)
504 #define SCM_U64VECTOR_ELEMENTS(obj) (SCM_U64VECTOR(obj)->elements)
505
506 extern ScmObj Scm_MakeU64Vector(int size, ScmUInt64 fill);
507 extern ScmObj Scm_MakeU64VectorFromArray(int size, const ScmUInt64 array[]);
508 extern ScmObj Scm_MakeU64VectorFromArrayShared(int size, ScmUInt64 array[]);
509 extern ScmObj Scm_U64VectorFill(ScmU64Vector *vec, ScmUInt64 fill, int, int);
510 extern ScmObj Scm_U64VectorRef(ScmU64Vector *vec, int index, ScmObj fallback);
511 extern ScmObj Scm_U64VectorSet(ScmU64Vector *vec, int index, ScmObj val, int clamp);
512 extern ScmObj Scm_U64VectorToList(ScmU64Vector *vec, int start, int end);
513 extern ScmObj Scm_ListToU64Vector(ScmObj list, int clamp);
514 extern ScmObj Scm_U64VectorCopy(ScmU64Vector *vec, int start, int end);
515 extern ScmObj Scm_U64VectorCopyX(ScmU64Vector *dst, int dstart,
516 ScmU64Vector *src, int sstart, int send);
517 extern ScmObj Scm_U64VectorToVector(ScmU64Vector *vec, int start, int end);
518 extern ScmObj Scm_VectorToU64Vector(ScmVector *vec, int start, int end, int clamp);
519
520 /* arithmetics */
521 extern ScmObj Scm_U64VectorAdd(ScmU64Vector *s0, ScmObj s1, int clamp);
522 extern ScmObj Scm_U64VectorAddX(ScmU64Vector *s0, ScmObj s1, int clamp);
523 extern ScmObj Scm_U64VectorSub(ScmU64Vector *s0, ScmObj s1, int clamp);
524 extern ScmObj Scm_U64VectorSubX(ScmU64Vector *s0, ScmObj s1, int clamp);
525 extern ScmObj Scm_U64VectorMul(ScmU64Vector *s0, ScmObj s1, int clamp);
526 extern ScmObj Scm_U64VectorMulX(ScmU64Vector *s0, ScmObj s1, int clamp);
527 extern ScmObj Scm_U64VectorDiv(ScmU64Vector *s0, ScmObj s1, int clamp);
528 extern ScmObj Scm_U64VectorDivX(ScmU64Vector *s0, ScmObj s1, int clamp);
529
530 extern ScmObj Scm_U64VectorAnd(ScmU64Vector *s0, ScmObj s1);
531 extern ScmObj Scm_U64VectorAndX(ScmU64Vector *s0, ScmObj s1);
532 extern ScmObj Scm_U64VectorIor(ScmU64Vector *s0, ScmObj s1);
533 extern ScmObj Scm_U64VectorIorX(ScmU64Vector *s0, ScmObj s1);
534 extern ScmObj Scm_U64VectorXor(ScmU64Vector *s0, ScmObj s1);
535 extern ScmObj Scm_U64VectorXorX(ScmU64Vector *s0, ScmObj s1);
536
537 extern ScmObj Scm_U64VectorDotProd(ScmU64Vector *v0, ScmObj v1);
538 extern ScmObj Scm_U64VectorRangeCheck(ScmU64Vector *v0, ScmObj min, ScmObj max);
539 extern ScmObj Scm_U64VectorClamp(ScmU64Vector *v0, ScmObj min, ScmObj max);
540 extern ScmObj Scm_U64VectorClampX(ScmU64Vector *v0, ScmObj min, ScmObj max);
541
542 extern ScmObj Scm_U64VectorSwapBytes(ScmU64Vector *v0);
543 extern ScmObj Scm_U64VectorSwapBytesX(ScmU64Vector *v0);
544
545 /* F32Vector */
546
547 typedef struct ScmF32VectorRec {
548 SCM_HEADER;
549 unsigned int immutable : 1;
550 int size : (SIZEOF_INT*CHAR_BIT-1);
551 void *owner;
552 float *elements;
553 } ScmF32Vector;
554
555 SCM_CLASS_DECL(Scm_F32VectorClass);
556 #define SCM_CLASS_F32VECTOR (&Scm_F32VectorClass)
557
558 #define SCM_F32VECTOR(obj) ((ScmF32Vector*)(obj))
559 #define SCM_F32VECTORP(obj) SCM_XTYPEP(obj, SCM_CLASS_F32VECTOR)
560 #define SCM_F32VECTOR_SIZE(obj) (SCM_F32VECTOR(obj)->size)
561 #define SCM_F32VECTOR_ELEMENTS(obj) (SCM_F32VECTOR(obj)->elements)
562
563 extern ScmObj Scm_MakeF32Vector(int size, float fill);
564 extern ScmObj Scm_MakeF32VectorFromArray(int size, const float array[]);
565 extern ScmObj Scm_MakeF32VectorFromArrayShared(int size, float array[]);
566 extern ScmObj Scm_F32VectorFill(ScmF32Vector *vec, float fill, int, int);
567 extern ScmObj Scm_F32VectorRef(ScmF32Vector *vec, int index, ScmObj fallback);
568 extern ScmObj Scm_F32VectorSet(ScmF32Vector *vec, int index, ScmObj val, int clamp);
569 extern ScmObj Scm_F32VectorToList(ScmF32Vector *vec, int start, int end);
570 extern ScmObj Scm_ListToF32Vector(ScmObj list, int clamp);
571 extern ScmObj Scm_F32VectorCopy(ScmF32Vector *vec, int start, int end);
572 extern ScmObj Scm_F32VectorCopyX(ScmF32Vector *dst, int dstart,
573 ScmF32Vector *src, int sstart, int send);
574 extern ScmObj Scm_F32VectorToVector(ScmF32Vector *vec, int start, int end);
575 extern ScmObj Scm_VectorToF32Vector(ScmVector *vec, int start, int end, int clamp);
576
577 /* arithmetics */
578 extern ScmObj Scm_F32VectorAdd(ScmF32Vector *s0, ScmObj s1, int clamp);
579 extern ScmObj Scm_F32VectorAddX(ScmF32Vector *s0, ScmObj s1, int clamp);
580 extern ScmObj Scm_F32VectorSub(ScmF32Vector *s0, ScmObj s1, int clamp);
581 extern ScmObj Scm_F32VectorSubX(ScmF32Vector *s0, ScmObj s1, int clamp);
582 extern ScmObj Scm_F32VectorMul(ScmF32Vector *s0, ScmObj s1, int clamp);
583 extern ScmObj Scm_F32VectorMulX(ScmF32Vector *s0, ScmObj s1, int clamp);
584 extern ScmObj Scm_F32VectorDiv(ScmF32Vector *s0, ScmObj s1, int clamp);
585 extern ScmObj Scm_F32VectorDivX(ScmF32Vector *s0, ScmObj s1, int clamp);
586
587 extern ScmObj Scm_F32VectorAnd(ScmF32Vector *s0, ScmObj s1);
588 extern ScmObj Scm_F32VectorAndX(ScmF32Vector *s0, ScmObj s1);
589 extern ScmObj Scm_F32VectorIor(ScmF32Vector *s0, ScmObj s1);
590 extern ScmObj Scm_F32VectorIorX(ScmF32Vector *s0, ScmObj s1);
591 extern ScmObj Scm_F32VectorXor(ScmF32Vector *s0, ScmObj s1);
592 extern ScmObj Scm_F32VectorXorX(ScmF32Vector *s0, ScmObj s1);
593
594 extern ScmObj Scm_F32VectorDotProd(ScmF32Vector *v0, ScmObj v1);
595 extern ScmObj Scm_F32VectorRangeCheck(ScmF32Vector *v0, ScmObj min, ScmObj max);
596 extern ScmObj Scm_F32VectorClamp(ScmF32Vector *v0, ScmObj min, ScmObj max);
597 extern ScmObj Scm_F32VectorClampX(ScmF32Vector *v0, ScmObj min, ScmObj max);
598
599 extern ScmObj Scm_F32VectorSwapBytes(ScmF32Vector *v0);
600 extern ScmObj Scm_F32VectorSwapBytesX(ScmF32Vector *v0);
601
602 /* F64Vector */
603
604 typedef struct ScmF64VectorRec {
605 SCM_HEADER;
606 unsigned int immutable : 1;
607 int size : (SIZEOF_INT*CHAR_BIT-1);
608 void *owner;
609 double *elements;
610 } ScmF64Vector;
611
612 SCM_CLASS_DECL(Scm_F64VectorClass);
613 #define SCM_CLASS_F64VECTOR (&Scm_F64VectorClass)
614
615 #define SCM_F64VECTOR(obj) ((ScmF64Vector*)(obj))
616 #define SCM_F64VECTORP(obj) SCM_XTYPEP(obj, SCM_CLASS_F64VECTOR)
617 #define SCM_F64VECTOR_SIZE(obj) (SCM_F64VECTOR(obj)->size)
618 #define SCM_F64VECTOR_ELEMENTS(obj) (SCM_F64VECTOR(obj)->elements)
619
620 extern ScmObj Scm_MakeF64Vector(int size, double fill);
621 extern ScmObj Scm_MakeF64VectorFromArray(int size, const double array[]);
622 extern ScmObj Scm_MakeF64VectorFromArrayShared(int size, double array[]);
623 extern ScmObj Scm_F64VectorFill(ScmF64Vector *vec, double fill, int, int);
624 extern ScmObj Scm_F64VectorRef(ScmF64Vector *vec, int index, ScmObj fallback);
625 extern ScmObj Scm_F64VectorSet(ScmF64Vector *vec, int index, ScmObj val, int clamp);
626 extern ScmObj Scm_F64VectorToList(ScmF64Vector *vec, int start, int end);
627 extern ScmObj Scm_ListToF64Vector(ScmObj list, int clamp);
628 extern ScmObj Scm_F64VectorCopy(ScmF64Vector *vec, int start, int end);
629 extern ScmObj Scm_F64VectorCopyX(ScmF64Vector *dst, int dstart,
630 ScmF64Vector *src, int sstart, int send);
631 extern ScmObj Scm_F64VectorToVector(ScmF64Vector *vec, int start, int end);
632 extern ScmObj Scm_VectorToF64Vector(ScmVector *vec, int start, int end, int clamp);
633
634 /* arithmetics */
635 extern ScmObj Scm_F64VectorAdd(ScmF64Vector *s0, ScmObj s1, int clamp);
636 extern ScmObj Scm_F64VectorAddX(ScmF64Vector *s0, ScmObj s1, int clamp);
637 extern ScmObj Scm_F64VectorSub(ScmF64Vector *s0, ScmObj s1, int clamp);
638 extern ScmObj Scm_F64VectorSubX(ScmF64Vector *s0, ScmObj s1, int clamp);
639 extern ScmObj Scm_F64VectorMul(ScmF64Vector *s0, ScmObj s1, int clamp);
640 extern ScmObj Scm_F64VectorMulX(ScmF64Vector *s0, ScmObj s1, int clamp);
641 extern ScmObj Scm_F64VectorDiv(ScmF64Vector *s0, ScmObj s1, int clamp);
642 extern ScmObj Scm_F64VectorDivX(ScmF64Vector *s0, ScmObj s1, int clamp);
643
644 extern ScmObj Scm_F64VectorAnd(ScmF64Vector *s0, ScmObj s1);
645 extern ScmObj Scm_F64VectorAndX(ScmF64Vector *s0, ScmObj s1);
646 extern ScmObj Scm_F64VectorIor(ScmF64Vector *s0, ScmObj s1);
647 extern ScmObj Scm_F64VectorIorX(ScmF64Vector *s0, ScmObj s1);
648 extern ScmObj Scm_F64VectorXor(ScmF64Vector *s0, ScmObj s1);
649 extern ScmObj Scm_F64VectorXorX(ScmF64Vector *s0, ScmObj s1);
650
651 extern ScmObj Scm_F64VectorDotProd(ScmF64Vector *v0, ScmObj v1);
652 extern ScmObj Scm_F64VectorRangeCheck(ScmF64Vector *v0, ScmObj min, ScmObj max);
653 extern ScmObj Scm_F64VectorClamp(ScmF64Vector *v0, ScmObj min, ScmObj max);
654 extern ScmObj Scm_F64VectorClampX(ScmF64Vector *v0, ScmObj min, ScmObj max);
655
656 extern ScmObj Scm_F64VectorSwapBytes(ScmF64Vector *v0);
657 extern ScmObj Scm_F64VectorSwapBytesX(ScmF64Vector *v0);
658
659
660 #endif /* GAUCHE_UVECT_H */
661