1use input_macro::input;
2use num::Integer;
3
4#[derive(Debug)]
5pub struct BrainfuckState<T: Integer> {
6 pub memory: Vec<T>,
7 pub pointer: usize,
8}
9
10#[macro_export]
11macro_rules! impl_brainfuck_for {
12 ($t:ty) => {
13 impl BrainfuckState<$t> {
14 pub fn new() -> BrainfuckState<u8> {
15 BrainfuckState::<u8> {
16 memory: vec![0],
17 pointer: 0usize,
18 }
19 }
20
21 pub fn mv_left(&mut self, offset: usize) {
22 self.pointer -= offset;
23 }
24
25 pub fn mv_right(&mut self, offset: usize) {
26 self.pointer += offset;
27 for _ in self.memory.len()..(self.pointer + offset + 1) {
28 self.memory.push(0);
29 }
30 }
31
32 pub fn add(&mut self, number: $t) {
33 self.memory[self.pointer] += number;
34 }
35
36 pub fn sub(&mut self, number: $t) {
37 self.memory[self.pointer] -= number;
38 }
39
40 pub fn out(&mut self) {
41 print!("{}", char::from(self.memory[self.pointer] as u8));
42 }
43
44 pub fn inp(&mut self) {
45 self.memory[self.pointer] = input!("").parse::<$t>().unwrap();
46 }
47 }
48 };
49}
50
51impl_brainfuck_for!(u8);
52impl_brainfuck_for!(u16);
53impl_brainfuck_for!(u32);
54impl_brainfuck_for!(u64);
55impl_brainfuck_for!(u128);
56impl_brainfuck_for!(usize);