72 lines
2.0 KiB
C++
72 lines
2.0 KiB
C++
|
|
namespace dk {
|
|
template <typename T>
|
|
#if defined(IS_PRETTY_FUNC_CONSTEXPR)
|
|
constexpr
|
|
#endif
|
|
inline HashType type_name_hash() {
|
|
#if defined(IS_PRETTY_FUNC_CONSTEXPR)
|
|
//static_assert(dk::tiger("a", 1, 0x01).a == 0xABF87E2EEFFBBE77ULL, "Bug in tiger hash");
|
|
//static_assert(dk::tiger("message digest", 14, 0x01).a == 0x951A2078CBF881D9ULL, "Bug in tiger hash");
|
|
|
|
// set padding to 0x80 for tiger V2
|
|
return dk::tiger(type_name<T>().data(), type_name<T>().size(), 0x01);
|
|
#else
|
|
const auto retstring = type_name<T>();
|
|
return implem::hash_string(retstring.data(), retstring.size());
|
|
#endif
|
|
}
|
|
|
|
template <typename T>
|
|
#if defined(IS_PRETTY_FUNC_CONSTEXPR)
|
|
constexpr inline sprout::string<implem::type_name_len<T>()> type_name()
|
|
#else
|
|
inline std::string type_name()
|
|
#endif
|
|
{
|
|
#if defined(IS_PRETTY_FUNC_CONSTEXPR)
|
|
# if defined(__GNUC__)
|
|
typedef sprout::string<implem::type_name_info<T>().len> sproutstring;
|
|
typedef sprout::string<implem::type_name_len<T>()> sproutstringret;
|
|
|
|
return sproutstringret(
|
|
implem::type_name_info<T>().str + sproutstring(implem::type_name_info<T>().str).find(
|
|
'=',
|
|
sproutstring(implem::type_name_info<T>().str).find('[')
|
|
) + 2,
|
|
implem::type_name_len<T>() - 1
|
|
);
|
|
# else
|
|
# error "not implemented"
|
|
# endif
|
|
#else
|
|
# error "not implemented"
|
|
const char* const pf = __PRETTY_FUNCTION__;
|
|
const std::size_t len = sizeof(__PRETTY_FUNCTION__) - 1;
|
|
#endif
|
|
}
|
|
|
|
namespace implem {
|
|
template <typename T>
|
|
constexpr type_name_info<T>::type_name_info() :
|
|
len(sizeof(__PRETTY_FUNCTION__)),
|
|
str(__PRETTY_FUNCTION__)
|
|
{
|
|
}
|
|
|
|
#if defined(IS_PRETTY_FUNC_CONSTEXPR)
|
|
template <typename T>
|
|
constexpr std::size_t type_name_len() {
|
|
typedef sprout::string<implem::type_name_info<T>().len> sproutstring;
|
|
|
|
# if defined(__GNUC__)
|
|
return type_name_info<T>().len - sproutstring(
|
|
implem::type_name_info<T>().str).find('=', sproutstring(implem::type_name_info<T>().str).find('[')) - 3;
|
|
# else
|
|
# error "not implemented"
|
|
# endif
|
|
}
|
|
#endif
|
|
} //namespace implem
|
|
} //namespace dk
|