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()
29 constexpr string_view_type svFunctionSignature = create_full_signature();
32 constexpr string_view_type svStartMarker =
QX_STR_PREFIX(char_t,
"type_strings<");
33 constexpr string_view_type svEndMarker =
QX_STR_PREFIX(char_t,
">::create_full_signature(");
35 constexpr string_view_type svStartMarker =
QX_STR_PREFIX(char_t,
"T = ");
36 constexpr string_view_type svEndMarker =
QX_STR_PREFIX(char_t,
", char_t = ");
38 constexpr string_view_type svStartMarker =
QX_STR_PREFIX(char_t,
"T = ");
39 constexpr string_view_type svEndMarker =
QX_STR_PREFIX(char_t,
";");
42 size_t nStartMarker = svFunctionSignature.find(svStartMarker);
43 size_t nStart = nStartMarker != string_view_type::npos ? (nStartMarker + svStartMarker.size()) : 0;
45 constexpr string_view_type classMarker =
QX_STR_PREFIX(char_t,
"class ");
46 size_t nClassMarker = svFunctionSignature.find(classMarker, nStart);
47 if (nClassMarker != string_view_type::npos)
48 nStart = nClassMarker + classMarker.size();
50 size_t nEndMarker = svFunctionSignature.find(svEndMarker, nStart);
51 size_t nEnd = nEndMarker != string_view_type::npos ? nEndMarker : svFunctionSignature.size();
54 size_t nCharCommaMarker = svFunctionSignature.rfind(
QX_CHAR_PREFIX(char_t,
','), nEnd);
55 if (nCharCommaMarker != string_view_type::npos)
56 nEnd = nCharCommaMarker;
59 return string_view_type(svFunctionSignature.data() + nStart, nEnd - nStart);
62 template<
class T,
class char_t>
63 constexpr
size_t type_strings<T, char_t>::get_num_template_parameters()
65 const string_view_type svSignature = create_signature();
67 size_t nBraceCounter = 0;
71 for (
size_t i = 0; i < svSignature.size(); ++i)
73 switch (svSignature[i])
80 if (svSignature.find(lambdaMarker, i + 1) == i + 1)
82 else if (nParams == 0 && nBraceCounter == 1)
96 if (nBraceCounter == 1)
106 template<
class T,
class char_t>
109 return create_signature();
112 template<
class T,
class char_t>
115 constexpr string_view_type svStartMarker =
QX_STR_PREFIX(char_t,
"<");
116 const string_view_type svSignature = create_signature();
117 size_t nStartMarker = svSignature.find(svStartMarker);
119 if (nStartMarker != string_view_type::npos && svSignature.find(lambdaMarker, nStartMarker) == nStartMarker + 1)
120 nStartMarker = string_view_type::npos;
122 return string_view_type(
124 nStartMarker != string_view_type::npos ? nStartMarker : svSignature.size());
127 template<
class T,
class char_t>
130 std::array<string_view_type, get_num_template_parameters()> tokens;
132 const string_view_type svSignature = create_signature();
134 size_t nTokenStart = 0;
135 size_t nBraceCounter = 0;
138 const auto add_token = [&tokens, &svSignature](
size_t nToken,
size_t nStart,
size_t nEnd)
146 constexpr string_view_type classMarker =
QX_STR_PREFIX(char_t,
"class ");
147 if (string_view_type(svSignature.data() + nStart, nEnd - nStart).starts_with(classMarker))
148 nStart += classMarker.size();
150 tokens[nToken] = string_view_type(svSignature.data() + nStart, nEnd + 1 - nStart);
153 bool bLambda =
false;
155 for (
size_t i = 0; i < svSignature.size(); ++i)
157 switch (svSignature[i])
162 if (nTokenStart == 0)
164 else if (!bLambda && svSignature.find(lambdaMarker, i + 1) == i + 1)
177 if (nBraceCounter == 1)
179 add_token(nParam, nTokenStart, i - 1);
187 if (tokens.size() > 0)
189 size_t nTokenEnd = svSignature.size() - 1;
197 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.