SeqAn3  3.2.0-rc.1
The Modern C++ library for sequence analysis.
misc_output.hpp
Go to the documentation of this file.
1 // -----------------------------------------------------------------------------------------------------
2 // Copyright (c) 2006-2022, Knut Reinert & Freie Universität Berlin
3 // Copyright (c) 2016-2022, Knut Reinert & MPI für molekulare Genetik
4 // This file may be used, modified and/or redistributed under the terms of the 3-clause BSD-License
5 // shipped with this file and also available at: https://github.com/seqan/seqan3/blob/master/LICENSE.md
6 // -----------------------------------------------------------------------------------------------------
7 
13 #pragma once
14 
15 #include <filesystem>
16 #include <functional>
17 #include <iostream>
18 #include <string>
19 #include <tuple>
20 
21 #if defined(SEQAN3_HAS_BZIP2)
22 # include <seqan3/contrib/stream/bz2_ostream.hpp>
23 #endif
24 #if defined(SEQAN3_HAS_ZLIB)
25 # include <seqan3/contrib/stream/bgzf_ostream.hpp>
26 # include <seqan3/contrib/stream/gz_ostream.hpp>
27 #endif
28 #include <seqan3/io/exception.hpp>
30 
31 namespace seqan3::detail
32 {
33 
41 template <builtin_character char_t>
42 inline auto make_secondary_ostream(std::basic_ostream<char_t> & primary_stream, std::filesystem::path & filename)
44 {
45  // don't assume ownership
46  constexpr auto stream_deleter_noop = [](std::basic_ostream<char_t> *) {};
47  // assume ownership
48  [[maybe_unused]] constexpr auto stream_deleter_default = [](std::basic_ostream<char_t> * ptr)
49  {
50  delete ptr;
51  };
52 
53  std::string extension = filename.extension().string();
54 
55  if (extension == ".gz")
56  {
57 #if defined(SEQAN3_HAS_ZLIB)
58  filename.replace_extension("");
59  return {new contrib::basic_gz_ostream<char_t>{primary_stream}, stream_deleter_default};
60 #else
61  throw file_open_error{"Trying to write a gzipped file, but no ZLIB available."};
62 #endif
63  }
64  else if ((extension == ".bgzf") || (extension == ".bam"))
65  {
66 #if defined(SEQAN3_HAS_ZLIB)
67  if (extension != ".bam") // remove extension except for bam
68  filename.replace_extension("");
69 
70  return {new contrib::basic_bgzf_ostream<char_t>{primary_stream}, stream_deleter_default};
71 #else
72  throw file_open_error{"Trying to write a bgzf'ed file, but no ZLIB available."};
73 #endif
74  }
75  else if (extension == ".bz2")
76  {
77 #if defined(SEQAN3_HAS_BZIP2)
78  filename.replace_extension("");
79  return {new contrib::basic_bz2_ostream<char_t>{primary_stream}, stream_deleter_default};
80 #else
81  throw file_open_error{"Trying to write a bzipped file, but no libbz2 available."};
82 #endif
83  }
84  else if (extension == ".zst")
85  {
86  throw file_open_error{"Trying to write a zst'ed file, but SeqAn does not yet support this."};
87  }
88 
89  return {&primary_stream, stream_deleter_noop};
90 }
91 
92 } // namespace seqan3::detail
Provides exceptions used in the I/O module.
Provides concepts that do not have equivalents in C++20.