basic_dsp_vector/vector_types/real/
real_to_complex.rs1use super::super::{
2 Buffer, Domain, DspVec, ErrorReason, InsertZerosOps, InsertZerosOpsBuffered, MetaData,
3 RealNumberSpace, RededicateForceOps, ToComplexResult, ToSliceMut, TransRes,
4};
5use crate::numbers::*;
6
7pub trait RealToComplexTransformsOps<T>: ToComplexResult
13where
14 T: RealNumber,
15{
16 fn to_complex(self) -> TransRes<Self::ComplexResult>;
28}
29
30pub trait RealToComplexTransformsOpsBuffered<S, T>: ToComplexResult
36where
37 S: ToSliceMut<T>,
38 T: RealNumber,
39{
40 fn to_complex_b<B>(self, buffer: &mut B) -> Self::ComplexResult
54 where
55 B: for<'a> Buffer<'a, S, T>;
56}
57
58impl<S, T, N, D> RealToComplexTransformsOps<T> for DspVec<S, T, N, D>
59where
60 DspVec<S, T, N, D>: ToComplexResult + InsertZerosOps<T>,
61 <DspVec<S, T, N, D> as ToComplexResult>::ComplexResult: RededicateForceOps<DspVec<S, T, N, D>>,
62 S: ToSliceMut<T>,
63 T: RealNumber,
64 N: RealNumberSpace,
65 D: Domain,
66{
67 fn to_complex(mut self) -> TransRes<Self::ComplexResult> {
68 if self.is_complex() {
69 self.number_space.to_complex();
70 return Err((
71 ErrorReason::InputMustBeReal,
72 Self::ComplexResult::rededicate_from_force(self),
73 ));
74 }
75
76 let result = self.zero_interleave(2);
77 let domain = self.domain();
78 match result {
79 Err(reason) => Err((
80 reason,
81 Self::ComplexResult::rededicate_with_runtime_data(self, true, domain),
82 )),
83 Ok(()) => Ok(Self::ComplexResult::rededicate_with_runtime_data(
84 self, true, domain,
85 )),
86 }
87 }
88}
89
90impl<S, T, N, D> RealToComplexTransformsOpsBuffered<S, T> for DspVec<S, T, N, D>
91where
92 DspVec<S, T, N, D>: ToComplexResult + InsertZerosOpsBuffered<S, T>,
93 <DspVec<S, T, N, D> as ToComplexResult>::ComplexResult: RededicateForceOps<DspVec<S, T, N, D>>,
94 S: ToSliceMut<T>,
95 T: RealNumber,
96 N: RealNumberSpace,
97 D: Domain,
98{
99 fn to_complex_b<B>(mut self, buffer: &mut B) -> Self::ComplexResult
100 where
101 B: for<'a> Buffer<'a, S, T>,
102 {
103 if self.is_complex() {
104 self.number_space.to_complex();
105 self.mark_vector_as_invalid();
106 return Self::ComplexResult::rededicate_from_force(self);
107 }
108 self.zero_interleave_b(buffer, 2);
109 self.number_space.to_complex();
110 Self::ComplexResult::rededicate_from_force(self)
111 }
112}