diff --git a/vlib/builtin/array.v b/vlib/builtin/array.v index d4088d375c..6cde270f98 100644 --- a/vlib/builtin/array.v +++ b/vlib/builtin/array.v @@ -720,3 +720,21 @@ pub fn (a array) pointers() []voidptr { } return res } + +// voidptr.vbytes() - makes a V []byte structure from a C style memory buffer. NB: the data is reused, NOT copied! +[unsafe] +pub fn (data voidptr) vbytes(len int) []byte { + res := array{ + element_size: 1 + data: data + len: len + cap: len + } + return res +} + +// byteptr.vbytes() - makes a V []byte structure from a C style memory buffer. NB: the data is reused, NOT copied! +[unsafe] +pub fn (data byteptr) vbytes(len int) []byte { + return unsafe {voidptr(data).vbytes(len)} +} diff --git a/vlib/builtin/array_test.v b/vlib/builtin/array_test.v index f1c9fbe1d0..b01f5d9fc6 100644 --- a/vlib/builtin/array_test.v +++ b/vlib/builtin/array_test.v @@ -1047,14 +1047,48 @@ const ( grid_size_1 = 2 grid_size_2 = 3 grid_size_3 = 4 - cell_value = 123 + cell_value = 123 ) fn test_multidimensional_array_initialization_with_consts() { - mut data := [][][]int{ len: grid_size_1, init: [][]int{ len: grid_size_2, init: []int{ len: grid_size_3, init: cell_value } } } + mut data := [][][]int{len: grid_size_1, init: [][]int{len: grid_size_2, init: []int{len: grid_size_3, init: cell_value}}} assert data.len == grid_size_1 assert data[0].len == grid_size_2 assert data[0][0].len == grid_size_3 assert data[0][0][0] == cell_value assert data[1][1][1] == cell_value } + +fn test_byteptr_vbytes() { + unsafe { + bp := malloc(5) + bp[0] = 1 + bp[1] = 2 + bp[2] = 3 + bp[3] = 4 + bp[4] = 255 + bytes := bp.vbytes(5) + println(bytes) + assert bytes.len == 5 + assert bytes[0] == 1 + assert bytes[1] == 2 + assert bytes[2] == 3 + assert bytes[3] == 4 + assert bytes[4] == 255 + } +} + +fn test_voidptr_vbytes() { + unsafe { + bp := malloc(3) + bp[0] = 4 + bp[1] = 5 + bp[2] = 6 + bytes := voidptr(bp).vbytes(3) + assert bytes.len == 3 + assert bytes[0] == 4 + assert bytes[1] == 5 + assert bytes[2] == 6 + println(bytes) + } +}