Skip to main content

link_cli/
hybrid_reference.rs

1//! `Platform.Data.Hybrid<uint>`-compatible reference encoding.
2
3const EXTERNAL_ZERO: u32 = (u32::MAX / 2) + 1;
4
5#[derive(Clone, Copy, Debug, Eq, PartialEq)]
6pub struct HybridReference {
7    encoded: u32,
8}
9
10impl HybridReference {
11    pub fn external(value: u32) -> Self {
12        Self {
13            encoded: if value == 0 {
14                EXTERNAL_ZERO
15            } else {
16                0u32.wrapping_sub(value)
17            },
18        }
19    }
20
21    pub fn from_encoded(encoded: u32) -> Self {
22        Self { encoded }
23    }
24
25    pub fn encoded(self) -> u32 {
26        self.encoded
27    }
28
29    pub fn absolute_value(self) -> Option<u32> {
30        if self.encoded == EXTERNAL_ZERO {
31            Some(0)
32        } else if self.encoded >= EXTERNAL_ZERO {
33            Some(0u32.wrapping_sub(self.encoded))
34        } else {
35            None
36        }
37    }
38
39    pub fn is_external(self) -> bool {
40        self.absolute_value().is_some()
41    }
42}
43
44/// Encodes an external reference the same way `Platform.Data.Hybrid<uint>` does.
45pub fn external_reference(value: u32) -> u32 {
46    HybridReference::external(value).encoded()
47}
48
49/// Decodes a `Platform.Data.Hybrid<uint>` external reference.
50pub fn external_reference_value(value: u32) -> Option<u32> {
51    HybridReference::from_encoded(value).absolute_value()
52}