]> gitweb.factorcode.org Git - factor.git/blob - vm/byte_arrays.cpp
removed global functions from byte_arrays.cpp and tuples.cpp
[factor.git] / vm / byte_arrays.cpp
1 #include "master.hpp"
2
3 namespace factor
4 {
5
6 byte_array *factorvm::allot_byte_array(cell size)
7 {
8         byte_array *array = allot_array_internal<byte_array>(size);
9         memset(array + 1,0,size);
10         return array;
11 }
12
13
14 inline void factorvm::vmprim_byte_array()
15 {
16         cell size = unbox_array_size();
17         dpush(tag<byte_array>(allot_byte_array(size)));
18 }
19
20 PRIMITIVE(byte_array)
21 {
22         PRIMITIVE_GETVM()->vmprim_byte_array();
23 }
24
25 inline void factorvm::vmprim_uninitialized_byte_array()
26 {
27         cell size = unbox_array_size();
28         dpush(tag<byte_array>(allot_array_internal<byte_array>(size)));
29 }
30
31 PRIMITIVE(uninitialized_byte_array)
32 {
33         PRIMITIVE_GETVM()->vmprim_uninitialized_byte_array();
34 }
35
36 inline void factorvm::vmprim_resize_byte_array()
37 {
38         byte_array *array = untag_check<byte_array>(dpop());
39         cell capacity = unbox_array_size();
40         dpush(tag<byte_array>(reallot_array(array,capacity)));
41 }
42
43 PRIMITIVE(resize_byte_array)
44 {
45         PRIMITIVE_GETVM()->vmprim_resize_byte_array();
46 }
47
48 void growable_byte_array::append_bytes(void *elts, cell len)
49 {
50         cell new_size = count + len;
51         factorvm *myvm = elements.myvm;
52         if(new_size >= array_capacity(elements.untagged()))
53                 elements = myvm->reallot_array(elements.untagged(),new_size * 2);
54
55         memcpy(&elements->data<u8>()[count],elts,len);
56
57         count += len;
58 }
59
60 void growable_byte_array::append_byte_array(cell byte_array_)
61 {
62         gc_root<byte_array> byte_array(byte_array_,elements.myvm);
63
64         cell len = array_capacity(byte_array.untagged());
65         cell new_size = count + len;
66         factorvm *myvm = elements.myvm;
67         if(new_size >= array_capacity(elements.untagged()))
68                 elements = myvm->reallot_array(elements.untagged(),new_size * 2);
69
70         memcpy(&elements->data<u8>()[count],byte_array->data<u8>(),len);
71
72         count += len;
73 }
74
75 void growable_byte_array::trim()
76 {
77         factorvm *myvm = elements.myvm;
78         elements = myvm->reallot_array(elements.untagged(),count);
79 }
80
81 }