Implement const_str_t<> helper

This commit is contained in:
Nekotekina 2021-05-12 18:41:54 +03:00
parent 8ae727ca04
commit f0ad20a250
2 changed files with 78 additions and 4 deletions

View File

@ -84,19 +84,19 @@ namespace logs
#define GEN_LOG_METHOD(_sev)\ #define GEN_LOG_METHOD(_sev)\
const message msg_##_sev{this, level::_sev};\ const message msg_##_sev{this, level::_sev};\
template <typename CharT, usz N, typename... Args>\ template <typename... Args>\
void _sev(const CharT(&fmt)[N], const Args&... args)\ void _sev(const const_str& fmt, const Args&... args)\
{\ {\
if (level::_sev <= enabled.observe()) [[unlikely]]\ if (level::_sev <= enabled.observe()) [[unlikely]]\
{\ {\
if constexpr (sizeof...(Args) > 0)\ if constexpr (sizeof...(Args) > 0)\
{\ {\
static constexpr fmt_type_info type_list[sizeof...(Args) + 1]{fmt_type_info::make<fmt_unveil_t<Args>>()...};\ static constexpr fmt_type_info type_list[sizeof...(Args) + 1]{fmt_type_info::make<fmt_unveil_t<Args>>()...};\
msg_##_sev.broadcast(reinterpret_cast<const char*>(fmt), type_list, u64{fmt_unveil<Args>::get(args)}...);\ msg_##_sev.broadcast(fmt, type_list, u64{fmt_unveil<Args>::get(args)}...);\
}\ }\
else\ else\
{\ {\
msg_##_sev.broadcast(reinterpret_cast<const char*>(fmt), nullptr);\ msg_##_sev.broadcast(fmt, nullptr);\
}\ }\
}\ }\
}\ }\

View File

@ -670,6 +670,80 @@ constexpr unsigned __builtin_COLUMN()
} }
#endif #endif
template <usz Size = usz(-1)>
struct const_str_t
{
static constexpr usz size = Size;
char8_t chars[Size + 1]{};
constexpr const_str_t(const char(&a)[Size + 1])
{
for (usz i = 0; i <= Size; i++)
chars[i] = a[i];
}
constexpr const_str_t(const char8_t(&a)[Size + 1])
{
for (usz i = 0; i <= Size; i++)
chars[i] = a[i];
}
operator const char*() const
{
return reinterpret_cast<const char*>(chars);
}
constexpr operator const char8_t*() const
{
return chars;
}
};
template <>
struct const_str_t<usz(-1)>
{
const usz size;
const union
{
const char8_t* chars;
const char* chars2;
};
template <usz N>
constexpr const_str_t(const char8_t(&a)[N])
: size(N - 1)
, chars(+a)
{
}
template <usz N>
constexpr const_str_t(const char(&a)[N])
: size(N - 1)
, chars2(+a)
{
}
operator const char*() const
{
return std::launder(chars2);
}
constexpr operator const char8_t*() const
{
return chars;
}
};
template <usz Size>
const_str_t(const char(&a)[Size]) -> const_str_t<Size - 1>;
template <usz Size>
const_str_t(const char8_t(&a)[Size]) -> const_str_t<Size - 1>;
using const_str = const_str_t<>;
struct src_loc struct src_loc
{ {
u32 line; u32 line;