2009-05-02 05:04:19 -04:00
|
|
|
#include "master.hpp"
|
|
|
|
|
2009-05-04 02:46:13 -04:00
|
|
|
namespace factor
|
|
|
|
{
|
|
|
|
|
2009-05-02 05:04:19 -04:00
|
|
|
F_BYTE_ARRAY *allot_byte_array(CELL size)
|
|
|
|
{
|
2009-05-02 05:43:58 -04:00
|
|
|
F_BYTE_ARRAY *array = allot_array_internal<F_BYTE_ARRAY>(size);
|
2009-05-02 05:04:19 -04:00
|
|
|
memset(array + 1,0,size);
|
|
|
|
return array;
|
|
|
|
}
|
|
|
|
|
2009-05-04 02:00:30 -04:00
|
|
|
PRIMITIVE(byte_array)
|
2009-05-02 05:04:19 -04:00
|
|
|
{
|
|
|
|
CELL size = unbox_array_size();
|
2009-05-02 21:47:29 -04:00
|
|
|
dpush(tag<F_BYTE_ARRAY>(allot_byte_array(size)));
|
2009-05-02 05:04:19 -04:00
|
|
|
}
|
|
|
|
|
2009-05-04 02:00:30 -04:00
|
|
|
PRIMITIVE(uninitialized_byte_array)
|
2009-05-02 05:04:19 -04:00
|
|
|
{
|
|
|
|
CELL size = unbox_array_size();
|
2009-05-02 21:47:29 -04:00
|
|
|
dpush(tag<F_BYTE_ARRAY>(allot_array_internal<F_BYTE_ARRAY>(size)));
|
2009-05-02 05:04:19 -04:00
|
|
|
}
|
|
|
|
|
2009-05-04 02:00:30 -04:00
|
|
|
PRIMITIVE(resize_byte_array)
|
2009-05-02 05:04:19 -04:00
|
|
|
{
|
2009-05-02 21:47:29 -04:00
|
|
|
F_BYTE_ARRAY *array = untag_check<F_BYTE_ARRAY>(dpop());
|
2009-05-02 05:04:19 -04:00
|
|
|
CELL capacity = unbox_array_size();
|
2009-05-02 21:47:29 -04:00
|
|
|
dpush(tag<F_BYTE_ARRAY>(reallot_array(array,capacity)));
|
2009-05-02 05:04:19 -04:00
|
|
|
}
|
|
|
|
|
2009-05-02 10:19:09 -04:00
|
|
|
void growable_byte_array::append_bytes(void *elts, CELL len)
|
2009-05-02 05:04:19 -04:00
|
|
|
{
|
2009-05-02 10:19:09 -04:00
|
|
|
CELL new_size = count + len;
|
2009-05-02 05:04:19 -04:00
|
|
|
|
2009-05-02 10:19:09 -04:00
|
|
|
if(new_size >= array_capacity(array.untagged()))
|
|
|
|
array = reallot_array(array.untagged(),new_size * 2);
|
2009-05-02 05:04:19 -04:00
|
|
|
|
2009-05-04 02:00:30 -04:00
|
|
|
memcpy(&array->data<u8>()[count],elts,len);
|
2009-05-02 05:04:19 -04:00
|
|
|
|
2009-05-02 10:19:09 -04:00
|
|
|
count += len;
|
|
|
|
}
|
|
|
|
|
|
|
|
void growable_byte_array::append_byte_array(CELL byte_array_)
|
|
|
|
{
|
|
|
|
gc_root<F_BYTE_ARRAY> byte_array(byte_array_);
|
|
|
|
|
|
|
|
CELL len = array_capacity(byte_array.untagged());
|
|
|
|
CELL new_size = count + len;
|
|
|
|
|
|
|
|
if(new_size >= array_capacity(array.untagged()))
|
|
|
|
array = reallot_array(array.untagged(),new_size * 2);
|
|
|
|
|
2009-05-04 02:00:30 -04:00
|
|
|
memcpy(&array->data<u8>()[count],byte_array->data<u8>(),len);
|
2009-05-02 10:19:09 -04:00
|
|
|
|
|
|
|
count += len;
|
|
|
|
}
|
|
|
|
|
|
|
|
void growable_byte_array::trim()
|
|
|
|
{
|
|
|
|
array = reallot_array(array.untagged(),count);
|
2009-05-02 05:04:19 -04:00
|
|
|
}
|
2009-05-04 02:46:13 -04:00
|
|
|
|
|
|
|
}
|