File: ReadProducer.hpp

package info (click to toggle)
salmon 0.7.2%2Bds1-2
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 4,352 kB
  • ctags: 5,243
  • sloc: cpp: 42,341; ansic: 6,252; python: 228; makefile: 207; sh: 190
file content (92 lines) | stat: -rw-r--r-- 2,535 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
/**
>HEADER
    Copyright (c) 2013 Rob Patro robp@cs.cmu.edu

    This file is part of Sailfish.

    Sailfish is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    Sailfish is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with Sailfish.  If not, see <http://www.gnu.org/licenses/>.
<HEADER
**/


#ifndef __READPRODUCER_HPP__
#define __READPRODUCER_HPP__

#include "jellyfish/parse_dna.hpp"
#include "jellyfish/mapped_file.hpp"
#include "jellyfish/parse_read.hpp"
#include "jellyfish/sequence_parser.hpp"
#include "jellyfish/dna_codes.hpp"
#include "jellyfish/compacted_hash.hpp"
#include "jellyfish/mer_counting.hpp"
#include "jellyfish/misc.hpp"
#include "StreamingSequenceParser.hpp"

template <typename Parser>
class ReadProducer {
};

template <>
class ReadProducer<jellyfish::parse_read> {
public:
  ReadProducer(jellyfish::parse_read& parser) : s_(new ReadSeq), stream_(parser.new_thread()) {}
  ~ReadProducer() { delete s_; }

  bool nextRead(ReadSeq*& s) {
    if ((read_ = stream_.next_read())) {
        // we iterate over the entire read
        const char*         start = read_->seq_s;
        const char*  const  end   = read_->seq_e;
        uint32_t readLen = std::distance(start, end);

        s_->seq = const_cast<char*>(read_->seq_s);
        s_->len = readLen;
        s_->name = const_cast<char*>(read_->header);
        s_->nlen = read_->hlen;
        s = s_;
        return true;
    } else {
      return false;
    }
  }

  void finishedWithRead(ReadSeq*& s) { s = nullptr; }

private:
  ReadSeq* s_;
  jellyfish::parse_read::read_t* read_;//{parser.new_thread()};
  jellyfish::parse_read::thread stream_;//{parser.new_thread()};
};

template <>
class ReadProducer<StreamingReadParser> {
public:
  ReadProducer(StreamingReadParser& parser) : parser_(parser) {}

  bool nextRead(ReadSeq*& s) {
    if (parser_.nextRead(s)) {
      return true;
    } else {
      s = nullptr;
      return false;
    }
  }

  void finishedWithRead(ReadSeq*& s) { parser_.finishedWithRead(s); }

private:
  StreamingReadParser& parser_;
};

#endif // __READPRODUCER_HPP__