/* -*- mode: C -*- */


#ifdef AGET_FROM_INDEX_ARRAY_FUN
static int AGET_FROM_INDEX_ARRAY_FUN (GENERIC_TYPE *src_data, SLindex_Type num_elements,
				      SLang_Array_Type *ind_at, int is_range,
				      GENERIC_TYPE *dest_data)
{
   SLindex_Type *indices, *indices_max;

   if (is_range)
     {
	SLarray_Range_Array_Type *r = (SLarray_Range_Array_Type *)ind_at->data;
	SLindex_Type idx = r->first_index, delta = r->delta;
	SLindex_Type j, jmax = (SLindex_Type) ind_at->num_elements;
	int ispos;

	if (jmax == 0)
	  return 0;

	if (-1 == check_range_indices (idx, delta, jmax, num_elements, &ispos))
	  return -1;

	if (ispos)
	  {
	     for (j = 0; j < jmax; j++)
	       {
		  dest_data[j] = src_data[idx];
		  idx += delta;
	       }
	     return 0;
	  }

	for (j = 0; j < jmax; j++)
	  {
	     SLindex_Type i = idx;
	     if (i < 0) i += num_elements;
	     dest_data[j] = src_data[i];
	     idx += delta;
	  }
	return 0;
     }

   /* Since the index array is linear, I can address it directly */
   indices = (SLindex_Type *) ind_at->data;
   indices_max = indices + ind_at->num_elements;

   while (indices < indices_max)
     {
	SLindex_Type i = *indices;

	CHECK_INDEX(i,num_elements,return -1);
	*dest_data++ = src_data[i];
	indices++;
     }
   return 0;
}
# undef AGET_FROM_INDEX_ARRAY_FUN
#endif

#ifdef APUT_FROM_INDEX_ARRAY_FUN
static int APUT_FROM_INDEX_ARRAY_FUN (char *src_data, SLuindex_Type data_increment,
				      SLang_Array_Type *ind_at, int is_range,
				      GENERIC_TYPE *dest_data, SLindex_Type num_elements)
{
   SLindex_Type *indices, *indices_max;

   if (is_range)
     {
	SLarray_Range_Array_Type *r = (SLarray_Range_Array_Type *)ind_at->data;
	SLindex_Type idx = r->first_index, delta = r->delta;
	SLindex_Type j, jmax = (SLindex_Type) ind_at->num_elements;
	int ispos;

	if (jmax == 0)
	  return 0;

	if (-1 == check_range_indices (idx, delta, jmax, num_elements, &ispos))
	  return -1;

	if (ispos)
	  {
	     for (j = 0; j < jmax; j++)
	       {
		  dest_data[idx] = *(GENERIC_TYPE *)src_data;
		  idx += delta;
		  src_data += data_increment;
	       }
	     return 0;
	  }

	for (j = 0; j < jmax; j++)
	  {
	     SLindex_Type i = idx;
	     if (i < 0) i += num_elements;
	     dest_data[i] = *(GENERIC_TYPE *)src_data;
	     idx += delta;
	     src_data += data_increment;
	  }
	return 0;
     }

   /* Since the index array is linear, I can address it directly */
   indices = (SLindex_Type *) ind_at->data;
   indices_max = indices + ind_at->num_elements;

   while (indices < indices_max)
     {
	SLindex_Type i = *indices;

	CHECK_INDEX(i,num_elements,return -1);
	dest_data[i] = *(GENERIC_TYPE *)src_data;
	src_data += data_increment;
	indices++;
     }
   return 0;
}
# undef APUT_FROM_INDEX_ARRAY_FUN
#endif

#undef GENERIC_TYPE
