aboutsummaryrefslogtreecommitdiff
path: root/v_windows/v/vlib/builtin/linux_bare/old/array_bare.v
blob: b92214fb4dc94937bc7a4aa809953c5e80e67003 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
module builtin

pub struct array {
pub:
	data         voidptr
	len          int
	cap          int
	element_size int
}

// for now off the stack
fn new_array_from_c_array(len int, cap int, elm_size int, c_array voidptr) array {
	arr := array{
		len: len
		cap: cap
		element_size: elm_size
		data: c_array
	}
	return arr
}

// Private function. Used to implement array[] operator
fn (a array) get(i int) voidptr {
	if i < 0 || i >= a.len {
		panic('array.get: index out of range') // FIXME: (i == $i, a.len == $a.len)')
	}
	return a.data + i * a.element_size
}

// Private function. Used to implement assigment to the array element.
fn (mut a array) set(i int, val voidptr) {
	if i < 0 || i >= a.len {
		panic('array.set: index out of range') // FIXME: (i == $i, a.len == $a.len)')
	}
	mem_copy(a.data + a.element_size * i, val, a.element_size)
}

// array.repeat returns new array with the given array elements
// repeated `nr_repeat` times
pub fn (a array) repeat(nr_repeats int) array {
	assert nr_repeats >= 0

	arr := array{
		len: nr_repeats * a.len
		cap: nr_repeats * a.len
		element_size: a.element_size
		data: malloc(nr_repeats * a.len * a.element_size)
	}
	for i in 0 .. nr_repeats {
		mem_copy(arr.data + i * a.len * a.element_size, a.data, a.len * a.element_size)
	}
	return arr
}