1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-24 12:20:20 +02:00

add generic array implementation facility

* libguile/array-handle.c (scm_i_register_array_implementation):
  (scm_i_array_implementation_for_obj): Add generic array facility,
  which will (in a few commits) detangle the array code.
  (scm_array_get_handle): Use the generic array facility. Note that
  scm_t_array_handle no longer has ref and set function pointers;
  instead it has a pointer to the array implementation. It is unlikely
  that code out there used these functions, however, as the supported
  way was through scm_array_handle_ref/set_x.
  (scm_array_handle_pos): Move this function here from arrays.c.
  (scm_array_handle_element_type): New function, returns a Scheme value
  representing the type of element stored in this array.

* libguile/array-handle.h (scm_t_array_element_type): New enum, for
  generically determining the type of an array.
  (scm_array_handle_rank):
  (scm_array_handle_dims): These are now just #defines.

* libguile/arrays.c:
* libguile/bitvectors.c:
* libguile/bytevectors.c:
* libguile/srfi-4.c:
* libguile/strings.c:
* libguile/vectors.c: Register array implementations for all of these.

* libguile/inline.h: Update for array_handle_ref/set change.
* libguile/deprecated.h: Need to include arrays.h now.
This commit is contained in:
Andy Wingo 2009-07-19 15:04:40 +02:00
parent 2fa901a51f
commit 2a610be594
12 changed files with 365 additions and 265 deletions

View file

@ -497,11 +497,8 @@ uvec_to_list (int type, SCM uvec)
SCM res = SCM_EOL;
elts = uvec_elements (type, uvec, &handle, &len, &inc);
for (i = len*inc; i > 0;)
{
i -= inc;
res = scm_cons (scm_array_handle_ref (&handle, i), res);
}
for (i = len - 1; i >= 0; i--)
res = scm_cons (scm_array_handle_ref (&handle, i*inc), res);
scm_array_handle_release (&handle);
return res;
}
@ -1086,18 +1083,35 @@ static scm_i_t_array_set uvec_setters[12] = {
c32set, c64set
};
scm_i_t_array_ref
scm_i_uniform_vector_ref_proc (SCM uvec)
static SCM
uvec_handle_ref (scm_t_array_handle *h, size_t index)
{
return uvec_reffers[SCM_UVEC_TYPE(uvec)];
return uvec_reffers [SCM_UVEC_TYPE(h->array)] (h, index);
}
scm_i_t_array_set
scm_i_uniform_vector_set_proc (SCM uvec)
static void
uvec_handle_set (scm_t_array_handle *h, size_t index, SCM val)
{
return uvec_setters[SCM_UVEC_TYPE(uvec)];
uvec_setters [SCM_UVEC_TYPE(h->array)] (h, index, val);
}
static void
uvec_get_handle (SCM v, scm_t_array_handle *h)
{
h->array = v;
h->ndims = 1;
h->dims = &h->dim0;
h->dim0.lbnd = 0;
h->dim0.ubnd = SCM_UVEC_LENGTH (v) - 1;
h->dim0.inc = 1;
h->element_type = SCM_UVEC_TYPE (v) + SCM_ARRAY_ELEMENT_TYPE_U8;
h->elements = h->writable_elements = SCM_UVEC_BASE (v);
}
SCM_ARRAY_IMPLEMENTATION (scm_tc16_uvec, 0xffff,
uvec_handle_ref, uvec_handle_set,
uvec_get_handle);
void
scm_init_srfi_4 (void)
{