16 template<
class char_t,
size_t N>
17 constexpr std::array<char_t, N> to_char_array(std::span<const char, N> svChar)
19 std::array<char_t, N> result;
20 for (
size_t i = 0; i < N; ++i)
21 result[i] = svChar[i];
25 template<
class char_t,
string_literal array>
28 static constexpr
auto char_array =
29 to_char_array<char_t>(std::span<
const char, array.size()>(array.data(), array.data() + array.size()));
34 template<
class T,
class char_t>
39 #elif QX_CLANG || QX_GNU
40 if constexpr (std::is_same_v<char_t, char>)
42 return __PRETTY_FUNCTION__;
46 return string_view_type(details::char_array_helper<char_t, __PRETTY_FUNCTION__>::char_array.data());
51 template<
class T,
class char_t>
52 constexpr
typename type_strings<T, char_t>::string_view_type type_strings<T, char_t>::create_signature()
54 constexpr string_view_type svFunctionSignature = create_full_signature();
57 constexpr string_view_type svStartMarker =
QX_STR_PREFIX(char_t,
"type_strings<");
58 constexpr string_view_type svEndMarker =
QX_STR_PREFIX(char_t,
">::create_full_signature(");
60 constexpr string_view_type svStartMarker =
QX_STR_PREFIX(char_t,
"T = ");
61 constexpr string_view_type svEndMarker =
QX_STR_PREFIX(char_t,
", char_t = ");
63 constexpr string_view_type svStartMarker =
QX_STR_PREFIX(char_t,
"T = ");
64 constexpr string_view_type svEndMarker =
QX_STR_PREFIX(char_t,
";");
67 size_t nStartMarker = svFunctionSignature.find(svStartMarker);
68 size_t nStart = nStartMarker != string_view_type::npos ? (nStartMarker + svStartMarker.size()) : 0;
70 constexpr string_view_type classMarker =
QX_STR_PREFIX(char_t,
"class ");
71 size_t nClassMarker = svFunctionSignature.find(classMarker, nStart);
72 if (nClassMarker != string_view_type::npos)
73 nStart = nClassMarker + classMarker.size();
75 size_t nEndMarker = svFunctionSignature.find(svEndMarker, nStart);
76 size_t nEnd = nEndMarker != string_view_type::npos ? nEndMarker : svFunctionSignature.size();
79 size_t nCharCommaMarker = svFunctionSignature.rfind(
QX_CHAR_PREFIX(char_t,
','), nEnd);
80 if (nCharCommaMarker != string_view_type::npos)
81 nEnd = nCharCommaMarker;
84 return string_view_type(svFunctionSignature.data() + nStart, nEnd - nStart);
87 template<
class T,
class char_t>
88 constexpr
size_t type_strings<T, char_t>::get_num_template_parameters()
90 const string_view_type svSignature = create_signature();
92 size_t nBraceCounter = 0;
96 for (
size_t i = 0; i < svSignature.size(); ++i)
98 switch (svSignature[i])
105 if (svSignature.find(lambdaMarker, i + 1) == i + 1)
107 else if (nParams == 0 && nBraceCounter == 1)
121 if (nBraceCounter == 1)
131 template<
class T,
class char_t>
134 return create_signature();
137 template<
class T,
class char_t>
140 constexpr string_view_type svStartMarker =
QX_STR_PREFIX(char_t,
"<");
141 const string_view_type svSignature = create_signature();
142 size_t nStartMarker = svSignature.find(svStartMarker);
144 if (nStartMarker != string_view_type::npos && svSignature.find(lambdaMarker, nStartMarker) == nStartMarker + 1)
145 nStartMarker = string_view_type::npos;
147 return string_view_type(
149 nStartMarker != string_view_type::npos ? nStartMarker : svSignature.size());
152 template<
class T,
class char_t>
155 std::array<string_view_type, get_num_template_parameters()> tokens;
157 const string_view_type svSignature = create_signature();
159 size_t nTokenStart = 0;
160 size_t nBraceCounter = 0;
163 const auto add_token = [&tokens, &svSignature](
size_t nToken,
size_t nStart,
size_t nEnd)
171 constexpr string_view_type classMarker =
QX_STR_PREFIX(char_t,
"class ");
172 if (string_view_type(svSignature.data() + nStart, nEnd - nStart).starts_with(classMarker))
173 nStart += classMarker.size();
175 tokens[nToken] = string_view_type(svSignature.data() + nStart, nEnd + 1 - nStart);
178 bool bLambda =
false;
180 for (
size_t i = 0; i < svSignature.size(); ++i)
182 switch (svSignature[i])
187 if (nTokenStart == 0)
189 else if (!bLambda && svSignature.find(lambdaMarker, i + 1) == i + 1)
202 if (nBraceCounter == 1)
204 add_token(nParam, nTokenStart, i - 1);
212 if (tokens.size() > 0)
214 size_t nTokenEnd = svSignature.size() - 1;
222 add_token(nParam, nTokenStart, nTokenEnd);
The class allows you to get strings with information about the type, including its full name,...
static constexpr auto get_template_parameters()
Get type template parameters.
static constexpr string_view_type get_name()
Get type name (short name without template parameters)
static constexpr string_view_type get_signature()
Get type signature (full name with template parameters)
#define QX_CHAR_PREFIX(value_t, ch)
Chose witch of prefixes add to char : L or none.
#define QX_STR_PREFIX(value_t, str)
Chose witch of prefixes add to string : L or none.