Merge commit '9b5da400dde6e6bc8fd0e318e7ca1feffa5870db'
[bpt/guile.git] / libguile / vectors.c
CommitLineData
6922d92f 1/* Copyright (C) 1995,1996,1998,1999,2000,2001, 2006, 2008, 2009, 2010,
9b5da400 2 * 2011, 2012, 2014 Free Software Foundation, Inc.
6922d92f 3 *
73be1d9e 4 * This library is free software; you can redistribute it and/or
53befeb7
NJ
5 * modify it under the terms of the GNU Lesser General Public License
6 * as published by the Free Software Foundation; either version 3 of
7 * the License, or (at your option) any later version.
0f2d19dd 8 *
53befeb7
NJ
9 * This library is distributed in the hope that it will be useful, but
10 * WITHOUT ANY WARRANTY; without even the implied warranty of
73be1d9e
MV
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
0f2d19dd 13 *
73be1d9e
MV
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
53befeb7
NJ
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
17 * 02110-1301 USA
73be1d9e 18 */
1bbd0b84 19
1bbd0b84 20
0f2d19dd 21\f
dbb605f5
LC
22#ifdef HAVE_CONFIG_H
23# include <config.h>
24#endif
0f2d19dd 25
a0599745
MD
26#include "libguile/_scm.h"
27#include "libguile/eq.h"
28#include "libguile/root.h"
29#include "libguile/strings.h"
30
31#include "libguile/validate.h"
32#include "libguile/vectors.h"
5c39373f 33#include "libguile/arrays.h" /* Hit me with the ugly stick */
f332e957 34#include "libguile/generalized-vectors.h"
88797580
MV
35#include "libguile/strings.h"
36#include "libguile/srfi-13.h"
1d0df896 37#include "libguile/dynwind.h"
88797580 38
1c44468d 39#include "libguile/bdw-gc.h"
3a2de079
LC
40
41
0f2d19dd
JB
42\f
43
6e708ef2
MV
44#define VECTOR_MAX_LENGTH (SCM_T_BITS_MAX >> 8)
45
6e708ef2
MV
46int
47scm_is_vector (SCM obj)
48{
49 if (SCM_I_IS_VECTOR (obj))
50 return 1;
04b87de5 51 if (SCM_I_ARRAYP (obj) && SCM_I_ARRAY_NDIM (obj) == 1)
6e708ef2 52 {
04b87de5 53 SCM v = SCM_I_ARRAY_V (obj);
6e708ef2
MV
54 return SCM_I_IS_VECTOR (v);
55 }
56 return 0;
57}
58
59int
60scm_is_simple_vector (SCM obj)
1d0df896 61{
6e708ef2 62 return SCM_I_IS_VECTOR (obj);
1d0df896
MV
63}
64
354116f7
MV
65const SCM *
66scm_vector_elements (SCM vec, scm_t_array_handle *h,
67 size_t *lenp, ssize_t *incp)
68{
3a2de079 69 if (SCM_I_WVECTP (vec))
a141db86 70 scm_wrong_type_arg_msg (NULL, 0, vec, "non-weak vector");
3a2de079 71
354116f7
MV
72 scm_generalized_vector_get_handle (vec, h);
73 if (lenp)
74 {
75 scm_t_array_dim *dim = scm_array_handle_dims (h);
76 *lenp = dim->ubnd - dim->lbnd + 1;
77 *incp = dim->inc;
78 }
79 return scm_array_handle_elements (h);
80}
81
82SCM *
83scm_vector_writable_elements (SCM vec, scm_t_array_handle *h,
84 size_t *lenp, ssize_t *incp)
85{
3a2de079 86 if (SCM_I_WVECTP (vec))
a141db86 87 scm_wrong_type_arg_msg (NULL, 0, vec, "non-weak vector");
3a2de079 88
354116f7
MV
89 scm_generalized_vector_get_handle (vec, h);
90 if (lenp)
91 {
92 scm_t_array_dim *dim = scm_array_handle_dims (h);
93 *lenp = dim->ubnd - dim->lbnd + 1;
94 *incp = dim->inc;
95 }
96 return scm_array_handle_writable_elements (h);
97}
98
a1ec6916 99SCM_DEFINE (scm_vector_p, "vector?", 1, 0, 0,
5ffe9968 100 (SCM obj),
1e6808ea
MG
101 "Return @code{#t} if @var{obj} is a vector, otherwise return\n"
102 "@code{#f}.")
1bbd0b84 103#define FUNC_NAME s_scm_vector_p
0f2d19dd 104{
de5c0f58 105 return scm_from_bool (scm_is_vector (obj));
0f2d19dd 106}
1bbd0b84 107#undef FUNC_NAME
0f2d19dd 108
f172c0b7 109SCM_GPROC (s_vector_length, "vector-length", 1, 0, 0, scm_vector_length, g_vector_length);
1e6808ea 110/* Returns the number of elements in @var{vector} as an exact integer. */
0f2d19dd 111SCM
f172c0b7 112scm_vector_length (SCM v)
0f2d19dd 113{
9db57a19 114 if (SCM_I_IS_NONWEAK_VECTOR (v))
6e708ef2 115 return scm_from_size_t (SCM_I_VECTOR_LENGTH (v));
04b87de5 116 else if (SCM_I_ARRAYP (v) && SCM_I_ARRAY_NDIM (v) == 1)
de5c0f58 117 {
04b87de5 118 scm_t_array_dim *dim = SCM_I_ARRAY_DIMS (v);
de5c0f58
MV
119 return scm_from_size_t (dim->ubnd - dim->lbnd + 1);
120 }
121 else
fa075d40 122 return scm_wta_dispatch_1 (g_vector_length, v, 1, "vector-length");
0f2d19dd
JB
123}
124
88797580
MV
125size_t
126scm_c_vector_length (SCM v)
127{
9b5da400 128 if (SCM_I_IS_NONWEAK_VECTOR (v))
6e708ef2 129 return SCM_I_VECTOR_LENGTH (v);
88797580 130 else
de5c0f58 131 return scm_to_size_t (scm_vector_length (v));
88797580
MV
132}
133
f172c0b7 134SCM_REGISTER_PROC (s_list_to_vector, "list->vector", 1, 0, 0, scm_vector);
5ffe9968 135/*
942e5b91
MG
136 "Return a newly created vector initialized to the elements of"
137 "the list @var{list}.\n\n"
138 "@lisp\n"
139 "(vector->list '#(dah dah didah)) @result{} (dah dah didah)\n"
140 "(list->vector '(dididit dah)) @result{} #(dididit dah)\n"
141 "@end lisp")
5ffe9968 142*/
a1ec6916 143SCM_DEFINE (scm_vector, "vector", 0, 0, 1,
f172c0b7 144 (SCM l),
8f85c0c6
NJ
145 "@deffnx {Scheme Procedure} list->vector l\n"
146 "Return a newly allocated vector composed of the\n"
1e6808ea
MG
147 "given arguments. Analogous to @code{list}.\n"
148 "\n"
942e5b91 149 "@lisp\n"
1e6808ea 150 "(vector 'a 'b 'c) @result{} #(a b c)\n"
942e5b91 151 "@end lisp")
1bbd0b84 152#define FUNC_NAME s_scm_vector
0f2d19dd
JB
153{
154 SCM res;
22a52da1 155 SCM *data;
1d0df896 156 long i, len;
6e708ef2 157 scm_t_array_handle handle;
22a52da1 158
1d0df896 159 SCM_VALIDATE_LIST_COPYLEN (1, l, len);
34d19ef6 160
6e708ef2
MV
161 res = scm_c_make_vector (len, SCM_UNSPECIFIED);
162 data = scm_vector_writable_elements (res, &handle, NULL, NULL);
1d0df896 163 i = 0;
c8857a4d 164 while (scm_is_pair (l) && i < len)
22a52da1 165 {
1d0df896 166 data[i] = SCM_CAR (l);
22a52da1 167 l = SCM_CDR (l);
6e708ef2 168 i += 1;
22a52da1
DH
169 }
170
c8857a4d
MV
171 scm_array_handle_release (&handle);
172
0f2d19dd
JB
173 return res;
174}
1bbd0b84 175#undef FUNC_NAME
0f2d19dd 176
f172c0b7 177SCM_GPROC (s_vector_ref, "vector-ref", 2, 0, 0, scm_vector_ref, g_vector_ref);
1cc91f1b 178
5ffe9968
GB
179/*
180 "@var{k} must be a valid index of @var{vector}.\n"
181 "@samp{Vector-ref} returns the contents of element @var{k} of\n"
182 "@var{vector}.\n\n"
942e5b91
MG
183 "@lisp\n"
184 "(vector-ref '#(1 1 2 3 5 8 13 21) 5) @result{} 8\n"
5ffe9968
GB
185 "(vector-ref '#(1 1 2 3 5 8 13 21)\n"
186 " (let ((i (round (* 2 (acos -1)))))\n"
187 " (if (inexact? i)\n"
188 " (inexact->exact i)\n"
942e5b91
MG
189 " i))) @result{} 13\n"
190 "@end lisp"
5ffe9968
GB
191*/
192
0f2d19dd 193SCM
ea633082 194scm_vector_ref (SCM v, SCM k)
685c0d71 195#define FUNC_NAME s_vector_ref
0f2d19dd 196{
de5c0f58 197 return scm_c_vector_ref (v, scm_to_size_t (k));
0f2d19dd 198}
685c0d71 199#undef FUNC_NAME
0f2d19dd 200
88797580
MV
201SCM
202scm_c_vector_ref (SCM v, size_t k)
203{
a141db86 204 if (SCM_I_IS_NONWEAK_VECTOR (v))
de5c0f58 205 {
6e708ef2 206 if (k >= SCM_I_VECTOR_LENGTH (v))
3a2de079 207 scm_out_of_range (NULL, scm_from_size_t (k));
a141db86 208 return SCM_SIMPLE_VECTOR_REF (v, k);
de5c0f58 209 }
04b87de5 210 else if (SCM_I_ARRAYP (v) && SCM_I_ARRAY_NDIM (v) == 1)
88797580 211 {
04b87de5
MV
212 scm_t_array_dim *dim = SCM_I_ARRAY_DIMS (v);
213 SCM vv = SCM_I_ARRAY_V (v);
a141db86
AW
214
215 k = SCM_I_ARRAY_BASE (v) + k*dim->inc;
216 if (k >= dim->ubnd - dim->lbnd + 1)
217 scm_out_of_range (NULL, scm_from_size_t (k));
218
219 if (SCM_I_IS_NONWEAK_VECTOR (vv))
220 return SCM_SIMPLE_VECTOR_REF (vv, k);
a141db86
AW
221 else
222 scm_wrong_type_arg_msg (NULL, 0, v, "non-uniform vector");
88797580 223 }
de5c0f58 224 else
fa075d40
AW
225 return scm_wta_dispatch_2 (g_vector_ref, v, scm_from_size_t (k), 2,
226 "vector-ref");
88797580
MV
227}
228
f172c0b7 229SCM_GPROC (s_vector_set_x, "vector-set!", 3, 0, 0, scm_vector_set_x, g_vector_set_x);
1cc91f1b 230
942e5b91
MG
231/* "@var{k} must be a valid index of @var{vector}.\n"
232 "@code{Vector-set!} stores @var{obj} in element @var{k} of @var{vector}.\n"
233 "The value returned by @samp{vector-set!} is unspecified.\n"
234 "@lisp\n"
235 "(let ((vec (vector 0 '(2 2 2 2) "Anna")))\n"
236 " (vector-set! vec 1 '("Sue" "Sue"))\n"
237 " vec) @result{} #(0 ("Sue" "Sue") "Anna")\n"
238 "(vector-set! '#(0 1 2) 1 "doe") @result{} @emph{error} ; constant vector\n"
239 "@end lisp"
5ffe9968
GB
240*/
241
0f2d19dd 242SCM
f172c0b7 243scm_vector_set_x (SCM v, SCM k, SCM obj)
685c0d71 244#define FUNC_NAME s_vector_set_x
0f2d19dd 245{
de5c0f58 246 scm_c_vector_set_x (v, scm_to_size_t (k), obj);
60c497a3 247 return SCM_UNSPECIFIED;
0f2d19dd 248}
685c0d71 249#undef FUNC_NAME
0f2d19dd 250
de5c0f58 251void
88797580
MV
252scm_c_vector_set_x (SCM v, size_t k, SCM obj)
253{
a141db86 254 if (SCM_I_IS_NONWEAK_VECTOR (v))
88797580 255 {
6e708ef2 256 if (k >= SCM_I_VECTOR_LENGTH (v))
a141db86
AW
257 scm_out_of_range (NULL, scm_from_size_t (k));
258 SCM_SIMPLE_VECTOR_SET (v, k, obj);
de5c0f58 259 }
04b87de5 260 else if (SCM_I_ARRAYP (v) && SCM_I_ARRAY_NDIM (v) == 1)
de5c0f58 261 {
04b87de5
MV
262 scm_t_array_dim *dim = SCM_I_ARRAY_DIMS (v);
263 SCM vv = SCM_I_ARRAY_V (v);
a141db86
AW
264
265 k = SCM_I_ARRAY_BASE (v) + k*dim->inc;
266 if (k >= dim->ubnd - dim->lbnd + 1)
267 scm_out_of_range (NULL, scm_from_size_t (k));
268
269 if (SCM_I_IS_NONWEAK_VECTOR (vv))
270 SCM_SIMPLE_VECTOR_SET (vv, k, obj);
6e708ef2
MV
271 else
272 scm_wrong_type_arg_msg (NULL, 0, v, "non-uniform vector");
88797580
MV
273 }
274 else
275 {
de5c0f58 276 if (SCM_UNPACK (g_vector_set_x))
fa075d40
AW
277 scm_wta_dispatch_n (g_vector_set_x,
278 scm_list_3 (v, scm_from_size_t (k), obj),
279 0,
280 "vector-set!");
de5c0f58
MV
281 else
282 scm_wrong_type_arg_msg (NULL, 0, v, "vector");
88797580
MV
283 }
284}
0f2d19dd 285
a1ec6916 286SCM_DEFINE (scm_make_vector, "make-vector", 1, 1, 0,
1bbd0b84 287 (SCM k, SCM fill),
1e6808ea 288 "Return a newly allocated vector of @var{k} elements. If a\n"
8f85c0c6
NJ
289 "second argument is given, then each position is initialized to\n"
290 "@var{fill}. Otherwise the initial contents of each position is\n"
1e6808ea 291 "unspecified.")
1bbd0b84 292#define FUNC_NAME s_scm_make_vector
0f2d19dd 293{
6e708ef2 294 size_t l = scm_to_unsigned_integer (k, 0, VECTOR_MAX_LENGTH);
e11e83f3 295
1b9be268 296 if (SCM_UNBNDP (fill))
d60cebe2 297 fill = SCM_UNSPECIFIED;
e11e83f3
MV
298
299 return scm_c_make_vector (l, fill);
00ffa0e7
KN
300}
301#undef FUNC_NAME
302
e382fdbe 303
00ffa0e7 304SCM
88797580 305scm_c_make_vector (size_t k, SCM fill)
00ffa0e7
KN
306#define FUNC_NAME s_scm_make_vector
307{
a141db86
AW
308 SCM vector;
309 unsigned long int j;
ed7e0765 310
a141db86 311 SCM_ASSERT_RANGE (1, scm_from_size_t (k), k <= VECTOR_MAX_LENGTH);
1b9be268 312
a141db86 313 vector = scm_words ((k << 8) | scm_tc7_vector, k + 1);
1b9be268 314
a141db86
AW
315 for (j = 0; j < k; ++j)
316 SCM_SIMPLE_VECTOR_SET (vector, j, fill);
1b9be268 317
a141db86 318 return vector;
0f2d19dd 319}
1bbd0b84 320#undef FUNC_NAME
0f2d19dd 321
6e708ef2
MV
322SCM_DEFINE (scm_vector_copy, "vector-copy", 1, 0, 0,
323 (SCM vec),
324 "Return a copy of @var{vec}.")
325#define FUNC_NAME s_scm_vector_copy
326{
327 scm_t_array_handle handle;
328 size_t i, len;
329 ssize_t inc;
330 const SCM *src;
ed7e0765 331 SCM result, *dst;
6e708ef2
MV
332
333 src = scm_vector_elements (vec, &handle, &len, &inc);
ed7e0765
LC
334
335 result = scm_c_make_vector (len, SCM_UNDEFINED);
336 dst = SCM_I_VECTOR_WELTS (result);
6e708ef2
MV
337 for (i = 0; i < len; i++, src += inc)
338 dst[i] = *src;
ed7e0765 339
c8857a4d 340 scm_array_handle_release (&handle);
6e708ef2 341
ed7e0765 342 return result;
6e708ef2
MV
343}
344#undef FUNC_NAME
345
d525e4f9 346\f
3b3b36dd 347SCM_DEFINE (scm_vector_to_list, "vector->list", 1, 0, 0,
1e6808ea 348 (SCM v),
8f85c0c6 349 "Return a newly allocated list composed of the elements of @var{v}.\n"
1e6808ea 350 "\n"
942e5b91
MG
351 "@lisp\n"
352 "(vector->list '#(dah dah didah)) @result{} (dah dah didah)\n"
353 "(list->vector '(dididit dah)) @result{} #(dididit dah)\n"
354 "@end lisp")
1bbd0b84 355#define FUNC_NAME s_scm_vector_to_list
0f2d19dd 356{
6e708ef2
MV
357 SCM res = SCM_EOL;
358 const SCM *data;
359 scm_t_array_handle handle;
22be72d3 360 size_t i, count, len;
6e708ef2
MV
361 ssize_t inc;
362
363 data = scm_vector_elements (v, &handle, &len, &inc);
22be72d3
LC
364 for (i = (len - 1) * inc, count = 0;
365 count < len;
366 i -= inc, count++)
367 res = scm_cons (data[i], res);
368
c8857a4d 369 scm_array_handle_release (&handle);
6e708ef2 370 return res;
0f2d19dd 371}
1bbd0b84 372#undef FUNC_NAME
0f2d19dd
JB
373
374
a1ec6916 375SCM_DEFINE (scm_vector_fill_x, "vector-fill!", 2, 0, 0,
1e6808ea 376 (SCM v, SCM fill),
8f85c0c6 377 "Store @var{fill} in every position of @var{vector}. The value\n"
1e6808ea 378 "returned by @code{vector-fill!} is unspecified.")
1bbd0b84 379#define FUNC_NAME s_scm_vector_fill_x
0f2d19dd 380{
6e708ef2
MV
381 scm_t_array_handle handle;
382 SCM *data;
383 size_t i, len;
384 ssize_t inc;
385
386 data = scm_vector_writable_elements (v, &handle, &len, &inc);
387 for (i = 0; i < len; i += inc)
388 data[i] = fill;
c8857a4d 389 scm_array_handle_release (&handle);
6e708ef2 390 return SCM_UNSPECIFIED;
0f2d19dd 391}
1bbd0b84 392#undef FUNC_NAME
0f2d19dd
JB
393
394
0f2d19dd 395SCM
354116f7 396scm_i_vector_equal_p (SCM x, SCM y)
0f2d19dd 397{
c014a02e 398 long i;
6e708ef2
MV
399 for (i = SCM_I_VECTOR_LENGTH (x) - 1; i >= 0; i--)
400 if (scm_is_false (scm_equal_p (SCM_I_VECTOR_ELTS (x)[i],
401 SCM_I_VECTOR_ELTS (y)[i])))
0f2d19dd
JB
402 return SCM_BOOL_F;
403 return SCM_BOOL_T;
404}
405
406
a1ec6916 407SCM_DEFINE (scm_vector_move_left_x, "vector-move-left!", 5, 0, 0,
1bbd0b84 408 (SCM vec1, SCM start1, SCM end1, SCM vec2, SCM start2),
694a9bb3
NJ
409 "Copy elements from @var{vec1}, positions @var{start1} to @var{end1},\n"
410 "to @var{vec2} starting at position @var{start2}. @var{start1} and\n"
411 "@var{start2} are inclusive indices; @var{end1} is exclusive.\n\n"
412 "@code{vector-move-left!} copies elements in leftmost order.\n"
413 "Therefore, in the case where @var{vec1} and @var{vec2} refer to the\n"
414 "same vector, @code{vector-move-left!} is usually appropriate when\n"
415 "@var{start1} is greater than @var{start2}.")
1bbd0b84 416#define FUNC_NAME s_scm_vector_move_left_x
0f2d19dd 417{
6e708ef2
MV
418 scm_t_array_handle handle1, handle2;
419 const SCM *elts1;
420 SCM *elts2;
de5c0f58 421 size_t len1, len2;
6e708ef2 422 ssize_t inc1, inc2;
a55c2b68 423 size_t i, j, e;
6e708ef2
MV
424
425 elts1 = scm_vector_elements (vec1, &handle1, &len1, &inc1);
426 elts2 = scm_vector_writable_elements (vec2, &handle2, &len2, &inc2);
34d19ef6 427
de5c0f58
MV
428 i = scm_to_unsigned_integer (start1, 0, len1);
429 e = scm_to_unsigned_integer (end1, i, len1);
ca659673 430 SCM_ASSERT_RANGE (SCM_ARG3, end1, (e-i) <= len2);
551b96d2
AW
431 j = scm_to_unsigned_integer (start2, 0, len2);
432 SCM_ASSERT_RANGE (SCM_ARG5, start2, j <= len2 - (e - i));
de5c0f58 433
6e708ef2
MV
434 i *= inc1;
435 e *= inc1;
436 j *= inc2;
437 for (; i < e; i += inc1, j += inc2)
438 elts2[j] = elts1[i];
439
c8857a4d
MV
440 scm_array_handle_release (&handle2);
441 scm_array_handle_release (&handle1);
442
0f2d19dd
JB
443 return SCM_UNSPECIFIED;
444}
1bbd0b84 445#undef FUNC_NAME
0f2d19dd 446
a1ec6916 447SCM_DEFINE (scm_vector_move_right_x, "vector-move-right!", 5, 0, 0,
1bbd0b84 448 (SCM vec1, SCM start1, SCM end1, SCM vec2, SCM start2),
694a9bb3
NJ
449 "Copy elements from @var{vec1}, positions @var{start1} to @var{end1},\n"
450 "to @var{vec2} starting at position @var{start2}. @var{start1} and\n"
451 "@var{start2} are inclusive indices; @var{end1} is exclusive.\n\n"
452 "@code{vector-move-right!} copies elements in rightmost order.\n"
453 "Therefore, in the case where @var{vec1} and @var{vec2} refer to the\n"
454 "same vector, @code{vector-move-right!} is usually appropriate when\n"
455 "@var{start1} is less than @var{start2}.")
1bbd0b84 456#define FUNC_NAME s_scm_vector_move_right_x
0f2d19dd 457{
6e708ef2
MV
458 scm_t_array_handle handle1, handle2;
459 const SCM *elts1;
460 SCM *elts2;
de5c0f58 461 size_t len1, len2;
6e708ef2 462 ssize_t inc1, inc2;
a55c2b68 463 size_t i, j, e;
6e708ef2
MV
464
465 elts1 = scm_vector_elements (vec1, &handle1, &len1, &inc1);
466 elts2 = scm_vector_writable_elements (vec2, &handle2, &len2, &inc2);
0f2d19dd 467
de5c0f58
MV
468 i = scm_to_unsigned_integer (start1, 0, len1);
469 e = scm_to_unsigned_integer (end1, i, len1);
ca659673 470 SCM_ASSERT_RANGE (SCM_ARG3, end1, (e-i) <= len2);
551b96d2
AW
471 j = scm_to_unsigned_integer (start2, 0, len2);
472 SCM_ASSERT_RANGE (SCM_ARG5, start2, j <= len2 - (e - i));
473
474 j += (e - i);
de5c0f58 475
6e708ef2
MV
476 i *= inc1;
477 e *= inc1;
478 j *= inc2;
479 while (i < e)
de5c0f58 480 {
6e708ef2
MV
481 e -= inc1;
482 j -= inc2;
483 elts2[j] = elts1[e];
de5c0f58 484 }
6e708ef2 485
c8857a4d
MV
486 scm_array_handle_release (&handle2);
487 scm_array_handle_release (&handle1);
488
0f2d19dd
JB
489 return SCM_UNSPECIFIED;
490}
1bbd0b84 491#undef FUNC_NAME
0f2d19dd 492
438974d0 493\f
2a610be5
AW
494static SCM
495vector_handle_ref (scm_t_array_handle *h, size_t idx)
88797580 496{
2a610be5
AW
497 if (idx > h->dims[0].ubnd)
498 scm_out_of_range ("vector-handle-ref", scm_from_size_t (idx));
499 return ((SCM*)h->elements)[idx];
88797580
MV
500}
501
2a610be5
AW
502static void
503vector_handle_set (scm_t_array_handle *h, size_t idx, SCM val)
88797580 504{
2a610be5
AW
505 if (idx > h->dims[0].ubnd)
506 scm_out_of_range ("vector-handle-set!", scm_from_size_t (idx));
507 ((SCM*)h->writable_elements)[idx] = val;
88797580 508}
88797580 509
2a610be5
AW
510static void
511vector_get_handle (SCM v, scm_t_array_handle *h)
88797580 512{
2a610be5
AW
513 h->array = v;
514 h->ndims = 1;
515 h->dims = &h->dim0;
516 h->dim0.lbnd = 0;
517 h->dim0.ubnd = SCM_I_VECTOR_LENGTH (v) - 1;
518 h->dim0.inc = 1;
519 h->element_type = SCM_ARRAY_ELEMENT_TYPE_SCM;
520 h->elements = h->writable_elements = SCM_I_VECTOR_WELTS (v);
88797580
MV
521}
522
c5f17102
AW
523/* the & ~2 allows catching scm_tc7_wvect as well. needs changing if you change
524 tags.h. */
2a610be5
AW
525SCM_ARRAY_IMPLEMENTATION (scm_tc7_vector, 0x7f & ~2,
526 vector_handle_ref, vector_handle_set,
f65e0168 527 vector_get_handle)
f65e0168 528SCM_VECTOR_IMPLEMENTATION (SCM_ARRAY_ELEMENT_TYPE_SCM, scm_make_vector)
88797580 529
1cc91f1b 530
0f2d19dd
JB
531void
532scm_init_vectors ()
0f2d19dd 533{
a0599745 534#include "libguile/vectors.x"
0f2d19dd
JB
535}
536
89e00824
ML
537
538/*
539 Local Variables:
540 c-file-style: "gnu"
541 End:
542*/