//! Storage for the parser to expand macros call into.

/// This storage is used by the parser to store the expaned content of a macro call. It is only
/// used when user-defined macros are used. Otherwise, this storage is not used and is _zero-overhead_.
///
/// [`Storage`] needs to exist because Rust does not allow self-referencial types. When Rust does
/// (hopefully) gain support for self-referencial types, this storage will be removed.
#[derive(Default)]
pub struct Storage(pub(super) bumpalo::Bump);

impl Storage {
    /// Create a new storage for the parser.
    pub fn new() -> Self {
        Default::default()
    }

    /// Reset the storage's memory.
    ///
    /// It is recommended to call this method after each parsing operation to free up memory. This
    /// is more efficient than dropping the storage and creating a new one.
    pub fn reset(&mut self) {
        self.0.reset();
    }
}
