furtif_core/structs/assignment_tools/
safe.rs1use std::fmt::Display;
18
19use hashed_type_def::HashedTypeDef;
20use crate::types::u128slx;
23
24#[cfg(feature = "serde")] use serde::{ Serialize as SerdeSerialize, Deserialize as SerdeDeserialize, };
25#[cfg(feature = "rkyv")] use rkyv::{ Archive, Serialize as RkyvSerialize, Deserialize as RkyvDeserialize, };
26
27#[derive(HashedTypeDef, Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord,)]
28#[cfg_attr(feature = "rkyv", derive(Archive,RkyvSerialize,RkyvDeserialize))]
29pub struct SafeElement<X> {
33 pub (crate) code: X,
34 pub (crate) lattice_hash: u128slx,
35}
36
37impl<X> Display for SafeElement<X> where X: Display {
38 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
39 self.code.fmt(f)
40 }
41}
42
43#[cfg(feature = "serde")]
45mod serding {
46 use crate::types::{ SlxInto, IntoSlx, };
49 use super::{
50 SafeElement as SerdingSafeElement, SerdeSerialize, SerdeDeserialize,
51 };
52 #[derive(SerdeSerialize,SerdeDeserialize)]
53 pub struct SafeElement<X> {
54 element: X, lattice_hash: u128,
55 }
56 impl<'de, X> SerdeDeserialize<'de> for SerdingSafeElement<X> where X: SerdeDeserialize<'de>, {
57 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
58 where D: serde::Deserializer<'de> {
59 let SafeElement { element, lattice_hash} = SafeElement::<X>::deserialize(deserializer)?;
60 let lattice_hash = lattice_hash.slx();
61 Ok(Self { code: element, lattice_hash, })
62 }
63 }
64 impl<X> SerdeSerialize for SerdingSafeElement<X> where X: Clone + SerdeSerialize, {
65 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
66 where S: serde::Serializer {
67 let SerdingSafeElement { code: element, lattice_hash } = self;
68 let element = element.clone();
69 let lattice_hash = lattice_hash.unslx();
70 let safe_element = SafeElement { element, lattice_hash, };
71 safe_element.serialize(serializer)
72 }
73 }
74}
75
76#[derive(HashedTypeDef, Debug,)]
80pub struct SafeArray<'a,X> {
81 pub (crate) product: Vec<&'a X>,
82 pub (crate) lattice_hash: u128slx,
83}
84
85impl<X> SafeElement<X> {
86 pub unsafe fn unsafe_new(element: X, lattice_hash: u128slx,) -> Self {
92 Self { code: element, lattice_hash }
93 }
94
95 pub fn encoded(&self) -> X where X: Clone { self.code.clone() }
98
99 pub fn lattice_hash(&self) -> u128slx { self.lattice_hash }
102}
103
104impl<'a,X> SafeArray<'a,X> {
105 pub fn len(&self) -> usize { self.product.len() }
106
107 pub fn lattice_hash(&self) -> u128slx { self.lattice_hash }
110}