metaemu_state/
traits.rs

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}