1 #pragma once
2 
3 #include <concepts>
4 #include <type_traits>
5 
6 namespace lg2::details
7 {
8 
9 /** Matches a type T which is anything except one of those in Ss. */
10 template <typename T, typename... Ss>
11 concept any_but = (... && !std::convertible_to<T, Ss>);
12 
13 /** Determine if a type might be a constexpr string: (const char (&)[N]) */
14 template <typename T>
15 concept maybe_constexpr_string = std::is_array_v<std::remove_cvref_t<T>> &&
16                                  std::same_as<const char*, std::decay_t<T>>;
17 
18 /** Determine if a type is certainly not a constexpr string. */
19 template <typename T>
20 concept not_constexpr_string = (!maybe_constexpr_string<T>);
21 
22 }; // namespace lg2::details
23