20 using Traits = FormatArgument::TypeTraits<Arg>;
21 using Decayed =
typename Traits::Decayed;
22 using Normalized =
typename Traits::Normalized;
24 if constexpr (std::is_same_v<Decayed, bool>)
26 return ArgumentSummary{.kind = ArgumentKind::Bool};
28 else if constexpr (std::is_same_v<Decayed, char>)
30 return ArgumentSummary{.kind = ArgumentKind::Character};
32 else if constexpr (Traits::is_string_like)
34 return ArgumentSummary{.kind = ArgumentKind::String};
36 else if constexpr (Traits::is_pointer_like)
38 return ArgumentSummary{.kind = ArgumentKind::Pointer};
40 else if constexpr (Traits::is_signed_integer)
42 return ArgumentSummary{
43 .kind = ArgumentKind::Signed,
44 .uses_64bit_storage =
sizeof(Normalized) >
sizeof(int32_t),
47 else if constexpr (Traits::is_unsigned_integer)
49 return ArgumentSummary{
50 .kind = ArgumentKind::Unsigned,
51 .uses_64bit_storage =
sizeof(Normalized) >
sizeof(uint32_t),
54 else if constexpr (std::is_same_v<Decayed, float>)
56 return ArgumentSummary{.kind = ArgumentKind::Float32};
58 else if constexpr (std::is_same_v<Decayed, double>)
60 return ArgumentSummary{.kind = ArgumentKind::Float64};
62 else if constexpr (std::is_same_v<Decayed, long double>)
64 return ArgumentSummary{.kind = ArgumentKind::LongDouble};
68 return ArgumentSummary{};