dataloader-rs 0.3.0

High-performance DataLoader for Rust with a PyTorch-like interface
Documentation
use crate::{collator::default_collator::DefaultCollate, error::Result};

macro_rules! tuple_impl {
    ($($name:ident),+ ; $($idx:tt),+) => {
        impl<$($name),+> DefaultCollate for ($($name,)+)
        where
            $($name: DefaultCollate),+
        {
            type Batch = ($($name::Batch,)+);

            fn collate_items(items: Vec<Self>) -> Result<Self::Batch> {
                let mut cols: ($(Vec<$name>,)+) = (
                    $(Vec::<$name>::with_capacity(items.len()),)+
                );

                for item in items {
                    $(
                        cols.$idx.push(item.$idx);
                    )+
                }

                Ok((
                    $($name::collate_items(cols.$idx)?,)+
                ))
            }
        }
    };
}

tuple_impl!(A ; 0);
tuple_impl!(A, B ; 0, 1);
tuple_impl!(A, B, C ; 0, 1, 2);
tuple_impl!(A, B, C, D ; 0, 1, 2, 3);
tuple_impl!(A, B, C, D, E ; 0, 1, 2, 3, 4);
tuple_impl!(A, B, C, D, E, F ; 0, 1, 2, 3, 4, 5);