factor/vm/generic_arrays.hpp

65 lines
1.6 KiB
C++
Raw Normal View History

2009-05-04 02:46:13 -04:00
namespace factor
{
template<typename Array> cell array_capacity(const Array *array)
2009-05-02 05:43:58 -04:00
{
#ifdef FACTOR_DEBUG
FACTOR_ASSERT(array->type() == Array::type_number);
2009-05-02 05:43:58 -04:00
#endif
return array->capacity >> TAG_BITS;
}
template<typename Array> cell array_size(cell capacity)
2009-05-02 05:43:58 -04:00
{
return sizeof(Array) + capacity * Array::element_size;
2009-05-02 05:43:58 -04:00
}
template<typename Array> cell array_size(Array *array)
2009-05-02 05:43:58 -04:00
{
return array_size<Array>(array_capacity(array));
2009-05-02 05:43:58 -04:00
}
/* Allocates memory */
2009-10-20 13:45:00 -04:00
template<typename Array> Array *factor_vm::allot_uninitialized_array(cell capacity)
2009-09-29 14:53:10 -04:00
{
Array *array = allot<Array>(array_size<Array>(capacity));
2009-09-29 14:53:10 -04:00
array->capacity = tag_fixnum(capacity);
return array;
}
template<typename Array> bool factor_vm::reallot_array_in_place_p(Array *array, cell capacity)
2009-09-29 14:53:10 -04:00
{
2009-10-05 23:16:08 -04:00
return nursery.contains_p(array) && capacity <= array_capacity(array);
2009-09-29 14:53:10 -04:00
}
/* Allocates memory (sometimes) */
template<typename Array> Array *factor_vm::reallot_array(Array *array_, cell capacity)
2009-09-29 14:53:10 -04:00
{
data_root<Array> array(array_,this);
2009-09-29 14:53:10 -04:00
if (array_capacity(array.untagged()) == capacity)
return array.untagged();
2009-09-29 14:53:10 -04:00
if(reallot_array_in_place_p(array.untagged(),capacity))
{
array->capacity = tag_fixnum(capacity);
return array.untagged();
}
else
{
cell to_copy = array_capacity(array.untagged());
if(capacity < to_copy)
to_copy = capacity;
2009-10-20 13:45:00 -04:00
Array *new_array = allot_uninitialized_array<Array>(capacity);
memcpy(new_array + 1,array.untagged() + 1,to_copy * Array::element_size);
memset((char *)(new_array + 1) + to_copy * Array::element_size,
0,(capacity - to_copy) * Array::element_size);
2009-09-29 14:53:10 -04:00
return new_array;
}
}
2009-05-04 02:46:13 -04:00
}