reorganize plumbing

This commit is contained in:
Niko Matsakis 2024-07-12 07:07:11 -04:00
parent 65118a0fe6
commit 15106ff8ea
20 changed files with 145 additions and 101 deletions

View file

@ -84,21 +84,18 @@ impl DbMacro {
fn has_storage_impl(&self, input: &syn::ItemStruct) -> syn::Result<TokenStream> { fn has_storage_impl(&self, input: &syn::ItemStruct) -> syn::Result<TokenStream> {
let storage = self.find_storage_field(input)?; let storage = self.find_storage_field(input)?;
let db = &input.ident; let db = &input.ident;
let zalsa = self.hygiene.ident("zalsa");
let SalsaHasStorage = self.hygiene.ident("SalsaHasStorage");
let SalsaStorage = self.hygiene.ident("SalsaStorage");
Ok(quote! { Ok(quote! {
const _: () = { const _: () = {
use salsa::storage::HasStorage as #SalsaHasStorage; use salsa::plumbing as #zalsa;
use salsa::storage::Storage as #SalsaStorage;
unsafe impl #SalsaHasStorage for #db { unsafe impl #zalsa::HasStorage for #db {
fn storage(&self) -> &#SalsaStorage<Self> { fn storage(&self) -> &#zalsa::Storage<Self> {
&self.#storage &self.#storage
} }
fn storage_mut(&mut self) -> &mut #SalsaStorage<Self> { fn storage_mut(&mut self) -> &mut #zalsa::Storage<Self> {
&mut self.#storage &mut self.#storage
} }
} }
@ -115,17 +112,21 @@ impl DbMacro {
} }
fn add_salsa_view_method_impl(&self, input: &mut syn::ItemImpl) -> syn::Result<()> { fn add_salsa_view_method_impl(&self, input: &mut syn::ItemImpl) -> syn::Result<()> {
let zalsa = self.hygiene.ident("zalsa");
let Some((_, TraitPath, _)) = &input.trait_ else { let Some((_, TraitPath, _)) = &input.trait_ else {
return Err(syn::Error::new_spanned( return Err(syn::Error::new_spanned(
&input.self_ty, &input.self_ty,
"impl must be on a trait", "impl must be on a trait",
)); ));
}; };
input.items.push(parse_quote! { input.items.push(parse_quote! {
#[doc(hidden)] #[doc(hidden)]
#[allow(uncommon_codepoins)] #[allow(uncommon_codepoins)]
fn zalsa_add_view(&self) { fn zalsa_add_view(&self) {
salsa::storage::views(self).add::<Self, dyn #TraitPath>(|t| t, |t| t); use salsa::plumbing as #zalsa;
#zalsa::views(self).add::<Self, dyn #TraitPath>(|t| t, |t| t);
} }
}); });
Ok(()) Ok(())

View file

@ -82,7 +82,7 @@ pub trait Configuration: 'static {
/// * the `specify` method, which can only be used when the key is an entity created by the active query. /// * the `specify` method, which can only be used when the key is an entity created by the active query.
/// It sets the value of the function imperatively, so that when later fetches occur, they'll return this value. /// It sets the value of the function imperatively, so that when later fetches occur, they'll return this value.
/// * the `store` method, which can only be invoked with an `&mut` reference, and is to set input fields. /// * the `store` method, which can only be invoked with an `&mut` reference, and is to set input fields.
pub struct FunctionIngredient<C: Configuration> { pub struct IngredientImpl<C: Configuration> {
/// The ingredient index we were assigned in the database. /// The ingredient index we were assigned in the database.
/// Used to construct `DatabaseKeyIndex` values. /// Used to construct `DatabaseKeyIndex` values.
index: IngredientIndex, index: IngredientIndex,
@ -127,7 +127,7 @@ pub fn should_backdate_value<V: Eq>(old_value: &V, new_value: &V) -> bool {
/// e.g. you can do `Config<X, 0>` and `Config<X, 1>`. /// e.g. you can do `Config<X, 0>` and `Config<X, 1>`.
pub struct Config<const C: usize>(std::marker::PhantomData<[(); C]>); pub struct Config<const C: usize>(std::marker::PhantomData<[(); C]>);
impl<C> FunctionIngredient<C> impl<C> IngredientImpl<C>
where where
C: Configuration, C: Configuration,
{ {
@ -199,7 +199,7 @@ where
} }
} }
impl<C> Ingredient for FunctionIngredient<C> impl<C> Ingredient for IngredientImpl<C>
where where
C: Configuration, C: Configuration,
{ {
@ -276,7 +276,7 @@ where
} }
} }
impl<C> std::fmt::Debug for FunctionIngredient<C> impl<C> std::fmt::Debug for IngredientImpl<C>
where where
C: Configuration, C: Configuration,
{ {
@ -287,7 +287,7 @@ where
} }
} }
impl<C> IngredientRequiresReset for FunctionIngredient<C> impl<C> IngredientRequiresReset for IngredientImpl<C>
where where
C: Configuration, C: Configuration,
{ {

View file

@ -3,10 +3,10 @@ use crate::{
storage::DatabaseGen, DatabaseKeyIndex, Id, storage::DatabaseGen, DatabaseKeyIndex, Id,
}; };
use super::{Configuration, FunctionIngredient}; use super::{Configuration, IngredientImpl};
use crate::accumulator::Accumulator; use crate::accumulator::Accumulator;
impl<C> FunctionIngredient<C> impl<C> IngredientImpl<C>
where where
C: Configuration, C: Configuration,
{ {

View file

@ -1,8 +1,8 @@
use crate::runtime::local_state::QueryRevisions; use crate::runtime::local_state::QueryRevisions;
use super::{memo::Memo, Configuration, FunctionIngredient}; use super::{memo::Memo, Configuration, IngredientImpl};
impl<C> FunctionIngredient<C> impl<C> IngredientImpl<C>
where where
C: Configuration, C: Configuration,
{ {

View file

@ -3,9 +3,9 @@ use crossbeam::queue::SegQueue;
use crate::{runtime::local_state::QueryOrigin, Id}; use crate::{runtime::local_state::QueryOrigin, Id};
use super::{memo, Configuration, FunctionIngredient}; use super::{memo, Configuration, IngredientImpl};
impl<C> FunctionIngredient<C> impl<C> IngredientImpl<C>
where where
C: Configuration, C: Configuration,
{ {

View file

@ -3,9 +3,9 @@ use crate::{
storage::DatabaseGen, Database, DatabaseKeyIndex, Event, EventKind, storage::DatabaseGen, Database, DatabaseKeyIndex, Event, EventKind,
}; };
use super::{memo::Memo, Configuration, FunctionIngredient}; use super::{memo::Memo, Configuration, IngredientImpl};
impl<C> FunctionIngredient<C> impl<C> IngredientImpl<C>
where where
C: Configuration, C: Configuration,
{ {

View file

@ -6,9 +6,9 @@ use crate::{
Cycle, Database, Event, EventKind, Cycle, Database, Event, EventKind,
}; };
use super::{memo::Memo, Configuration, FunctionIngredient}; use super::{memo::Memo, Configuration, IngredientImpl};
impl<C> FunctionIngredient<C> impl<C> IngredientImpl<C>
where where
C: Configuration, C: Configuration,
{ {

View file

@ -2,9 +2,9 @@ use arc_swap::Guard;
use crate::{runtime::StampedValue, storage::DatabaseGen, Id}; use crate::{runtime::StampedValue, storage::DatabaseGen, Id};
use super::{Configuration, FunctionIngredient}; use super::{Configuration, IngredientImpl};
impl<C> FunctionIngredient<C> impl<C> IngredientImpl<C>
where where
C: Configuration, C: Configuration,
{ {

View file

@ -1,8 +1,8 @@
use crate::{runtime::local_state::QueryOrigin, Id}; use crate::{runtime::local_state::QueryOrigin, Id};
use super::{Configuration, FunctionIngredient}; use super::{Configuration, IngredientImpl};
impl<C> FunctionIngredient<C> impl<C> IngredientImpl<C>
where where
C: Configuration, C: Configuration,
{ {

View file

@ -10,9 +10,9 @@ use crate::{
Id, Revision, Runtime, Id, Revision, Runtime,
}; };
use super::{memo::Memo, Configuration, FunctionIngredient}; use super::{memo::Memo, Configuration, IngredientImpl};
impl<C> FunctionIngredient<C> impl<C> IngredientImpl<C>
where where
C: Configuration, C: Configuration,
{ {

View file

@ -7,9 +7,9 @@ use crate::{
Database, DatabaseKeyIndex, Id, Database, DatabaseKeyIndex, Id,
}; };
use super::{memo::Memo, Configuration, FunctionIngredient}; use super::{memo::Memo, Configuration, IngredientImpl};
impl<C> FunctionIngredient<C> impl<C> IngredientImpl<C>
where where
C: Configuration, C: Configuration,
{ {

View file

@ -8,9 +8,9 @@ use crate::{
Id, Runtime, Id, Runtime,
}; };
use super::{memo::Memo, Configuration, FunctionIngredient}; use super::{memo::Memo, Configuration, IngredientImpl};
impl<C> FunctionIngredient<C> impl<C> IngredientImpl<C>
where where
C: Configuration, C: Configuration,
{ {

View file

@ -18,14 +18,14 @@ pub trait Configuration: Any {
type Id: FromId + 'static + Send + Sync; type Id: FromId + 'static + Send + Sync;
} }
pub struct InputIngredient<C: Configuration> { pub struct IngredientImpl<C: Configuration> {
ingredient_index: IngredientIndex, ingredient_index: IngredientIndex,
counter: AtomicU32, counter: AtomicU32,
debug_name: &'static str, debug_name: &'static str,
_phantom: std::marker::PhantomData<C::Id>, _phantom: std::marker::PhantomData<C::Id>,
} }
impl<C: Configuration> InputIngredient<C> { impl<C: Configuration> IngredientImpl<C> {
pub fn new(index: IngredientIndex, debug_name: &'static str) -> Self { pub fn new(index: IngredientIndex, debug_name: &'static str) -> Self {
Self { Self {
ingredient_index: index, ingredient_index: index,
@ -62,7 +62,7 @@ impl<C: Configuration> InputIngredient<C> {
} }
} }
impl<C: Configuration> Ingredient for InputIngredient<C> { impl<C: Configuration> Ingredient for IngredientImpl<C> {
fn ingredient_index(&self) -> IngredientIndex { fn ingredient_index(&self) -> IngredientIndex {
self.ingredient_index self.ingredient_index
} }
@ -125,11 +125,11 @@ impl<C: Configuration> Ingredient for InputIngredient<C> {
} }
} }
impl<C: Configuration> IngredientRequiresReset for InputIngredient<C> { impl<C: Configuration> IngredientRequiresReset for IngredientImpl<C> {
const RESET_ON_NEW_REVISION: bool = false; const RESET_ON_NEW_REVISION: bool = false;
} }
impl<C: Configuration> std::fmt::Debug for InputIngredient<C> { impl<C: Configuration> std::fmt::Debug for IngredientImpl<C> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct(std::any::type_name::<Self>()) f.debug_struct(std::any::type_name::<Self>())
.field("index", &self.ingredient_index) .field("index", &self.ingredient_index)

View file

@ -2,7 +2,6 @@ use crate::cycle::CycleRecoveryStrategy;
use crate::id::{AsId, FromId}; use crate::id::{AsId, FromId};
use crate::ingredient::{fmt_index, Ingredient, IngredientRequiresReset}; use crate::ingredient::{fmt_index, Ingredient, IngredientRequiresReset};
use crate::input::Configuration; use crate::input::Configuration;
use crate::plumbing::transmute_lifetime;
use crate::runtime::local_state::QueryOrigin; use crate::runtime::local_state::QueryOrigin;
use crate::runtime::StampedValue; use crate::runtime::StampedValue;
use crate::storage::IngredientIndex; use crate::storage::IngredientIndex;
@ -23,13 +22,13 @@ impl<T: Send + Sync + 'static> InputFieldData for T {}
/// a shared reference, so some locking is required. /// a shared reference, so some locking is required.
/// Altogether this makes the implementation somewhat simpler than tracked /// Altogether this makes the implementation somewhat simpler than tracked
/// structs. /// structs.
pub struct InputFieldIngredient<C: Configuration, F: InputFieldData> { pub struct FieldIngredientImpl<C: Configuration, F: InputFieldData> {
index: IngredientIndex, index: IngredientIndex,
map: DashMap<C::Id, Box<StampedValue<F>>>, map: DashMap<C::Id, Box<StampedValue<F>>>,
debug_name: &'static str, debug_name: &'static str,
} }
impl<C, F> InputFieldIngredient<C, F> impl<C, F> FieldIngredientImpl<C, F>
where where
C: Configuration, C: Configuration,
F: InputFieldData, F: InputFieldData,
@ -110,7 +109,16 @@ where
} }
} }
impl<C, F> Ingredient for InputFieldIngredient<C, F> /// More limited wrapper around transmute that copies lifetime from `a` to `b`.
///
/// # Safety condition
///
/// `b` must be owned by `a`
unsafe fn transmute_lifetime<'a, 'b, A, B>(_a: &'a A, b: &'b B) -> &'a B {
std::mem::transmute(b)
}
impl<C, F> Ingredient for FieldIngredientImpl<C, F>
where where
C: Configuration, C: Configuration,
F: InputFieldData, F: InputFieldData,
@ -166,7 +174,7 @@ where
} }
} }
impl<C, F> IngredientRequiresReset for InputFieldIngredient<C, F> impl<C, F> IngredientRequiresReset for FieldIngredientImpl<C, F>
where where
C: Configuration, C: Configuration,
F: InputFieldData, F: InputFieldData,
@ -174,7 +182,7 @@ where
const RESET_ON_NEW_REVISION: bool = false; const RESET_ON_NEW_REVISION: bool = false;
} }
impl<C, F> std::fmt::Debug for InputFieldIngredient<C, F> impl<C, F> std::fmt::Debug for FieldIngredientImpl<C, F>
where where
C: Configuration, C: Configuration,
F: InputFieldData, F: InputFieldData,

View file

@ -53,7 +53,7 @@ impl<T: Eq + Hash + Clone> InternedData for T {}
/// The interned ingredient has the job of hashing values of type `Data` to produce an `Id`. /// The interned ingredient has the job of hashing values of type `Data` to produce an `Id`.
/// It used to store interned structs but also to store the id fields of a tracked struct. /// It used to store interned structs but also to store the id fields of a tracked struct.
/// Interned values endure until they are explicitly removed in some way. /// Interned values endure until they are explicitly removed in some way.
pub struct InternedIngredient<C: Configuration> { pub struct IngredientImpl<C: Configuration> {
/// Index of this ingredient in the database (used to construct database-ids, etc). /// Index of this ingredient in the database (used to construct database-ids, etc).
ingredient_index: IngredientIndex, ingredient_index: IngredientIndex,
@ -86,7 +86,7 @@ where
fields: C::Data<'static>, fields: C::Data<'static>,
} }
impl<C> InternedIngredient<C> impl<C> IngredientImpl<C>
where where
C: Configuration, C: Configuration,
{ {
@ -182,7 +182,7 @@ where
} }
} }
impl<C> Ingredient for InternedIngredient<C> impl<C> Ingredient for IngredientImpl<C>
where where
C: Configuration, C: Configuration,
{ {
@ -247,14 +247,14 @@ where
} }
} }
impl<C> IngredientRequiresReset for InternedIngredient<C> impl<C> IngredientRequiresReset for IngredientImpl<C>
where where
C: Configuration, C: Configuration,
{ {
const RESET_ON_NEW_REVISION: bool = false; const RESET_ON_NEW_REVISION: bool = false;
} }
impl<C> std::fmt::Debug for InternedIngredient<C> impl<C> std::fmt::Debug for IngredientImpl<C>
where where
C: Configuration, C: Configuration,
{ {

View file

@ -1,28 +1,27 @@
pub mod accumulator; mod accumulator;
mod alloc; mod alloc;
pub mod cancelled; mod cancelled;
pub mod cycle; mod cycle;
pub mod database; mod database;
pub mod durability; mod durability;
pub mod event; mod event;
pub mod function; mod function;
pub mod hash; mod hash;
pub mod id; mod id;
pub mod ingredient; mod ingredient;
pub mod ingredient_list; mod ingredient_list;
pub mod input; mod input;
pub mod input_field; mod input_field;
pub mod interned; mod interned;
pub mod key; mod key;
mod nonce; mod nonce;
pub mod plumbing; mod revision;
pub mod revision; mod runtime;
pub mod runtime; mod salsa_struct;
pub mod salsa_struct; mod setter;
pub mod setter; mod storage;
pub mod storage; mod tracked_struct;
pub mod tracked_struct; mod update;
pub mod update;
mod views; mod views;
pub use self::cancelled::Cancelled; pub use self::cancelled::Cancelled;
@ -45,3 +44,47 @@ pub use salsa_macros::interned;
pub use salsa_macros::tracked; pub use salsa_macros::tracked;
pub use salsa_macros::DebugWithDb; pub use salsa_macros::DebugWithDb;
pub use salsa_macros::Update; pub use salsa_macros::Update;
/// Internal names used by salsa macros.
///
/// # WARNING
///
/// The contents of this module are NOT subject to semver.
pub mod plumbing {
pub use crate::cycle::Cycle;
pub use crate::cycle::CycleRecoveryStrategy;
pub use crate::database::Database;
pub use crate::id::AsId;
pub use crate::id::FromId;
pub use crate::id::Id;
pub use crate::ingredient::Ingredient;
pub use crate::ingredient::Jar;
pub use crate::salsa_struct::SalsaStructInDb;
pub use crate::storage::views;
pub use crate::storage::IngredientCache;
pub use crate::storage::IngredientIndex;
pub mod input {
pub use crate::input::Configuration;
pub use crate::input::IngredientImpl;
pub use crate::input_field::FieldIngredientImpl;
}
pub mod interned {
pub use crate::interned::Configuration;
pub use crate::interned::IngredientImpl;
pub use crate::interned::ValueStruct;
}
pub mod function {
pub use crate::function::Configuration;
pub use crate::function::IngredientImpl;
}
pub mod tracked_struct {
pub use crate::tracked_struct::tracked_field::FieldIngredientImpl;
pub use crate::tracked_struct::Configuration;
pub use crate::tracked_struct::IngredientImpl;
pub use crate::tracked_struct::JarImpl;
}
}

View file

@ -1,8 +0,0 @@
// Returns `u` but with the lifetime of `t`.
//
// Safe if you know that data at `u` will remain shared
// until the reference `t` expires.
#[allow(clippy::needless_lifetimes)]
pub(crate) unsafe fn transmute_lifetime<'t, 'u, T, U>(_t: &'t T, u: &'u U) -> &'t U {
std::mem::transmute(u)
}

View file

@ -1,6 +1,6 @@
use crate::id::AsId; use crate::id::AsId;
use crate::input::Configuration; use crate::input::Configuration;
use crate::input_field::{InputFieldData, InputFieldIngredient}; use crate::input_field::{FieldIngredientImpl, InputFieldData};
use crate::{Durability, Runtime}; use crate::{Durability, Runtime};
use std::hash::Hash; use std::hash::Hash;
@ -8,7 +8,7 @@ use std::hash::Hash;
pub struct Setter<'setter, C: Configuration, F: InputFieldData> { pub struct Setter<'setter, C: Configuration, F: InputFieldData> {
runtime: &'setter mut Runtime, runtime: &'setter mut Runtime,
key: C::Id, key: C::Id,
ingredient: &'setter mut InputFieldIngredient<C, F>, ingredient: &'setter mut FieldIngredientImpl<C, F>,
durability: Durability, durability: Durability,
} }
@ -20,7 +20,7 @@ where
pub fn new( pub fn new(
runtime: &'setter mut Runtime, runtime: &'setter mut Runtime,
key: C::Id, key: C::Id,
ingredient: &'setter mut InputFieldIngredient<C, F>, ingredient: &'setter mut FieldIngredientImpl<C, F>,
) -> Self { ) -> Self {
Setter { Setter {
runtime, runtime,

View file

@ -2,6 +2,7 @@ use std::{fmt, hash::Hash, marker::PhantomData, ptr::NonNull};
use crossbeam::atomic::AtomicCell; use crossbeam::atomic::AtomicCell;
use dashmap::mapref::entry::Entry; use dashmap::mapref::entry::Entry;
use tracked_field::FieldIngredientImpl;
use crate::{ use crate::{
cycle::CycleRecoveryStrategy, cycle::CycleRecoveryStrategy,
@ -17,10 +18,9 @@ use crate::{
}; };
use self::struct_map::{StructMap, Update}; use self::struct_map::{StructMap, Update};
pub use self::tracked_field::TrackedFieldIngredient;
mod struct_map; mod struct_map;
mod tracked_field; pub mod tracked_field;
// ANCHOR: Configuration // ANCHOR: Configuration
/// Trait that defines the key properties of a tracked struct. /// Trait that defines the key properties of a tracked struct.
@ -99,14 +99,14 @@ pub trait Configuration: Jar + Sized + 'static {
} }
// ANCHOR_END: Configuration // ANCHOR_END: Configuration
pub struct TrackedStructJar<C> pub struct JarImpl<C>
where where
C: Configuration, C: Configuration,
{ {
phantom: PhantomData<C>, phantom: PhantomData<C>,
} }
impl<C: Configuration> Default for TrackedStructJar<C> { impl<C: Configuration> Default for JarImpl<C> {
fn default() -> Self { fn default() -> Self {
Self { Self {
phantom: Default::default(), phantom: Default::default(),
@ -114,18 +114,18 @@ impl<C: Configuration> Default for TrackedStructJar<C> {
} }
} }
impl<C: Configuration> Jar for TrackedStructJar<C> { impl<C: Configuration> Jar for JarImpl<C> {
fn create_ingredients( fn create_ingredients(
&self, &self,
struct_index: crate::storage::IngredientIndex, struct_index: crate::storage::IngredientIndex,
) -> Vec<Box<dyn Ingredient>> { ) -> Vec<Box<dyn Ingredient>> {
let struct_ingredient = TrackedStructIngredient::new(struct_index); let struct_ingredient = IngredientImpl::new(struct_index);
let struct_map = &struct_ingredient.struct_map.view(); let struct_map = &struct_ingredient.struct_map.view();
std::iter::once(Box::new(struct_ingredient) as _) std::iter::once(Box::new(struct_ingredient) as _)
.chain( .chain(
(0..u32::try_from(C::FIELD_DEBUG_NAMES.len()).unwrap()).map(|field_index| { (0..u32::try_from(C::FIELD_DEBUG_NAMES.len()).unwrap()).map(|field_index| {
Box::new(TrackedFieldIngredient::<C>::new( Box::new(FieldIngredientImpl::<C>::new(
struct_index, struct_index,
field_index, field_index,
struct_map, struct_map,
@ -149,7 +149,7 @@ pub trait TrackedStructInDb<DB: ?Sized + Database>: SalsaStructInDb<DB> {
/// Unlike normal interners, tracked struct indices can be deleted and reused aggressively: /// Unlike normal interners, tracked struct indices can be deleted and reused aggressively:
/// when a tracked function re-executes, /// when a tracked function re-executes,
/// any tracked structs that it created before but did not create this time can be deleted. /// any tracked structs that it created before but did not create this time can be deleted.
pub struct TrackedStructIngredient<C> pub struct IngredientImpl<C>
where where
C: Configuration, C: Configuration,
{ {
@ -236,7 +236,7 @@ where
#[derive(Debug, PartialEq, Eq, Hash, PartialOrd, Ord, Copy, Clone)] #[derive(Debug, PartialEq, Eq, Hash, PartialOrd, Ord, Copy, Clone)]
pub struct Disambiguator(pub u32); pub struct Disambiguator(pub u32);
impl<C> TrackedStructIngredient<C> impl<C> IngredientImpl<C>
where where
C: Configuration, C: Configuration,
{ {
@ -420,7 +420,7 @@ where
} }
} }
impl<C> Ingredient for TrackedStructIngredient<C> impl<C> Ingredient for IngredientImpl<C>
where where
C: Configuration, C: Configuration,
{ {
@ -482,7 +482,7 @@ where
} }
} }
impl<C> std::fmt::Debug for TrackedStructIngredient<C> impl<C> std::fmt::Debug for IngredientImpl<C>
where where
C: Configuration, C: Configuration,
{ {
@ -493,7 +493,7 @@ where
} }
} }
impl<C> IngredientRequiresReset for TrackedStructIngredient<C> impl<C> IngredientRequiresReset for IngredientImpl<C>
where where
C: Configuration, C: Configuration,
{ {

View file

@ -16,7 +16,7 @@ use super::{struct_map::StructMapView, Configuration};
/// Unlike normal interners, tracked struct indices can be deleted and reused aggressively: /// Unlike normal interners, tracked struct indices can be deleted and reused aggressively:
/// when a tracked function re-executes, /// when a tracked function re-executes,
/// any tracked structs that it created before but did not create this time can be deleted. /// any tracked structs that it created before but did not create this time can be deleted.
pub struct TrackedFieldIngredient<C> pub struct FieldIngredientImpl<C>
where where
C: Configuration, C: Configuration,
{ {
@ -26,7 +26,7 @@ where
struct_map: StructMapView<C>, struct_map: StructMapView<C>,
} }
impl<C> TrackedFieldIngredient<C> impl<C> FieldIngredientImpl<C>
where where
C: Configuration, C: Configuration,
{ {
@ -68,7 +68,7 @@ where
} }
} }
impl<C> Ingredient for TrackedFieldIngredient<C> impl<C> Ingredient for FieldIngredientImpl<C>
where where
C: Configuration, C: Configuration,
{ {
@ -139,7 +139,7 @@ where
} }
} }
impl<C> std::fmt::Debug for TrackedFieldIngredient<C> impl<C> std::fmt::Debug for FieldIngredientImpl<C>
where where
C: Configuration, C: Configuration,
{ {
@ -151,7 +151,7 @@ where
} }
} }
impl<C> IngredientRequiresReset for TrackedFieldIngredient<C> impl<C> IngredientRequiresReset for FieldIngredientImpl<C>
where where
C: Configuration, C: Configuration,
{ {