blob: 1e94603b8f6f0bf9145a34fd7f68d8b9a40a2241 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
|
public delegate string FooFunc (Foo foo, string s);
public class Foo : Object {
public signal string test (string s);
public void add (FooFunc func) {
test.connect (func);
}
public void add_owned (owned FooFunc func) {
test.connect (func);
}
public void add_remove (FooFunc func) {
test.connect (func);
test.disconnect (func);
}
public void add_remove_owned (owned FooFunc func) {
test.connect (func);
test.disconnect (func);
}
public void invoke_test () {
assert (test ("bar") == "foo");
}
public void invoke_test_empty () {
assert (test ("bar") == null);
}
}
public class Bar : Object {
public signal string test (string s);
int i;
public Bar (Foo foo) {
i = 42;
foo.add (instance_callback);
}
public Bar.owned (Foo foo) {
i = 42;
foo.add_owned (instance_callback);
}
public Bar.remove (Foo foo) {
i = 42;
foo.add_remove (instance_callback);
}
public Bar.remove_owned (Foo foo) {
i = 42;
foo.add_remove_owned (instance_callback);
}
string instance_callback (Foo foo, string s) {
assert (foo is Foo);
assert (this is Bar);
assert (s == "bar");
assert (i == 42);
return "foo";
}
}
string callback_static (Foo foo, string s) {
assert (foo is Foo);
assert (s == "bar");
return "foo";
}
void main () {
Foo foo;
Bar bar;
foo = new Foo ();
foo.add ((FooFunc) callback_static);
foo.invoke_test ();
foo = new Foo ();
foo.add_owned ((FooFunc) callback_static);
foo.invoke_test ();
foo = new Foo ();
foo.add_remove ((FooFunc) callback_static);
foo.invoke_test_empty ();
foo = new Foo ();
foo.add_remove_owned ((FooFunc) callback_static);
foo.invoke_test_empty ();
foo = new Foo ();
bar = new Bar (foo);
foo.invoke_test ();
foo = new Foo ();
bar = new Bar.owned (foo);
foo.invoke_test ();
foo = new Foo ();
bar = new Bar.remove (foo);
foo.invoke_test_empty ();
foo = new Foo ();
bar = new Bar.remove_owned (foo);
foo.invoke_test_empty ();
}
|