yat/omic/BamReadSequenceIterator.h

Code
Comments
Other
Rev Date Author Line
4345 19 Apr 23 peter 1 #ifndef theplu_yat_omic_bam_read_sequence_iterator
4345 19 Apr 23 peter 2 #define theplu_yat_omic_bam_read_sequence_iterator
4345 19 Apr 23 peter 3
4345 19 Apr 23 peter 4 // $Id$
4345 19 Apr 23 peter 5
4345 19 Apr 23 peter 6 /*
4345 19 Apr 23 peter 7   Copyright (C) 2023 Peter Johansson
4345 19 Apr 23 peter 8
4345 19 Apr 23 peter 9   This file is part of the yat library, https://dev.thep.lu.se/yat
4345 19 Apr 23 peter 10
4345 19 Apr 23 peter 11   The yat library is free software; you can redistribute it and/or
4345 19 Apr 23 peter 12   modify it under the terms of the GNU General Public License as
4345 19 Apr 23 peter 13   published by the Free Software Foundation; either version 3 of the
4345 19 Apr 23 peter 14   License, or (at your option) any later version.
4345 19 Apr 23 peter 15
4345 19 Apr 23 peter 16   The yat library is distributed in the hope that it will be useful,
4345 19 Apr 23 peter 17   but WITHOUT ANY WARRANTY; without even the implied warranty of
4345 19 Apr 23 peter 18   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
4345 19 Apr 23 peter 19   General Public License for more details.
4345 19 Apr 23 peter 20
4345 19 Apr 23 peter 21   You should have received a copy of the GNU General Public License
4345 19 Apr 23 peter 22   along with yat. If not, see <https://www.gnu.org/licenses/>.
4345 19 Apr 23 peter 23 */
4345 19 Apr 23 peter 24
4345 19 Apr 23 peter 25 #include <boost/iterator/iterator_facade.hpp>
4345 19 Apr 23 peter 26
4345 19 Apr 23 peter 27 #include <cstdint>
4345 19 Apr 23 peter 28
4345 19 Apr 23 peter 29 namespace theplu {
4345 19 Apr 23 peter 30 namespace yat {
4345 19 Apr 23 peter 31 namespace omic {
4345 19 Apr 23 peter 32
4345 19 Apr 23 peter 33   // forward declaration
4345 19 Apr 23 peter 34   class BamRead;
4345 19 Apr 23 peter 35
4345 19 Apr 23 peter 36   /**
4345 19 Apr 23 peter 37      A small class holding a sequence base and corresponding base
4345 19 Apr 23 peter 38      quality.
4345 19 Apr 23 peter 39
4345 19 Apr 23 peter 40      \since New in yat 0.21
4345 19 Apr 23 peter 41    */
4345 19 Apr 23 peter 42    class BamReadSequenceQuality
4345 19 Apr 23 peter 43   {
4345 19 Apr 23 peter 44   public:
4345 19 Apr 23 peter 45     /// construct a default object
4345 19 Apr 23 peter 46     BamReadSequenceQuality(void) = default;
4345 19 Apr 23 peter 47     /**
4345 19 Apr 23 peter 48        construct a BamReadSequenceQuality with base \c b and quality
4345 19 Apr 23 peter 49        \c q
4345 19 Apr 23 peter 50     */
4345 19 Apr 23 peter 51     BamReadSequenceQuality(char b, uint8_t q);
4345 19 Apr 23 peter 52
4345 19 Apr 23 peter 53     /// \return base
4345 19 Apr 23 peter 54     const char& base(void) const;
4345 19 Apr 23 peter 55
4345 19 Apr 23 peter 56     /// \return quality
4345 19 Apr 23 peter 57     const uint8_t& qual(void) const;
4345 19 Apr 23 peter 58
4345 19 Apr 23 peter 59     /// \return base
4345 19 Apr 23 peter 60     char& base(void);
4345 19 Apr 23 peter 61
4345 19 Apr 23 peter 62     /// \return quality
4345 19 Apr 23 peter 63     uint8_t& qual(void);
4345 19 Apr 23 peter 64   private:
4345 19 Apr 23 peter 65     char base_;
4345 19 Apr 23 peter 66     uint8_t qual_;
4345 19 Apr 23 peter 67   };
4345 19 Apr 23 peter 68
4345 19 Apr 23 peter 69   /**
4345 19 Apr 23 peter 70      \relates BamReadSequenceQuality
4345 19 Apr 23 peter 71
4345 19 Apr 23 peter 72      \return true if both base and quality are the same for \c lhs and
4345 19 Apr 23 peter 73      \c rhs
4345 19 Apr 23 peter 74
4345 19 Apr 23 peter 75      \since New in yat 0.21
4345 19 Apr 23 peter 76    */
4345 19 Apr 23 peter 77   bool operator==(const BamReadSequenceQuality& lhs,
4345 19 Apr 23 peter 78                   const BamReadSequenceQuality& rhs);
4345 19 Apr 23 peter 79
4345 19 Apr 23 peter 80
4345 19 Apr 23 peter 81   /**
4345 19 Apr 23 peter 82      \brief class to iterate through the sequence of a BamRead
4345 19 Apr 23 peter 83
4345 19 Apr 23 peter 84      Iterator is a const random access iterator
4345 19 Apr 23 peter 85
4345 19 Apr 23 peter 86      \since New in yat 0.21
4345 19 Apr 23 peter 87    */
4345 19 Apr 23 peter 88   class BamReadSequenceIterator
4345 19 Apr 23 peter 89     : public boost::iterator_facade<
4345 19 Apr 23 peter 90     BamReadSequenceIterator, const BamReadSequenceQuality,
4345 19 Apr 23 peter 91     std::random_access_iterator_tag
4345 19 Apr 23 peter 92     >
4345 19 Apr 23 peter 93   {
4345 19 Apr 23 peter 94   public:
4345 19 Apr 23 peter 95     /**
4345 19 Apr 23 peter 96        \brief Default constructor
4345 19 Apr 23 peter 97      */
4345 19 Apr 23 peter 98     BamReadSequenceIterator(void);
4345 19 Apr 23 peter 99
4345 19 Apr 23 peter 100     /**
4345 19 Apr 23 peter 101        Creates an iterator pointing to the ith base (and quality).
4345 19 Apr 23 peter 102      */
4345 19 Apr 23 peter 103     explicit BamReadSequenceIterator(const BamRead& bam, size_t i=0);
4345 19 Apr 23 peter 104
4345 19 Apr 23 peter 105   private:
4345 19 Apr 23 peter 106     friend class boost::iterator_core_access;
4345 19 Apr 23 peter 107
4345 19 Apr 23 peter 108     void advance(BamReadSequenceIterator::difference_type);
4345 19 Apr 23 peter 109
4345 19 Apr 23 peter 110     void decrement(void);
4345 19 Apr 23 peter 111     BamReadSequenceIterator::reference dereference(void) const;
4345 19 Apr 23 peter 112
4345 19 Apr 23 peter 113     typename BamReadSequenceIterator::difference_type
4345 19 Apr 23 peter 114     distance_to(const BamReadSequenceIterator& other) const;
4345 19 Apr 23 peter 115
4345 19 Apr 23 peter 116     bool equal(const BamReadSequenceIterator& other) const;
4345 19 Apr 23 peter 117
4345 19 Apr 23 peter 118     void increment(void);
4345 19 Apr 23 peter 119     void update(void);
4345 19 Apr 23 peter 120
4345 19 Apr 23 peter 121     const BamRead* bam_;
4345 19 Apr 23 peter 122     size_t index_;
4345 19 Apr 23 peter 123     BamReadSequenceQuality value_;
4345 19 Apr 23 peter 124   };
4345 19 Apr 23 peter 125 }}}
4345 19 Apr 23 peter 126 #endif