const EXTERNAL_ZERO: u32 = (u32::MAX / 2) + 1;
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct HybridReference {
encoded: u32,
}
impl HybridReference {
pub fn external(value: u32) -> Self {
Self {
encoded: if value == 0 {
EXTERNAL_ZERO
} else {
0u32.wrapping_sub(value)
},
}
}
pub fn from_encoded(encoded: u32) -> Self {
Self { encoded }
}
pub fn encoded(self) -> u32 {
self.encoded
}
pub fn absolute_value(self) -> Option<u32> {
if self.encoded == EXTERNAL_ZERO {
Some(0)
} else if self.encoded >= EXTERNAL_ZERO {
Some(0u32.wrapping_sub(self.encoded))
} else {
None
}
}
pub fn is_external(self) -> bool {
self.absolute_value().is_some()
}
}
pub fn external_reference(value: u32) -> u32 {
HybridReference::external(value).encoded()
}
pub fn external_reference_value(value: u32) -> Option<u32> {
HybridReference::from_encoded(value).absolute_value()
}