1 #ifndef _theplu_yat_omic_bam_pair_iterator_ 2 #define _theplu_yat_omic_bam_pair_iterator_ 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> 64 template<
typename Base>
66 :
public boost::iterator_facade<
67 BamPairIterator<Base>, const BamPair, std::input_iterator_tag,
87 #ifndef YAT_HAVE_BOOST_ITERATOR_FACADE_PROXY_PTR 106 YAT_ASSERT(iter_ != end_);
107 dummie_.
first() = *mate_;
108 dummie_.
second() = *iter_;
119 std::shared_ptr<std::map<std::string, BamRead> > siam_reads_;
120 typedef std::pair<int32_t, int32_t> Position;
121 std::shared_ptr<std::multimap<Position, BamRead> > reads_;
122 friend class boost::iterator_core_access;
126 void increment(
void);
127 void find_next(
void);
136 template<
typename Base>
147 template<
typename Base>
155 template<
typename Base>
157 : iter_(base), end_(end),
161 BOOST_CONCEPT_ASSERT((boost_concepts::ReadableIterator<Base>));
162 BOOST_CONCEPT_ASSERT((boost_concepts::SinglePassIterator<Base>));
163 using boost::Convertible;
164 typedef typename std::iterator_traits<Base>::value_type value_type;
165 BOOST_CONCEPT_ASSERT((Convertible<value_type, BamRead>));
170 template<
typename Base>
173 BOOST_CONCEPT_ASSERT((boost::InputIterator<Base>));
174 using boost::Convertible;
175 typedef typename std::iterator_traits<Base>::value_type value_type;
176 BOOST_CONCEPT_ASSERT((Convertible<value_type, BamRead>));
180 template<
typename Base>
188 template<
typename Base>
189 bool BamPairIterator<Base>::equal(
const BamPairIterator& other)
const 191 return iter_ == other.iter_;
195 template<
typename Base>
196 void BamPairIterator<Base>::increment(
void)
203 template<
typename Base>
204 void BamPairIterator<Base>::find_next(
void)
207 for (; iter_!=end_; ++iter_) {
208 Position position(iter_->tid(), iter_->pos());
209 Position mate_position(iter_->mtid(), iter_->mpos());
211 if (siam_reads_->size() && less(siam_reads_->begin()->second, *iter_))
212 siam_reads_->clear();
215 if (mate_position > position)
216 reads_->insert(std::make_pair(mate_position, *iter_));
217 else if (position > mate_position) {
218 std::multimap<Position, BamRead>::iterator
219 lower = reads_->lower_bound(position);
222 reads_->erase(reads_->begin(), lower);
225 for (; lower!=reads_->end() && lower->first == position; ++lower)
226 if (same_query_name(lower->second, *iter_)) {
227 mate_ = &lower->second;
233 std::map<std::string, BamRead>::iterator
234 mate = siam_reads_->lower_bound(iter_->name());
235 if (mate!=siam_reads_->end() && same_query_name(mate->second, *iter_)) {
236 mate_ = &mate->second;
241 siam_reads_->insert(mate, std::make_pair(iter_->name(), *iter_));
BamPairIterator(void)
default constructor
Definition: BamPairIterator.h:171
BamRead & first(void)
access first BamRead
The Department of Theoretical Physics namespace as we define it.
Definition: stl_utility.h:64
Class holding a bam query.
Definition: BamRead.h:51
BamPairIterator< Base > bam_pair_iterator(Base end)
Definition: BamPairIterator.h:148
Definition: BamPairIterator.h:65
BamPairIterator< Base > bam_pair_iterator(Base base, Base end)
Definition: BamPairIterator.h:137
BamPairIterator::pointer operator->(void) const
Definition: BamPairIterator.h:94
BamRead & second(void)
access second BamRead