linux-input 0.1.0

Rust bindings to Linux's input subsystems
Documentation
use {
    std::{
        borrow::{
            Cow
        },
        iter::{
            FusedIterator
        },
        marker::{
            PhantomData
        }
    }
};

pub(crate) struct EventBitsIter< 'a, T > {
    buffer: Cow< 'a, [u8] >,
    index: usize,
    bit: usize,
    byte: u8,
    phantom: PhantomData< T >
}

impl< 'a, T > EventBitsIter< 'a, T > {
    pub(crate) fn new( buffer: Cow< 'a, [u8] > ) -> Self {
        let byte = buffer.first().cloned().unwrap_or( 0 );
        EventBitsIter {
            buffer,
            index: 0,
            bit: 0,
            byte,
            phantom: PhantomData
        }
    }
}

impl< 'a, T > Iterator for EventBitsIter< 'a, T > where T: From< u16 > {
    type Item = T;
    fn next( &mut self ) -> Option< Self::Item > {
        while self.byte == 0 {
            if self.index + 1 >= self.buffer.len() {
                return None;
            }

            self.index += 1;
            self.byte = self.buffer[ self.index ];
            self.bit = 0;
        }

        while self.byte & 1 == 0 {
            self.byte >>= 1;
            self.bit += 1;
        }

        let output = self.index * 8 + self.bit;
        self.byte >>= 1;
        self.bit += 1;

        Some( (output as u16).into() )
    }
}

impl< 'a, T > FusedIterator for EventBitsIter< 'a, T > where T: From< u16 > {}

#[test]
fn test_event_bits_iter_empty() {
    let mut iter = EventBitsIter::< u16 >::new( &[] );
    assert_eq!( iter.next(), None );
}

#[test]
fn test_event_bits_iter_single_element_empty() {
    let mut iter = EventBitsIter::< u16 >::new( &[0] );
    assert_eq!( iter.next(), None );
}

#[test]
fn test_event_bits_iter_multiple_elements_empty() {
    let mut iter = EventBitsIter::< u16 >::new( &[0, 0, 0, 0] );
    assert_eq!( iter.next(), None );
}

#[test]
fn test_event_bits_iter_single_element_first_bit() {
    let mut iter = EventBitsIter::< u16 >::new( &[0b0000_0001] );
    assert_eq!( iter.next(), Some( 0 ) );
    assert_eq!( iter.next(), None );
}

#[test]
fn test_event_bits_iter_single_element_last_bit() {
    let mut iter = EventBitsIter::< u16 >::new( &[0b1000_0000] );
    assert_eq!( iter.next(), Some( 7 ) );
    assert_eq!( iter.next(), None );
}

#[test]
fn test_event_bits_iter_single_element_multiple_bits() {
    let mut iter = EventBitsIter::< u16 >::new( &[0b1000_0001] );
    assert_eq!( iter.next(), Some( 0 ) );
    assert_eq!( iter.next(), Some( 7 ) );
    assert_eq!( iter.next(), None );
}

#[test]
fn test_event_bits_iter_single_element_multiple_elements() {
    let mut iter = EventBitsIter::< u16 >::new( &[0, 0b1000_0001, 0] );
    assert_eq!( iter.next(), Some( 8 ) );
    assert_eq!( iter.next(), Some( 15 ) );
    assert_eq!( iter.next(), None );
}