2004-07-16 02:26:21 -04:00
|
|
|
typedef struct {
|
|
|
|
CELL header;
|
|
|
|
/* untagged */
|
|
|
|
CELL capacity;
|
|
|
|
} ARRAY;
|
|
|
|
|
|
|
|
INLINE ARRAY* untag_array(CELL tagged)
|
|
|
|
{
|
2004-11-27 22:26:05 -05:00
|
|
|
/* type_check(ARRAY_TYPE,tagged); */
|
|
|
|
return (ARRAY*)UNTAG(tagged); /* FIXME */
|
2004-07-16 02:26:21 -04:00
|
|
|
}
|
|
|
|
|
2004-08-27 02:09:24 -04:00
|
|
|
ARRAY* allot_array(CELL type, FIXNUM capacity);
|
|
|
|
ARRAY* array(FIXNUM capacity, CELL fill);
|
|
|
|
ARRAY* grow_array(ARRAY* array, FIXNUM capacity, CELL fill);
|
|
|
|
ARRAY* shrink_array(ARRAY* array, FIXNUM capacity);
|
2004-07-16 02:26:21 -04:00
|
|
|
|
2004-08-27 02:09:24 -04:00
|
|
|
#define AREF(array,index) ((CELL)(array) + sizeof(ARRAY) + (index) * CELLS)
|
2004-07-16 02:26:21 -04:00
|
|
|
|
|
|
|
#define ASIZE(pointer) align8(sizeof(ARRAY) + \
|
2004-08-27 02:09:24 -04:00
|
|
|
((ARRAY*)(pointer))->capacity * CELLS)
|
2004-07-16 02:26:21 -04:00
|
|
|
|
|
|
|
/* untagged & unchecked */
|
|
|
|
INLINE CELL array_nth(ARRAY* array, CELL index)
|
|
|
|
{
|
|
|
|
return get(AREF(array,index));
|
|
|
|
}
|
|
|
|
|
|
|
|
/* untagged & unchecked */
|
|
|
|
INLINE void set_array_nth(ARRAY* array, CELL index, CELL value)
|
|
|
|
{
|
|
|
|
put(AREF(array,index),value);
|
|
|
|
}
|
|
|
|
|
|
|
|
void fixup_array(ARRAY* array);
|
|
|
|
void collect_array(ARRAY* array);
|