parent
f059a9e96c
commit
242c5760f1
|
@ -346,17 +346,25 @@ pub fn (a &array) clone() array {
|
|||
// Recursively clone-generated elements if array element is array type
|
||||
size_of_array := int(sizeof(array))
|
||||
if a.element_size == size_of_array {
|
||||
mut is_elem_array := true
|
||||
for i in 0 .. a.len {
|
||||
ar := array{}
|
||||
unsafe { C.memcpy(&ar, a.get_unsafe(i), size_of_array) }
|
||||
if ar.len > ar.cap || ar.cap <= 0 || ar.element_size <= 0 {
|
||||
is_elem_array = false
|
||||
break
|
||||
}
|
||||
ar_clone := ar.clone()
|
||||
unsafe { arr.set_unsafe(i, &ar_clone) }
|
||||
}
|
||||
} else {
|
||||
if !isnil(a.data) {
|
||||
unsafe { C.memcpy(byteptr(arr.data), a.data, a.cap * a.element_size) }
|
||||
if is_elem_array {
|
||||
return arr
|
||||
}
|
||||
}
|
||||
|
||||
if !isnil(a.data) {
|
||||
unsafe { C.memcpy(byteptr(arr.data), a.data, a.cap * a.element_size) }
|
||||
}
|
||||
return arr
|
||||
}
|
||||
|
||||
|
|
|
@ -1343,3 +1343,19 @@ fn test_multi_fixed_array_with_default_init() {
|
|||
println(a)
|
||||
assert a == [[10, 10, 10]!, [10, 10, 10]!, [10, 10, 10]!]!
|
||||
}
|
||||
|
||||
struct Abc {
|
||||
mut:
|
||||
x i64
|
||||
y i64
|
||||
z i64
|
||||
}
|
||||
|
||||
fn test_clone_of_same_elem_size_array() {
|
||||
mut arr := []Abc{}
|
||||
arr << Abc{1, 2, 3}
|
||||
arr << Abc{2, 3, 4}
|
||||
arr2 := arr.clone()
|
||||
println(arr2)
|
||||
assert arr2 == [Abc{1, 2, 3}, Abc{2, 3, 4}]
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue