SeqAn3 3.2.0-rc.1
The Modern C++ library for sequence analysis.
misc.hpp
Go to the documentation of this file.
1// -----------------------------------------------------------------------------------------------------
2// Copyright (c) 2006-2021, Knut Reinert & Freie Universität Berlin
3// Copyright (c) 2016-2021, 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 <seqan3/std/algorithm>
16#include <filesystem>
17#include <seqan3/std/iterator>
18#include <variant>
19
23
24namespace seqan3::detail
25{
26
29template <typename list_t, template <typename ...> typename output_t>
31
34template <template <typename...> typename output_t, typename ...ts>
35struct variant_from_tags<type_list<ts...>, output_t>
36{
39};
40
47template <std::output_iterator<char> it_t>
48constexpr void write_eol(it_t & it, bool const add_cr)
49{
50 if (add_cr)
51 it = '\r';
52
53 it = '\n';
54}
55
66template <typename format_variant_type>
67void set_format(format_variant_type & format,
68 std::filesystem::path const & file_name)
69{
71
72 bool format_found = false;
73 std::string extension = file_name.extension().string();
74 if (extension.size() > 1)
75 {
76 extension = extension.substr(1); // drop leading "."
77 detail::for_each<valid_formats>([&] (auto fmt)
78 {
79 using fm_type = typename decltype(fmt)::type; // remove type_identity wrapper
80
81 for (auto const & ext : fm_type::file_extensions)
82 {
83 if (std::ranges::equal(ext, extension))
84 {
85 format.template emplace<fm_type>();
86 format_found = true;
87 return;
88 }
89 }
90 });
91 }
92
93 if (!format_found)
94 throw unhandled_extension_error("No valid format found for this extension.");
95}
96
102template <typename list_t>
103inline constexpr bool has_member_file_extensions = false;
104
106template <template <typename ...> typename list_t, typename ...ts>
107 requires (requires { ts::file_extensions; }, ..., true)
108inline constexpr bool has_member_file_extensions<list_t<ts...>> = true;
110
116template <typename query_t>
117inline constexpr bool has_type_valid_formats = false;
118
120template <typename query_t>
121 requires requires { typename query_t::valid_formats; }
122inline constexpr bool has_type_valid_formats<query_t> = true;
124
145template <typename formats_t>
147{
148 static_assert(has_member_file_extensions<formats_t>,
149 "Expects that all formats have a static member file_extensions storing the extensions in a range");
150
151 std::vector<std::string> extensions;
152 detail::for_each<formats_t>([&extensions] (auto t_identity)
153 {
154 using format_t = typename decltype(t_identity)::type;
155 std::ranges::copy(format_t::file_extensions, std::cpp20::back_inserter(extensions));
156 });
157
158 return extensions;
159}
160} // namespace seqan3::detail
The <algorithm> header from C++20's standard library.
T extension(T... args)
typename transfer_template_args_onto< source_type, target_template >::type transfer_template_args_onto_t
Shortcut for seqan3::detail::transfer_template_args_onto (transformation_trait shortcut).
Definition: template_inspection.hpp:77
std::vector< std::string > valid_file_extensions()
Returns a list of valid file extensions.
Definition: misc.hpp:146
void set_format(format_variant_type &format, std::filesystem::path const &file_name)
Sets the file format according to the file name extension.
Definition: misc.hpp:67
constexpr bool has_type_valid_formats
Helper function to determine if a type has a static member valid_formats.
Definition: misc.hpp:117
constexpr void write_eol(it_t &it, bool const add_cr)
Write "\n" or "\r\n" to the stream iterator, depending on arguments.
Definition: misc.hpp:48
constexpr bool has_member_file_extensions
Helper function to determine if all types in a format type list have a static member file_extensions.
Definition: misc.hpp:103
Provides exceptions used in the I/O module.
The <iterator> header from C++20's standard library.
The internal SeqAn3 namespace.
Definition: aligned_sequence_concept.hpp:29
T size(T... args)
Base class to deduce the std::variant type from format tags.
Definition: misc.hpp:30
Type that contains multiple types.
Definition: type_list.hpp:29
Thrown if there is no format that accepts a given file extension.
Definition: exception.hpp:30
T substr(T... args)
Provides type traits for working with templates.
Provides algorithms for meta programming, parameter packs and seqan3::type_list.