|
|
|
@ -1,50 +1,46 @@
|
|
|
|
|
use super::{Value, IntCode};
|
|
|
|
|
use std::io;
|
|
|
|
|
use super::{Value, IntCode, IntCodeIO};
|
|
|
|
|
|
|
|
|
|
pub fn add(intcode: &mut IntCode, argv: &Vec<Value>) {
|
|
|
|
|
pub fn add<I: IntCodeIO>(intcode: &mut IntCode<I>, argv: &Vec<Value>) {
|
|
|
|
|
intcode.write(argv[2].address.unwrap(), argv[0].value + argv[1].value);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn mul(intcode: &mut IntCode, argv: &Vec<Value>) {
|
|
|
|
|
pub fn mul<I: IntCodeIO>(intcode: &mut IntCode<I>, argv: &Vec<Value>) {
|
|
|
|
|
intcode.write(argv[2].address.unwrap(), argv[0].value * argv[1].value);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn exit(intcode: &mut IntCode, _argv: &Vec<Value>) {
|
|
|
|
|
pub fn exit<I: IntCodeIO>(intcode: &mut IntCode<I>, _argv: &Vec<Value>) {
|
|
|
|
|
intcode.terminate();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn cin(intcode: &mut IntCode, argv: &Vec<Value>) {
|
|
|
|
|
let mut value = String::new();
|
|
|
|
|
let _ = io::stdin()
|
|
|
|
|
.read_line(&mut value)
|
|
|
|
|
.expect("Unable to read stdin");
|
|
|
|
|
intcode.write(argv[0].address.unwrap(), value.trim().parse().unwrap());
|
|
|
|
|
pub fn cin<I: IntCodeIO>(intcode: &mut IntCode<I>, argv: &Vec<Value>) {
|
|
|
|
|
let value = intcode.io.get();
|
|
|
|
|
intcode.write(argv[0].address.unwrap(), value);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn cout(_intcode: &mut IntCode, argv: &Vec<Value>) {
|
|
|
|
|
println!("{}", argv[0].value);
|
|
|
|
|
pub fn cout<I: IntCodeIO>(intcode: &mut IntCode<I>, argv: &Vec<Value>) {
|
|
|
|
|
intcode.io.put(argv[0].value)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn jump_if_true(intcode: &mut IntCode, argv: &Vec<Value>) {
|
|
|
|
|
pub fn jump_if_true<I: IntCodeIO>(intcode: &mut IntCode<I>, argv: &Vec<Value>) {
|
|
|
|
|
if argv[0].value != 0 {
|
|
|
|
|
intcode.jump(argv[1].value as usize)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn jump_if_false(intcode: &mut IntCode, argv: &Vec<Value>) {
|
|
|
|
|
pub fn jump_if_false<I: IntCodeIO>(intcode: &mut IntCode<I>, argv: &Vec<Value>) {
|
|
|
|
|
if argv[0].value == 0 {
|
|
|
|
|
intcode.jump(argv[1].value as usize)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn lt(intcode: &mut IntCode, argv: &Vec<Value>) {
|
|
|
|
|
pub fn lt<I: IntCodeIO>(intcode: &mut IntCode<I>, argv: &Vec<Value>) {
|
|
|
|
|
intcode.write(
|
|
|
|
|
argv[2].address.unwrap(),
|
|
|
|
|
if argv[0].value < argv[1].value { 1 } else { 0 }
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn eq(intcode: &mut IntCode, argv: &Vec<Value>) {
|
|
|
|
|
pub fn eq<I: IntCodeIO>(intcode: &mut IntCode<I>, argv: &Vec<Value>) {
|
|
|
|
|
intcode.write(
|
|
|
|
|
argv[2].address.unwrap(),
|
|
|
|
|
if argv[0].value == argv[1].value { 1 } else { 0 }
|
|
|
|
|