1 template<typename T> CELL array_capacity(T *array)
4 CELL header = untag_header(array->header);
5 assert(header == T::type_number);
7 return array->capacity >> TAG_BITS;
10 #define AREF(array,index) ((CELL)(array) + sizeof(F_ARRAY) + (index) * CELLS)
11 #define UNAREF(array,ptr) (((CELL)(ptr)-(CELL)(array)-sizeof(F_ARRAY)) / CELLS)
13 template <typename T> CELL array_nth(T *array, CELL slot)
16 assert(slot < array_capacity<T>(array));
17 assert(untag_header(array->header) == T::type_number);
19 return get(AREF(array,slot));
22 template <typename T> void set_array_nth(T *array, CELL slot, CELL value)
25 assert(slot < array_capacity<T>(array));
26 assert(untag_header(array->header) == T::type_number);
28 put(AREF(array,slot),value);
29 write_barrier((CELL)array);
32 template <typename T> CELL array_size(CELL capacity)
34 return sizeof(T) + capacity * T::element_size;
37 template <typename T> CELL array_size(T *array)
39 return array_size<T>(array_capacity(array));
42 template <typename T> T *allot_array_internal(CELL capacity)
44 T *array = allot<T>(array_size<T>(capacity));
45 array->capacity = tag_fixnum(capacity);
49 template <typename T> bool reallot_array_in_place_p(T *array, CELL capacity)
51 return in_zone(&nursery,(CELL)array) && capacity <= array_capacity(array);
54 template <typename T> T *reallot_array(T *array_, CELL capacity)
56 gc_root<T> array(array_);
58 if(reallot_array_in_place_p(array.untagged(),capacity))
60 array->capacity = tag_fixnum(capacity);
61 return array.untagged();
65 CELL to_copy = array_capacity(array.untagged());
66 if(capacity < to_copy)
69 T *new_array = allot_array_internal<T>(capacity);
71 memcpy(new_array + 1,array.untagged() + 1,to_copy * T::element_size);
72 memset((char *)(new_array + 1) + to_copy * T::element_size,
73 0,(capacity - to_copy) * T::element_size);