syntax_parser_generator/handles/
handle.rs1use std::fmt::{Debug, Formatter};
2use std::hash::Hash;
3
4use derive_where::derive_where;
5
6pub trait HandleCore: Clone + Copy + Eq + PartialEq + Hash + Debug + Ord + PartialOrd {
13 fn into_index(self) -> usize;
15
16 fn from_index(index: usize) -> Self;
18}
19
20#[derive_where(Clone, Copy, PartialEq, Eq, Hash)]
22pub struct Handle<T>
23where
24 T: Handled + ?Sized,
25{
26 pub core: T::HandleCoreType,
28}
29
30pub trait Handled {
32 type HandleCoreType: HandleCore;
34
35 fn new_handle(serial_number: usize) -> Handle<Self> {
37 serial_number.into()
38 }
39}
40
41impl<T> Handle<T>
42where
43 T: Handled + ?Sized,
44{
45 pub(super) fn index(&self) -> usize {
46 self.core.into_index()
47 }
48
49 pub fn mock(existing_handles: &Vec<Handle<T>>) -> Handle<T> {
53 let existing_indices: std::collections::HashSet<usize> = existing_handles
54 .iter()
55 .map(|handle| handle.index())
56 .collect();
57
58 let mut index = 0;
59 while existing_indices.contains(&index) {
60 index += 1;
61 }
62
63 index.into()
64 }
65}
66
67impl<T> Debug for Handle<T>
68where
69 T: Handled,
70{
71 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
72 write!(f, "Handle({:?})", self.core.into_index())
73 }
74}
75
76impl<T> From<usize> for Handle<T>
77where
78 T: Handled + ?Sized,
79{
80 fn from(serial_number: usize) -> Self {
82 Self {
83 core: T::HandleCoreType::from_index(serial_number),
84 }
85 }
86}
87
88impl<T> Into<usize> for Handle<T>
89where
90 T: Handled + ?Sized,
91{
92 fn into(self) -> usize {
94 self.core.into_index()
95 }
96}