28#include <easy3d/core/signal.h>
40 MyCar(
int speed) : speed_(speed) {}
43 int speed()
const {
return speed_; }
46 std::cout <<
"started. speed: " << speed_ <<
"\n";
49 void start(
const std::string& msg) {
50 std::cout <<
"car started: " << msg <<
"\n";
53 void report_speed(
int max_allow_speed)
const {
54 std::cout <<
"max allowed speed is " << max_allow_speed <<
". I am at " << speed_ <<
"\n";
57 void stop(
int hours,
const std::string &msg)
const {
58 std::cout << msg <<
". After driving for " << hours <<
" hours\n";
66void test_signal_for_members(MyCar *car) {
74 start_signal.
connect(car, &MyCar::start);
76 start_signal.
connect(car,
static_cast<void (MyCar::*)(
void)
> (&MyCar::start));
77 start_signal.
connect(car, overload<MyCar>(&MyCar::start));
80 easy3d::connect(&start_signal, car,
static_cast<void (MyCar::*)(
void)
> (&MyCar::start));
83 start_signal_1arg.
connect(car, &MyCar::start);
84 start_signal_1arg.
connect(car,
static_cast<void (MyCar::*)(
const std::string&)
> (&MyCar::start));
85 start_signal_1arg.
connect(car, overload<MyCar, const std::string&>(&MyCar::start));
88 easy3d::connect(&start_signal_1arg, car,
static_cast<void (MyCar::*)(
const std::string&)
> (&MyCar::start));
89 easy3d::connect(&start_signal_1arg, car, overload<MyCar, const std::string&>(&MyCar::start));
94 report_signal.
connect(car, &MyCar::report_speed);
99 stop_signal.
connect(car, &MyCar::stop);
104 report_signal.
send(80);
105 stop_signal.
send(6,
"I have to stop");
115void signal_func_start() {
116 std::cout <<
"started\n";
119void signal_func_start(
const std::string& msg) {
120 std::cout <<
"car started: " << msg <<
"\n";
123void signal_func_report_speed(
int max_allow_speed,
const MyCar *car) {
124 std::cout <<
"max allowed is " << max_allow_speed <<
". I am at " << car->speed() <<
"\n";
127void signal_func_stop(
const MyCar *car,
int hours,
const std::string &msg) {
128 std::cout << msg <<
" after driving for " << hours <<
" hours. My speed was " << car->speed() <<
"\n";
132void test_signal_for_functions(MyCar *car) {
141 func_start_signal.
connect(
static_cast<void (*)(
void)
> (signal_func_start));
142 func_start_signal.
connect(overload<>(signal_func_start));
145 easy3d::connect(&func_start_signal,
static_cast<void (*)(
void)
> (signal_func_start));
151 easy3d::connect(&func_start_signal_1arg,
static_cast<void (*)(
const std::string&)
> (signal_func_start));
152 easy3d::connect(&func_start_signal_1arg, overload<const std::string&>(signal_func_start));
155 func_start_signal_1arg.
connect(
static_cast<void (*)(
const std::string&)
> (signal_func_start));
156 func_start_signal_1arg.
connect(overload<const std::string&> (signal_func_start));
161 func_report_signal.
connect(signal_func_report_speed);
166 another_stop_signal.
connect(signal_func_stop);
170 func_start_signal.
send();
171 func_start_signal_1arg.
send(
"blabla...");
172 func_report_signal.
send(80, car);
173 another_stop_signal.
send(car, 6,
"I have to stop");
182void test_signal_for_lambda_functions(MyCar *car) {
183 auto lambda_start = []() ->
void {
184 std::cout <<
"started\n";
187 auto lambda_start_1arg = [](MyCar *car) ->
void {
188 std::cout <<
"speed is " << car->speed() <<
"\n";
191 auto lambda_report_speed = [](
int max_allow_speed,
const MyCar *car) ->
void {
192 std::cout <<
"max allowed is " << max_allow_speed <<
". I am at " << car->speed() <<
"\n";
195 auto lambda_stop = [](
const MyCar *car,
int hours,
const std::string &msg) ->
void {
196 std::cout << msg <<
" after driving for " << hours <<
" hours. My speed was " << car->speed() <<
"\n";
206 lambda_start_signal.
connect(lambda_start);
211 lambda_start_signal_1arg.
connect(lambda_start_1arg);
215 lambda_report_signal.
connect(lambda_report_speed);
219 lambda_stop_signal.
connect(lambda_stop);
221 lambda_start_signal.
send();
222 lambda_start_signal_1arg.
send(car);
223 lambda_report_signal.
send(80, car);
224 lambda_stop_signal.
send(car, 6,
"I have to stop");
233void test_signal_for_connect_signal_to_signal() {
240 int id = C.
connect([](
const std::string &msg) ->
void {
241 std::cout <<
"C: " << msg << std::endl;
253 std::cout <<
"connect to a class member --------------------------------------------------------------\n";
254 test_signal_for_members(&car);
256 std::cout <<
"connect to a function ------------------------------------------------------------------\n";
257 test_signal_for_functions(&car);
259 std::cout <<
"connect to a lambda function -----------------------------------------------------------\n";
260 test_signal_for_lambda_functions(&car);
262 std::cout <<
"connect a signal to another signal -----------------------------------------------------\n";
263 test_signal_for_connect_signal_to_signal();
A light-weight implementation of the simple signal-slot mechanism.
Definition: signal.h:56
void disconnect_all()
Disconnects all previously connected functions.
Definition: signal.h:155
int connect(std::function< void(Args...)> const &slot)
Connects a function to this signal.
Definition: signal.h:97
void send(Args... p)
Calls all connected functions.
Definition: signal.h:160
void disconnect(int id)
Disconnects a previously connected function.
Definition: signal.h:150
Definition: collider.cpp:182
int connect(SIGNAL *signal, FUNCTION const &slot)
Connects a function to the signal.
Definition: signal.h:202