Skip to content

Commit 9dd8228

Browse files
authored
arrays: move carray_to_varray from builtin, make it generic (#15503)
1 parent 2dde7ff commit 9dd8228

File tree

4 files changed

+31
-12
lines changed

4 files changed

+31
-12
lines changed

vlib/arrays/arrays.v

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -570,3 +570,12 @@ fn can_copy_bits<T>() bool {
570570
}
571571
return false
572572
}
573+
574+
// carray_to_varray copies a C byte array into a V array of type `T`.
575+
// See also: `cstring_to_vstring`
576+
[unsafe]
577+
pub fn carray_to_varray<T>(c_array voidptr, c_array_len int) []T {
578+
mut v_array := []T{len: c_array_len}
579+
unsafe { vmemcpy(v_array.data, c_array, c_array_len * int(sizeof(T))) }
580+
return v_array
581+
}

vlib/builtin/array.v

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -126,15 +126,6 @@ fn new_array_from_c_array_no_alloc(len int, cap int, elm_size int, c_array voidp
126126
return arr
127127
}
128128

129-
// carray_to_varray copies a C byte array into a V `u8` array.
130-
// See also: `cstring_to_vstring`
131-
[unsafe]
132-
pub fn carray_to_varray(c_array voidptr, c_array_len int) []u8 {
133-
mut v_array := []u8{len: c_array_len}
134-
unsafe { vmemcpy(v_array.data, c_array, c_array_len * int(sizeof(u8))) }
135-
return v_array
136-
}
137-
138129
// Private function. Increases the `cap` of an array to the
139130
// required value by copying the data to a new memory location
140131
// (creating a clone) unless `a.cap` is already large enough.

vlib/v/tests/c_array_test.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,10 @@ void* gen_c_array(int size) {
66
return c_array;
77
}
88

9+
void* gen_c_int_array(int size) {
10+
int *c_array = malloc(size);
11+
for(int i = 0; i < size; i++) {
12+
c_array[i] = i & 0xFF;
13+
}
14+
return c_array;
15+
}

vlib/v/tests/c_array_test.v

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,26 @@
1+
import arrays
2+
13
#insert "@VEXEROOT/vlib/v/tests/c_array_test.c"
24

35
fn C.gen_c_array(size int) voidptr
46

7+
fn C.gen_c_int_array(size int) voidptr
8+
59
fn test_carray_to_varray() {
610
size := 10
711
mut c_array := C.gen_c_array(size)
8-
v_array := unsafe { carray_to_varray(c_array, size) }
12+
v_u8_array := unsafe { arrays.carray_to_varray<u8>(c_array, size) }
913
unsafe { C.free(c_array) }
10-
assert v_array.len == size
11-
for i, elem in v_array {
14+
assert v_u8_array.len == size
15+
for i, elem in v_u8_array {
16+
assert elem == i
17+
}
18+
19+
c_int_array := C.gen_c_int_array(size)
20+
v_int_array := unsafe { arrays.carray_to_varray<int>(c_int_array, size) }
21+
unsafe { C.free(c_int_array) }
22+
assert v_int_array.len == size
23+
for i, elem in v_int_array {
1224
assert elem == i
1325
}
1426
}

0 commit comments

Comments
 (0)