yat  0.14.5pre
BamReadIterator.h
1 #ifndef theplu_yat_omic_bam_read_iterator
2 #define theplu_yat_omic_bam_read_iterator
3 
4 // $Id: BamReadIterator.h 3360 2014-11-24 01:22:23Z peter $
5 
6 /*
7  Copyright (C) 2012, 2013, 2014 Peter Johansson
8 
9  This file is part of the yat library, http://dev.thep.lu.se/yat
10 
11  The yat library is free software; you can redistribute it and/or
12  modify it under the terms of the GNU General Public License as
13  published by the Free Software Foundation; either version 3 of the
14  License, or (at your option) any later version.
15 
16  The yat library is distributed in the hope that it will be useful,
17  but WITHOUT ANY WARRANTY; without even the implied warranty of
18  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19  General Public License for more details.
20 
21  You should have received a copy of the GNU General Public License
22  along with this program. If not, see <http://www.gnu.org/licenses/>.
23 */
24 
25 #include "BamFile.h"
26 #include "BamRead.h"
27 #include "config_bam.h"
28 
29 #include YAT_SAM_HEADER
30 
31 #include <boost/iterator/iterator_facade.hpp>
32 #include <boost/shared_ptr.hpp>
33 
34 #include <iterator>
35 
36 namespace theplu {
37 namespace yat {
38 namespace omic {
39 
40  // forward declaration
41  class InBamFile;
42 
61  : public boost::iterator_facade<
62  BamReadIterator, const BamRead, std::input_iterator_tag
63  >
64  {
65  public:
69  BamReadIterator(void);
70 
77  explicit BamReadIterator(InBamFile& in);
78 
96  BamReadIterator(InBamFile& in, int32_t tid, int32_t start, int32_t end);
97  private:
98  friend class boost::iterator_core_access;
99  BamReadIterator::reference dereference(void) const;
100  bool equal(const BamReadIterator& other) const;
101  void increment(void);
102 
103  /*
104  Interface class for the actor that handles difference between
105  an iterator that iterates the entire file and one that uses
106  index to iterate over a specific region.
107  */
108  class Actor
109  {
110  public:
111  explicit Actor(InBamFile*);
112  virtual ~Actor(void);
113  virtual void increment(void)=0;
114  InBamFile* in_;
115  BamRead read_;
116  };
117 
118  // class used when region is entire file
119  class AllActor : public Actor
120  {
121  public:
122  AllActor(void);
123  explicit AllActor(InBamFile&);
124  void increment(void);
125  };
126 
127  // class used when iterating over a sub-region of the bam file
128  class IndexActor : public Actor
129  {
130  public:
131  IndexActor(InBamFile& bf, int32_t tid, int32_t begin, int32_t end);
132  void increment(void);
133  private:
134 #if YAT_HAVE_HTSLIB
135  boost::shared_ptr<hts_itr_t> iter_;
136 #else
137  boost::shared_ptr<__bam_iter_t> iter_;
138 #endif
139  };
140 
141  boost::shared_ptr<Actor> actor_;
142 
143  struct IndexDestroyer
144  {
145 #if YAT_HAVE_HTSLIB
146  void operator()(hts_itr_t* i) const
147  {
148  bam_itr_destroy(i);
149  }
150 #else
151  void operator()(bam_iter_t i) const
152  {
153  bam_iter_destroy(i);
154  }
155 #endif
156  };
157  };
158 }}}
159 #endif
Class holding a bam query.
Definition: BamRead.h:53
BamReadIterator(void)
Contructs end of file iterator.
Definition: BamFile.h:118
class to iterate through a InBamFile
Definition: BamReadIterator.h:60

Generated on Tue Sep 26 2017 02:33:29 for yat by  doxygen 1.8.5