factor/vm/generic_arrays.hpp

70 lines
1.6 KiB
C++
Raw Normal View History

2009-05-04 02:46:13 -04:00
namespace factor
{
2009-05-04 05:50:24 -04:00
template<typename T> cell array_capacity(T *array)
2009-05-02 05:43:58 -04:00
{
#ifdef FACTOR_DEBUG
2009-05-04 05:50:24 -04:00
assert(array->h.hi_tag() == T::type_number);
2009-05-02 05:43:58 -04:00
#endif
return array->capacity >> TAG_BITS;
}
2009-05-04 05:50:24 -04:00
template <typename T> cell array_size(cell capacity)
2009-05-02 05:43:58 -04:00
{
return sizeof(T) + capacity * T::element_size;
}
2009-05-04 05:50:24 -04:00
template <typename T> cell array_size(T *array)
2009-05-02 05:43:58 -04:00
{
return array_size<T>(array_capacity(array));
}
template <typename T> T *factorvm::allot_array_internal(cell capacity)
2009-05-02 05:43:58 -04:00
{
2009-05-02 10:19:09 -04:00
T *array = allot<T>(array_size<T>(capacity));
2009-05-02 05:43:58 -04:00
array->capacity = tag_fixnum(capacity);
return array;
}
template <typename T> T *allot_array_internal(cell capacity)
{
return vm->allot_array_internal<T>(capacity);
}
template <typename T> bool factorvm::reallot_array_in_place_p(T *array, cell capacity)
2009-05-02 05:43:58 -04:00
{
return in_zone(&nursery,array) && capacity <= array_capacity(array);
2009-05-02 05:43:58 -04:00
}
template <typename T> bool reallot_array_in_place_p(T *array, cell capacity)
{
return vm->reallot_array_in_place_p<T>(array,capacity);
}
2009-08-17 16:37:10 -04:00
template <typename TYPE> TYPE *factorvm::reallot_array(TYPE *array_, cell capacity)
2009-05-02 05:43:58 -04:00
{
2009-08-17 16:37:10 -04:00
gc_root<TYPE> array(array_,this);
2009-05-02 05:43:58 -04:00
2009-05-02 10:19:09 -04:00
if(reallot_array_in_place_p(array.untagged(),capacity))
2009-05-02 05:43:58 -04:00
{
array->capacity = tag_fixnum(capacity);
2009-05-02 10:19:09 -04:00
return array.untagged();
2009-05-02 05:43:58 -04:00
}
else
{
2009-05-04 05:50:24 -04:00
cell to_copy = array_capacity(array.untagged());
2009-05-02 05:43:58 -04:00
if(capacity < to_copy)
to_copy = capacity;
2009-08-17 16:37:10 -04:00
TYPE *new_array = allot_array_internal<TYPE>(capacity);
2009-05-02 05:43:58 -04:00
2009-08-17 16:37:10 -04:00
memcpy(new_array + 1,array.untagged() + 1,to_copy * TYPE::element_size);
memset((char *)(new_array + 1) + to_copy * TYPE::element_size,
0,(capacity - to_copy) * TYPE::element_size);
2009-05-02 05:43:58 -04:00
return new_array;
}
}
2009-05-04 02:46:13 -04:00
}