From 94267f9c3b2ccd6220eee613998594e83930056b Mon Sep 17 00:00:00 2001 From: Alpha Chen Date: Sun, 8 Jan 2017 14:31:03 -0800 Subject: [PATCH] [2016][rust][23.1] refactorings --- 2016/rust/src/assembunny.rs | 74 +++++++++++++++++++------------------ 1 file changed, 39 insertions(+), 35 deletions(-) diff --git a/2016/rust/src/assembunny.rs b/2016/rust/src/assembunny.rs index 786cd94..e64e59c 100644 --- a/2016/rust/src/assembunny.rs +++ b/2016/rust/src/assembunny.rs @@ -54,8 +54,7 @@ impl Iterator for Assembunny { self.registers[Register::PC] += 1; match instruction { Instruction::Cpy(v, Variable::Register(r)) => { - let value = self.value(v); - self.registers[r] = value; + self.registers[r] = self.value(v); } Instruction::Inc(Variable::Register(r)) => { self.registers[r] += 1; @@ -64,9 +63,8 @@ impl Iterator for Assembunny { self.registers[r] -= 1; } Instruction::Jnz(v, delta) if self.value(v) != 0 => { - let delta = self.value(delta); - let pc = self.value(Register::PC) + delta - 1; - self.registers[Register::PC] = pc; + self.registers[Register::PC] -= 1; + self.registers[Register::PC] += self.value(delta); } Instruction::Tgl(v) => { let index = (pc as isize) + self.value(v); @@ -92,14 +90,12 @@ impl ops::Index for Registers { type Output = isize; fn index(&self, _index: Register) -> &isize { - let index: u8 = _index.into(); - self.0.index(index as usize) + self.0.index(usize::from(_index)) } } impl ops::IndexMut for Registers { fn index_mut(&mut self, _index: Register) -> &mut isize { - let index: u8 = _index.into(); - self.0.index_mut(index as usize) + self.0.index_mut(usize::from(_index)) } } @@ -111,18 +107,6 @@ impl Instructions { } } -impl fmt::Display for Instructions { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, - "{}", - self.0 - .iter() - .map(Instruction::to_string) - .collect::>() - .join("\n")) - } -} - impl ops::Index for Instructions { type Output = Instruction; @@ -146,8 +130,8 @@ pub enum Register { D, } -impl From for u8 { - fn from(r: Register) -> u8 { +impl From for usize { + fn from(r: Register) -> usize { match r { Register::PC => 0, Register::A => 1, @@ -167,6 +151,38 @@ pub enum Instruction { Tgl(Variable), } +#[derive(Clone, Copy, Debug, PartialEq)] +pub enum Variable { + Register(Register), + Value(isize), +} + +impl From for Variable { + fn from(r: Register) -> Self { + Variable::Register(r) + } +} + +impl From for Variable { + fn from(i: isize) -> Self { + Variable::Value(i) + } +} + +// Display + +impl fmt::Display for Instructions { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, + "{}", + self.0 + .iter() + .map(Instruction::to_string) + .collect::>() + .join("\n")) + } +} + impl fmt::Display for Instruction { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { match *self { @@ -179,12 +195,6 @@ impl fmt::Display for Instruction { } } -#[derive(Clone, Copy, Debug, PartialEq)] -pub enum Variable { - Register(Register), - Value(isize), -} - impl fmt::Display for Variable { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { match *self { @@ -196,12 +206,6 @@ impl fmt::Display for Variable { } } -impl From for Variable { - fn from(r: Register) -> Self { - Variable::Register(r) - } -} - // Parsing impl str::FromStr for Instructions {