From bee5e7de03232452233c7e749e236362747c9208 Mon Sep 17 00:00:00 2001 From: yuyi Date: Wed, 8 Sep 2021 01:40:21 +0800 Subject: [PATCH] v.gen.c: fix generics array delete (#11429) --- vlib/v/gen/c/fn.v | 12 ++++++ vlib/v/tests/generics_array_delete_test.v | 48 +++++++++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100644 vlib/v/tests/generics_array_delete_test.v 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 +}