hydro_lang/location/
member_id.rs1use std::fmt::{Debug, Display};
2use std::hash::Hash;
3use std::marker::PhantomData;
4
5use serde::{Deserialize, Serialize};
6
7#[derive(Deserialize, Serialize)]
8pub enum MemberId<Tag> {
9 Legacy {
10 raw_id: u32,
11 _phantom: PhantomData<Tag>,
12 },
13}
14
15impl<Tag> MemberId<Tag> {
16 pub fn from_raw_id(raw_id: u32) -> Self {
17 MemberId::Legacy {
18 raw_id,
19 _phantom: PhantomData,
20 }
21 }
22
23 pub fn get_raw_id(&self) -> u32 {
24 match self {
25 MemberId::Legacy { raw_id, .. } => *raw_id,
26 }
27 }
28}
29
30impl<Tag> Debug for MemberId<Tag> {
31 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
32 match self {
33 MemberId::Legacy { raw_id, .. } => write!(
34 f,
35 "MemberId::<{}>({})",
36 std::any::type_name::<Tag>(),
37 raw_id
38 ),
39 }
40 }
41}
42
43impl<Tag> Display for MemberId<Tag> {
44 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
45 match self {
46 MemberId::Legacy { raw_id, .. } => {
47 write!(
48 f,
49 "MemberId::<{}>({})",
50 std::any::type_name::<Tag>(),
51 raw_id
52 )
53 }
54 }
55 }
56}
57
58impl<Tag> PartialOrd for MemberId<Tag> {
59 #[expect(
60 clippy::non_canonical_partial_ord_impl,
61 reason = "The implementation _is_ non-canonical."
62 )]
63 fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
64 match (self, other) {
65 (
66 MemberId::Legacy { raw_id, _phantom },
67 MemberId::Legacy {
68 raw_id: other_raw_id,
69 _phantom: _other_phantom,
70 },
71 ) => Some(raw_id.cmp(other_raw_id)),
72 }
73 }
74}
75
76impl<Tag> Ord for MemberId<Tag> {
77 fn cmp(&self, other: &Self) -> std::cmp::Ordering {
78 self.partial_cmp(other)
79 .expect("Can't compare different kinds of member ids")
80 }
81}
82
83impl<Tag> Clone for MemberId<Tag> {
84 fn clone(&self) -> Self {
85 match self {
86 MemberId::Legacy { raw_id, .. } => MemberId::Legacy {
87 raw_id: *raw_id,
88 _phantom: PhantomData,
89 },
90 }
91 }
92}
93
94impl<Tag> PartialEq for MemberId<Tag> {
95 fn eq(&self, other: &Self) -> bool {
96 match (self, other) {
97 (
98 MemberId::Legacy { raw_id, _phantom },
99 MemberId::Legacy {
100 raw_id: other_raw_id,
101 _phantom: _other_phantom,
102 },
103 ) => raw_id == other_raw_id,
104 }
105 }
106}
107
108impl<Tag> Eq for MemberId<Tag> {}
109
110impl<Tag> Hash for MemberId<Tag> {
111 fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
112 match self {
113 MemberId::Legacy { raw_id, _phantom } => raw_id.hash(state),
114 }
115 }
116}