1#[macro_export]
7macro_rules! custom_intern_id {
8    ( $name:ident, $base:ty, $min:expr, $max:expr ) => {
9        #[derive(Clone, Copy, Eq, PartialEq, Debug)]
10        struct $name($base);
11
12        impl ::num_traits::Bounded for $name {
13            fn min_value() -> Self {
14                $name($min)
15            }
16            fn max_value() -> Self {
17                $name($max)
18            }
19        }
20
21        impl ::num_traits::ToPrimitive for $name {
22            fn to_i64(&self) -> Option<i64> { self.0.to_i64() }
23            fn to_u64(&self) -> Option<u64> { self.0.to_u64() }
24        }
25
26        impl ::num_traits::FromPrimitive for $name {
27            fn from_i64(n: i64) -> Option<Self> { <$base as ::num_traits::FromPrimitive>::from_i64(n).map(|x| $name(x)) }
28            fn from_u64(n: u64) -> Option<Self> { <$base as ::num_traits::FromPrimitive>::from_u64(n).map(|x| $name(x)) }
29        }
30    };
31    ( $name:ident, $base:ty ) => {
32        custom_intern_id!($name, $base, <$base as ::num::Bounded>::min_value(), <$base as ::num::Bounded>::max_value());
33    };
34}