SeqAn3 3.1.0
The Modern C++ library for sequence analysis.
concept.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/ranges>
16#include <tuple>
17
20
21namespace seqan3::detail
22{
23
37template <typename t>
38SEQAN3_CONCEPT sequence_pair = requires ()
39{
40 requires tuple_like<t>;
41 requires std::tuple_size_v<t> == 2;
42 requires std::ranges::forward_range<std::tuple_element_t<0, t>>;
43 requires std::ranges::forward_range<std::tuple_element_t<1, t>>;
46};
48
61template <typename t>
62SEQAN3_CONCEPT sequence_pair_range = std::ranges::forward_range<t> && sequence_pair<std::ranges::range_value_t<t>>;
64
83template <typename t>
84SEQAN3_CONCEPT indexed_sequence_pair_range = std::ranges::forward_range<t> &&
85 requires (std::ranges::range_value_t<t> value)
86{
87 requires tuple_like<decltype(value)>;
88 requires std::tuple_size_v<decltype(value)> == 2;
89 requires sequence_pair<std::tuple_element_t<0, decltype(value)>>;
90 requires std::copy_constructible<std::tuple_element_t<1, decltype(value)>>;
91};
93
108template <typename t>
109SEQAN3_CONCEPT align_pairwise_single_input =
110 sequence_pair<std::remove_reference_t<t>> &&
111 std::is_lvalue_reference_v<t> ||
112 (std::ranges::viewable_range<std::tuple_element_t<0, std::remove_reference_t<t>>> &&
113 std::ranges::viewable_range<std::tuple_element_t<1, std::remove_reference_t<t>>>);
115
134template <typename t>
135SEQAN3_CONCEPT align_pairwise_range_input =
136 std::ranges::forward_range<t> &&
137 sequence_pair<std::ranges::range_value_t<t>> &&
138 ((std::ranges::viewable_range<t> && std::is_lvalue_reference_v<std::ranges::range_reference_t<t>>) ||
139 align_pairwise_single_input<std::remove_reference_t<std::ranges::range_reference_t<t>>>);
141} // namespace seqan3::detail
Core alphabet concept and free function/type trait wrappers.
The basis for seqan3::alphabet, but requires only rank interface (not char).
Whether a type behaves like a tuple.
The <ranges> header from C++20's standard library.
T tuple_size_v
Provides seqan3::tuple_like.