fugue_ir/il/traits/
mod.rs1use 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}