24 #include "cheetah/data/TimeFrequencyContainer.h" 25 #include "panda/MultiIterator.h" 33 template<
class TimeFrequencyType>
34 class TimeFrequencySampleIterator {
35 typedef typename TimeFrequencyType::ConstSpectra IteratorType;
38 TimeFrequencySampleIterator()
43 TimeFrequencySampleIterator(TimeFrequencyType& tf)
44 : _sample_number(tf.number_of_spectra())
45 , _it(new IteratorType(tf.spectrum(_sample_number)))
49 TimeFrequencySampleIterator(TimeFrequencyType& tf, std::size_t sample_number)
50 : _tf(tf.shared_from_this())
51 , _sample_number(sample_number)
52 , _it(new IteratorType(tf.spectrum(sample_number)))
57 bool operator==(TimeFrequencySampleIterator
const& o)
const 60 return _sample_number == o._sample_number;
63 return o._sample_number == o._tf->number_of_spectra();
66 return _sample_number == _tf->number_of_spectra();
71 bool operator!=(TimeFrequencySampleIterator
const& o)
const 76 typename TimeFrequencyType::ConstSpectra& operator*()
const 81 TimeFrequencySampleIterator& operator++()
83 *_it = this->_tf->spectrum(++this->_sample_number);
87 TimeFrequencySampleIterator operator++(
int)
89 TimeFrequencySampleIterator tmp(*
this);
95 std::shared_ptr<TimeFrequencyType> _tf;
96 std::size_t _sample_number;
97 mutable typename std::shared_ptr<IteratorType> _it;
100 template<
typename T,
typename TimeFrequencyType,
class ChannelIterationEndHandler,
class TimeDiscontinuityHandler>
101 struct MultiIteratorDepthTraitsImpl : panda::DefaultIteratorDepthTraits<T>
105 template<
typename TimeFrequencyType,
class ChannelIterationEndHandler,
class TimeDiscontinuityHandler>
106 struct MultiIteratorDepthTraitsImpl<typename TimeFrequencyType::ConstSpectra::const_iterator, TimeFrequencyType, ChannelIterationEndHandler, TimeDiscontinuityHandler>
107 :
public panda::IteratorDepthTraits<typename TimeFrequencyType::ConstSpectra::const_iterator, ChannelIterationEndHandler>
109 typedef panda::IteratorDepthTraits<typename TimeFrequencyType::ConstSpectra::const_iterator, ChannelIterationEndHandler> BaseT;
110 MultiIteratorDepthTraitsImpl()
115 template<
typename TimeFrequencyType,
class ChannelIterationEndHandler,
class TimeDiscontinuityHandler>
116 struct MultiIteratorDepthTraitsImpl<typename TimeFrequencyType::ConstSpectra, TimeFrequencyType, ChannelIterationEndHandler, TimeDiscontinuityHandler>
117 :
public panda::IteratorDepthTraits<typename TimeFrequencyType::ConstSpectra, ChannelIterationEndHandler>
119 typedef panda::IteratorDepthTraits<typename TimeFrequencyType::ConstSpectra, ChannelIterationEndHandler> BaseT;
120 MultiIteratorDepthTraitsImpl(ChannelIterationEndHandler ch_handler)
121 : BaseT(ch_handler) {}
127 template<
typename TimeFrequencyType,
class ChannelIterationEndHandler,
class TimeDiscontinuityHandler>
128 struct MultiIteratorDepthTraitsImpl<const
std::shared_ptr<TimeFrequencyType>, TimeFrequencyType, ChannelIterationEndHandler, TimeDiscontinuityHandler>
129 :
public panda::IteratorDepthTraits<const std::shared_ptr<TimeFrequencyType>>
131 typedef TimeFrequencySampleIterator<const TimeFrequencyType> Iterator;
133 MultiIteratorDepthTraitsImpl(TimeDiscontinuityHandler td_handler)
134 : _td_handler(td_handler)
135 , _expected_time(TimeFrequencyType::TimePointType::min())
136 , _last_interval(0.0 *
boost::units::si::seconds)
140 Iterator begin(TimeFrequencyType
const& tf)
143 auto const& interval = tf.sample_interval();
144 if(((tf.start_time() - _expected_time) >= 0.5 * interval) || interval != _last_interval)
146 _td_handler(tf.start_time(), tf.sample_interval());
148 _expected_time = tf.end_time() + interval;
149 _last_interval = interval;
150 return Iterator(tf, 0);
153 Iterator begin(std::shared_ptr<TimeFrequencyType>
const& tf)
155 if(tf)
return begin(*tf);
156 throw panda::Error(
"shared_ptr not initialised");
159 Iterator end(TimeFrequencyType
const& tf)
164 Iterator end(std::shared_ptr<TimeFrequencyType>
const& tf)
170 TimeDiscontinuityHandler _td_handler;
171 typename TimeFrequencyType::TimePointType _expected_time;
172 typedef typename TimeFrequencyType::TimePointType::rep Rep;
173 typename TimeFrequencyType::TimeType _last_interval;
176 template<
typename TimeFrequencyType,
class ChannelIterationEndHandler,
class TimeDiscontinuityHandler>
177 struct MultiIteratorDepthTraits
179 template <
typename T>
using DepthTraits = MultiIteratorDepthTraitsImpl<T, TimeFrequencyType, ChannelIterationEndHandler, TimeDiscontinuityHandler>;
184 template <
class Arch,
typename NumericalT>
189 template <
class Arch,
typename NumericalT>
190 template <
class ChannelIterationEndHandler,
class TimeDiscontinuityHandler>
192 :
public panda::MultiIterator<panda::MultiIteratorTraits
193 < const decltype(TimeFrequencyContainer<Arch, NumericalT>::_data)
194 , decltype(TimeFrequencyContainer<Arch, NumericalT>::_data.cbegin())
195 , MultiIteratorDepthTraits
196 <typename TimeFrequencyContainer<Arch, NumericalT>::TimeFrequencyType
197 , ChannelIterationEndHandler
198 , TimeDiscontinuityHandler
199 >::template DepthTraits
204 typedef panda::MultiIterator<panda::MultiIteratorTraits
205 <
const ContainerType
207 , MultiIteratorDepthTraits
209 , ChannelIterationEndHandler
210 , TimeDiscontinuityHandler
211 >::template DepthTraits
216 : BaseT(ts._data.begin(), ts._data.end()
217 , MultiIteratorDepthTraitsImpl<typename TimeFrequencyType::ConstSpectra, TimeFrequencyType, ChannelIterationEndHandler, TimeDiscontinuityHandler>(ch_handler)
218 , MultiIteratorDepthTraitsImpl<
const std::shared_ptr<TimeFrequencyType>,
TimeFrequencyType, ChannelIterationEndHandler, TimeDiscontinuityHandler>(td_handler))
224 : BaseT(ts._data.begin(), ts._data.end()
225 , MultiIteratorDepthTraitsImpl<typename TimeFrequencyType::ConstSpectra, TimeFrequencyType, ChannelIterationEndHandler, TimeDiscontinuityHandler>(ChannelIterationEndHandler())
226 , MultiIteratorDepthTraitsImpl<
const std::shared_ptr<TimeFrequencyType>,
TimeFrequencyType, ChannelIterationEndHandler, TimeDiscontinuityHandler>(TimeDiscontinuityHandler()))
230 template<
class ChannelEndHandler,
class TimeDiscoHandler>
233 return BaseT::operator==(o);
243 return !BaseT::end();
246 template<
class ChannelEndHandler,
class TimeDiscoHandler>
249 return BaseT::operator!=(o);
253 template <
class Arch,
typename NumericalT>
258 template <
class Arch,
typename NumericalT>
263 template <
class Arch,
typename NumericalT>
267 _number_of_spectra = 0;
270 template <
class Arch,
typename NumericalT>
273 return _data.empty();
276 template <
class Arch,
typename NumericalT>
280 if(data->number_of_channels() != number_of_channels()) {
281 panda::Error e(
"expecting ");
282 e << number_of_channels() <<
" channels, got " << data->number_of_channels();
286 _number_of_spectra += data->number_of_spectra();
287 _data.push_back(data);
290 template <
class Arch,
typename NumericalT>
293 this->add(data.shared_from_this());
296 template <
class Arch,
typename NumericalT>
299 return _data[0]->number_of_channels();
302 template <
class Arch,
typename NumericalT>
305 return _number_of_spectra;
308 template <
class Arch,
typename NumericalT>
311 return _data[0]->start_time();
314 template <
class Arch,
typename NumericalT>
317 return _data[0]->sample_interval();
320 template <
class Arch,
typename NumericalT>
323 return _data[0]->channel_frequencies();
326 template<
class Arch,
typename NumericalT>
327 template<
class ChannelIterationEndHandler,
class TimeDiscontinuityHandler>
342 template<
class Arch,
typename NumericalT>
TimeType sample_interval() const
bool empty() const
return true if there is no data
void clear()
clear all data
std::size_t number_of_channels() const
Provides the TimeFrequency API over a set of TimeFrequency objects.
std::size_t number_of_spectra() const
Some limits and constants for FLDO.
ConstEndChannelIterator end() const
return the end iterator
TimePointType const & start_time() const
void add(TimeFrequencyType &data)
add data to the collection
ConstChannelIterator< ChannelIterationEndHandler, TimeDiscontinuityHandler > begin(ChannelIterationEndHandler, TimeDiscontinuityHandler) const
std::vector< FrequencyType > const & channel_frequencies() const