v2 / vlib / builtin / linux_bare / old / array_bare.v
53 lines · 47 sloc · 1.32 KB · 2332ecff4811b8c97dfda8e825170e9397962519
Raw
1module builtin
2
3pub struct array {
4pub:
5 data voidptr
6 len int
7 cap int
8 element_size int
9}
10
11// for now off the stack
12fn new_array_from_c_array(len int, cap int, elm_size int, c_array voidptr) array {
13 arr := array{
14 len: len
15 cap: cap
16 element_size: elm_size
17 data: c_array
18 }
19 return arr
20}
21
22// Private function. Used to implement array[] operator
23fn (a array) get(i int) voidptr {
24 if i < 0 || i >= a.len {
25 panic('array.get: index out of range') // FIXME: (i == ${i}, a.len == ${a.len})')
26 }
27 return a.data + i * a.element_size
28}
29
30// Private function. Used to implement assignment to the array element.
31fn (mut a array) set(i int, val voidptr) {
32 if i < 0 || i >= a.len {
33 panic('array.set: index out of range') // FIXME: (i == ${i}, a.len == ${a.len})')
34 }
35 mem_copy(a.data + a.element_size * i, val, a.element_size)
36}
37
38// array.repeat returns new array with the given array elements
39// repeated `nr_repeat` times
40pub fn (a array) repeat(nr_repeats int) array {
41 assert nr_repeats >= 0
42
43 arr := array{
44 len: nr_repeats * a.len
45 cap: nr_repeats * a.len
46 element_size: a.element_size
47 data: malloc(nr_repeats * a.len * a.element_size)
48 }
49 for i in 0 .. nr_repeats {
50 mem_copy(arr.data + i * a.len * a.element_size, a.data, a.len * a.element_size)
51 }
52 return arr
53}
54