diff --git a/vlib/v/gen/c/fn.v b/vlib/v/gen/c/fn.v index 7838221489..389881d179 100644 --- a/vlib/v/gen/c/fn.v +++ b/vlib/v/gen/c/fn.v @@ -749,6 +749,18 @@ fn (mut g Gen) method_call(node ast.CallExpr) { g.expr(node.args[0].expr) g.write('})') return + } else if left_sym.kind == .array && node.name == 'delete' { + g.write('array_delete(') + if node.left_type.is_ptr() { + g.expr(node.left) + } else { + g.write('&') + g.expr(node.left) + } + g.write(', ') + g.expr(node.args[0].expr) + g.write(')') + return } if left_sym.kind in [.sum_type, .interface_] { diff --git a/vlib/v/tests/generics_array_delete_test.v b/vlib/v/tests/generics_array_delete_test.v new file mode 100644 index 0000000000..75fb511c0b --- /dev/null +++ b/vlib/v/tests/generics_array_delete_test.v @@ -0,0 +1,48 @@ +struct Set { +mut: + field []T +} + +fn (mut s Set) add(value T) bool { + mut result := false + + if value !in s.field { + s.field << value + result = true + } + + return result +} + +fn (mut s Set) remove(value T) bool { + mut result := false + + if value in s.field { + ndx := s.field.index(value) + s.field.delete(ndx) + result = true + } + + return result +} + +fn test_generics_array_delete() { + mut set := Set{} + + mut added := set.add(4) + println(added) + assert added + + added = set.add(3) + println(added) + assert added + + added = set.add(3) + println(added) + assert !added + + println(set) + mut removed := set.remove(4) + println(removed) + assert removed +}