DoorKeeper/include/doorkeeper/implem/typename.inl

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