hydro_lang/location/
member_id.rs

1use std::fmt::{Debug, Display};
2use std::hash::Hash;
3use std::marker::PhantomData;
4
5use serde::{Deserialize, Serialize};
6
7#[repr(transparent)]
8pub struct MemberId<Tag> {
9    pub raw_id: u32,
10    pub(crate) _phantom: PhantomData<Tag>,
11}
12
13impl<Tag> MemberId<Tag> {
14    pub fn from_raw(id: u32) -> Self {
15        MemberId {
16            raw_id: id,
17            _phantom: PhantomData,
18        }
19    }
20}
21
22impl<Tag> Debug for MemberId<Tag> {
23    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
24        write!(
25            f,
26            "MemberId::<{}>({})",
27            std::any::type_name::<Tag>(),
28            self.raw_id
29        )
30    }
31}
32
33impl<Tag> Display for MemberId<Tag> {
34    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
35        write!(
36            f,
37            "MemberId::<{}>({})",
38            std::any::type_name::<Tag>(),
39            self.raw_id
40        )
41    }
42}
43
44impl<Tag> Clone for MemberId<Tag> {
45    fn clone(&self) -> Self {
46        *self
47    }
48}
49
50impl<Tag> Copy for MemberId<Tag> {}
51
52impl<Tag> PartialOrd for MemberId<Tag> {
53    fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
54        Some(self.cmp(other))
55    }
56}
57
58impl<Tag> Ord for MemberId<Tag> {
59    fn cmp(&self, other: &Self) -> std::cmp::Ordering {
60        self.raw_id.cmp(&other.raw_id)
61    }
62}
63
64impl<Tag> Serialize for MemberId<Tag> {
65    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
66    where
67        S: serde::ser::Serializer,
68    {
69        self.raw_id.serialize(serializer)
70    }
71}
72
73impl<'de, Tag> Deserialize<'de> for MemberId<Tag> {
74    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
75    where
76        D: serde::de::Deserializer<'de>,
77    {
78        u32::deserialize(deserializer).map(|id| MemberId {
79            raw_id: id,
80            _phantom: PhantomData,
81        })
82    }
83}
84
85impl<Tag> PartialEq for MemberId<Tag> {
86    fn eq(&self, other: &Self) -> bool {
87        self.raw_id == other.raw_id
88    }
89}
90
91impl<Tag> Eq for MemberId<Tag> {}
92
93impl<Tag> Hash for MemberId<Tag> {
94    fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
95        self.raw_id.hash(state)
96    }
97}