cifar_10_loader 0.2.0

Crate of loading cifar10
Documentation
extern crate image;
extern crate itertools;
extern crate walkdir;

pub(crate) trait CifarImageTrait {
    fn new(bytes: &[u8]) -> Result<super::image_pub::CifarImage, ::std::io::Error>;
}

impl CifarImageTrait for super::image_pub::CifarImage {
    fn new(bytes: &[u8]) -> Result<Self, ::std::io::Error> {
        use std::io::Read;
        use std::mem;
        use self::image::GenericImage;
        use self::itertools::multizip;
        use self::itertools::Itertools;
        let bytes: &mut &[u8] = &mut bytes.as_ref();
        let label: u8 = unsafe {
            let label: &mut [u8; 1] = &mut mem::uninitialized();
            bytes.read_exact(label)?;
            *label.get_unchecked(0)
        };
        let img = unsafe {
            let mut img = image::DynamicImage::new_rgb8(32, 32);
            let red: &mut [u8; 1024] = &mut mem::uninitialized();
            let green: &mut [u8; 1024] = &mut mem::uninitialized();
            let blue: &mut [u8; 1024] = &mut mem::uninitialized();
            bytes.read_exact(red)?;
            bytes.read_exact(green)?;
            bytes.read_exact(blue)?;
            multizip((
                (0..32).cartesian_product(0..32),
                red.iter(),
                green.iter(),
                blue.iter(),
            )).for_each(|((y, x), r, g, b)| {
                let mut pixel: image::Rgba<u8> = mem::uninitialized();
                pixel.data = [*r, *g, *b, 255];
                img.unsafe_put_pixel(x, y, pixel);
            });
            img
        };
        Ok(super::image_pub::CifarImage {
            label: label,
            image: img,
        })
    }
}