13#if !defined(ULTRA_GP_INDIVIDUAL_EXON_VIEW_TCC)
14# error "Don't include this file directly, include the specific .h instead"
17#if !defined(ULTRA_GP_INDIVIDUAL_ITERATOR_TCC)
18#define ULTRA_GP_INDIVIDUAL_ITERATOR_TCC
34template<
bool is_const>
35class basic_exon_iterator
39 using iterator_concept = std::input_iterator_tag;
41 using iterator_category = std::input_iterator_tag;
43 using difference_type = std::ptrdiff_t;
44 using value_type = gene;
45 using pointer = value_type *;
46 using const_pointer =
const value_type *;
47 using reference = value_type &;
48 using const_reference =
const value_type &;
50 using ptr= std::conditional_t<is_const, const_pointer, pointer>;
51 using ref= std::conditional_t<is_const, const_reference, reference>;
52 using ind= std::conditional_t<is_const, const gp::individual, gp::individual>;
57 explicit basic_exon_iterator(ind &
id) : ind_(std::addressof(id))
60 loci_.insert(
id.start());
69 basic_exon_iterator &operator++()
73 const auto &g(
operator*());
78 loci_.erase(loci_.begin());
80 for (
const auto &a : g.args)
81 if (a.index() == d_address)
82 loci_.insert(g.locus_of_argument(a));
89 basic_exon_iterator operator++(
int)
91 const auto tmp(*
this);
103 [[nodiscard]]
bool operator==(std::default_sentinel_t)
const noexcept
105 return loci_.empty();
111 [[nodiscard]] ref &operator*()
const
113 return ind_->genome_(locus());
119 [[nodiscard]] ptr operator->()
const
125 [[nodiscard]] ultra::locus locus()
const
127 return *loci_.cbegin();
134 std::set<ultra::locus, std::greater<ultra::locus>> loci_ {};