fastlib 0.3.7

FAST (FIX Adapted for STreaming protocol) is a space and processing efficient encoding method for message oriented data streams.
Documentation
#[derive(Debug, PartialEq)]
pub struct Stacked<T> {
    pub(crate) current: Option<T>,
    pub(crate) stack: Vec<T>,
}

impl<T> Stacked<T> {
    pub fn new_empty() -> Self {
        Self {
            current: None,
            stack: Vec::new(),
        }
    }

    pub fn new(v: T) -> Self {
        Self {
            current: Some(v),
            stack: Vec::new(),
        }
    }

    pub fn push(&mut self, v: T) {
        match self.current.replace(v) {
            None => {}
            Some(old) => {
                self.stack.push(old);
            }
        }
    }

    pub fn pop(&mut self) -> Option<T> {
        let old = self.stack.pop();
        match old {
            None => self.current.take(),
            Some(v) => self.current.replace(v),
        }
    }

    #[inline]
    pub fn peek(&self) -> Option<&T> {
        self.current.as_ref()
    }

    #[inline]
    pub fn must_peek(&self) -> &T {
        self.peek().unwrap()
    }

    #[inline]
    pub fn peek_mut(&mut self) -> Option<&mut T> {
        self.current.as_mut()
    }

    #[inline]
    pub fn must_peek_mut(&mut self) -> &mut T {
        self.peek_mut().unwrap()
    }
}

#[cfg(test)]
mod test {
    use super::*;

    #[test]
    fn test_stacked() {
        let mut s: Stacked<u32> = Stacked::new_empty();
        assert_eq!(s.peek(), None);
        assert_eq!(s.current, None);
        assert_eq!(s.stack, vec![]);

        s.push(37);
        assert_eq!(s.peek(), Some(&37));
        assert_eq!(s.current, Some(37));
        assert_eq!(s.stack, vec![]);

        s.push(42);
        assert_eq!(s.peek(), Some(&42));
        assert_eq!(s.current, Some(42));
        assert_eq!(s.stack, vec![37]);

        let v = s.pop().unwrap();
        assert_eq!(v, 42);
        assert_eq!(s.peek(), Some(&37));
        assert_eq!(s.current, Some(37));
        assert_eq!(s.stack, vec![]);

        let v = s.pop().unwrap();
        assert_eq!(v, 37);
        assert_eq!(s.peek(), None);
        assert_eq!(s.current, None);
        assert_eq!(s.stack, vec![]);
    }
}