4 template<typename T> cell array_capacity(T *array)
7 assert(array->h.hi_tag() == T::type_number);
9 return array->capacity >> TAG_BITS;
12 template <typename T> cell array_size(cell capacity)
14 return sizeof(T) + capacity * T::element_size;
17 template <typename T> cell array_size(T *array)
19 return array_size<T>(array_capacity(array));
22 template <typename T> T *allot_array_internal(cell capacity)
24 T *array = allot<T>(array_size<T>(capacity));
25 array->capacity = tag_fixnum(capacity);
29 template <typename T> bool reallot_array_in_place_p(T *array, cell capacity)
31 return in_zone(&nursery,array) && capacity <= array_capacity(array);
34 template <typename T> T *reallot_array(T *array_, cell capacity)
36 gc_root<T> array(array_,vm);
38 if(reallot_array_in_place_p(array.untagged(),capacity))
40 array->capacity = tag_fixnum(capacity);
41 return array.untagged();
45 cell to_copy = array_capacity(array.untagged());
46 if(capacity < to_copy)
49 T *new_array = allot_array_internal<T>(capacity);
51 memcpy(new_array + 1,array.untagged() + 1,to_copy * T::element_size);
52 memset((char *)(new_array + 1) + to_copy * T::element_size,
53 0,(capacity - to_copy) * T::element_size);