Scheme SRFI-18 implementation and tests file
[bpt/guile.git] / libguile / srfi-4.h
CommitLineData
f8579182
MV
1#ifndef SCM_SRFI_4_H
2#define SCM_SRFI_4_H
3/* srfi-4.c --- Homogeneous numeric vector datatypes.
4 *
2b829bbb 5 * Copyright (C) 2001, 2004, 2006 Free Software Foundation, Inc.
f8579182
MV
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
92205699 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
f8579182
MV
20 */
21\f
22
23#include "libguile/__scm.h"
6e708ef2 24#include "libguile/unif.h"
f8579182 25
e0e49670
MV
26/* Generic procedures.
27 */
28
29SCM_API SCM scm_uniform_vector_p (SCM v);
30SCM_API SCM scm_uniform_vector_length (SCM v);
31SCM_API SCM scm_uniform_vector_ref (SCM v, SCM idx);
32SCM_API SCM scm_uniform_vector_set_x (SCM v, SCM idx, SCM val);
33SCM_API SCM scm_uniform_vector_to_list (SCM v);
69730f92
MV
34SCM_API SCM scm_uniform_vector_read_x (SCM v, SCM port_or_fd,
35 SCM start, SCM end);
36SCM_API SCM scm_uniform_vector_write (SCM v, SCM port_or_fd,
37 SCM start, SCM end);
e0e49670
MV
38
39SCM_API int scm_is_uniform_vector (SCM obj);
40SCM_API size_t scm_c_uniform_vector_length (SCM v);
811eb6d0
MV
41SCM_API SCM scm_c_uniform_vector_ref (SCM v, size_t idx);
42SCM_API void scm_c_uniform_vector_set_x (SCM v, size_t idx, SCM val);
fea99690 43SCM_API size_t scm_array_handle_uniform_element_size (scm_t_array_handle *h);
6e708ef2
MV
44SCM_API const void *scm_array_handle_uniform_elements (scm_t_array_handle *h);
45SCM_API void *scm_array_handle_uniform_writable_elements (scm_t_array_handle *h);
46SCM_API const void *scm_uniform_vector_elements (SCM uvec,
47 scm_t_array_handle *h,
48 size_t *lenp, ssize_t *incp);
49SCM_API void *scm_uniform_vector_writable_elements (SCM uvec,
50 scm_t_array_handle *h,
51 size_t *lenp,
52 ssize_t *incp);
e0e49670
MV
53
54/* Specific procedures.
55 */
56
f8579182
MV
57SCM_API SCM scm_u8vector_p (SCM obj);
58SCM_API SCM scm_make_u8vector (SCM n, SCM fill);
ab7acbb7 59SCM_API SCM scm_take_u8vector (scm_t_uint8 *data, size_t n);
f8579182
MV
60SCM_API SCM scm_u8vector (SCM l);
61SCM_API SCM scm_u8vector_length (SCM uvec);
62SCM_API SCM scm_u8vector_ref (SCM uvec, SCM index);
63SCM_API SCM scm_u8vector_set_x (SCM uvec, SCM index, SCM value);
64SCM_API SCM scm_u8vector_to_list (SCM uvec);
65SCM_API SCM scm_list_to_u8vector (SCM l);
90d4368c 66SCM_API SCM scm_any_to_u8vector (SCM obj);
6e708ef2
MV
67SCM_API const scm_t_uint8 *scm_array_handle_u8_elements (scm_t_array_handle *h);
68SCM_API scm_t_uint8 *scm_array_handle_u8_writable_elements (scm_t_array_handle *h);
69SCM_API const scm_t_uint8 *scm_u8vector_elements (SCM uvec,
70 scm_t_array_handle *h,
71 size_t *lenp, ssize_t *incp);
72SCM_API scm_t_uint8 *scm_u8vector_writable_elements (SCM uvec,
73 scm_t_array_handle *h,
74 size_t *lenp,
75 ssize_t *incp);
f8579182
MV
76
77SCM_API SCM scm_s8vector_p (SCM obj);
78SCM_API SCM scm_make_s8vector (SCM n, SCM fill);
ab7acbb7 79SCM_API SCM scm_take_s8vector (scm_t_int8 *data, size_t n);
f8579182
MV
80SCM_API SCM scm_s8vector (SCM l);
81SCM_API SCM scm_s8vector_length (SCM uvec);
82SCM_API SCM scm_s8vector_ref (SCM uvec, SCM index);
83SCM_API SCM scm_s8vector_set_x (SCM uvec, SCM index, SCM value);
84SCM_API SCM scm_s8vector_to_list (SCM uvec);
85SCM_API SCM scm_list_to_s8vector (SCM l);
90d4368c 86SCM_API SCM scm_any_to_s8vector (SCM obj);
6e708ef2
MV
87SCM_API const scm_t_int8 *scm_array_handle_s8_elements (scm_t_array_handle *h);
88SCM_API scm_t_int8 *scm_array_handle_s8_writable_elements (scm_t_array_handle *h);
89SCM_API const scm_t_int8 *scm_s8vector_elements (SCM uvec,
90 scm_t_array_handle *h,
91 size_t *lenp, ssize_t *incp);
92SCM_API scm_t_int8 *scm_s8vector_writable_elements (SCM uvec,
93 scm_t_array_handle *h,
94 size_t *lenp,
95 ssize_t *incp);
f8579182
MV
96
97SCM_API SCM scm_u16vector_p (SCM obj);
98SCM_API SCM scm_make_u16vector (SCM n, SCM fill);
ab7acbb7 99SCM_API SCM scm_take_u16vector (scm_t_uint16 *data, size_t n);
f8579182
MV
100SCM_API SCM scm_u16vector (SCM l);
101SCM_API SCM scm_u16vector_length (SCM uvec);
102SCM_API SCM scm_u16vector_ref (SCM uvec, SCM index);
103SCM_API SCM scm_u16vector_set_x (SCM uvec, SCM index, SCM value);
104SCM_API SCM scm_u16vector_to_list (SCM uvec);
105SCM_API SCM scm_list_to_u16vector (SCM l);
90d4368c 106SCM_API SCM scm_any_to_u16vector (SCM obj);
6e708ef2
MV
107SCM_API const scm_t_uint16 *scm_array_handle_u16_elements (scm_t_array_handle *h);
108SCM_API scm_t_uint16 *scm_array_handle_u16_writable_elements (scm_t_array_handle *h);
109SCM_API const scm_t_uint16 *scm_u16vector_elements (SCM uvec,
110 scm_t_array_handle *h,
111 size_t *lenp,
112 ssize_t *incp);
113SCM_API scm_t_uint16 *scm_u16vector_writable_elements (SCM uvec,
114 scm_t_array_handle *h,
115 size_t *lenp,
116 ssize_t *incp);
f8579182
MV
117
118SCM_API SCM scm_s16vector_p (SCM obj);
119SCM_API SCM scm_make_s16vector (SCM n, SCM fill);
ab7acbb7 120SCM_API SCM scm_take_s16vector (scm_t_int16 *data, size_t n);
f8579182
MV
121SCM_API SCM scm_s16vector (SCM l);
122SCM_API SCM scm_s16vector_length (SCM uvec);
123SCM_API SCM scm_s16vector_ref (SCM uvec, SCM index);
124SCM_API SCM scm_s16vector_set_x (SCM uvec, SCM index, SCM value);
125SCM_API SCM scm_s16vector_to_list (SCM uvec);
126SCM_API SCM scm_list_to_s16vector (SCM l);
90d4368c 127SCM_API SCM scm_any_to_s16vector (SCM obj);
6e708ef2
MV
128SCM_API const scm_t_int16 *scm_array_handle_s16_elements (scm_t_array_handle *h);
129SCM_API scm_t_int16 *scm_array_handle_s16_writable_elements (scm_t_array_handle *h);
130SCM_API const scm_t_int16 *scm_s16vector_elements (SCM uvec,
131 scm_t_array_handle *h,
132 size_t *lenp, ssize_t *incp);
133SCM_API scm_t_int16 *scm_s16vector_writable_elements (SCM uvec,
134 scm_t_array_handle *h,
135 size_t *lenp,
136 ssize_t *incp);
f8579182
MV
137
138SCM_API SCM scm_u32vector_p (SCM obj);
139SCM_API SCM scm_make_u32vector (SCM n, SCM fill);
ab7acbb7 140SCM_API SCM scm_take_u32vector (scm_t_uint32 *data, size_t n);
f8579182
MV
141SCM_API SCM scm_u32vector (SCM l);
142SCM_API SCM scm_u32vector_length (SCM uvec);
143SCM_API SCM scm_u32vector_ref (SCM uvec, SCM index);
144SCM_API SCM scm_u32vector_set_x (SCM uvec, SCM index, SCM value);
145SCM_API SCM scm_u32vector_to_list (SCM uvec);
146SCM_API SCM scm_list_to_u32vector (SCM l);
90d4368c 147SCM_API SCM scm_any_to_u32vector (SCM obj);
6e708ef2
MV
148SCM_API const scm_t_uint32 *scm_array_handle_u32_elements (scm_t_array_handle *h);
149SCM_API scm_t_uint32 *scm_array_handle_u32_writable_elements (scm_t_array_handle *h);
150SCM_API const scm_t_uint32 *scm_u32vector_elements (SCM uvec,
151 scm_t_array_handle *h,
152 size_t *lenp,
153 ssize_t *incp);
154SCM_API scm_t_uint32 *scm_u32vector_writable_elements (SCM uvec,
155 scm_t_array_handle *h,
156 size_t *lenp,
157 ssize_t *incp);
f8579182
MV
158
159SCM_API SCM scm_s32vector_p (SCM obj);
160SCM_API SCM scm_make_s32vector (SCM n, SCM fill);
ab7acbb7 161SCM_API SCM scm_take_s32vector (scm_t_int32 *data, size_t n);
f8579182
MV
162SCM_API SCM scm_s32vector (SCM l);
163SCM_API SCM scm_s32vector_length (SCM uvec);
164SCM_API SCM scm_s32vector_ref (SCM uvec, SCM index);
165SCM_API SCM scm_s32vector_set_x (SCM uvec, SCM index, SCM value);
166SCM_API SCM scm_s32vector_to_list (SCM uvec);
167SCM_API SCM scm_list_to_s32vector (SCM l);
90d4368c 168SCM_API SCM scm_any_to_s32vector (SCM obj);
6e708ef2
MV
169SCM_API const scm_t_int32 *scm_array_handle_s32_elements (scm_t_array_handle *h);
170SCM_API scm_t_int32 *scm_array_handle_s32_writable_elements (scm_t_array_handle *h);
171SCM_API const scm_t_int32 *scm_s32vector_elements (SCM uvec,
172 scm_t_array_handle *h,
173 size_t *lenp, ssize_t *incp);
174SCM_API scm_t_int32 *scm_s32vector_writable_elements (SCM uvec,
175 scm_t_array_handle *h,
176 size_t *lenp,
177 ssize_t *incp);
f8579182
MV
178
179SCM_API SCM scm_u64vector_p (SCM obj);
180SCM_API SCM scm_make_u64vector (SCM n, SCM fill);
181SCM_API SCM scm_u64vector (SCM l);
182SCM_API SCM scm_u64vector_length (SCM uvec);
183SCM_API SCM scm_u64vector_ref (SCM uvec, SCM index);
184SCM_API SCM scm_u64vector_set_x (SCM uvec, SCM index, SCM value);
185SCM_API SCM scm_u64vector_to_list (SCM uvec);
186SCM_API SCM scm_list_to_u64vector (SCM l);
90d4368c 187SCM_API SCM scm_any_to_u64vector (SCM obj);
00c17d45
MV
188
189#if SCM_HAVE_T_UINT64
ab7acbb7 190SCM_API SCM scm_take_u64vector (scm_t_uint64 *data, size_t n);
6e708ef2
MV
191SCM_API const scm_t_uint64 *scm_array_handle_u64_elements (scm_t_array_handle *h);
192SCM_API scm_t_uint64 *scm_array_handle_u64_writable_elements (scm_t_array_handle *h);
193SCM_API const scm_t_uint64 *scm_u64vector_elements (SCM uvec,
194 scm_t_array_handle *h,
195 size_t *lenp,
196 ssize_t *incp);
197SCM_API scm_t_uint64 *scm_u64vector_writable_elements (SCM uvec,
198 scm_t_array_handle *h,
199 size_t *lenp,
200 ssize_t *incp);
00c17d45 201#endif
f8579182
MV
202
203SCM_API SCM scm_s64vector_p (SCM obj);
204SCM_API SCM scm_make_s64vector (SCM n, SCM fill);
205SCM_API SCM scm_s64vector (SCM l);
206SCM_API SCM scm_s64vector_length (SCM uvec);
207SCM_API SCM scm_s64vector_ref (SCM uvec, SCM index);
208SCM_API SCM scm_s64vector_set_x (SCM uvec, SCM index, SCM value);
209SCM_API SCM scm_s64vector_to_list (SCM uvec);
210SCM_API SCM scm_list_to_s64vector (SCM l);
90d4368c 211SCM_API SCM scm_any_to_s64vector (SCM obj);
00c17d45
MV
212
213#if SCM_HAVE_T_INT64
ab7acbb7 214SCM_API SCM scm_take_s64vector (scm_t_int64 *data, size_t n);
6e708ef2
MV
215SCM_API const scm_t_int64 *scm_array_handle_s64_elements (scm_t_array_handle *h);
216SCM_API scm_t_int64 *scm_array_handle_s64_writable_elements (scm_t_array_handle *h);
217SCM_API const scm_t_int64 *scm_s64vector_elements (SCM uvec,
218 scm_t_array_handle *h,
219 size_t *lenp, ssize_t *incp);
220SCM_API scm_t_int64 *scm_s64vector_writable_elements (SCM uvec,
221 scm_t_array_handle *h,
222 size_t *lenp,
223 ssize_t *incp);
00c17d45 224#endif
f8579182
MV
225
226SCM_API SCM scm_f32vector_p (SCM obj);
227SCM_API SCM scm_make_f32vector (SCM n, SCM fill);
ab7acbb7 228SCM_API SCM scm_take_f32vector (float *data, size_t n);
f8579182
MV
229SCM_API SCM scm_f32vector (SCM l);
230SCM_API SCM scm_f32vector_length (SCM uvec);
231SCM_API SCM scm_f32vector_ref (SCM uvec, SCM index);
232SCM_API SCM scm_f32vector_set_x (SCM uvec, SCM index, SCM value);
233SCM_API SCM scm_f32vector_to_list (SCM uvec);
234SCM_API SCM scm_list_to_f32vector (SCM l);
90d4368c 235SCM_API SCM scm_any_to_f32vector (SCM obj);
6e708ef2
MV
236SCM_API const float *scm_array_handle_f32_elements (scm_t_array_handle *h);
237SCM_API float *scm_array_handle_f32_writable_elements (scm_t_array_handle *h);
238SCM_API const float *scm_f32vector_elements (SCM uvec,
239 scm_t_array_handle *h,
240 size_t *lenp, ssize_t *incp);
241SCM_API float *scm_f32vector_writable_elements (SCM uvec,
242 scm_t_array_handle *h,
243 size_t *lenp,
244 ssize_t *incp);
f8579182
MV
245
246SCM_API SCM scm_f64vector_p (SCM obj);
247SCM_API SCM scm_make_f64vector (SCM n, SCM fill);
ab7acbb7 248SCM_API SCM scm_take_f64vector (double *data, size_t n);
f8579182
MV
249SCM_API SCM scm_f64vector (SCM l);
250SCM_API SCM scm_f64vector_length (SCM uvec);
251SCM_API SCM scm_f64vector_ref (SCM uvec, SCM index);
252SCM_API SCM scm_f64vector_set_x (SCM uvec, SCM index, SCM value);
253SCM_API SCM scm_f64vector_to_list (SCM uvec);
254SCM_API SCM scm_list_to_f64vector (SCM l);
90d4368c 255SCM_API SCM scm_any_to_f64vector (SCM obj);
6e708ef2
MV
256SCM_API const double *scm_array_handle_f64_elements (scm_t_array_handle *h);
257SCM_API double *scm_array_handle_f64_writable_elements (scm_t_array_handle *h);
258SCM_API const double *scm_f64vector_elements (SCM uvec,
259 scm_t_array_handle *h,
260 size_t *lenp, ssize_t *incp);
261SCM_API double *scm_f64vector_writable_elements (SCM uvec,
262 scm_t_array_handle *h,
263 size_t *lenp,
264 ssize_t *incp);
f8579182 265
cbdc8379
MV
266SCM_API SCM scm_c32vector_p (SCM obj);
267SCM_API SCM scm_make_c32vector (SCM n, SCM fill);
ab7acbb7 268SCM_API SCM scm_take_c32vector (float *data, size_t n);
cbdc8379
MV
269SCM_API SCM scm_c32vector (SCM l);
270SCM_API SCM scm_c32vector_length (SCM uvec);
271SCM_API SCM scm_c32vector_ref (SCM uvec, SCM index);
272SCM_API SCM scm_c32vector_set_x (SCM uvec, SCM index, SCM value);
273SCM_API SCM scm_c32vector_to_list (SCM uvec);
274SCM_API SCM scm_list_to_c32vector (SCM l);
90d4368c 275SCM_API SCM scm_any_to_c32vector (SCM obj);
6e708ef2
MV
276SCM_API const float *scm_array_handle_c32_elements (scm_t_array_handle *h);
277SCM_API float *scm_array_handle_c32_writable_elements (scm_t_array_handle *h);
278SCM_API const float *scm_c32vector_elements (SCM uvec,
279 scm_t_array_handle *h,
280 size_t *lenp, ssize_t *incp);
281SCM_API float *scm_c32vector_writable_elements (SCM uvec,
282 scm_t_array_handle *h,
283 size_t *lenp,
284 ssize_t *incp);
cbdc8379
MV
285
286SCM_API SCM scm_c64vector_p (SCM obj);
287SCM_API SCM scm_make_c64vector (SCM n, SCM fill);
ab7acbb7 288SCM_API SCM scm_take_c64vector (double *data, size_t n);
cbdc8379
MV
289SCM_API SCM scm_c64vector (SCM l);
290SCM_API SCM scm_c64vector_length (SCM uvec);
291SCM_API SCM scm_c64vector_ref (SCM uvec, SCM index);
292SCM_API SCM scm_c64vector_set_x (SCM uvec, SCM index, SCM value);
293SCM_API SCM scm_c64vector_to_list (SCM uvec);
294SCM_API SCM scm_list_to_c64vector (SCM l);
90d4368c 295SCM_API SCM scm_any_to_c64vector (SCM obj);
6e708ef2
MV
296SCM_API const double *scm_array_handle_c64_elements (scm_t_array_handle *h);
297SCM_API double *scm_array_handle_c64_writable_elements (scm_t_array_handle *h);
298SCM_API const double *scm_c64vector_elements (SCM uvec,
299 scm_t_array_handle *h,
300 size_t *lenp, ssize_t *incp);
301SCM_API double *scm_c64vector_writable_elements (SCM uvec,
302 scm_t_array_handle *h,
303 size_t *lenp,
304 ssize_t *incp);
cbdc8379 305
f301dbf3 306SCM_API SCM scm_i_generalized_vector_type (SCM vec);
e0e49670 307SCM_API const char *scm_i_uniform_vector_tag (SCM uvec);
4ea4bc4c
MV
308SCM_API scm_i_t_array_ref scm_i_uniform_vector_ref_proc (SCM uvec);
309SCM_API scm_i_t_array_set scm_i_uniform_vector_set_proc (SCM uvec);
e0e49670 310
ec313f0e
MV
311#if SCM_ENABLE_DEPRECATED
312
313/* Deprecated because we want people to use the scm_t_array_handle
314 interface.
315*/
316
e0e49670 317SCM_API size_t scm_uniform_element_size (SCM obj);
f8579182 318
ec313f0e
MV
319#endif
320
f8579182
MV
321SCM_API void scm_init_srfi_4 (void);
322
323#endif /* SCM_SRFI_4_H */