v/vlib/v/tests/generics_struct_anon_fn_typ...

70 lines
1.2 KiB
V

fn neg(a int) int {
return -a
}
struct FnHolder1<T> {
func T
}
fn (self FnHolder1<T>) call(a int) int {
return self.func(a)
}
struct FnHolder2<T> {
func fn (int) int
}
fn (self FnHolder2<T>) call(a int) int {
return self.func(a)
}
fn holder_call_1<T>(func T, a int) int {
h := FnHolder1<T>{func}
return h.call(a)
}
fn holder_call_2<T>(func T, a int) int {
h := FnHolder2<T>{func}
return h.call(a)
}
fn holder_call_11<T>(func T, a int) int {
f := func
h := FnHolder1<T>{f}
return h.call(a)
}
fn holder_call_21<T>(func T, a int) int {
f := func
h := FnHolder2<T>{f}
return h.call(a)
}
fn holder_call_12<T>(func T, a int) int {
return FnHolder1<T>{func}.call(a)
}
fn holder_call_22<T>(func T, a int) int {
return FnHolder2<T>{func}.call(a)
}
fn test_generic_struct_with_anon_fn_parameter() {
mut ret := holder_call_1(neg, 1)
assert ret == -1
ret = holder_call_11(neg, 2)
assert ret == -2
ret = holder_call_12(neg, 3)
assert ret == -3
ret = FnHolder1<fn (int) int>{neg}.call(4)
assert ret == -4
ret = holder_call_2(neg, 3)
assert ret == -3
ret = holder_call_21(neg, 4)
assert ret == -4
ret = holder_call_22(neg, 5)
assert ret == -5
ret = FnHolder2<fn (int) int>{neg}.call(6)
assert ret == -6
}