fixed-queue 0.5.2

no_std, no_alloc, use [T; N]. support `Vec`/`VecDeque`/`History`
Documentation
use fixed_queue::VecDeque;

#[test]
fn test_base() {
    let mut vec: VecDeque<usize, 3> = VecDeque::new();
    assert_eq!(vec.capacity(), 3);
    assert!(vec.is_empty());

    assert!(vec.push_back(2).is_ok());
    assert_eq!(vec[0], 2);
    assert!(vec.push_front(1).is_ok());
    assert_eq!(vec[0], 1);
    assert_eq!(vec[1], 2);
    assert!(vec.push_back(3).is_ok());
    assert_eq!(vec[2], 3);
    assert!(vec.push_back(4).is_err());
    assert_eq!(vec.pop_back().unwrap(), 3);
    assert!(vec.push_back(5).is_ok());
    assert_eq!(vec.pop_back().unwrap(), 5);
    assert_eq!(vec.pop_back().unwrap(), 2);
    assert_eq!(vec.pop_back().unwrap(), 1);
    assert!(vec.pop_back().is_none());
    assert!(vec.push_front(6).is_ok());
    assert_eq!(vec[0], 6);
}

#[test]
fn test_drop() {
    use on_drop::OnDrop;

    let mut vec: VecDeque<_, 3> = VecDeque::new();
    let (item, token) = OnDrop::token(1);
    assert!(vec.push_front(item).is_ok());
    drop(vec);
    assert!(token.is_droped());
}

#[test]
fn clear_with_panicking_drop_is_sound() {
    use std::panic::{self, AssertUnwindSafe};
    struct P(bool);
    impl Drop for P {
        fn drop(&mut self) { if self.0 { panic!("boom"); } }
    }
    let mut q: fixed_queue::VecDeque<P, 8> = fixed_queue::VecDeque::new();
    q.push_back(P(false)).ok();
    q.push_back(P(true)).ok();   // 이 원소의 drop이 panic
    q.push_back(P(false)).ok();
    let r = panic::catch_unwind(AssertUnwindSafe(|| { q.clear(); }));
    assert!(r.is_err());
    // 수정 전: 여기서 q가 drop되며 double-free (ASAN). 수정 후: 정상.
    drop(q);
}