4 #ifndef LEXY_DETAIL_NTTP_STRING_HPP_INCLUDED
5 #define LEXY_DETAIL_NTTP_STRING_HPP_INCLUDED
14 template <
typename CharT, CharT... Cs>
19 template <
template <
typename C, C...>
typename T>
22 static constexpr
auto size =
sizeof...(Cs);
24 template <
typename T =
char_type>
25 static constexpr T
c_str[
sizeof...(Cs) + 1] = {transcode_char<T>(Cs)..., T()};
29 #if LEXY_HAS_NTTP // string NTTP implementation
35 template <std::
size_t N,
typename CharT>
44 for (
auto i = 0u; i != N; ++i)
57 template <std::
size_t N,
typename CharT>
58 string_literal(
const CharT (&)[N]) -> string_literal<N - 1, CharT>;
59 template <
typename CharT>
60 string_literal(CharT) -> string_literal<1, CharT>;
62 template <
template <
typename C, C... Cs>
typename T, string_literal Str, std::size_t... Idx>
63 auto _to_type_string(index_sequence<Idx...>)
65 return T<
typename decltype(Str)::
char_type, Str.data[Idx]...>{};
67 template <
template <
typename C, C... Cs>
typename T, string_literal Str>
72 # define LEXY_NTTP_STRING(T, Str) \
73 ::lexy::_detail::to_type_string<T, ::lexy::_detail::string_literal(Str)>
75 #elif defined(__GNUC__) // literal implementation
77 # pragma GCC diagnostic push
78 # pragma GCC diagnostic ignored "-Wpedantic"
80 # pragma GCC diagnostic ignored "-Wgnu-string-literal-operator-template"
83 template <
typename CharT, CharT... Cs>
84 constexpr ::lexy::_detail::type_string<CharT, Cs...>
operator""_lexy_string_udl()
89 # define LEXY_NTTP_STRING(T, Str) decltype(Str##_lexy_string_udl)::rename<T>
91 # pragma GCC diagnostic pop
93 #else // string<Cs...> macro implementation
97 template <
typename A,
typename B>
99 template <
typename CharT, CharT... C1, CharT... C2>
104 template <
typename A,
typename B>
107 template <
template <
typename CharT, CharT...>
typename T,
typename TypeString, std::size_t Size,
111 static_assert(Size <= MaxSize,
"string out of range");
112 using type =
typename TypeString::template rename<T>;
117 # define LEXY_NTTP_STRING_LENGTH(Str) (sizeof(Str) / sizeof(Str[0]) - 1)
120 # define LEXY_NTTP_STRING1(Str, I) \
121 ::std::conditional_t< \
122 (I < LEXY_NTTP_STRING_LENGTH(Str)), \
123 ::lexy::_detail::type_string<::LEXY_DECAY_DECLTYPE(Str[0]), \
124 (I >= LEXY_NTTP_STRING_LENGTH(Str) ? Str[0] : Str[I])>, \
125 ::lexy::_detail::type_string<::LEXY_DECAY_DECLTYPE(Str[0])>>
128 # define LEXY_NTTP_STRING2(Str, I) \
129 ::lexy::_detail::cat<LEXY_NTTP_STRING1(Str, I), LEXY_NTTP_STRING1(Str, I + 1)>
130 # define LEXY_NTTP_STRING4(Str, I) \
131 ::lexy::_detail::cat<LEXY_NTTP_STRING2(Str, I), LEXY_NTTP_STRING2(Str, I + 2)>
132 # define LEXY_NTTP_STRING8(Str, I) \
133 ::lexy::_detail::cat<LEXY_NTTP_STRING4(Str, I), LEXY_NTTP_STRING4(Str, I + 4)>
134 # define LEXY_NTTP_STRING16(Str, I) \
135 ::lexy::_detail::cat<LEXY_NTTP_STRING8(Str, I), LEXY_NTTP_STRING8(Str, I + 8)>
136 # define LEXY_NTTP_STRING32(Str, I) \
137 ::lexy::_detail::cat<LEXY_NTTP_STRING16(Str, I), LEXY_NTTP_STRING16(Str, I + 16)>
140 # define LEXY_NTTP_STRING(T, Str) \
141 ::lexy::_detail::macro_type_string<T, LEXY_NTTP_STRING32(Str, 0), \
142 LEXY_NTTP_STRING_LENGTH(Str), 32>::type
146 #endif // LEXY_DETAIL_NTTP_STRING_HPP_INCLUDED