• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Various simple examples involving disconnecting and blocking slots.
2 // Copyright Douglas Gregor 2001-2004.
3 // Copyright Frank Mori Hess 2009.
4 //
5 // Use, modification and
6 // distribution is subject to the Boost Software License, Version
7 // 1.0. (See accompanying file LICENSE_1_0.txt or copy at
8 // http://www.boost.org/LICENSE_1_0.txt)
9 // For more information, see http://www.boost.org
10 
11 #include <iostream>
12 #include <boost/signals2/signal.hpp>
13 #include <boost/signals2/shared_connection_block.hpp>
14 
15 struct HelloWorld
16 {
operator ()HelloWorld17   void operator()() const
18   {
19     std::cout << "Hello, World!" << std::endl;
20   }
21 };
22 
disconnect_example()23 void disconnect_example()
24 {
25   boost::signals2::signal<void ()> sig;
26 
27 //[ disconnect_code_snippet
28   boost::signals2::connection c = sig.connect(HelloWorld());
29   std::cout << "c is connected\n";
30   sig(); // Prints "Hello, World!"
31 
32   c.disconnect(); // Disconnect the HelloWorld object
33   std::cout << "c is disconnected\n";
34   sig(); // Does nothing: there are no connected slots
35 //]
36 }
37 
block_example()38 void block_example()
39 {
40   boost::signals2::signal<void ()> sig;
41 
42 //[ block_code_snippet
43   boost::signals2::connection c = sig.connect(HelloWorld());
44   std::cout << "c is not blocked.\n";
45   sig(); // Prints "Hello, World!"
46 
47   {
48     boost::signals2::shared_connection_block block(c); // block the slot
49     std::cout << "c is blocked.\n";
50     sig(); // No output: the slot is blocked
51   } // shared_connection_block going out of scope unblocks the slot
52   std::cout << "c is not blocked.\n";
53   sig(); // Prints "Hello, World!"}
54 //]
55 }
56 
57 struct ShortLived
58 {
operator ()ShortLived59   void operator()() const
60   {
61     std::cout << "Life is short!" << std::endl;
62   }
63 };
64 
scoped_connection_example()65 void scoped_connection_example()
66 {
67   boost::signals2::signal<void ()> sig;
68 
69 //[ scoped_connection_code_snippet
70   {
71     boost::signals2::scoped_connection c(sig.connect(ShortLived()));
72     sig(); // will call ShortLived function object
73   } // scoped_connection goes out of scope and disconnects
74 
75   sig(); // ShortLived function object no longer connected to sig
76 //]
77 }
78 
79 //[ disconnect_by_slot_def_code_snippet
foo()80 void foo() { std::cout << "foo"; }
bar()81 void bar() { std::cout << "bar\n"; }
82 //]
83 
disconnect_by_slot_example()84 void disconnect_by_slot_example()
85 {
86   boost::signals2::signal<void()> sig;
87 
88 //[ disconnect_by_slot_usage_code_snippet
89   sig.connect(&foo);
90   sig.connect(&bar);
91   sig();
92 
93   // disconnects foo, but not bar
94   sig.disconnect(&foo);
95   sig();
96 //]
97 }
98 
main()99 int main()
100 {
101   std::cout << "Disconnect example:\n";
102   disconnect_example();
103 
104   std::cout << "\nBlock example:\n";
105   block_example();
106 
107   std::cout << "\nScoped connection example:\n";
108   scoped_connection_example();
109 
110   std::cout << "\nDisconnect by slot example:\n";
111   disconnect_by_slot_example();
112 
113   return 0;
114 }
115