23namespace seqan3::detail
35class constexpr_pseudo_bitset :
public std::array<bool, N>
46 constexpr constexpr_pseudo_bitset
operator|(constexpr_pseudo_bitset rhs)
const noexcept
48 for (
size_t i = 0; i < N; ++i)
49 rhs[i] = rhs[i] || base_t::operator[](i);
54 constexpr constexpr_pseudo_bitset operator~() const noexcept
56 constexpr_pseudo_bitset ret{};
57 for (
size_t i = 0; i < N; ++i)
58 ret[i] = !base_t::operator[](i);
76template <
char op,
typename condition_head_t,
typename... condition_ts>
87template <
typename condition_t>
88struct char_predicate_base;
101template <
typename condition_t>
102concept char_predicate =
requires {
103 requires std::predicate<std::remove_reference_t<condition_t>,
char>;
104 requires std::is_base_of_v<char_predicate_base<std::remove_cvref_t<condition_t>>,
141template <char_predicate... condition_ts>
142 requires (
sizeof...(condition_ts) >= 2)
143struct char_predicate_disjunction;
145template <
char_predicate condition_t>
146struct char_predicate_negator;
155template <
typename derived_t>
156struct char_predicate_base
159 using data_t = constexpr_pseudo_bitset<257>;
166 template <
char_predicate rhs_t>
167 constexpr auto operator||(rhs_t
const &)
const
169 return char_predicate_disjunction<derived_t, rhs_t>{};
173 constexpr auto operator!()
const
175 return char_predicate_negator<derived_t>{};
183 template <std::
integral value_t>
184 constexpr bool operator()(value_t
const val)
const noexcept
185 requires (
sizeof(value_t) == 1)
187 return derived_t::data[
static_cast<unsigned char>(val)];
191 template <std::
integral value_t>
192 constexpr bool operator()(value_t
const val)
const noexcept
193 requires (
sizeof(value_t) != 1)
208 static_assert(!std::same_as<char_value_t, void>,
"There is no valid character representation.");
211 : (char_trait::eq_int_type(val, char_trait::eof())) ? derived_t::data[256]
222 return derived_t::msg;
237template <char_predicate... condition_ts>
238 requires (
sizeof...(condition_ts) >= 2)
239struct char_predicate_disjunction :
public char_predicate_base<char_predicate_disjunction<condition_ts...>>
242 static inline const std::string msg = detail::condition_message_v<
'|', condition_ts...>;
245 using base_t = char_predicate_base<char_predicate_disjunction<condition_ts...>>;
248 using typename base_t::data_t;
250 static constexpr data_t
data = (condition_ts::data | ...);
259template <
char_predicate condition_t>
260struct char_predicate_negator :
public char_predicate_base<char_predicate_negator<condition_t>>
266 using base_t = char_predicate_base<char_predicate_negator<condition_t>>;
269 using typename base_t::data_t;
271 static constexpr data_t
data = ~condition_t::data;
286template <u
int8_t
interval_first, u
int8_t
interval_last>
287 requires (interval_first <= interval_last)
288struct is_in_interval_type : public char_predicate_base<is_in_interval_type<interval_first, interval_last>>
295 using base_t = char_predicate_base<is_in_interval_type<interval_first, interval_last>>;
298 using typename base_t::data_t;
300 static constexpr data_t
data = []()
constexpr
304 for (
size_t i = interval_first; i <= static_cast<size_t>(interval_last); ++i)
321struct is_char_type :
public char_predicate_base<is_char_type<char_v>>
323 static_assert(char_v == EOF ||
static_cast<uint64_t
>(char_v) < 256,
"TODO");
330 using base_t = char_predicate_base<is_char_type<char_v>>;
333 using typename base_t::data_t;
335 static constexpr data_t
data = []()
constexpr
342 ret[
static_cast<uint8_t
>(char_v)] =
true;
Provides various type traits on generic types.
auto operator|(validator1_type &&vali1, validator2_type &&vali2)
Enables the chaining of validators.
Definition validators.hpp:1121
Provides traits to inspect some information of a type, for example its name.
Provides concepts that do not have equivalents in C++20.