git.delta.rocks / jrsonnet / refs/commits / fc45c6ca2bef

difftreelog

source

crates/jrsonnet-evaluator/src/map.rs1.5 KiBsourcehistory
1use jrsonnet_gcmodule::{Cc, Trace};2use jrsonnet_interner::IStr;3use rustc_hash::FxHashMap;45use crate::{gc::WithCapacityExt as _, Thunk, Val};67#[derive(Trace, Debug)]8#[trace(tracking(force))]9pub struct LayeredHashMapInternals {10	parent: Option<LayeredHashMap>,11	current: FxHashMap<IStr, Thunk<Val>>,12}1314#[derive(Trace, Debug)]15pub struct LayeredHashMap(Cc<LayeredHashMapInternals>);1617impl LayeredHashMap {18	pub fn iter_keys(self, mut handler: impl FnMut(IStr)) {19		for (k, _) in &self.0.current {20			handler(k.clone());21		}22		if let Some(parent) = self.0.parent.clone() {23			parent.iter_keys(handler);24		}25	}2627	pub(crate) fn new(layer: FxHashMap<IStr, Thunk<Val>>) -> Self {28		Self(Cc::new(LayeredHashMapInternals {29			parent: None,30			current: layer,31		}))32	}3334	pub fn extend(self, new_layer: FxHashMap<IStr, Thunk<Val>>) -> Self {35		Self(Cc::new(LayeredHashMapInternals {36			parent: Some(self),37			current: new_layer,38		}))39	}4041	pub fn get(&self, key: &IStr) -> Option<&Thunk<Val>> {42		(self.0)43			.current44			.get(key)45			.or_else(|| self.0.parent.as_ref().and_then(|p| p.get(key)))46	}4748	pub fn contains_key(&self, key: &IStr) -> bool {49		(self.0).current.contains_key(key)50			|| self51				.052				.parent53				.as_ref()54				.map_or(false, |p| p.contains_key(key))55	}56}5758impl Clone for LayeredHashMap {59	fn clone(&self) -> Self {60		Self(self.0.clone())61	}62}6364impl Default for LayeredHashMap {65	fn default() -> Self {66		Self(Cc::new(LayeredHashMapInternals {67			parent: None,68			current: FxHashMap::new(),69		}))70	}71}