link_cli/
hybrid_reference.rs1const 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
44pub fn external_reference(value: u32) -> u32 {
46 HybridReference::external(value).encoded()
47}
48
49pub fn external_reference_value(value: u32) -> Option<u32> {
51 HybridReference::from_encoded(value).absolute_value()
52}