22 #include <type_traits>
24 #include <fmt/ranges.h>
36 template <
typename... Args>
38 using type = fmt::format_string<Args...>;
41 template <
typename R,
typename F>
46 template <
typename R,
typename F>
49 if (std::empty(range)) {
50 fmt::print(
"{} empty\n\n", kind_name);
54 auto unpacker = [fmtstr](
auto... args) -> std::string {
55 return fmt::format(fmtstr, args...);
58 auto formatter = [unpacker, &packing_func](
auto entry) -> std::string {
60 if (!entry.has_value()) {
61 return std::string{
"empty"};
64 return std::apply(unpacker, packing_func(entry));
68 for (
auto entry : range) {
69 fmt::print(
"[{:s}] entry: {:>3} {:s}\n", kind_name, j++, formatter(entry));
typename fmtstr_type_finder< std::invoke_result_t< F, typename R::value_type > >::type fmtstr_type
Definition: deadlock.h:42
Definition: champsim.h:24
void range_print_deadlock(const R &range, std::string kind_name, detail::fmtstr_type< R, F > fmtstr, F &&packing_func)
Definition: deadlock.h:47
constexpr bool is_specialization_v
Definition: type_traits.h:25
fmt::format_string< Args... > type
Definition: deadlock.h:38
Definition: deadlock.h:33