|
@@ -1,35 +1,23 @@
|
|
-use std::{convert::TryFrom};
|
|
|
|
|
|
+mod test;
|
|
|
|
+mod opcode;
|
|
|
|
+use opcode::Opcode;
|
|
|
|
+mod input_provider;
|
|
|
|
+use input_provider::{InputProvider, NullProvider};
|
|
|
|
|
|
|
|
+#[derive(Debug)]
|
|
pub struct Computer {
|
|
pub struct Computer {
|
|
tape: Vec<i32>,
|
|
tape: Vec<i32>,
|
|
- ptr_pos: usize
|
|
|
|
|
|
+ ptr_pos: usize,
|
|
|
|
+ input_provider: Box<dyn InputProvider>
|
|
}
|
|
}
|
|
|
|
|
|
-enum Opcode {
|
|
|
|
- ADD = 1,
|
|
|
|
- MULT = 2,
|
|
|
|
- TERMINATE = 99,
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-impl TryFrom<i32> for Opcode {
|
|
|
|
- type Error = ();
|
|
|
|
-
|
|
|
|
- fn try_from(v: i32) -> Result<Self, Self::Error> {
|
|
|
|
- match v {
|
|
|
|
- x if x == Opcode::ADD as i32 => Ok(Opcode::ADD),
|
|
|
|
- x if x == Opcode::MULT as i32 => Ok(Opcode::MULT),
|
|
|
|
- x if x == Opcode::TERMINATE as i32 => Ok(Opcode::TERMINATE),
|
|
|
|
- _ => Err(()),
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-}
|
|
|
|
|
|
|
|
|
|
+#[derive(Debug)]
|
|
pub struct Error {
|
|
pub struct Error {
|
|
pub msg: String
|
|
pub msg: String
|
|
}
|
|
}
|
|
|
|
|
|
impl Computer {
|
|
impl Computer {
|
|
-
|
|
|
|
fn add(&mut self, left_addy: usize, right_addy: usize, dest_addy: usize) -> Result<(), Error>{
|
|
fn add(&mut self, left_addy: usize, right_addy: usize, dest_addy: usize) -> Result<(), Error>{
|
|
let memsize = self.tape.len();
|
|
let memsize = self.tape.len();
|
|
if left_addy < memsize && right_addy < memsize && dest_addy < memsize {
|
|
if left_addy < memsize && right_addy < memsize && dest_addy < memsize {
|
|
@@ -65,6 +53,7 @@ impl Computer {
|
|
return Computer {
|
|
return Computer {
|
|
tape: iter.map(|item| item.clone()).collect(),
|
|
tape: iter.map(|item| item.clone()).collect(),
|
|
ptr_pos: 0,
|
|
ptr_pos: 0,
|
|
|
|
+ input_provider: Box::new(NullProvider{})
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|