1 #ifndef theplu_yat_omic_bam_pair_iterator2 2 #define theplu_yat_omic_bam_pair_iterator2 29 #include "yat/utility/yat_assert.h" 31 #include <boost/concept/assert.hpp> 32 #include <boost/iterator/iterator_concepts.hpp> 33 #include <boost/iterator/iterator_facade.hpp> 65 template<
typename Base>
67 :
public boost::iterator_facade<
68 BamPairIterator2<Base>, const BamPair, std::input_iterator_tag,
86 #ifndef YAT_HAVE_BOOST_ITERATOR_FACADE_PROXY_PTR 93 typename BamPairIterator2::pointer
operator->(
void)
const 106 dummie_.
first() = first_->first;
107 dummie_.
second() = second_->second;
117 typedef std::pair<int32_t, int32_t> Position;
119 typedef std::multimap<Position, BamRead> MultiMap;
120 std::shared_ptr<MultiMap> reads_;
121 MultiMap::iterator first_;
122 MultiMap::iterator second_;
123 friend class boost::iterator_core_access;
125 void assign_pair(
void);
129 std::multimap<Position, BamRead>::iterator
131 void increment(
void);
142 template<
typename Base>
153 template<
typename Base>
161 template<
typename Base>
163 : iter_(base), end_(end),
165 first_(reads_->end()), second_(reads_->end())
167 BOOST_CONCEPT_ASSERT((boost_concepts::ReadableIterator<Base>));
168 BOOST_CONCEPT_ASSERT((boost_concepts::SinglePassIterator<Base>));
169 using boost::Convertible;
170 typedef typename std::iterator_traits<Base>::value_type value_type;
171 BOOST_CONCEPT_ASSERT((Convertible<value_type, BamRead>));
176 template<
typename Base>
179 BOOST_CONCEPT_ASSERT((boost::InputIterator<Base>));
180 using boost::Convertible;
181 typedef typename std::iterator_traits<Base>::value_type value_type;
182 BOOST_CONCEPT_ASSERT((Convertible<value_type, BamRead>));
186 template<
typename Base>
193 YAT_ASSERT(reads_->size());
194 first_ = reads_->begin();
195 second_ = find_mate(first_->second);
196 if (second_ == reads_->end())
204 template<
typename Base>
206 BamPairIterator2<Base>::dereference(
void)
const 208 return BamPairProxy(&first_->second, &second_->second);
212 template<
typename Base>
213 bool BamPairIterator2<Base>::equal(
const BamPairIterator2& other)
const 215 return iter_ == other.iter_ && reads_->size() == other.reads_->size();
219 template<
typename Base>
220 void BamPairIterator2<Base>::increment(
void)
227 template<
typename Base>
228 BamPairIterator2<Base>::MultiMap::iterator
229 BamPairIterator2<Base>::find_mate(
const yat::omic::BamRead& bam)
231 Position mate_pos(bam.mtid(), bam.mpos());
232 YAT_ASSERT(reads_->size());
235 while (reads_->rbegin()->first <= mate_pos && iter_!=end_)
238 typedef MultiMap::iterator iterator;
239 std::pair<iterator, iterator> range = reads_->equal_range(mate_pos);
240 for (; range.first != range.second; ++range.first) {
241 if (!same_query_name(bam, range.first->second))
244 if (bam.pos()==bam.mpos() && bam.tid()==bam.mtid() &&
245 bam.flag() == range.first->second.flag())
249 return reads_->end();
253 template<
typename Base>
254 void BamPairIterator2<Base>::pop(
void)
256 YAT_ASSERT(reads_->size());
257 reads_->erase(first_);
261 template<
typename Base>
262 bool BamPairIterator2<Base>::push(
void)
266 Position position(iter_->tid(), iter_->pos());
267 reads_->insert(reads_->end(), std::make_pair(position, *iter_));
BamPairIterator2(void)
default constructor
Definition: BamPairIterator2.h:177
BamRead & first(void)
access first BamRead
BamPairIterator2::pointer operator->(void) const
Definition: BamPairIterator2.h:93
The Department of Theoretical Physics namespace as we define it.
Definition: stl_utility.h:64
Class holding a bam query.
Definition: BamRead.h:51
BamPairIterator2< Base > bam_pair_iterator2(Base end)
Definition: BamPairIterator2.h:154
Definition: BamPairIterator2.h:66
BamPairIterator2< Base > bam_pair_iterator2(Base base, Base end)
Definition: BamPairIterator2.h:143
BamRead & second(void)
access second BamRead