mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
8178e1f7da
Added more array support that depends on malloc. Added string clone (that uses malloc). Added test for it. Eliminated stack allocated buffers from most of the unit checks.
55 lines
1.2 KiB
V
55 lines
1.2 KiB
V
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, cap, 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 (a mut 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 := 0; i < nr_repeats; i++ {
|
|
mem_copy(arr.data + i * a.len * a.element_size, a.data, a.len * a.element_size)
|
|
}
|
|
return arr
|
|
}
|