SeqAn3 3.4.0-rc.4
The Modern C++ library for sequence analysis.
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages Concepts
range.hpp
Go to the documentation of this file.
1// SPDX-FileCopyrightText: 2006-2025 Knut Reinert & Freie Universität Berlin
2// SPDX-FileCopyrightText: 2016-2025 Knut Reinert & MPI für molekulare Genetik
3// SPDX-License-Identifier: BSD-3-Clause
4
10#pragma once
11
12#include <functional>
13#include <ranges>
14
20
21namespace seqan3
22{
23
33template <typename rng_t>
35 !std::same_as<std::remove_cvref_t<std::ranges::range_reference_t<rng_t>>, std::remove_cvref_t<rng_t>>;
36
51template <typename rng_t>
52 requires std::ranges::input_range<rng_t> && nonrecursive_range<rng_t>
54{
63 template <typename stream_t, typename arg_t>
64 constexpr void operator()(stream_t & stream, arg_t && arg) const
65 {
66 stream << '[';
67 auto first = std::ranges::begin(arg);
68 auto last = std::ranges::end(arg);
69 if (first != last)
70 {
71 stream << *first;
72 ++first;
73 }
74 while (first != last)
75 {
76 stream << ',';
77 stream << *first;
78 ++first;
79 }
80 stream << ']';
81 }
82};
83
92template <sequence sequence_t>
94{
103 template <typename stream_t, typename arg_t>
104 constexpr void operator()(stream_t & stream, arg_t && arg) const
105 {
106 for (auto && chr : arg)
107 stream << chr;
108 }
109};
110
120template <typename char_sequence_t>
121 requires std::ranges::input_range<char_sequence_t>
122 && (detail::is_char_adaptation_v<std::remove_cvref_t<std::ranges::range_reference_t<char_sequence_t>>>)
124{
132 template <typename stream_t, typename arg_t>
133 constexpr void operator()(stream_t & stream, arg_t && arg) const
134 {
135 // null-terminated string
136 if constexpr (std::is_pointer_v<std::decay_t<char_sequence_t>>)
137 return std::invoke(std_printer<char_sequence_t>{}, stream, std::forward<arg_t>(arg));
138
139 for (auto && chr : arg)
140 stream << chr;
141 }
142};
143
152template <typename integer_sequence_t>
153 requires std::ranges::input_range<integer_sequence_t>
154 && std::integral<std::remove_cvref_t<std::ranges::range_reference_t<integer_sequence_t>>>
156{};
157
158} // namespace seqan3
T begin(T... args)
Provides alphabet adaptations for standard char types.
A "pretty printer" for most SeqAn data structures and related types.
Definition debug_stream_type.hpp:79
Definition range.hpp:34
Provides various transformation traits used by the range module.
Provides seqan3::debug_stream and related types.
T invoke(T... args)
The main SeqAn3 namespace.
Definition aligned_sequence_concept.hpp:26
Additional non-standard concepts for ranges.
constexpr void operator()(stream_t &stream, arg_t &&arg) const
Prints the character sequence to the given stream.
Definition range.hpp:133
constexpr void operator()(stream_t &stream, arg_t &&arg) const
Prints the elements of a sequence to an output stream.
Definition range.hpp:64
Definition default_printer.hpp:36
Definition default_printer.hpp:37
constexpr void operator()(stream_t &stream, arg_t &&arg) const
Prints the elements of a sequence to an output stream.
Definition range.hpp:104
Definition default_printer.hpp:42
Provides alphabet adaptations for standard uint types.
Hide me