From a927dda9bb995acae52d75095def0c240365ff97 Mon Sep 17 00:00:00 2001 From: Orivej Desh Date: Sat, 12 Oct 2019 03:34:56 +0000 Subject: [PATCH] Use words for packed constants --- include/fmt/core.h | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/include/fmt/core.h b/include/fmt/core.h index 60976ca5..4bff089e 100644 --- a/include/fmt/core.h +++ b/include/fmt/core.h @@ -889,7 +889,11 @@ using mapped_type_constant = typename Context::char_type>; // Maximum number of arguments with packed types. -enum { max_packed_args = 12 }; +enum { + packed_arg_bitsize = 5, + packed_arg_mask = (1 << packed_arg_bitsize) - 1, + max_packed_args = 63 / packed_arg_bitsize, +}; enum : unsigned long long { is_unpacked_bit = 1ull << 63 }; template class arg_map; @@ -1052,7 +1056,7 @@ template constexpr unsigned long long encode_types() { return 0; } template constexpr unsigned long long encode_types() { return mapped_type_constant::value | - (encode_types() << 5); + (encode_types() << packed_arg_bitsize); } template @@ -1197,8 +1201,8 @@ template class basic_format_args { bool is_packed() const { return (types_ & internal::is_unpacked_bit) == 0; } internal::type type(int index) const { - int shift = index * 5; - return static_cast((types_ >> shift) & 0x1f); + int shift = index * internal::packed_arg_bitsize; + return static_cast((types_ >> shift) & internal::packed_arg_mask); } friend class internal::arg_map;