#vm #value #traits #building-block

vm_value

fn_vm使用的核心值trait,此crate旨在为在Rust中创建按值传递的VM提供构建块。

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

Download history 133/week @ 2024-07-09 352/week @ 2024-07-16 2/week @ 2024-07-30

每月下载量487
用于fn_vm

MIT许可证

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_lenvar_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