1use fugue::bv::BitVec;
2
3use fugue::bytes::Order;
4use fugue::bytes::traits::ByteCast;
5
6use fugue::ir::Address;
7use ux::u24;
8use paste::paste;
9
10pub use metaemu_state_derive::AsState;
11
12pub trait StateValue: Clone + Default {
13 fn from_byte(value: u8) -> Self;
14}
15
16impl<V> StateValue for V where V: Clone + Default + From<u8> {
17 #[inline(always)]
18 fn from_byte(value: u8) -> Self {
19 Self::from(value)
20 }
21}
22
23pub trait FromStateValues<V: StateValue>: Sized {
24 fn from_values<O: Order>(values: &[V]) -> Self;
25}
26
27pub trait IntoStateValues<V: StateValue>: Sized {
28 fn into_values<O: Order>(self, values: &mut [V]);
29}
30
31macro_rules! impl_for {
32 ($t:ident) => {
33 impl FromStateValues<u8> for $t {
34 #[inline(always)]
35 fn from_values<O: Order>(buf: &[u8]) -> Self {
36 <$t as ByteCast>::from_bytes::<O>(buf)
37 }
38 }
39
40 impl IntoStateValues<u8> for $t {
41 #[inline(always)]
42 fn into_values<O: Order>(self, buf: &mut [u8]) {
43 <$t as ByteCast>::into_bytes::<O>(&self, buf)
44 }
45 }
46 };
47}
48
49macro_rules! impls_for {
50 [$($tname:ident),*] => {
51 $(
52 paste! {
53 impl_for!($tname);
54 }
55 )*
56 };
57}
58
59impls_for![bool, i8, i16, i32, i64, i128, isize, u8, u16, u32, u64, u128, usize, u24];
60
61impl FromStateValues<u8> for BitVec {
62 #[inline(always)]
63 fn from_values<O: Order>(values: &[u8]) -> Self {
64 BitVec::from_bytes::<O>(values, false)
65 }
66}
67
68impl IntoStateValues<u8> for BitVec {
69 #[inline(always)]
70 fn into_values<O: Order>(self, values: &mut [u8]) {
71 self.into_bytes::<O>(values)
72 }
73}
74
75impl IntoStateValues<u8> for &'_ BitVec {
76 #[inline(always)]
77 fn into_values<O: Order>(self, values: &mut [u8]) {
78 if O::ENDIAN.is_big() {
79 self.to_be_bytes(values)
80 } else {
81 self.to_le_bytes(values)
82 }
83 }
84}
85
86pub trait State: Clone {
87 type Error: std::error::Error;
88
89 fn fork(&self) -> Self;
90 fn restore(&mut self, other: &Self);
91}
92
93pub trait StateOps: State {
94 type Value: StateValue;
95
96 fn len(&self) -> usize;
97
98 fn copy_values<F, T>(&mut self, from: F, to: T, size: usize) -> Result<(), Self::Error>
99 where F: Into<Address>,
100 T: Into<Address>;
101
102 fn get_values<A>(&self, address: A, bytes: &mut [Self::Value]) -> Result<(), Self::Error>
103 where A: Into<Address>;
104
105 fn view_values<A>(&self, address: A, size: usize) -> Result<&[Self::Value], Self::Error>
106 where A: Into<Address>;
107
108 fn view_values_mut<A>(&mut self, address: A, size: usize) -> Result<&mut [Self::Value], Self::Error>
109 where A: Into<Address>;
110
111 fn set_values<A>(&mut self, address: A, bytes: &[Self::Value]) -> Result<(), Self::Error>
112 where A: Into<Address>;
113
114 fn write<A, O: Order, V: IntoStateValues<Self::Value>>(&mut self, address: A, value: V) -> Result<(), Self::Error>
115 where A: Into<Address>{
116 let value_size = std::mem::size_of_val(&value);
117 value.into_values::<O>(&mut self.view_values_mut(address, value_size)?);
118 Ok(())
119 }
120
121 fn read<A, O: Order, V: FromStateValues<Self::Value>>(&self, address: A, size: usize) -> Result<V, Self::Error>
122 where A: Into<Address>{
123 let values = self.view_values(address, size)?;
124 Ok(V::from_values::<O>(values))
125 }
126
127
128}
129
130pub trait AsState<S>: State {
131 fn state_ref(&self) -> &S;
132 fn state_mut(&mut self) -> &mut S;
133}
134
135impl<S, T> AsState<S> for T where T: State + AsRef<S> + AsMut<S> {
136 fn state_ref(&self) -> &S {
137 self.as_ref()
138 }
139
140 fn state_mut(&mut self) -> &mut S {
141 self.as_mut()
142 }
143}
144
145pub trait AsState2<S, T>: State + AsState<S> + AsState<T> {
146 fn state2_ref(&self) -> (&S, &T) {
147 (self.state_ref(), self.state_ref())
148 }
149
150 fn state2_mut(&mut self) -> (&mut S, &mut T);
151}
152
153pub trait AsState3<S, T, U>: State + AsState<S> + AsState<T> + AsState<U> {
154 fn state3_ref(&self) -> (&S, &T, &U) {
155 (self.state_ref(), self.state_ref(), self.state_ref())
156 }
157
158 fn state3_mut(&mut self) -> (&mut S, &mut T, &mut U);
159}
160
161pub trait AsState4<S, T, U, V>: State + AsState<S> + AsState<T> + AsState<U> + AsState<V> {
162 fn state4_ref(&self) -> (&S, &T, &U, &V) {
163 (self.state_ref(), self.state_ref(), self.state_ref(), self.state_ref())
164 }
165
166 fn state4_mut(&mut self) -> (&mut S, &mut T, &mut U, &mut V);
167}