use super::super::meta;
use super::{
ComplexFreqVec, ComplexTimeVec, DataDomain, Domain, DspVec, GenDspVec, NumberSpace,
RealFreqVec, RealTimeVec, ToSlice, TypeMetaData,
};
use crate::multicore_support::MultiCoreSettings;
use crate::numbers::*;
use std::convert::From;
pub trait ToDspVector<T>: Sized + ToSlice<T>
where
T: RealNumber,
{
fn to_gen_dsp_vec(self, is_complex: bool, domain: DataDomain) -> GenDspVec<Self, T>;
fn to_dsp_vec<N, D>(self, meta_data: &TypeMetaData<T, N, D>) -> DspVec<Self, T, N, D>
where
N: NumberSpace,
D: Domain;
}
pub trait ToRealVector<T>: Sized + ToSlice<T>
where
T: RealNumber,
{
fn to_real_time_vec(self) -> RealTimeVec<Self, T>;
fn to_real_freq_vec(self) -> RealFreqVec<Self, T>;
}
pub trait ToComplexVector<S, T>
where
S: Sized + ToSlice<T>,
T: RealNumber,
{
fn to_complex_time_vec(self) -> ComplexTimeVec<S, T>;
fn to_complex_freq_vec(self) -> ComplexFreqVec<S, T>;
}
pub trait FromVector<T>
where
T: RealNumber,
{
type Output;
fn get(self) -> (Self::Output, usize);
fn to_slice(&self) -> &[T];
}
impl<S, T, N, D> FromVector<T> for DspVec<S, T, N, D>
where
S: ToSlice<T>,
T: RealNumber,
N: NumberSpace,
D: Domain,
{
type Output = S;
fn get(self) -> (Self::Output, usize) {
let len = self.valid_len;
(self.data, len)
}
fn to_slice(&self) -> &[T] {
let len = self.valid_len;
let slice = self.data.to_slice();
&slice[0..len]
}
}
impl<S, T> From<S> for RealTimeVec<S, T>
where
S: ToSlice<T>,
T: RealNumber,
{
fn from(mut data: S) -> Self {
let len = data.len();
let alloc = data.alloc_len();
data.try_resize(alloc)
.expect("Expanding to alloc_len should always work");
RealTimeVec {
data,
delta: T::one(),
domain: meta::Time,
number_space: meta::Real,
valid_len: len,
multicore_settings: MultiCoreSettings::default(),
}
}
}
impl<S, T> From<S> for ComplexTimeVec<S, T>
where
S: ToSlice<T>,
T: RealNumber,
{
fn from(mut data: S) -> Self {
let len = data.len();
let alloc = data.alloc_len();
data.try_resize(alloc)
.expect("Expanding to alloc_len should always work");
ComplexTimeVec {
data,
delta: T::one(),
domain: meta::Time,
number_space: meta::Complex,
valid_len: len,
multicore_settings: MultiCoreSettings::default(),
}
}
}
impl<S, T> From<S> for RealFreqVec<S, T>
where
S: ToSlice<T>,
T: RealNumber,
{
fn from(mut data: S) -> Self {
let len = data.len();
let alloc = data.alloc_len();
data.try_resize(alloc)
.expect("Expanding to alloc_len should always work");
RealFreqVec {
data,
delta: T::one(),
domain: meta::Freq,
number_space: meta::Real,
valid_len: len,
multicore_settings: MultiCoreSettings::default(),
}
}
}
impl<S, T> From<S> for ComplexFreqVec<S, T>
where
S: ToSlice<T>,
T: RealNumber,
{
fn from(mut data: S) -> Self {
let len = data.len();
let alloc = data.alloc_len();
data.try_resize(alloc)
.expect("Expanding to alloc_len should always work");
ComplexFreqVec {
data,
delta: T::one(),
domain: meta::Freq,
number_space: meta::Complex,
valid_len: len,
multicore_settings: MultiCoreSettings::default(),
}
}
}
impl<S, T, N, D> Clone for DspVec<S, T, N, D>
where
S: ToSlice<T> + Clone,
T: RealNumber,
N: NumberSpace + Clone,
D: Domain + Clone,
{
fn clone(&self) -> Self {
DspVec {
data: self.data.clone(),
delta: self.delta,
domain: self.domain.clone(),
number_space: self.number_space.clone(),
valid_len: self.valid_len,
multicore_settings: self.multicore_settings,
}
}
fn clone_from(&mut self, source: &Self) {
self.data = source.data.clone();
self.delta = source.delta;
self.domain = source.domain.clone();
self.number_space = source.number_space.clone();
self.valid_len = source.valid_len;
self.multicore_settings = source.multicore_settings;
}
}