7个不稳定版本 (3个破坏性更新)
0.4.3 | 2024年7月17日 |
---|---|
0.4.2 | 2024年7月16日 |
0.3.0 | 2024年7月15日 |
0.2.0 | 2024年7月15日 |
0.1.0 | 2024年7月15日 |
#10 in #building-block
每月下载量487
用于fn_vm
18KB
432 行
vm_value
fn_vm使用的核心值trait,此crate旨在为在Rust中创建按值传递的VM提供构建块。
实现这些trait允许您轻松创建一个包含所有基本二进制和一元运算(加、减、取余、非等)的VM。
值
目前此trait已为int(i8 - i128 & isize)、VMStr(围绕String的封装)和VarNum(VarInt、VarUInt和VarFloat)实现。
长度和VarNum(VMValue的数字实现)分别由small_len和var_num提供。
pub struct VMStatus<O, V> {
pub done: bool,
pub last_command: O,
pub value: Option<V>,
}
pub trait VM<Op, Val, T: VMValue<Op, Val, T>> {
type Error;
fn run(&mut self) -> Result<VMStatus<Op, Val>, Self::Error>;
fn execute(&mut self) -> Result<(), Self::Error>;
fn next_len(&mut self) -> Length{
let u8 = self.next_byte();
match u8 {
253 => Length::Word(u16::from_be_bytes(self.next_n_bytes::<2>())),
254 => Length::Double(u32::from_be_bytes(self.next_n_bytes::<4>())),
255 => Length::Quad(u64::from_be_bytes(self.next_n_bytes::<8>())),
_ => {
u8.into()
}
}
}
fn next_byte(&mut self) -> u8;
fn next_str(&mut self) -> String {
let len = self.next_len();
let bytes = self.next_n_bytes_vec(len);
std::str::from_utf8(&bytes).unwrap().to_string()
}
fn next_n_bytes<const N: usize>(&mut self) -> [u8; N];
fn next_n_bytes_vec(&mut self, n: Length) -> Vec<u8>;
}
pub trait Logical: Clone + Sized {
fn bool_and(&self, b: &Self) -> bool;
fn bool_or(&self, b: &Self) -> bool;
fn bool_xor(&self, b: &Self) -> bool;
fn bool_not(&self) -> bool;
fn logical_and(&self, b: &Self) -> Self {
if self.bool_and(b) {
self.clone()
} else {
b.clone()
}
}
fn logical_or(&self, b: &Self) -> Self {
if self.bool_or(b) {
self.clone()
} else {
b.clone()
}
}
fn logical_xor(&self, b: &Self) -> Self {
if self.bool_xor(b) {
self.clone()
} else {
b.clone()
}
}
fn bitwise_reverse(&self) -> Self;
}
pub trait VMValue<Op, Val, T: VMValue<Op, Val, T>>: Display + Debug + Clone + PartialEq + Logical + Add<Output=T> + Mul<Output=T> + Div<Output=T> + PartialOrd + Sub<Output=T> + BitAnd<Output=T> + BitOr<Output=T> + BitXor<Output=T> + Rem<Output=T> + Not<Output=T> + Neg<Output=T> + Shr<Output=T> + Shl<Output=T> {
fn create_from_vm_bytes<V: VM<Op, Val, T>>(vm: &mut V) -> T;
fn to_vm_bytes(&self) -> Vec<u8>;
}
依赖项
~1.3–1.9MB
~34K SLoC