1 #ifndef GENESIS_POPULATION_WINDOW_INTERVAL_WINDOW_STREAM_H_
2 #define GENESIS_POPULATION_WINDOW_INTERVAL_WINDOW_STREAM_H_
43 #include <type_traits>
47 namespace population {
73 template<
class InputStreamIterator,
class DataType =
typename InputStreamIterator::value_type>
87 using InputType =
typename InputStreamIterator::value_type;
120 using InputType =
typename InputStreamIterator::value_type;
147 if( parent_->width_ == 0 ) {
148 throw std::runtime_error(
"Cannot use IntervalWindowStream of width 0." );
150 if( parent_->stride_ == 0 ) {
151 parent_->stride_ = parent_->width_;
153 if( parent_->stride_ > parent_->width_ ) {
154 throw std::runtime_error(
155 "Cannot use IntervalWindowStream with stride > width."
187 void init_chromosome_()
194 if( base_iterator_type::current_ == base_iterator_type::end_ ) {
202 base_iterator_type::is_first_window_ =
true;
203 base_iterator_type::is_last_window_ =
false;
206 if( parent_->emit_leading_empty_windows_ ) {
212 current_start_ = pos - (( pos - 1 ) % parent_->stride_ );
216 void increment_() override final
225 if( base_iterator_type::current_ == base_iterator_type::end_ ) {
229 if( ! base_iterator_type::is_last_window_ ) {
230 throw std::runtime_error(
231 "IntervalWindowStream: Incrementing past the end"
247 current_start_ += parent_->stride_;
248 base_iterator_type::is_first_window_ =
false;
265 window_.
entries().size() > 0 &&
266 window_.
entries().back().position < current_start_
271 window_.
entries().size() > 0 &&
272 window_.
entries().front().position < current_start_
279 while( base_iterator_type::current_ != base_iterator_type::end_ ) {
280 auto const cur_pos = parent_->
position_function( *base_iterator_type::current_ );
286 *base_iterator_type::current_
288 cur_pos >= current_start_ + parent_->width_
296 assert( cur_pos >= current_start_ );
297 assert( cur_pos < current_start_ + parent_->width_ );
302 window_.
size() > 0 &&
303 window_.
entries().back().position >= cur_pos
305 throw std::runtime_error(
306 "Invalid entry in sliding window that not in sequence with other entries. "
307 "Previous entry is " + window_.
chromosome() +
":" +
309 ", current (invalid) entry is " + window_.
chromosome() +
":" +
315 window_.
entries().emplace_back(
321 ++base_iterator_type::current_;
327 base_iterator_type::current_ == base_iterator_type::end_ ||
330 base_iterator_type::is_last_window_ =
true;
335 window_.
last_position( current_start_ + parent_->width_ - 1 );
338 value_type& get_current_window_() const override final
343 BaseWindowStream<InputStreamIterator, DataType>
const* get_parent_() const override final
355 size_t current_start_ = 1;
356 size_t next_index_ = 0;
369 InputStreamIterator
begin, InputStreamIterator
end,
438 emit_leading_empty_windows_ = value;
444 return emit_leading_empty_windows_;
453 std::unique_ptr<typename BaseWindowStream<InputStreamIterator, DataType>::BaseIterator>
462 std::unique_ptr<typename BaseWindowStream<InputStreamIterator, DataType>::BaseIterator>
477 mutable size_t stride_ = 0;
479 bool emit_leading_empty_windows_ =
false;
499 template<
class InputStreamIterator,
class DataType =
typename InputStreamIterator::value_type>
500 IntervalWindowStream<InputStreamIterator, DataType>
502 InputStreamIterator begin, InputStreamIterator end,
size_t width = 0,
size_t stride = 0
520 template<
class InputStreamIterator>
521 IntervalWindowStream<InputStreamIterator>
523 InputStreamIterator begin, InputStreamIterator end,
size_t width = 0,
size_t stride = 0
525 using DataType =
typename InputStreamIterator::value_type;
529 it.entry_input_function = []( DataType
const& variant ) {
532 it.chromosome_function = []( DataType
const& variant ) {
533 return variant.chromosome;
535 it.position_function = []( DataType
const& variant ) {
536 return variant.position;
556 template<
class InputStreamIterator>
557 WindowViewStream<InputStreamIterator>
559 InputStreamIterator begin, InputStreamIterator end,
size_t width = 0,
size_t stride = 0
569 #endif // include guard