use super::{AdviceMap, Felt, InnerNodeInfo, InputError, MerkleStore};
use alloc::vec::Vec;
use vm_core::crypto::hash::RpoDigest;
#[cfg(not(feature = "internals"))]
#[derive(Clone, Debug, Default)]
pub struct AdviceInputs {
stack: Vec<Felt>,
map: AdviceMap,
store: MerkleStore,
}
impl AdviceInputs {
pub fn with_stack_values<I>(mut self, iter: I) -> Result<Self, InputError>
where
I: IntoIterator<Item = u64>,
{
let stack = iter
.into_iter()
.map(|v| Felt::try_from(v).map_err(|e| InputError::NotFieldElement(v, e)))
.collect::<Result<Vec<_>, _>>()?;
self.stack.extend(stack.iter());
Ok(self)
}
pub fn with_stack<I>(mut self, iter: I) -> Self
where
I: IntoIterator<Item = Felt>,
{
self.stack.extend(iter);
self
}
pub fn with_map<I>(mut self, iter: I) -> Self
where
I: IntoIterator<Item = (RpoDigest, Vec<Felt>)>,
{
self.map.extend(iter);
self
}
pub fn with_merkle_store(mut self, store: MerkleStore) -> Self {
self.store = store;
self
}
pub fn extend_stack<I>(&mut self, iter: I)
where
I: IntoIterator<Item = Felt>,
{
self.stack.extend(iter);
}
pub fn extend_map<I>(&mut self, iter: I)
where
I: IntoIterator<Item = (RpoDigest, Vec<Felt>)>,
{
self.map.extend(iter);
}
pub fn extend_merkle_store<I>(&mut self, iter: I)
where
I: Iterator<Item = InnerNodeInfo>,
{
self.store.extend(iter);
}
pub fn extend(&mut self, other: Self) {
self.stack.extend(other.stack);
self.map.extend(other.map);
self.store.extend(other.store.inner_nodes());
}
pub fn stack(&self) -> &[Felt] {
&self.stack
}
pub fn mapped_values(&self, key: &RpoDigest) -> Option<&[Felt]> {
self.map.get(key)
}
pub const fn merkle_store(&self) -> &MerkleStore {
&self.store
}
#[allow(clippy::type_complexity)]
pub(crate) fn into_parts(self) -> (Vec<Felt>, AdviceMap, MerkleStore) {
let Self { stack, map, store } = self;
(stack, map, store)
}
}
#[cfg(feature = "internals")]
#[derive(Clone, Debug, Default)]
pub struct AdviceInputs {
pub stack: Vec<Felt>,
pub map: AdviceMap,
pub store: MerkleStore,
}