fugue_ir/il/traits/
mod.rs

1use crate::space::AddressSpaceId;
2use crate::translator::Translator;
3use fugue_bv::BitVec;
4
5use std::borrow::Cow;
6use std::fmt;
7
8pub trait BitSize {
9    fn bits(&self) -> usize;
10}
11
12pub trait Variable {
13    fn space(&self) -> AddressSpaceId;
14    fn generation(&self) -> usize;
15    fn generation_mut(&mut self) -> &mut usize;
16    fn with_generation(&self, generation: usize) -> Self;
17}
18
19pub trait TranslateIR<Loc, Val, Var> {
20    type TLoc;
21    type TVal;
22    type TVar;
23
24    fn translate_loc(&self, loc: Loc) -> Self::TLoc;
25    fn translate_val(&self, val: Val) -> Self::TVal;
26    fn translate_var(&self, var: Var) -> Self::TVar;
27}
28
29#[derive(Clone)]
30pub struct TranslatorFormatter<'t> {
31    pub translator: Option<&'t Translator>,
32    pub branch_start: &'t str,
33    pub branch_end: &'t str,
34    pub keyword_start: &'t str,
35    pub keyword_end: &'t str,
36    pub location_start: &'t str,
37    pub location_end: &'t str,
38    pub type_start: &'t str,
39    pub type_end: &'t str,
40    pub value_start: &'t str,
41    pub value_end: &'t str,
42    pub variable_start: &'t str,
43    pub variable_end: &'t str,
44}
45
46impl<'t> Default for TranslatorFormatter<'t> {
47    fn default() -> Self {
48        Self {
49            translator: None,
50            branch_start: "",
51            branch_end: "",
52            keyword_start: "",
53            keyword_end: "",
54            location_start: "",
55            location_end: "",
56            type_start: "",
57            type_end: "",
58            value_start: "",
59            value_end: "",
60            variable_start: "",
61            variable_end: "",
62        }
63    }
64}
65
66impl<'t> From<&'t Translator> for TranslatorFormatter<'t> {
67    fn from(t: &'t Translator) -> Self {
68        Self {
69            translator: Some(t),
70            ..Default::default()
71        }
72    }
73}
74
75impl<'t> From<Option<&'t Translator>> for TranslatorFormatter<'t> {
76    fn from(translator: Option<&'t Translator>) -> Self {
77        Self {
78            translator,
79            ..Default::default()
80        }
81    }
82}
83
84pub trait TranslatorDisplay<'v, 't> {
85    type Target: fmt::Display;
86
87    fn display_with(&'v self, translator: Option<&'t Translator>) -> Self::Target {
88        self.display_full(Cow::Owned(TranslatorFormatter::from(translator)))
89    }
90
91    fn display_full(&'v self, display: Cow<'t, TranslatorFormatter<'t>>) -> Self::Target;
92}
93
94impl BitSize for BitVec {
95    fn bits(&self) -> usize {
96        self.bits()
97    }
98}
99
100pub struct BitVecFormatter<'v, 't> {
101    bv: &'v BitVec,
102    fmt: Cow<'t, TranslatorFormatter<'t>>,
103}
104
105impl<'v, 't> fmt::Display for BitVecFormatter<'v, 't> {
106    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
107        #[cfg(feature = "bigint")]
108        let v = self.bv.as_bigint();
109        #[cfg(not(feature = "bigint"))]
110        let v = self.bv.as_raw();
111
112        write!(
113            f,
114            "{}{:#x}{}:{}{}{}",
115            self.fmt.value_start,
116            &*v,
117            self.fmt.value_end,
118            self.fmt.value_start,
119            self.bv.bits(),
120            self.fmt.value_end
121        )
122    }
123}
124
125impl<'v, 't> TranslatorDisplay<'v, 't> for BitVec {
126    type Target = BitVecFormatter<'v, 't>;
127
128    fn display_full(
129        &'v self,
130        fmt: Cow<'t, TranslatorFormatter<'t>>,
131    ) -> Self::Target {
132        BitVecFormatter {
133            bv: self,
134            fmt,
135        }
136    }
137}