#![allow(unused)]
use std::collections::HashMap;
use std::hash::Hash;
use std::marker::PhantomData;
use crate::VarId;
use crate::grammar::GrTree;
#[derive(Clone, Debug)]
pub struct FromRTS;
#[derive(Clone, Debug)]
pub struct FromPRS;
#[derive(Clone, Debug)]
pub struct Origin<F, T> {
pub trees: Vec<GrTree>,
pub map: HashMap<F, (VarId, usize)>,
_phantom: PhantomData<T>,
}
impl<F, T> Origin<F, T> {
pub fn new() -> Self {
Origin {
trees: Vec::new(),
map: HashMap::new(),
_phantom: PhantomData,
}
}
pub fn with_capacity(size: usize) -> Self {
Origin {
trees: Vec::with_capacity(size),
map: HashMap::new(),
_phantom: PhantomData,
}
}
pub fn from_data(trees: Vec<GrTree>, map: HashMap<F, (VarId, usize)>) -> Self {
Origin { trees, map, _phantom: PhantomData }
}
pub fn from_trees_mut(trees: &mut Vec<GrTree>) -> Self {
let trees = std::mem::take(trees);
Self::from_data(trees, HashMap::new())
}
pub fn set_tree(&mut self, var: VarId, tree: GrTree) {
let var = var as usize;
if self.trees.len() <= var {
self.trees.resize(var + 1, GrTree::new());
}
self.trees[var] = tree;
}
pub fn get_tree(&self, var: VarId) -> Option<&GrTree> {
self.trees.get(var as usize)
}
}
impl<F, T> Default for Origin<F, T> {
fn default() -> Self {
Self::new()
}
}
impl<F: Eq + Hash, T> Origin<F, T> {
pub fn add(&mut self, new: F, origin: (VarId, usize)) {
self.map.insert(new, origin);
}
pub fn get(&self, new: F) -> Option<(&GrTree, usize)> {
self.map.get(&new).cloned()
.map(|(v, node)| (&self.trees[v as usize], node))
}
}