1#ifndef BTLLIB_SEQ_READER_MULTILINE_FASTQ_MODULE_HPP 
    2#define BTLLIB_SEQ_READER_MULTILINE_FASTQ_MODULE_HPP 
    4#include "btllib/cstring.hpp" 
    5#include "btllib/status.hpp" 
   12class SeqReaderMultilineFastqModule
 
   16  friend class SeqReader;
 
   27  Stage stage = Stage::HEADER;
 
   30  static bool buffer_valid(
const char* buffer, 
size_t size);
 
   31  template<
typename ReaderType, 
typename RecordType>
 
   32  bool read_buffer(ReaderType& reader, RecordType& record);
 
   33  template<
typename ReaderType, 
typename RecordType>
 
   34  bool read_transition(ReaderType& reader, RecordType& record);
 
   35  template<
typename ReaderType, 
typename RecordType>
 
   36  bool read_file(ReaderType& reader, RecordType& record);
 
   39template<
typename ReaderType, 
typename RecordType>
 
   41SeqReaderMultilineFastqModule::read_buffer(ReaderType& reader,
 
   44  record.header.clear();
 
   47  if (reader.buffer.start < reader.buffer.end) {
 
   52          if (!reader.readline_buffer_append(record.header)) {
 
   59          if (!reader.readline_buffer_append(record.seq)) {
 
   63          stage = Stage::TRANSITION;
 
   66        case Stage::TRANSITION: {
 
   67          c = reader.getc_buffer();
 
   71          reader.ungetc_buffer(c);
 
   80          if (!reader.readline_buffer_append(tmp)) {
 
   88          if (!reader.readline_buffer_append(record.qual)) {
 
   92          if (record.qual.size() == record.seq.size()) {
 
   93            stage = Stage::HEADER;
 
   97                      "SeqReader: Multiline FASTQ reader: Quality string is " 
   98                      "longer than sequence string.");
 
  102          log_error(
"SeqReader has entered an invalid state.");
 
  103          std::exit(EXIT_FAILURE); 
 
  111template<
typename ReaderType, 
typename RecordType>
 
  113SeqReaderMultilineFastqModule::read_transition(ReaderType& reader,
 
  116  if (std::ferror(reader.source) == 0 && std::feof(reader.source) == 0) {
 
  117    const auto p = std::fgetc(reader.source);
 
  119      std::ungetc(p, reader.source);
 
  123          case Stage::HEADER: {
 
  124            reader.readline_file_append(record.header, reader.source);
 
  129            reader.readline_file_append(record.seq, reader.source);
 
  131            stage = Stage::TRANSITION;
 
  134          case Stage::TRANSITION: {
 
  135            c = std::fgetc(reader.source);
 
  139            std::ungetc(c, reader.source);
 
  148            reader.readline_file_append(tmp, reader.source);
 
  154            reader.readline_file_append(record.qual, reader.source);
 
  156            if (record.qual.size() == record.seq.size()) {
 
  157              stage = Stage::HEADER;
 
  160            check_error(record.qual.size() > record.seq.size(),
 
  161                        "SeqReader: Multiline FASTQ reader: Quality string is " 
  162                        "longer than sequence string.");
 
  166            log_error(
"SeqReader has entered an invalid state.");
 
  167            std::exit(EXIT_FAILURE); 
 
  176template<
typename ReaderType, 
typename RecordType>
 
  178SeqReaderMultilineFastqModule::read_file(ReaderType& reader, RecordType& record)
 
  180  if (!reader.file_at_end(reader.source)) {
 
  181    reader.readline_file(record.header, reader.source);
 
  183    reader.readline_file(record.seq, reader.source);
 
  186      c = std::fgetc(reader.source);
 
  188                  "SeqReader: Multiline FASTQ reader: Unexpected end.");
 
  189      std::ungetc(c, reader.source);
 
  191        reader.readline_file(tmp, reader.source);
 
  192        reader.readline_file(record.qual, reader.source);
 
  195        while (record.qual.size() < record.seq.size()) {
 
  196          prevlen = record.qual.size();
 
  197          reader.readline_file_append(record.qual, reader.source);
 
  199                      "SeqReader: Multiline FASTQ reader: Failed to read the " 
  203        check_error(record.qual.size() > record.seq.size(),
 
  204                    "SeqReader: Multiline FASTQ reader: Quality string is " 
  205                    "longer than sequence string.");
 
  208      reader.readline_file_append(record.seq, reader.source);
 
Definition: bloom_filter.hpp:16
void check_error(bool condition, const std::string &msg)
void rtrim(std::string &s)
void log_error(const std::string &msg)