1use std::{fmt::Debug, hash::Hash};
2
3use serde::{Deserialize, Serialize};
4
5#[derive(Serialize, Deserialize)]
6pub struct Id<T>(u64, std::marker::PhantomData<T>);
7
8impl<T> Clone for Id<T> {
9 fn clone(&self) -> Self {
10 *self
11 }
12}
13
14impl<T> Copy for Id<T> {}
15
16impl<T> PartialEq for Id<T> {
17 fn eq(&self, other: &Self) -> bool {
18 self.0.eq(&other.0)
19 }
20}
21
22impl<T> Debug for Id<T> {
23 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
24 f.debug_tuple("Id")
25 .field(&self.0)
26 .field(&format_args!("_"))
27 .finish()
28 }
29}
30
31impl<T> Eq for Id<T> {}
32
33impl<T> Id<T> {
34 pub(crate) fn new() -> Self {
35 Self(0, std::marker::PhantomData)
36 }
37
38 pub(crate) fn alloc(&mut self) -> Self {
39 *self = Self(self.0 + 1, std::marker::PhantomData);
40 *self
41 }
42}
43
44impl<T> Hash for Id<T> {
45 fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
46 self.0.hash(state);
47 }
48}