ruPRIM 0.1.8

Parallel primitives, reductions, scans, and indexing for Ruda.
Documentation
use ruda_kernel::dsl as kernel_dsl;
use crate::reduce::{
    ReducePrecision,
    components::{
        instructions::Item,
        readers::{Reader, ReaderExpand},
    },
};
use ruda_kernel::dsl::prelude::*;

#[derive(RudaType)]
pub struct RudaReader<P: ReducePrecision> {
    reader: Reader<P>,
}

#[ruda]
#[allow(clippy::len_without_is_empty)]
impl<P: ReducePrecision> RudaReader<P> {
    pub fn new(reader: Reader<P>) -> RudaReader<P> {
        RudaReader::<P> { reader }
    }

    pub fn read(&self, vector_index: usize) -> Item<P> {
        match &self.reader {
            Reader::Parallel(reader) => reader.read_ruda(vector_index),
            Reader::Perpendicular(reader) => reader.read_ruda(vector_index),
        }
    }

    pub fn length(&self) -> usize {
        match &self.reader {
            Reader::Parallel(reader) => reader.length_ruda(),
            Reader::Perpendicular(reader) => reader.length_ruda(),
        }
    }
}