rsfk_core/
lib.rs

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);