completeq_rs/
user_event.rs1use std::{
2 fmt::Display,
3 hash::Hash,
4 marker::PhantomData,
5 sync::{
6 atomic::{AtomicUsize, Ordering},
7 Arc,
8 },
9};
10
11pub trait UserEvent: Default {
13 type ID: ?Sized + Hash + Eq + Send + Sync + Clone + 'static + Display;
16 type Argument: Sized + Send + 'static;
18}
19
20pub trait AutoIncEvent: UserEvent {
23 fn next(&mut self) -> Self::ID;
25}
26
27#[derive(Clone)]
28pub struct RPCResponser<Argument>(Arc<AtomicUsize>, PhantomData<Argument>);
30
31impl<Argument> Default for RPCResponser<Argument> {
32 fn default() -> Self {
33 Self(Arc::new(AtomicUsize::new(1)), PhantomData)
34 }
35}
36
37impl<Argument> UserEvent for RPCResponser<Argument>
38where
39 Argument: Sized + Send + 'static,
40{
41 type ID = usize;
42 type Argument = Argument;
43}
44
45impl<Argument> AutoIncEvent for RPCResponser<Argument>
46where
47 Argument: Sized + Send + 'static,
48{
49 fn next(&mut self) -> Self::ID {
50 self.0.fetch_add(1, Ordering::SeqCst)
51 }
52}