pub type ExprId = usize;
#[derive(Debug, Clone)]
pub enum ExprChild {
Id(ExprId),
Inline(Box<Expression>),
}
impl ExprChild {
pub fn resolve<'a>(&'a self, expressions: &'a [Expression]) -> &'a Expression {
match self {
ExprChild::Id(id) => &expressions[*id],
ExprChild::Inline(expr) => expr,
}
}
pub fn as_id(&self) -> Option<ExprId> {
match self {
ExprChild::Id(id) => Some(*id),
ExprChild::Inline(_) => None,
}
}
pub fn id(&self) -> ExprId {
match self {
ExprChild::Id(id) => *id,
ExprChild::Inline(_) => panic!("Expected ExprChild::Id, got Inline"),
}
}
}
#[derive(Debug, Clone)]
pub struct Expression {
pub op: String,
pub values: Vec<ExprChild>,
pub id: Option<usize>,
pub dim: usize,
pub stage: usize,
pub exp_deg: i64,
pub row_offset: Option<i64>,
pub rows_offsets: Vec<i64>,
pub value: Option<String>,
pub boundary_id: Option<usize>,
pub boundary: Option<String>,
pub opening: Option<i64>,
pub commit_id: Option<usize>,
pub stage_id: Option<usize>,
pub airgroup_id: Option<usize>,
pub im_pol: bool,
pub pol_id: Option<usize>,
pub keep: Option<bool>,
pub info_computed: bool,
pub line: Option<String>,
}
impl Default for Expression {
fn default() -> Self {
Self {
op: String::new(),
values: Vec::new(),
id: None,
dim: 1,
stage: 0,
exp_deg: 0,
row_offset: None,
rows_offsets: Vec::new(),
value: None,
boundary_id: None,
boundary: None,
opening: None,
commit_id: None,
stage_id: None,
airgroup_id: None,
im_pol: false,
pol_id: None,
keep: None,
info_computed: false,
line: None,
}
}
}
#[derive(Debug, Default)]
pub struct ExpressionArena {
pub exprs: Vec<Expression>,
}
impl ExpressionArena {
pub fn new() -> Self {
Self { exprs: Vec::new() }
}
pub fn push(&mut self, expr: Expression) -> ExprId {
let id = self.exprs.len();
self.exprs.push(expr);
id
}
pub fn get(&self, id: ExprId) -> &Expression {
&self.exprs[id]
}
pub fn get_mut(&mut self, id: ExprId) -> &mut Expression {
&mut self.exprs[id]
}
pub fn len(&self) -> usize {
self.exprs.len()
}
pub fn is_empty(&self) -> bool {
self.exprs.is_empty()
}
}