SeqAn3 3.4.0-rc.1
The Modern C++ library for sequence analysis.
Loading...
Searching...
No Matches
misc_output.hpp
Go to the documentation of this file.
1// SPDX-FileCopyrightText: 2006-2024 Knut Reinert & Freie Universität Berlin
2// SPDX-FileCopyrightText: 2016-2024 Knut Reinert & MPI für molekulare Genetik
3// SPDX-License-Identifier: BSD-3-Clause
4
10#pragma once
11
12#include <filesystem>
13#include <functional>
14#include <iostream>
15#include <string>
16#include <tuple>
17
18#if defined(SEQAN3_HAS_BZIP2)
19# include <seqan3/contrib/stream/bz2_ostream.hpp>
20#endif
21#if defined(SEQAN3_HAS_ZLIB)
22# include <seqan3/contrib/stream/bgzf_ostream.hpp>
23# include <seqan3/contrib/stream/gz_ostream.hpp>
24#endif
28
29namespace seqan3::detail
30{
31
39template <builtin_character char_t>
40inline auto make_secondary_ostream(std::basic_ostream<char_t> & primary_stream, std::filesystem::path & filename)
42{
43 // don't assume ownership
44 constexpr auto stream_deleter_noop = [](std::basic_ostream<char_t> *) {};
45 // assume ownership
46 [[maybe_unused]] constexpr auto stream_deleter_default = [](std::basic_ostream<char_t> * ptr)
47 {
48 delete ptr;
49 };
50
51 std::string extension = filename.extension().string();
52
53 if (extension == ".gz")
54 {
55#if defined(SEQAN3_HAS_ZLIB)
56 filename.replace_extension("");
57 return {new contrib::basic_gz_ostream<char_t>{primary_stream}, stream_deleter_default};
58#else
59 throw file_open_error{"Trying to write a gzipped file, but no ZLIB available."};
60#endif
61 }
62 else if ((extension == ".bgzf") || (extension == ".bam"))
63 {
64#if defined(SEQAN3_HAS_ZLIB)
65 if (extension != ".bam") // remove extension except for bam
66 filename.replace_extension("");
67
68 return {new contrib::basic_bgzf_ostream<char_t>{primary_stream}, stream_deleter_default};
69#else
70 throw file_open_error{"Trying to write a bgzf'ed file, but no ZLIB available."};
71#endif
72 }
73 else if (extension == ".bz2")
74 {
75#if defined(SEQAN3_HAS_BZIP2)
76 filename.replace_extension("");
77 return {new contrib::basic_bz2_ostream<char_t>{primary_stream}, stream_deleter_default};
78#else
79 throw file_open_error{"Trying to write a bzipped file, but no libbz2 available."};
80#endif
81 }
82 else if (extension == ".zst")
83 {
84 throw file_open_error{"Trying to write a zst'ed file, but SeqAn does not yet support this."};
85 }
86
87 return {&primary_stream, stream_deleter_noop};
88}
89
90} // namespace seqan3::detail
Provides seqan3::contrib::bgzf_thread_count.
Provides exceptions used in the I/O module.
Provides concepts that do not have equivalents in C++20.
Hide me