use std::str::FromStr;
use std::vec::*;
#[derive(Debug, Clone)]
pub struct ReaderResultsRow<T>
where
T: FromStr + Clone,
{
pub num_fields: usize,
pub num_lines: usize,
pub results: Vec<T>,
}
#[derive(Debug, Clone)]
pub struct ReaderResultsCol<T>
where
T: FromStr + Clone,
{
pub num_fields: usize,
pub num_lines: usize,
pub results: Vec<T>,
}
pub trait ReaderResults<T>
where
T: FromStr + Clone,
{
fn get_num_fields(&self) -> usize;
fn get_num_lines(&self) -> usize;
fn get_results(&self) -> &Vec<T>;
fn get_mut_results(&mut self) -> &mut Vec<T>;
fn get_inner_lanes(&self, lane_index: usize) -> &[T];
fn get_mut_inner_lane(&mut self, lane_index: usize) -> &mut [T];
fn get_value(&self, row_index: usize, col_index: usize) -> T;
fn get_row(&self, row_index: usize) -> Vec<T>;
fn get_rows(&self, row_indices: Vec<usize>) -> Vec<Vec<T>>;
fn get_col(&self, col_index: usize) -> Vec<T>;
fn get_cols(&self, col_indices: Vec<usize>) -> Vec<Vec<T>>;
}
impl<T> ReaderResults<T> for ReaderResultsRow<T>
where
T: FromStr + Clone,
{
fn get_num_fields(&self) -> usize {
self.num_fields
}
fn get_num_lines(&self) -> usize {
self.num_lines
}
fn get_results(&self) -> &Vec<T> {
&self.results
}
fn get_mut_results(&mut self) -> &mut Vec<T> {
&mut self.results
}
fn get_inner_lanes(&self, lane_index: usize) -> &[T] {
assert!(lane_index < self.num_lines);
let start_index = lane_index * self.num_fields;
let end_index = start_index + self.num_fields;
&self.results[start_index .. end_index]
}
fn get_mut_inner_lane(&mut self, lane_index: usize) -> &mut [T] {
assert!(lane_index < self.num_lines);
let start_index = lane_index * self.num_fields;
let end_index = start_index + self.num_fields;
&mut self.results[start_index .. end_index]
}
fn get_value(&self, row_index: usize, col_index: usize) -> T {
assert!(row_index < self.num_lines);
assert!(col_index < self.num_fields);
self.results[row_index * self.num_fields + col_index].clone()
}
fn get_row(&self, row_index: usize) -> Vec<T> {
assert!(row_index < self.num_lines);
let out: Vec<T> = self
.results
.iter()
.skip(row_index * self.num_fields)
.take(self.num_fields)
.cloned()
.collect();
out
}
fn get_rows(&self, row_indices: Vec<usize>) -> Vec<Vec<T>> {
let mut out: Vec<Vec<T>> = Vec::new();
for index in row_indices.iter() {
out.push(self.get_row(*index));
}
out
}
fn get_col(&self, col_index: usize) -> Vec<T> {
assert!(col_index < self.num_fields);
let out: Vec<T> = self
.results
.iter()
.skip(col_index)
.step_by(self.num_fields)
.cloned()
.collect();
out
}
fn get_cols(&self, col_indices: Vec<usize>) -> Vec<Vec<T>> {
let mut out: Vec<Vec<T>> = Vec::new();
for index in col_indices.iter() {
out.push(self.get_col(*index));
}
out
}
}
impl<T> ReaderResults<T> for ReaderResultsCol<T>
where
T: FromStr + Clone,
{
fn get_num_fields(&self) -> usize {
self.num_fields
}
fn get_num_lines(&self) -> usize {
self.num_lines
}
fn get_results(&self) -> &Vec<T> {
&self.results
}
fn get_mut_results(&mut self) -> &mut Vec<T> {
&mut self.results
}
fn get_inner_lanes(&self, lane_index: usize) -> &[T] {
assert!(lane_index < self.num_fields);
let start_index = lane_index * self.num_lines;
let end_index = start_index + self.num_lines;
&self.results[start_index .. end_index]
}
fn get_mut_inner_lane(&mut self, lane_index: usize) -> &mut [T] {
assert!(lane_index < self.num_lines);
let start_index = lane_index * self.num_lines;
let end_index = start_index + self.num_lines;
&mut self.results[start_index .. end_index]
}
fn get_value(&self, row_index: usize, col_index: usize) -> T {
assert!(row_index < self.num_lines);
assert!(col_index < self.num_fields);
self.results[col_index * self.num_lines + row_index].clone()
}
fn get_row(&self, row_index: usize) -> Vec<T> {
assert!(row_index < self.num_lines);
let out: Vec<T> = self
.results
.iter()
.skip(row_index)
.step_by(self.num_lines)
.cloned()
.collect();
out
}
fn get_rows(&self, row_indices: Vec<usize>) -> Vec<Vec<T>> {
let mut out: Vec<Vec<T>> = Vec::new();
for index in row_indices.iter() {
out.push(self.get_row(*index));
}
out
}
fn get_col(&self, col_index: usize) -> Vec<T> {
assert!(col_index < self.num_fields);
let out: Vec<T> = self
.results
.iter()
.skip(col_index * self.num_lines)
.take(self.num_lines)
.cloned()
.collect();
out
}
fn get_cols(&self, col_indices: Vec<usize>) -> Vec<Vec<T>> {
let mut out: Vec<Vec<T>> = Vec::new();
for index in col_indices.iter() {
out.push(self.get_col(*index));
}
out
}
}
pub struct RawReaderResultsRows {
pub num_fields: usize,
pub num_lines: usize,
pub results: Vec<u8>,
pub index: Vec<usize>,
}
pub struct RawReaderResultsCols {
pub num_fields: usize,
pub num_lines: usize,
pub results: Vec<Vec<u8>>,
pub index: Vec<Vec<usize>>,
}
pub trait RawReaderParse {
fn new(field: usize, num_lines: usize) -> Self;
fn get_num_lines(&self) -> usize;
fn incr_num_lines(&mut self);
fn set_num_lines(&mut self, num_lines: usize);
fn set_results(&mut self, value: u8, field: usize);
fn set_index(&mut self, field: usize);
}
impl RawReaderParse for RawReaderResultsRows {
#[inline(always)]
fn new(field: usize, num_lines: usize) -> Self {
let mut rr =
RawReaderResultsRows {
num_fields: field,
num_lines: 0,
results: Vec::<u8>::new(),
index: Vec::<usize>::new(),
};
rr.results.reserve(num_lines * field);
rr.index.reserve(num_lines);
rr
}
#[inline(always)]
fn get_num_lines(&self) -> usize {
self.num_lines
}
#[inline(always)]
fn incr_num_lines(&mut self) {
self.num_lines += 1;
}
#[inline(always)]
fn set_num_lines(&mut self, num_lines: usize) {
self.num_lines = num_lines;
}
#[inline(always)]
fn set_results(&mut self, value: u8, _field: usize) {
self.results.push(value);
}
#[inline(always)]
fn set_index(&mut self, _field: usize) {
self.index.push(self.results.len());
}
}
impl RawReaderParse for RawReaderResultsCols {
#[inline(always)]
fn new(field: usize, num_lines: usize) -> Self {
let mut rr =
RawReaderResultsCols {
num_fields: field,
num_lines: 0,
results: Vec::<Vec<u8>>::new(),
index: Vec::<Vec<usize>>::new(),
};
for icol in 0..field {
rr.results.push(Vec::<u8>::new());
rr.results[icol].reserve(num_lines);
rr.index.push(Vec::<usize>::new());
rr.index[icol].reserve(num_lines);
}
rr
}
#[inline(always)]
fn get_num_lines(&self) -> usize {
self.num_lines
}
#[inline(always)]
fn incr_num_lines(&mut self) {
self.num_lines += 1;
}
#[inline(always)]
fn set_num_lines(&mut self, num_lines: usize) {
self.num_lines = num_lines;
}
#[inline(always)]
fn set_results(&mut self, value: u8, field: usize) {
assert!(field - 1 < self.num_fields);
self.results[field - 1].push(value);
}
#[inline(always)]
fn set_index(&mut self, field: usize) {
assert!(field - 1 < self.num_fields);
self.index[field - 1].push(self.results[field - 1].len());
}
}