VM: Refactor generic_arrays.hpp to Factor style

db4
Erik Charlebois 2013-05-11 22:04:22 -04:00
parent 34d04b9306
commit 4ea2e9ed06
1 changed files with 34 additions and 41 deletions

View File

@ -1,52 +1,45 @@
namespace factor namespace factor {
{
template<typename Array> cell array_capacity(const Array *array) template <typename Array> cell array_capacity(const Array* array) {
{
#ifdef FACTOR_DEBUG #ifdef FACTOR_DEBUG
FACTOR_ASSERT(array->type() == Array::type_number); FACTOR_ASSERT(array->type() == Array::type_number);
#endif #endif
return array->capacity >> TAG_BITS; return array->capacity >> TAG_BITS;
} }
template<typename Array> cell array_size(cell capacity) template <typename Array> cell array_size(cell capacity) {
{
return sizeof(Array) + capacity * Array::element_size; return sizeof(Array) + capacity * Array::element_size;
} }
template<typename Array> cell array_size(Array *array) template <typename Array> cell array_size(Array* array) {
{
return array_size<Array>(array_capacity(array)); return array_size<Array>(array_capacity(array));
} }
/* Allocates memory */ /* Allocates memory */
template<typename Array> Array *factor_vm::allot_uninitialized_array(cell capacity) template <typename Array>
{ Array* factor_vm::allot_uninitialized_array(cell capacity) {
Array* array = allot<Array>(array_size<Array>(capacity)); Array* array = allot<Array>(array_size<Array>(capacity));
array->capacity = tag_fixnum(capacity); array->capacity = tag_fixnum(capacity);
return array; return array;
} }
template<typename Array> bool factor_vm::reallot_array_in_place_p(Array *array, cell capacity) template <typename Array>
{ bool factor_vm::reallot_array_in_place_p(Array* array, cell capacity) {
return nursery.contains_p(array) && capacity <= array_capacity(array); return nursery.contains_p(array) && capacity <= array_capacity(array);
} }
/* Allocates memory (sometimes) */ /* Allocates memory (sometimes) */
template<typename Array> Array *factor_vm::reallot_array(Array *array_, cell capacity) template <typename Array>
{ Array* factor_vm::reallot_array(Array* array_, cell capacity) {
data_root<Array> array(array_, this); data_root<Array> array(array_, this);
if (array_capacity(array.untagged()) == capacity) if (array_capacity(array.untagged()) == capacity)
return array.untagged(); return array.untagged();
if(reallot_array_in_place_p(array.untagged(),capacity)) if (reallot_array_in_place_p(array.untagged(), capacity)) {
{
array->capacity = tag_fixnum(capacity); array->capacity = tag_fixnum(capacity);
return array.untagged(); return array.untagged();
} } else {
else
{
cell to_copy = array_capacity(array.untagged()); cell to_copy = array_capacity(array.untagged());
if (capacity < to_copy) if (capacity < to_copy)
to_copy = capacity; to_copy = capacity;
@ -54,8 +47,8 @@ template<typename Array> Array *factor_vm::reallot_array(Array *array_, cell cap
Array* new_array = allot_uninitialized_array<Array>(capacity); Array* new_array = allot_uninitialized_array<Array>(capacity);
memcpy(new_array + 1, array.untagged() + 1, to_copy * Array::element_size); memcpy(new_array + 1, array.untagged() + 1, to_copy * Array::element_size);
memset((char *)(new_array + 1) + to_copy * Array::element_size, memset((char*)(new_array + 1) + to_copy * Array::element_size, 0,
0,(capacity - to_copy) * Array::element_size); (capacity - to_copy) * Array::element_size);
return new_array; return new_array;
} }