25 #ifdef SEQAN3_DEPRECATED_310
29 namespace seqan3::detail
41 class constexpr_pseudo_bitset :
public std::array<bool, N>
51 constexpr constexpr_pseudo_bitset
operator|(constexpr_pseudo_bitset rhs)
const noexcept
53 for (
size_t i = 0; i < N; ++i)
54 rhs[i] = rhs[i] || base_t::operator[](i);
59 constexpr constexpr_pseudo_bitset operator~() const noexcept
61 constexpr_pseudo_bitset ret{};
62 for (
size_t i = 0; i < N; ++i)
63 ret[i] = !base_t::operator[](i);
81 template <
char op,
typename condition_head_t,
typename ...condition_ts>
85 (condition_head_t::msg + ... +
95 template <
typename condition_t>
96 struct char_predicate_base;
109 template <
typename condition_t>
110 SEQAN3_CONCEPT char_predicate = requires
112 requires std::predicate<std::remove_reference_t<condition_t>,
char>;
113 requires std::is_base_of_v<char_predicate_base<std::remove_cvref_t<condition_t>>,
149 template <char_predicate... condition_ts>
150 requires (
sizeof...(condition_ts) >= 2)
151 struct char_predicate_disjunction;
153 template <char_predicate condition_t>
154 struct char_predicate_negator;
163 template <typename derived_t>
164 struct char_predicate_base
167 using data_t = constexpr_pseudo_bitset<257>;
174 template <
char_predicate rhs_t>
175 constexpr
auto operator||(rhs_t
const &)
const
177 return char_predicate_disjunction<derived_t, rhs_t>{};
181 constexpr
auto operator!()
const
183 return char_predicate_negator<derived_t>{};
191 template <std::
integral value_t>
192 constexpr
bool operator()(value_t
const val)
const noexcept
194 requires (
sizeof(value_t) == 1)
197 return derived_t::data[
static_cast<unsigned char>(val)];
201 template <std::
integral value_t>
202 constexpr
bool operator()(value_t
const val)
const noexcept
204 requires (
sizeof(value_t) != 1)
209 (char_trait::eq_int_type(val, char_trait::eof())) ? derived_t::
data[256] : false;
219 return derived_t::msg;
234 template <char_predicate... condition_ts>
236 requires (
sizeof...(condition_ts) >= 2)
238 struct char_predicate_disjunction : public char_predicate_base<char_predicate_disjunction<condition_ts...>>
241 inline static const std::string msg = detail::condition_message_v<
'|', condition_ts...>;
244 using base_t = char_predicate_base<char_predicate_disjunction<condition_ts...>>;
247 using typename base_t::data_t;
249 static constexpr data_t
data = (condition_ts::data | ...);
258 template <
char_predicate condition_t>
259 struct char_predicate_negator :
public char_predicate_base<char_predicate_negator<condition_t>>
265 using base_t = char_predicate_base<char_predicate_negator<condition_t>>;
268 using typename base_t::data_t;
270 static constexpr data_t
data = ~condition_t::data;
285 template <u
int8_t
interval_first, u
int8_t
interval_last>
287 requires (interval_first <= interval_last)
289 struct is_in_interval_type :
public char_predicate_base<is_in_interval_type<interval_first, interval_last>>
299 using base_t = char_predicate_base<is_in_interval_type<interval_first, interval_last>>;
302 using typename base_t::data_t;
304 static constexpr data_t
data = [] () constexpr
308 for (
size_t i = interval_first; i <= static_cast<size_t>(interval_last); ++i)
315 #ifdef SEQAN3_DEPRECATED_310
325 template <detail::constexpr_alphabet alphabet_t>
326 struct is_in_alphabet_type :
public char_predicate_base<is_in_alphabet_type<alphabet_t>>
331 detail::type_name_as_string<alphabet_t> +
335 using base_t = char_predicate_base<is_in_alphabet_type<alphabet_t>>;
338 using typename base_t::data_t;
340 static constexpr data_t
data = [] () constexpr
344 for (
size_t i = 0; i < 256; ++i)
345 ret[i] = char_is_valid_for<alphabet_t>(
static_cast<uint8_t
>(i));
361 template <
int char_v>
362 struct is_char_type :
public char_predicate_base<is_char_type<char_v>>
364 static_assert(char_v == EOF ||
static_cast<uint64_t
>(char_v) < 256,
"TODO");
374 using base_t = char_predicate_base<is_char_type<char_v>>;
377 using typename base_t::data_t;
379 static constexpr data_t
data = [] () constexpr
386 ret[
static_cast<uint8_t
>(char_v)] =
true;
Core alphabet concept and free function/type trait wrappers.
auto operator|(validator1_type &&vali1, validator2_type &&vali2)
Enables the chaining of validators.
Definition: validators.hpp:1103
Provides traits to inspect some information of a type, for example its name.
Provides various type traits on generic types.