SeqAn3  3.0.1
The Modern C++ library for sequence analysis.
concept.hpp
Go to the documentation of this file.
1 // -----------------------------------------------------------------------------------------------------
2 // Copyright (c) 2006-2020, Knut Reinert & Freie Universität Berlin
3 // Copyright (c) 2016-2020, 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 <tuple>
16 
19 #include <seqan3/std/ranges>
20 
21 namespace seqan3::detail
22 {
23 
36 template <typename t>
38 SEQAN3_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 
60 template <typename t>
62 SEQAN3_CONCEPT sequence_pair_range = std::ranges::forward_range<t> && sequence_pair<std::ranges::range_value_t<t>>;
64 
82 template <typename t>
84 SEQAN3_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 
107 template <typename t>
109 SEQAN3_CONCEPT align_pairwise_single_input =
110  sequence_pair<t> &&
111  std::ranges::viewable_range<std::tuple_element_t<0, t>> &&
112  std::ranges::viewable_range<std::tuple_element_t<1, t>>;
114 
132 template <typename t>
134 SEQAN3_CONCEPT align_pairwise_range_input =
135  std::ranges::forward_range<t> &&
136  sequence_pair<std::ranges::range_value_t<t>> &&
137  ((std::ranges::viewable_range<t> && std::is_lvalue_reference_v<std::ranges::range_reference_t<t>>) ||
138  align_pairwise_single_input<std::remove_reference_t<std::ranges::range_reference_t<t>>>);
140 } // namespace seqan3::detail
tuple.hpp
Provides seqan3::tuple_like.
tuple
tuple_like
Whether a type behaves like a tuple.
ranges
Adaptations of concepts from the Ranges TS.
copy_constructible
The concept std::copy_constructible is satisfied if T is an lvalue reference type,...
std::remove_reference_t
semialphabet
The basis for seqan3::alphabet, but requires only rank interface (not char).
concept.hpp
Core alphabet concept and free function/type trait wrappers.
std::tuple_size_v
T tuple_size_v