9namespace FieldSelection
19[[nodiscard]]
constexpr size_t LengthIndex(Length length)
21 return static_cast<size_t>(length);
31[[nodiscard]]
constexpr bool IsUnsignedType(ValueKind type)
35 case ValueKind::Unsigned:
36 case ValueKind::Binary:
37 case ValueKind::Octal:
38 case ValueKind::HexLower:
39 case ValueKind::HexUpper:
55 for (
const auto& descriptor : specifiers)
57 if (descriptor.token == token)
74[[nodiscard]]
constexpr bool TypeEnabled(FeatureGate gate, Length length)
78 case FeatureGate::Integer:
79 return Config::enable_integer;
80 case FeatureGate::IntegerBase8_16:
81 return Config::enable_integer_base8_16;
82 case FeatureGate::Pointer:
83 return Config::enable_pointer;
84 case FeatureGate::Text:
85 return Config::enable_text;
86 case FeatureGate::FloatFixed:
87 return Config::enable_float_fixed &&
88 (length != Length::LongDouble || Config::enable_float_long_double);
89 case FeatureGate::FloatScientific:
90 return Config::enable_float_scientific &&
91 (length != Length::LongDouble || Config::enable_float_long_double);
92 case FeatureGate::FloatGeneral:
93 return Config::enable_float_general &&
94 (length != Length::LongDouble || Config::enable_float_long_double);
109[[nodiscard]]
constexpr bool LengthAllowed(LengthPolicy policy, Length length)
113 case LengthPolicy::Integer:
114 return length != Length::LongDouble;
115 case LengthPolicy::NoneOnly:
116 return length == Length::Default;
117 case LengthPolicy::Float:
118 return length == Length::Default || length == Length::LongDouble;
131[[nodiscard]]
constexpr FormatArgumentRule RuleFromTable(
132 const std::array<FormatArgumentRule, length_rule_count>& rules, Length length)
134 return rules[LengthIndex(length)];
145[[nodiscard]]
consteval bool RuleUses64BitStorage(FormatArgumentRule rule)
149 case FormatArgumentRule::SignedLong:
150 return sizeof(long) >
sizeof(int32_t);
151 case FormatArgumentRule::SignedLongLong:
152 return sizeof(
long long) >
sizeof(int32_t);
153 case FormatArgumentRule::SignedIntMax:
154 return sizeof(intmax_t) >
sizeof(int32_t);
155 case FormatArgumentRule::SignedSize:
156 return sizeof(std::make_signed_t<size_t>) >
sizeof(int32_t);
157 case FormatArgumentRule::SignedPtrDiff:
158 return sizeof(ptrdiff_t) >
sizeof(int32_t);
159 case FormatArgumentRule::UnsignedLong:
160 return sizeof(
unsigned long) >
sizeof(uint32_t);
161 case FormatArgumentRule::UnsignedLongLong:
162 return sizeof(
unsigned long long) >
sizeof(uint32_t);
163 case FormatArgumentRule::UnsignedIntMax:
164 return sizeof(uintmax_t) >
sizeof(uint32_t);
165 case FormatArgumentRule::UnsignedSize:
166 return sizeof(size_t) >
sizeof(uint32_t);
167 case FormatArgumentRule::UnsignedPtrDiff:
168 return sizeof(std::make_unsigned_t<ptrdiff_t>) >
sizeof(uint32_t);
181[[nodiscard]]
constexpr bool UsesDoubleFloatStorage()
183 return Config::enable_float_double;
printf 降级阶段共享的描述表与策略辅助函数 / Shared descriptor-table and policy helpers for printf lowering
单个源级 printf 说明符描述项 / One source-level printf specifier descriptor