27 namespace seqan3::detail
39 class constexpr_pseudo_bitset :
public std::array<bool, N>
49 constexpr constexpr_pseudo_bitset
operator|(constexpr_pseudo_bitset rhs)
const noexcept
51 for (
size_t i = 0; i < N; ++i)
52 rhs[i] = rhs[i] || base_t::operator[](i);
57 constexpr constexpr_pseudo_bitset operator~() const noexcept
59 constexpr_pseudo_bitset ret{};
60 for (
size_t i = 0; i < N; ++i)
61 ret[i] = !base_t::operator[](i);
79 template <
char op,
typename condition_head_t,
typename ...condition_ts>
83 (condition_head_t::msg + ... +
93 template <
typename condition_t>
94 class char_predicate_base;
106 template <
typename condition_t>
108 SEQAN3_CONCEPT char_predicate = requires
111 requires std::is_base_of_v<char_predicate_base<remove_cvref_t<condition_t>>,
112 remove_cvref_t<condition_t>>;
147 template <char_predicate... condition_ts>
148 requires
sizeof...(condition_ts) >= 2
149 struct char_predicate_combiner;
151 template <
char_predicate condition_t>
152 struct char_predicate_negator;
161 template <
typename derived_t>
162 struct char_predicate_base
165 using data_t = constexpr_pseudo_bitset<257>;
171 template <
char_predicate rhs_t>
173 constexpr
auto operator||(rhs_t
const &)
const
175 return char_predicate_combiner<derived_t, rhs_t>{};
179 constexpr
auto operator!()
const
181 return char_predicate_negator<derived_t>{};
188 template <std::
integral value_t>
190 constexpr
bool operator()(value_t
const val)
const noexcept
192 requires
sizeof(value_t) == 1
195 return derived_t::data[static_cast<unsigned char>(val)];
199 template <std::
integral value_t>
200 constexpr
bool operator()(value_t
const val)
const noexcept
202 requires
sizeof(value_t) != 1
206 (
static_cast<decltype(EOF)
>(val) == EOF) ? derived_t::data[256] :
false;
216 return derived_t::msg;
231 template <char_predicate... condition_ts>
233 requires
sizeof...(condition_ts) >= 2
235 struct char_predicate_combiner :
public char_predicate_base<char_predicate_combiner<condition_ts...>>
238 inline static const std::string msg = detail::condition_message_v<
'|', condition_ts...>;
241 using base_t = char_predicate_base<char_predicate_combiner<condition_ts...>>;
244 using typename base_t::data_t;
246 static constexpr data_t
data = (condition_ts::data | ...);
255 template <
char_predicate condition_t>
256 struct char_predicate_negator :
public char_predicate_base<char_predicate_negator<condition_t>>
262 using base_t = char_predicate_base<char_predicate_negator<condition_t>>;
265 using typename base_t::data_t;
267 static constexpr data_t
data = ~condition_t::data;
282 template <u
int8_t
interval_first, u
int8_t
interval_last>
284 requires interval_first <= interval_last
286 struct is_in_interval_type :
public char_predicate_base<is_in_interval_type<interval_first, interval_last>>
296 using base_t = char_predicate_base<is_in_interval_type<interval_first, interval_last>>;
299 using typename base_t::data_t;
301 static constexpr data_t
data = [] () constexpr
305 for (
size_t i = interval_first; i <= static_cast<size_t>(interval_last); ++i)
321 template <detail::constexpr_alphabet alphabet_t>
322 struct is_in_alphabet_type :
public char_predicate_base<is_in_alphabet_type<alphabet_t>>
327 detail::type_name_as_string<alphabet_t> +
331 using base_t = char_predicate_base<is_in_alphabet_type<alphabet_t>>;
334 using typename base_t::data_t;
336 static constexpr data_t
data = [] () constexpr
340 for (
size_t i = 0; i < 256; ++i)
341 ret[i] = char_is_valid_for<alphabet_t>(static_cast<uint8_t>(i));
356 template <
int char_v>
357 struct is_char_type :
public char_predicate_base<is_char_type<char_v>>
359 static_assert(char_v == EOF || static_cast<uint64_t>(char_v) < 256,
"TODO");
369 using base_t = char_predicate_base<is_char_type<char_v>>;
372 using typename base_t::data_t;
374 static constexpr data_t
data = [] () constexpr
381 ret[static_cast<uint8_t>(char_v)] =
true;