13 template<
class T,
class char_t>
14 constexpr
typename type_strings<T, char_t>::string_view_type type_strings<T, char_t>::create_full_signature()
18 #elif QX_CLANG || QX_GNU
19 if constexpr (std::is_same_v<char_t, char>)
20 return __PRETTY_FUNCTION__;
22 return convert_string_literal<char_t, __PRETTY_FUNCTION__>();
26 template<
class T,
class char_t>
27 constexpr
typename type_strings<T, char_t>::string_view_type type_strings<T, char_t>::create_signature()
32 if constexpr (std::is_same_v<T, void>)
35 else if constexpr (std::is_same_v<T, bool>)
38 else if constexpr (std::is_same_v<T, char>)
41 else if constexpr (std::is_same_v<T, signed char>)
44 else if constexpr (std::is_same_v<T, unsigned char>)
45 return "unsigned char";
47 else if constexpr (std::is_same_v<T, wchar_t>)
50 else if constexpr (std::is_same_v<T, char8_t>)
53 else if constexpr (std::is_same_v<T, char16_t>)
56 else if constexpr (std::is_same_v<T, char32_t>)
59 else if constexpr (std::is_same_v<T, std::int8_t>)
62 else if constexpr (std::is_same_v<T, std::uint8_t>)
65 else if constexpr (std::is_same_v<T, std::int16_t>)
68 else if constexpr (std::is_same_v<T, std::uint16_t>)
71 else if constexpr (std::is_same_v<T, std::int32_t>)
74 else if constexpr (std::is_same_v<T, std::uint32_t>)
77 else if constexpr (std::is_same_v<T, std::int64_t>)
80 else if constexpr (std::is_same_v<T, std::uint64_t>)
83 else if constexpr (std::is_same_v<T, float>)
86 else if constexpr (std::is_same_v<T, double>)
89 else if constexpr (std::is_same_v<T, long double>)
92 else if constexpr (std::is_same_v<T, std::nullptr_t>)
95 constexpr string_view_type svFunctionSignature = create_full_signature();
98 constexpr string_view_type svStartMarker =
QX_STR_PREFIX(char_t,
"type_strings<");
99 constexpr string_view_type svEndMarker =
QX_STR_PREFIX(char_t,
">::create_full_signature(");
101 constexpr string_view_type svStartMarker =
QX_STR_PREFIX(char_t,
"T = ");
102 constexpr string_view_type svEndMarker =
QX_STR_PREFIX(char_t,
", char_t = ");
104 constexpr string_view_type svStartMarker =
QX_STR_PREFIX(char_t,
"T = ");
105 constexpr string_view_type svEndMarker =
QX_STR_PREFIX(char_t,
";");
108 size_t nStartMarker = svFunctionSignature.find(svStartMarker);
109 size_t nStart = nStartMarker != string_view_type::npos ? (nStartMarker + svStartMarker.size()) : 0;
111 constexpr string_view_type classMarker =
QX_STR_PREFIX(char_t,
"class ");
112 size_t nClassMarker = svFunctionSignature.find(classMarker, nStart);
113 if (nClassMarker != string_view_type::npos)
114 nStart = nClassMarker + classMarker.size();
116 size_t nEndMarker = svFunctionSignature.find(svEndMarker, nStart);
117 size_t nEnd = nEndMarker != string_view_type::npos ? nEndMarker : svFunctionSignature.size();
120 size_t nCharCommaMarker = svFunctionSignature.rfind(
QX_CHAR_PREFIX(char_t,
','), nEnd);
121 if (nCharCommaMarker != string_view_type::npos)
122 nEnd = nCharCommaMarker;
125 return string_view_type(svFunctionSignature.data() + nStart, nEnd - nStart);
128 template<
class T,
class char_t>
129 constexpr
size_t type_strings<T, char_t>::get_num_template_parameters()
131 const string_view_type svSignature = create_signature();
133 size_t nBraceCounter = 0;
135 bool bLambda =
false;
137 for (
size_t i = 0; i < svSignature.size(); ++i)
139 switch (svSignature[i])
146 if (svSignature.find(lambdaMarker, i + 1) == i + 1)
148 else if (nParams == 0 && nBraceCounter == 1)
162 if (nBraceCounter == 1)
172 template<
class T,
class char_t>
175 return create_signature();
178 template<
class T,
class char_t>
181 constexpr string_view_type svStartMarker =
QX_STR_PREFIX(char_t,
"<");
182 const string_view_type svSignature = create_signature();
183 size_t nStartMarker = svSignature.find(svStartMarker);
185 if (nStartMarker != string_view_type::npos && svSignature.find(lambdaMarker, nStartMarker) == nStartMarker + 1)
186 nStartMarker = string_view_type::npos;
188 return string_view_type(
190 nStartMarker != string_view_type::npos ? nStartMarker : svSignature.size());
193 template<
class T,
class char_t>
196 std::array<string_view_type, get_num_template_parameters()> tokens;
198 const string_view_type svSignature = create_signature();
200 size_t nTokenStart = 0;
201 size_t nBraceCounter = 0;
204 const auto add_token = [&tokens, &svSignature](
size_t nToken,
size_t nStart,
size_t nEnd)
212 constexpr string_view_type classMarker =
QX_STR_PREFIX(char_t,
"class ");
213 if (string_view_type(svSignature.data() + nStart, nEnd - nStart).starts_with(classMarker))
214 nStart += classMarker.size();
216 tokens[nToken] = string_view_type(svSignature.data() + nStart, nEnd + 1 - nStart);
219 bool bLambda =
false;
221 for (
size_t i = 0; i < svSignature.size(); ++i)
223 switch (svSignature[i])
228 if (nTokenStart == 0)
230 else if (!bLambda && svSignature.find(lambdaMarker, i + 1) == i + 1)
243 if (nBraceCounter == 1)
245 add_token(nParam, nTokenStart, i - 1);
253 if (tokens.size() > 0)
255 size_t nTokenEnd = svSignature.size() - 1;
263 add_token(nParam, nTokenStart, nTokenEnd);
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.