-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcallback_example.cpp
128 lines (104 loc) · 3.78 KB
/
callback_example.cpp
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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#include "key_logger/keyboard.h"
void function_ptr_example(event::key::code key, event::action::code action) {
if (action == event::action::key_down)
std::cout << "This is from function pointer, key: " << key << std::endl;
}
int main() {
/*
[ Function pointer example ]
- callback type: function pointer(void(*))
- container type: null_container
- parameter type: default(key_action_type)
- mask type: default(key_down, key_up, key_system)
*/
event::keyboard::logger<
decltype(&function_ptr_example),
event::null_container
> function_logger;
function_logger.set_callback(&function_ptr_example);
function_logger.start();
/*
[ Member function example ]
- callback type: member function pointer(void(class::*))
- container type: null_container
- parameter type: action_type
- mask type: default(key_down, key_up, key_system)
*/
struct mem_fn_example {
std::string str = "This is from member function, action: ";
void some_function(event::action::code action) {
if (action == event::action::key_down)
std::cout << str << action << std::endl;
}
};
event::keyboard::logger<
decltype(&mem_fn_example::some_function),
event::null_container,
event::keyboard::traits::action
> mem_fn_logger;
mem_fn_example mem_fn;
mem_fn_logger.set_callback(&mem_fn, &mem_fn_example::some_function);
mem_fn_logger.start();
/*
[ Lambda function example ]
- callback type: lambda function
- container type: null_container
- parameter type: key_type
- mask type: key_up
*/
std::string str("This is from lambda function, key: ");
auto lambda_func = [&str](event::key::code key) -> void {
std::cout << str << key << std::endl;
};
event::keyboard::logger<
decltype(lambda_func),
event::null_container,
event::keyboard::traits::key,
event::action::key_up
> lambda_logger;
lambda_logger.set_callback(lambda_func);
lambda_logger.start();
/*
[ std function example ]
- callback type: std::function
- container type: deque(std::deque<key_type>)
- parameter type: key_type
- mask type: key_down
*/
event::keyboard::logger<
event::key::code,
event::deque,
event::keyboard::traits::key,
event::action::key_down
> std_function_logger;
std_function_logger.set_callback([](event::key::code key) -> void {
std::cout << "This is from std::function, key: " << key << std::endl;
});
std_function_logger.start();
/*
[ Do other stuff... ]
- Logger runs on other thread
- It does not block other threads
- Other threads can be blocked only on following function calls
|- start() -> insert the callback function to __logger_base
|- stop() -> remove the callback function from __logger_base
*/
while (function_logger.is_running()) {
if (not std_function_logger.empty()) {
auto input = std_function_logger.pop_back();
if (input == event::key::code::escape)
break;
}
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}
/*
[ Clean up ]
- logger(__logger_base) is stopped when there is no callback to invoke
- logger(__logger_base) restarts when callback is newly submited
- logger(__logger_base) is destroyed on program exit
*/
function_logger.stop();
mem_fn_logger.stop();
lambda_logger.stop();
std_function_logger.stop();
}