1
0
mirror of https://github.com/vlang/v.git synced 2023-08-10 21:13:21 +03:00

cgen: fix generic for_in using iteration (#15979)

This commit is contained in:
yuyi 2022-10-06 23:20:38 +08:00 committed by GitHub
parent 73e28ec523
commit 03f82d5f68
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 51 additions and 1 deletions

View File

@ -358,7 +358,7 @@ fn (mut g Gen) for_in_stmt(node_ ast.ForInStmt) {
g.writeln('for (size_t $node.key_var = 0;; ++$node.key_var) {')
}
t_var := g.new_tmp_var()
receiver_typ := next_fn.params[0].typ
receiver_typ := g.unwrap_generic(next_fn.params[0].typ)
receiver_styp := g.typ(receiver_typ)
mut fn_name := receiver_styp.replace_each(['*', '', '.', '__']) + '_next'
receiver_sym := g.table.sym(receiver_typ)

View File

@ -0,0 +1,50 @@
pub struct Vec<T> {
mut:
data &T [required]
cap usize [required]
len usize [required]
}
pub fn new<T>() Vec<T> {
return Vec<T>{
data: unsafe { nil }
cap: 0
len: 0
}
}
pub fn (ar &Vec<T>) iter() Iter<T> {
return Iter<T>{
v: unsafe { ar }
}
}
pub struct Iter<T> {
mut:
v &Vec<T> [required]
pos usize
}
pub fn (mut iter Iter<T>) next() ?&T {
if iter.pos >= iter.v.len {
return none
}
defer {
iter.pos++
}
return unsafe { &iter.v.data[iter.pos] }
}
fn test_generics_for_in_iterate() {
mut goods := new<int>()
goods.call_generic_fn(fn (a &int) bool {
return *a > 1
})
assert true
}
fn (arr Vec<T>) call_generic_fn(cb fn (&T) bool) {
for val in arr.iter() {
println(cb(val))
}
}