1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
use crate::err::ProcessingResult;
use crate::ErrorType;
use crate::proc::Processor;

#[derive(Copy, Clone)]
pub struct ProcessorRange {
    pub(super) start: usize,
    pub(super) end: usize,
}

impl ProcessorRange {
    pub fn len(&self) -> usize {
        self.end - self.start
    }

    pub fn empty(&self) -> bool {
        self.start >= self.end
    }

    pub fn nonempty(&self) -> bool {
        !self.empty()
    }

    pub fn first(&self, proc: &Processor) -> Option<u8> {
        if self.empty() {
            None
        } else {
            Some(proc.code[self.start])
        }
    }

    pub fn require(&self, reason: &'static str) -> ProcessingResult<Self> {
        if self.empty() {
            Err(ErrorType::NotFound(reason))
        } else {
            Ok(*self)
        }
    }

    pub fn expect(&self) -> () {
        debug_assert!(self.nonempty());
    }
}