struct CCVD<T> {
    inner: std::collections::VecDeque<T>
}
impl<T> CCVD<T> {
    pub const fn new () -> Self {
        Self {inner: std::collections::VecDeque::new()}
    }
}

impl<T> cc_traits::Collection for CCVD<T> {
    type Item = T;
}
impl<T> cc_traits::PopBack for CCVD<T> {
    #[inline(always)]
    fn pop_back(&mut self) -> Option<Self::Item> {
        self.inner.pop_back()
    }
}
impl<T> cc_traits::PopFront for CCVD<T> {
    #[inline(always)]
    fn pop_front(&mut self) -> Option<Self::Item> {
        self.inner.pop_front()
    }
}
impl<T> cc_traits::PushBack for CCVD<T> {
    type Output = ();
    #[inline(always)]
    fn push_back(&mut self, element: Self::Item) -> Self::Output {
        self.inner.push_back(element)
    }
}

#[test]
fn test_sub () {
    use crate::sub;
    let (result, overflow): (Vec<u8>, bool) = sub!(
        [0u8, 0, 0, 0, 0, 0], 
        [255u8, 255, 255], 
        CCVD::<u8>::new(), 
        u8
    );
    println!("Result: {:?}, Overflow: {}.", result, overflow);
}
