25 namespace seqan3::detail
37 class constexpr_pseudo_bitset :
public std::array<bool, N>
41 using base_t = std::array<bool, N>;
47 constexpr constexpr_pseudo_bitset
operator|(constexpr_pseudo_bitset rhs)
const noexcept
49 for (
size_t i = 0; i < N; ++i)
50 rhs[i] = rhs[i] || base_t::operator[](i);
55 constexpr constexpr_pseudo_bitset operator~() const noexcept
57 constexpr_pseudo_bitset ret{};
58 for (
size_t i = 0; i < N; ++i)
59 ret[i] = !base_t::operator[](i);
77 template <
char op,
typename condition_head_t,
typename ...condition_ts>
78 inline const std::string condition_message_v
81 (condition_head_t::msg + ... +
82 (std::string{
" "} + std::string{{op, op}} + std::string{
" "} + condition_ts::msg)) +
91 template <
typename condition_t>
92 struct char_predicate_base;
105 template <
typename condition_t>
106 SEQAN3_CONCEPT char_predicate = requires
108 requires std::predicate<std::remove_reference_t<condition_t>,
char>;
109 requires std::is_base_of_v<char_predicate_base<std::remove_cvref_t<condition_t>>,
112 std::remove_reference_t<condition_t>::msg;
116 std::convertible_to, decltype(std::remove_reference_t<condition_t>::msg));
145 template <char_predicate... condition_ts>
146 requires (
sizeof...(condition_ts) >= 2)
147 struct char_predicate_disjunction;
149 template <char_predicate condition_t>
150 struct char_predicate_negator;
159 template <typename derived_t>
160 struct char_predicate_base
163 using data_t = constexpr_pseudo_bitset<257>;
170 template <
char_predicate rhs_t>
171 constexpr
auto operator||(rhs_t
const &)
const
173 return char_predicate_disjunction<derived_t, rhs_t>{};
177 constexpr
auto operator!()
const
179 return char_predicate_negator<derived_t>{};
187 template <std::
integral value_t>
188 constexpr
bool operator()(value_t
const val)
const noexcept
190 requires (
sizeof(value_t) == 1)
193 return derived_t::data[
static_cast<unsigned char>(val)];
197 template <std::
integral value_t>
198 constexpr
bool operator()(value_t
const val)
const noexcept
200 requires (
sizeof(value_t) != 1)
203 using char_trait = std::char_traits<value_t>;
204 return (
static_cast<std::make_unsigned_t<value_t>
>(val) < 256) ? operator()(
static_cast<uint8_t
>(val)) :
205 (char_trait::eq_int_type(val, char_trait::eof())) ? derived_t::data[256] : false;
213 std::string message()
const
215 return derived_t::msg;
230 template <char_predicate... condition_ts>
232 requires (
sizeof...(condition_ts) >= 2)
234 struct char_predicate_disjunction : public char_predicate_base<char_predicate_disjunction<condition_ts...>>
237 inline static const std::string msg = detail::condition_message_v<
'|', condition_ts...>;
240 using base_t = char_predicate_base<char_predicate_disjunction<condition_ts...>>;
243 using typename base_t::data_t;
245 static constexpr data_t data = (condition_ts::data | ...);
254 template <
char_predicate condition_t>
255 struct char_predicate_negator :
public char_predicate_base<char_predicate_negator<condition_t>>
258 inline static const std::string msg = std::string{
'!'} + condition_t::msg;
261 using base_t = char_predicate_base<char_predicate_negator<condition_t>>;
264 using typename base_t::data_t;
266 static constexpr data_t data = ~condition_t::data;
281 template <u
int8_t
interval_first, u
int8_t
interval_last>
283 requires (interval_first <= interval_last)
285 struct is_in_interval_type :
public char_predicate_base<is_in_interval_type<interval_first, interval_last>>
288 inline static const std::string msg = std::string{
"is_in_interval<'"} +
289 std::string{interval_first} +
290 std::string{
"', '"} +
291 std::string{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)
320 template <
int char_v>
321 struct 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");
326 inline static const std::string msg = std::string{
"is_char<'"} +
327 ((char_v == EOF) ? std::string{
"EOF"} : std::string{char_v}) +
333 using base_t = char_predicate_base<is_char_type<char_v>>;
336 using typename base_t::data_t;
338 static constexpr data_t data = [] () constexpr
345 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:1096
typename remove_cvref< t >::type remove_cvref_t
Return the input type with const, volatile and references removed (transformation_trait shortcut).
Definition: type_traits:54
Provides traits to inspect some information of a type, for example its name.