SeqAn3  3.2.0-rc.1
The Modern C++ library for sequence analysis.
alignment/pairwise/detail/concept.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 <ranges>
16 #include <tuple>
17 
20 
21 namespace seqan3::detail
22 {
23 
37 template <typename t>
38 concept sequence_pair = requires () {
40  requires std::tuple_size_v<t> == 2;
41  requires std::ranges::forward_range<std::tuple_element_t<0, t>>;
42  requires std::ranges::forward_range<std::tuple_element_t<1, t>>;
45  };
47 
60 template <typename t>
61 concept sequence_pair_range = std::ranges::forward_range<t> && sequence_pair<std::ranges::range_value_t<t>>;
63 
82 template <typename t>
83 concept indexed_sequence_pair_range =
84  std::ranges::forward_range<t> && requires (std::ranges::range_value_t<t> value) {
85  requires tuple_like<decltype(value)>;
86  requires std::tuple_size_v<decltype(value)> == 2;
87  requires sequence_pair<std::tuple_element_t<0, decltype(value)>>;
88  requires std::copy_constructible<std::tuple_element_t<1, decltype(value)>>;
89  };
91 
106 template <typename t>
107 concept align_pairwise_single_input =
108  sequence_pair<std::remove_reference_t<t>> && std::is_lvalue_reference_v<t>
109  || (std::ranges::viewable_range<std::tuple_element_t<0, std::remove_reference_t<t>>>
110  && std::ranges::viewable_range<std::tuple_element_t<1, std::remove_reference_t<t>>>);
112 
131 template <typename t>
132 concept align_pairwise_range_input =
133  std::ranges::forward_range<t> && sequence_pair<std::ranges::range_value_t<t>>
134  && ((std::ranges::viewable_range<t> && std::is_lvalue_reference_v<std::ranges::range_reference_t<t>>)
135  || align_pairwise_single_input<std::remove_reference_t<std::ranges::range_reference_t<t>>>);
137 } // namespace seqan3::detail
Core alphabet concept and free function/type trait wrappers.
requires requires
The rank_type of the semi-alphabet; defined as the return type of seqan3::to_rank....
Definition: alphabet/concept.hpp:164
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.