Fix type-safe formatting

This commit is contained in:
Nekotekina 2018-08-25 12:06:57 +03:00
parent 1d86c60548
commit 57f394e156
2 changed files with 7 additions and 6 deletions

View File

@ -74,8 +74,7 @@ namespace logs
if (UNLIKELY(sev <= enabled))
{
static constexpr fmt_type_info type_list[sizeof...(Args) + 1]{fmt_type_info::make<fmt_unveil_t<Args>>()...};
const u64 arg_array[sizeof...(Args) + 1]{fmt_unveil<Args>::get(args)...};
message{this, sev}.broadcast(fmt, type_list, arg_array);
message{this, sev}.broadcast(fmt, type_list, fmt_args_t<Args...>{fmt_unveil<Args>::get(args)...});
}
}

View File

@ -244,6 +244,10 @@ struct fmt_type_info
}
};
// Argument array type (each element generated via fmt_unveil<>)
template <typename... Args>
using fmt_args_t = const u64(&&)[sizeof...(Args) + 1];
namespace fmt
{
// Base-57 format helper
@ -286,8 +290,7 @@ namespace fmt
SAFE_BUFFERS FORCE_INLINE void append(std::string& out, const char* fmt, const Args&... args)
{
static constexpr fmt_type_info type_list[sizeof...(Args) + 1]{fmt_type_info::make<fmt_unveil_t<Args>>()...};
const u64 arg_array[sizeof...(Args) + 1]{fmt_unveil<Args>::get(args)...};
raw_append(out, fmt, type_list, arg_array);
raw_append(out, fmt, type_list, fmt_args_t<Args...>{fmt_unveil<Args>::get(args)...});
}
// Formatting function
@ -308,7 +311,6 @@ namespace fmt
[[noreturn]] SAFE_BUFFERS FORCE_INLINE void throw_exception(const char* fmt, const Args&... args)
{
static constexpr fmt_type_info type_list[sizeof...(Args) + 1]{fmt_type_info::make<fmt_unveil_t<Args>>()...};
const u64 arg_array[sizeof...(Args) + 1]{fmt_unveil<Args>::get(args)...};
raw_throw_exception<T>(fmt, type_list, arg_array);
raw_throw_exception<T>(fmt, type_list, fmt_args_t<Args...>{fmt_unveil<Args>::get(args)...});
}
}