rill-core-wdf 0.3.1

Wave Digital Filter core — elements, adapters, and analysis for analog circuit modeling
Documentation
#[macro_export]
macro_rules! wdf_element {
    (
        name: $name:ident<T>,
        params: { $($pname:ident: $ptype:ty),* },
        state: { $($sname:ident: $stype:ty),* },
        port_resistance: |$pr_self:ident| $pr:tt,
        scattering: |$p:ident, $a:ident| $scatter:tt,
        update: |$u:ident| $update:tt,
        reset: |$r:ident| $reset:tt,
    ) => {
        #[derive(Debug, Clone, Copy)]
        pub struct $name<T> {
            $($pname: $ptype,)*
            $($sname: $stype,)*
            voltage: T,
            current: T,
        }

        impl<T: $crate::Transcendental> $name<T> {
            pub fn new($($pname: $ptype),*) -> Self {
                Self { $($pname,)* $($sname: T::ZERO,)* voltage: T::ZERO, current: T::ZERO }
            }
        }

        impl<T: $crate::Transcendental> $crate::WdfElement<T> for $name<T> {
            fn port_resistance(&self) -> T { let $pr_self = self; $pr }
            fn process_incident(&mut self, a: T) -> T { let $p = self; let $a = a; $scatter }
            fn update_state(&mut self) { let $u = self; $update }
            fn voltage(&self) -> T { self.voltage }
            fn current(&self) -> T { self.current }
            fn reset(&mut self) { let $r = self; $reset }
        }
    };
}