diff options
| author | iximeow <me@iximeow.net> | 2021-06-14 17:46:05 -0700 | 
|---|---|---|
| committer | iximeow <me@iximeow.net> | 2021-06-14 17:46:05 -0700 | 
| commit | 354940536d4f700e7f441090435362e8f6ca219d (patch) | |
| tree | 7b94def81dc290bd04fe5449418153b997727d60 /src | |
| parent | 49b64e3534a6e6c6dfeeb69bb2770ea7721663df (diff) | |
experiment
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib.rs | 27 | 
1 files changed, 19 insertions, 8 deletions
| @@ -38,32 +38,43 @@ pub trait DecodeError {      fn bad_operand(&self) -> bool;  } -pub trait Decoder<Inst> where Inst: Sized + Default { +pub enum ReadError { +    ExhaustedInput, +    IOError(&'static str), +} + +pub trait Reader<Item> { +    fn next(&mut self) -> Result<Item, ReadError>; +} + +pub trait Decoder<A: Arch + ?Sized> {      type Error: DecodeError + Debug + Display; -    fn decode<T: IntoIterator<Item=u8>>(&self, bytes: T) -> Result<Inst, Self::Error> { -        let mut inst = Inst::default(); +    fn decode<T: Reader<A::Word>>(&self, bytes: &mut T) -> Result<A::Instruction, Self::Error> { +        let mut inst = A::Instruction::default();          self.decode_into(&mut inst, bytes).map(|_: ()| inst)      } -    fn decode_into<T: IntoIterator<Item=u8>>(&self, inst: &mut Inst, bytes: T) -> Result<(), Self::Error>; +    fn decode_into<T: Reader<A::Word>>(&self, inst: &mut A::Instruction, bytes: &mut T) -> Result<(), Self::Error>;  }  #[cfg(feature="use-serde")]  pub trait Arch { +    type Word: Debug + Display + PartialEq + Eq;      type Address: Address + Debug + Hash + PartialEq + Eq + Serialize + for<'de> Deserialize<'de>; -    type Instruction: Instruction + LengthedInstruction<Unit=AddressDiff<Self::Address>> + Debug + Default; +    type Instruction: Instruction + LengthedInstruction<Unit=AddressDiff<Self::Address>> + Debug + Default + Sized;      type DecodeError: DecodeError + Debug + Display; -    type Decoder: Decoder<Self::Instruction, Error=Self::DecodeError> + Default; +    type Decoder: Decoder<Self, Error=Self::DecodeError> + Default;      type Operand;  }  #[cfg(not(feature="use-serde"))]  pub trait Arch { +    type Word: Debug + Display + PartialEq + Eq;      type Address: Address + Debug + Hash + PartialEq + Eq; -    type Instruction: Instruction + LengthedInstruction<Unit=AddressDiff<Self::Address>> + Debug + Default; +    type Instruction: Instruction + LengthedInstruction<Unit=AddressDiff<Self::Address>> + Debug + Default + Sized;      type DecodeError: DecodeError + Debug + Display; -    type Decoder: Decoder<Self::Instruction, Error=Self::DecodeError> + Default; +    type Decoder: Decoder<Self, Error=Self::DecodeError> + Default;      type Operand;  } | 
