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
129
130
131
132
133
134
135
136
137
138
139
140
//! RAII handler guard that unregisters on drop.
//!
//! A [`HandlerGuard`] is returned by
//! [`SyncRegistry::register_guard`](crate::SyncRegistry::register_guard) and
//! its priority variant. While the guard is alive the handler stays
//! registered; when the guard is dropped (or goes out of scope) the
//! corresponding handler is automatically removed.
//!
//! The guard holds a [`Weak`] reference to the registry so it does not keep
//! the registry alive on its own. If the registry is dropped before the
//! guard, dropping the guard becomes a no-op.
use Weak;
use crateHandlerId;
use SyncRegistry;
/// RAII handle for a registered handler.
///
/// Drop the guard to unregister. Call [`HandlerGuard::forget`] to detach the
/// guard from the handler, leaving the handler registered indefinitely.
///
/// The guard is not [`Clone`]; ownership of a registration is unique.
///
/// # Examples
///
/// Automatic cleanup when the guard leaves scope:
///
/// ```
/// use std::sync::Arc;
/// use registry_io::SyncRegistry;
///
/// let registry = Arc::new(SyncRegistry::<u32>::new());
/// assert_eq!(registry.handler_count(), 0);
///
/// {
/// let _guard = registry.register_guard(|n| {
/// println!("got {n}");
/// });
/// assert_eq!(registry.handler_count(), 1);
/// }
///
/// assert_eq!(registry.handler_count(), 0);
/// ```
///
/// Forgetting the guard to keep the handler registered:
///
/// ```
/// use std::sync::Arc;
/// use registry_io::SyncRegistry;
///
/// let registry = Arc::new(SyncRegistry::<()>::new());
/// let guard = registry.register_guard(|_| {});
/// let id = guard.id();
/// guard.forget();
/// // Handler is still active.
/// assert_eq!(registry.handler_count(), 1);
/// // Manually unregister via the returned id.
/// assert!(registry.unregister(id));
/// ```