27 #include <boost/operators.hpp>
29 #include <boost/range.hpp>
31 #include <boost/assert.hpp>
34 #define WAVEFORM_USE_CBEGIN_CEND 1
64 template <
typename Iterator1,
typename Iterator2>
71 template <
typename RandomAccessRange1,
typename RandomAccessRange2>
117 template<
typename TimeContainer
118 ,
typename FreqContainer = TimeContainer
119 ,
typename TransformT = PlaceholderTransformClass
135 typedef typename TimeContainer::value_type
TimeT;
138 typedef typename FreqContainer::value_type
FreqT;
170 enum DomainSpecifier {TimeDomain, FreqDomain, EitherDomain};
175 DomainSpecifier validDomain_;
178 TimeContainer timeSeries_;
181 FreqContainer freqSpectrum_;
184 TransformT transform_;
207 : validDomain_(EitherDomain)
209 , freqSpectrum_(count)
210 , transform_(timeSeries_, freqSpectrum_)
212 if (timeSeries_.size()%2)
213 throw std::length_error(
"Waveform: The array length was not a multiple of 2!");
219 : validDomain_(toCopy.validDomain_)
220 , timeSeries_(toCopy.timeSeries_)
221 , freqSpectrum_(toCopy.freqSpectrum_)
222 , transform_(timeSeries_, freqSpectrum_)
224 if (timeSeries_.size()%2)
225 throw std::length_error(
"Waveform: The array length was not a multiple of 2!");
231 : validDomain_(TimeDomain)
232 , timeSeries_(toCopy)
233 , freqSpectrum_(timeSeries_.
size()/2 + 1)
234 , transform_(timeSeries_, freqSpectrum_)
236 if (timeSeries_.size()%2)
237 throw std::length_error(
"Waveform: The array length was not a multiple of 2!");
242 : validDomain_(FreqDomain)
243 , timeSeries_((toCopy.
size() - 1) * 2)
244 , freqSpectrum_(toCopy)
245 , transform_(timeSeries_, freqSpectrum_)
247 if (timeSeries_.size()%2)
248 throw std::length_error(
"Waveform: The array length was not a multiple of 2!");
452 if (toValidate == validDomain_ || validDomain_ == EitherDomain) {
455 else if (toValidate == TimeDomain) {
456 transform_.exec_inverse_transform();
458 else if (toValidate == FreqDomain) {
459 transform_.exec_transform();
461 else if (toValidate == EitherDomain) {
462 if (validDomain_ == TimeDomain) {
463 transform_.exec_transform();
466 transform_.exec_inverse_transform();
470 validDomain_ = toValidate;
504 swap(first.validDomain_, second.validDomain_);
506 swap(first.timeSeries_, second.timeSeries_);
508 swap(first.freqSpectrum_, second.freqSpectrum_);
510 swap(first.transform_, second.transform_);
566 template <
typename ...Args1,
typename ...Args2>
568 operator==(
const Waveform<Args1...>& lhs,
const Waveform<Args2...>& rhs)
577 return lhs.GetTimeSeries() == rhs.GetTimeSeries() && lhs.GetFreqSpectrum() == rhs.GetFreqSpectrum();
580 template <
typename ...Args1,
typename ...Args2>
582 operator!=(
const Waveform<Args1...>& lhs,
const Waveform<Args2...>& rhs)
584 return !(lhs == rhs);