17
17
*/
18
18
19
19
// The purpose of this test case is threefold.
20
- // - Test sigc::track_obj().
20
+ // - Test sigc::track_obj() and sigc::track_object() .
21
21
// - Show that a slot with a C++11 lambda expression can be automatically
22
22
// disconnected when an object derived from sigc::trackable is deleted,
23
- // provided sigc::track_obj() is used.
23
+ // provided sigc::track_obj() or sigc::track_object() is used.
24
24
// It shows that C++11 lambda expressions can replace the libsigc++ lambda
25
25
// expressions, which have been removed.
26
26
// See https://bugzilla.gnome.org/show_bug.cgi?id=672555
@@ -115,32 +115,38 @@ main(int argc, char* argv[])
115
115
return util->get_result_and_delete_instance () ? EXIT_SUCCESS : EXIT_FAILURE;
116
116
117
117
sigc::slot<std::string (int )> sl1;
118
+ sigc::slot<std::string (int )> sl2;
118
119
{
119
120
bar_group4 bar4;
120
121
sl1 = sigc::track_obj (Functor1 (bar4), bar4);
121
- result_stream << sl1 (-2 );
122
- util->check_result (result_stream, " negative" );
122
+ sl2 = sigc::track_object (Functor1 (bar4), bar4);
123
+ result_stream << sl1 (-2 ) << " , " << sl2 (2 );
124
+ util->check_result (result_stream, " negative, positive" );
123
125
124
- } // auto-disconnect sl1
126
+ } // auto-disconnect sl1 and sl2
125
127
126
- result_stream << sl1 (-2 );
127
- util->check_result (result_stream, " " );
128
+ result_stream << sl1 (-2 ) << " , " << sl2 ( 2 ) ;
129
+ util->check_result (result_stream, " , " );
128
130
129
131
// Allocate on the heap. valgrind can then find erroneous memory accesses.
130
132
// (There should be none, of course.)
131
- auto psl2 = new sigc::slot<std::string (int , std::string)>;
133
+ auto psl3 = new sigc::slot<std::string (int , std::string)>;
134
+ auto psl4 = new sigc::slot<std::string (int , std::string)>;
132
135
auto pbar4 = new bar_group4;
133
136
auto pbook4 = new book (" A Book" );
134
- *psl2 = sigc::track_obj (Functor2 (*pbar4, *pbook4), *pbar4, *pbook4);
135
- result_stream << (*psl2)(0 , " Book title: " );
136
- util->check_result (result_stream, " zero, Book title: A Book" );
137
+ *psl3 = sigc::track_obj (Functor2 (*pbar4, *pbook4), *pbar4, *pbook4);
138
+ *psl4 = sigc::track_object (Functor2 (*pbar4, *pbook4), *pbar4, *pbook4);
139
+ result_stream << (*psl3)(0 , " Book title: " ) << " , " << (*psl4)(1 , " Title: " );
140
+ util->check_result (result_stream, " zero, Book title: A Book, positive, Title: A Book" );
137
141
138
- delete pbook4; // auto-disconnect *psl2
142
+ delete pbook4; // auto-disconnect *psl3 and *psl4
139
143
pbook4 = nullptr ;
140
- result_stream << (*psl2)(0 , " Book title: " );
141
- util->check_result (result_stream, " " );
142
- delete psl2;
143
- psl2 = nullptr ;
144
+ result_stream << (*psl3)(0 , " Book title: " ) << " , " << (*psl4)(1 , " Title: " );
145
+ util->check_result (result_stream, " , " );
146
+ delete psl3;
147
+ psl3 = nullptr ;
148
+ delete psl4;
149
+ psl4 = nullptr ;
144
150
delete pbar4;
145
151
pbar4 = nullptr ;
146
152
@@ -149,38 +155,47 @@ main(int argc, char* argv[])
149
155
// auto-disconnect
150
156
// If you want to auto-disconnect a slot with a C++11 lambda expression
151
157
// that contains references to sigc::trackable-derived objects, you must use
152
- // sigc::track_obj().
153
- sigc::slot<void (std::ostringstream&)> sl10;
158
+ // sigc::track_obj() or sigc::track_object().
159
+ sigc::slot<void (std::ostringstream&)> sl11;
160
+ sigc::slot<void (std::ostringstream&)> sl12;
154
161
{
155
162
book guest_book (" karl" );
156
- // sl1 = [&guest_book](std::ostringstream& stream){ stream << guest_book << "\n"; }; // no
157
- // auto-disconnect
158
- sl10 = sigc::track_obj (
163
+ // no auto-disconnect
164
+ // sl1 = [&guest_book](std::ostringstream& stream){ stream << guest_book << "\n"; };
165
+ sl11 = sigc::track_obj (
166
+ [&guest_book](std::ostringstream& stream) { stream << guest_book; }, guest_book);
167
+ sl12 = sigc::track_object (
159
168
[&guest_book](std::ostringstream& stream) { stream << guest_book; }, guest_book);
160
- sl10 (result_stream);
161
- util->check_result (result_stream, " karl" );
169
+ sl11 (result_stream);
170
+ sl12 (result_stream);
171
+ util->check_result (result_stream, " karlkarl" );
162
172
163
- } // auto-disconnect sl10
173
+ } // auto-disconnect sl11 and sl12
164
174
165
- sl10 (result_stream);
175
+ sl11 (result_stream);
176
+ sl12 (result_stream);
166
177
util->check_result (result_stream, " " );
167
178
168
179
// auto-disconnect
169
- sigc::slot<void ()> sl20;
180
+ sigc::slot<void ()> sl21;
181
+ sigc::slot<void ()> sl22;
170
182
{
171
183
book guest_book (" karl" );
172
184
// sl2 = [&guest_book] () { egon(guest_book); }; // no auto-disconnect
173
185
// sl2 = std::bind(&egon, std::ref(guest_book)); // does not compile (gcc 4.6.3)
174
- sl20 = sigc::track_obj ([&guest_book]() { egon (guest_book); }, guest_book);
175
- sl20 ();
176
- util->check_result (result_stream, " egon(string 'karl')" );
186
+ sl21 = sigc::track_obj ([&guest_book]() { egon (guest_book); }, guest_book);
187
+ sl22 = sigc::track_obj ([&guest_book]() { egon (guest_book); }, guest_book);
188
+ sl21 ();
189
+ sl22 ();
190
+ util->check_result (result_stream, " egon(string 'karl')egon(string 'egon was here')" );
177
191
178
192
result_stream << static_cast <const std::string&>(guest_book);
179
193
util->check_result (result_stream, " egon was here" );
180
194
181
- } // auto-disconnect sl20
195
+ } // auto-disconnect sl21 and sl22
182
196
183
- sl20 ();
197
+ sl21 ();
198
+ sl22 ();
184
199
util->check_result (result_stream, " " );
185
200
186
201
// Code example in the documentation sigc++/adaptors/track_obj.h.
@@ -194,8 +209,9 @@ main(int argc, char* argv[])
194
209
// some_signal.connect(sigc::bind(&foo_group4, std::ref(some_bar))); // auto-disconnects,
195
210
// but we prefer C++11 lambda
196
211
some_signal.connect (sigc::track_obj ([&some_bar]() { foo_group4 (some_bar); }, some_bar));
212
+ some_signal.connect (sigc::track_object ([&some_bar]() { foo_group4 (some_bar); }, some_bar));
197
213
some_signal.emit ();
198
- util->check_result (result_stream, " foo_group4(bar_group4&)" );
214
+ util->check_result (result_stream, " foo_group4(bar_group4&)foo_group4(bar_group4&) " );
199
215
200
216
} // auto-disconnect the lambda expression
201
217
0 commit comments