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
44
45
46
47
use std::cmp::Ordering;
use crate::idx::Idx;
use crate::qty::MocQty;
use super::cell::{Cell, MocCell};
use super::cellrange::{CellRange, MocCellRange};
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum CellOrCellRange<T: Idx> {
Cell(Cell<T>),
CellRange(CellRange<T>),
}
impl<T: Idx> CellOrCellRange<T> {
fn get_depth_idx_low(&self) -> (u8, &T) {
match &self {
CellOrCellRange::Cell(Cell{ depth, idx}) => (*depth, idx),
CellOrCellRange::CellRange(CellRange{ depth, range}) => (*depth, &range.start),
}
}
pub fn flat_cmp<Q: MocQty<T>>(&self, other: &Self) -> Ordering {
let (d1, i_l) = self.get_depth_idx_low();
let (d2, i_r) = other.get_depth_idx_low();
match d1.cmp(&d2) {
Ordering::Equal => i_l.cmp(i_r),
Ordering::Less => i_l.unsigned_shl(Q::shift(d2 - d1) as u32).cmp(i_r),
Ordering::Greater => i_l.cmp(&i_r.unsigned_shl(Q::shift(d1 - d2) as u32)),
}
}
}
#[derive(Debug, Clone, PartialEq)]
pub enum MocCellOrCellRange<T: Idx, Q: MocQty<T>> {
MocCell(MocCell<T, Q>),
MocCellRange(MocCellRange<T, Q>),
}