SeqAn3  3.0.3
The Modern C++ library for sequence analysis.
exposition_only_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/concepts>
16 #include <type_traits>
17 
18 #include <seqan3/core/platform.hpp>
19 
20 namespace seqan3::detail
21 {
22 
33 template <class T, class U>
34 SEQAN3_CONCEPT weakly_equality_comparable_with =
35  requires(std::remove_reference_t<T> const & t,
37  {
38  std::convertible_to<decltype(t == u), bool>;
39  std::convertible_to<decltype(t != u), bool>;
40  std::convertible_to<decltype(u == t), bool>;
41  std::convertible_to<decltype(u != t), bool>;
42  };
44 
46 template <typename lhs_t, typename rhs_t>
47 struct weakly_equality_comparable_with_trait :
48  std::integral_constant<bool, weakly_equality_comparable_with<lhs_t, rhs_t>>
49 {};
50 
57 template <typename t1, typename t2>
58 SEQAN3_CONCEPT weakly_ordered_with = requires (std::remove_reference_t<t1> const & v1,
59  std::remove_reference_t<t2> const & v2)
60 {
61  std::convertible_to<decltype(v1 < v2), bool>;
62  std::convertible_to<decltype(v1 <= v2), bool>;
63  std::convertible_to<decltype(v1 > v2), bool>;
64  std::convertible_to<decltype(v1 >= v2), bool>;
65 
66  std::convertible_to<decltype(v2 < v1), bool>;
67  std::convertible_to<decltype(v2 <= v1), bool>;
68  std::convertible_to<decltype(v2 > v1), bool>;
69  std::convertible_to<decltype(v2 >= v1), bool>;
70 };
72 
74 template <typename lhs_t, typename rhs_t>
75 struct weakly_ordered_with_trait : std::integral_constant<bool, weakly_ordered_with<lhs_t, rhs_t>>
76 {};
77 
79 
80 } // seqan3::detail
81 
82 namespace seqan3
83 {
84 
94 template <typename t, typename u>
95 SEQAN3_CONCEPT implicitly_convertible_to = std::is_convertible_v<t, u>;
97 
103 template <typename t, typename u>
104 SEQAN3_CONCEPT explicitly_convertible_to = requires (t vt) { { static_cast<u>(vt)}; };
106 
113 template <typename t>
114 SEQAN3_CONCEPT arithmetic = std::is_arithmetic_v<t>;
116 
124 template <typename t>
125 SEQAN3_CONCEPT floating_point = arithmetic<t> && std::is_floating_point_v<t>;
127 
135 
136 template <typename t>
137 SEQAN3_CONCEPT builtin_character = std::integral<t> &&
138  (std::same_as<t, char> || std::same_as<t, unsigned char> || std::same_as<t, signed char> ||
139 #ifdef __cpp_char8_t
140  std::same_as<t, char8_t> ||
141 #endif
142  std::same_as<t, char16_t> || std::same_as<t, char32_t> || std::same_as<t, wchar_t>);
144 
152 template <typename t>
153 SEQAN3_CONCEPT trivially_destructible = std::destructible<t> && std::is_trivially_destructible_v<t>;
155 
163 template <typename t>
164 SEQAN3_CONCEPT trivially_copyable = std::copyable<t> && std::is_trivially_copyable_v<t>;
166 
175 template <typename t>
176 SEQAN3_CONCEPT trivial = trivially_copyable<t> && trivially_destructible<t> && std::is_trivial_v<t>;
178 
185 template <typename t>
186 SEQAN3_CONCEPT standard_layout = std::is_standard_layout_v<t>;
188 
200 template <typename t, typename u>
201 SEQAN3_CONCEPT weakly_assignable_from = std::is_assignable_v<t, u>;
204 
205 } // namespace seqan3
The Concepts library.
A type that satisfies std::is_arithmetic_v<t>.
This concept encompasses exactly the types char, signed char, unsigned char, wchar_t,...
Resolves to std::ranges::explicitly_convertible_to<type1, type2>(). <dl class="no-api">This entity i...
An arithmetic type that also satisfies std::is_floating_point_v<t>.
Resolves to std::ranges::implicitly_convertible_to<type1, type2>(). <dl class="no-api">This entity i...
Resolves to std::is_standard_layout_v<t>.
A type that satisfies seqan3::trivially_copyable and seqan3::trivially_destructible.
A type that satisfies std::is_trivially_copyable_v<t>.
A type that satisfies std::is_trivially_destructible_v<t>.
Resolves to std::is_assignable_v<t>.
The main SeqAn3 namespace.
Definition: aligned_sequence_concept.hpp:29
Provides platform and dependency checks.