17 using Traits = FormatArgument::TypeTraits<Arg>;
18 using Decayed =
typename Traits::Decayed;
19 using Normalized =
typename Traits::Normalized;
21 if constexpr (std::is_same_v<Decayed, bool>)
23 return ArgumentSummary{.kind = ArgumentKind::Bool};
25 else if constexpr (std::is_same_v<Decayed, char>)
27 return ArgumentSummary{.kind = ArgumentKind::Character};
29 else if constexpr (Traits::is_string_like)
31 return ArgumentSummary{.kind = ArgumentKind::String};
33 else if constexpr (Traits::is_pointer_like)
35 return ArgumentSummary{.kind = ArgumentKind::Pointer};
37 else if constexpr (Traits::is_signed_integer)
39 return ArgumentSummary{
40 .kind = ArgumentKind::Signed,
41 .uses_64bit_storage =
sizeof(Normalized) >
sizeof(int32_t),
44 else if constexpr (Traits::is_unsigned_integer)
46 return ArgumentSummary{
47 .kind = ArgumentKind::Unsigned,
48 .uses_64bit_storage =
sizeof(Normalized) >
sizeof(uint32_t),
51 else if constexpr (std::is_same_v<Decayed, float>)
53 return ArgumentSummary{.kind = ArgumentKind::Float32};
55 else if constexpr (std::is_same_v<Decayed, double>)
57 return ArgumentSummary{.kind = ArgumentKind::Float64};
59 else if constexpr (std::is_same_v<Decayed, long double>)
61 return ArgumentSummary{.kind = ArgumentKind::LongDouble};
65 return ArgumentSummary{};