8namespace FieldSelection
17[[nodiscard]]
constexpr size_t LengthIndex(Length length)
19 return static_cast<size_t>(length);
28[[nodiscard]]
constexpr bool IsUnsignedType(ValueKind type)
32 case ValueKind::Unsigned:
33 case ValueKind::Binary:
34 case ValueKind::Octal:
35 case ValueKind::HexLower:
36 case ValueKind::HexUpper:
51 for (
const auto& descriptor : specifiers)
53 if (descriptor.token == token)
68[[nodiscard]]
constexpr bool TypeEnabled(FeatureGate gate, Length length)
72 case FeatureGate::Integer:
73 return Config::enable_integer;
74 case FeatureGate::IntegerBase8_16:
75 return Config::enable_integer_base8_16;
76 case FeatureGate::Pointer:
77 return Config::enable_pointer;
78 case FeatureGate::Text:
79 return Config::enable_text;
80 case FeatureGate::FloatFixed:
81 return Config::enable_float_fixed &&
82 (length != Length::LongDouble || Config::enable_float_long_double);
83 case FeatureGate::FloatScientific:
84 return Config::enable_float_scientific &&
85 (length != Length::LongDouble || Config::enable_float_long_double);
86 case FeatureGate::FloatGeneral:
87 return Config::enable_float_general &&
88 (length != Length::LongDouble || Config::enable_float_long_double);
102[[nodiscard]]
constexpr bool LengthAllowed(LengthPolicy policy, Length length)
106 case LengthPolicy::Integer:
107 return length != Length::LongDouble;
108 case LengthPolicy::NoneOnly:
109 return length == Length::Default;
110 case LengthPolicy::Float:
111 return length == Length::Default || length == Length::LongDouble;
123[[nodiscard]]
constexpr FormatArgumentRule RuleFromTable(
124 const std::array<FormatArgumentRule, length_rule_count>& rules, Length length)
126 return rules[LengthIndex(length)];
136[[nodiscard]]
consteval bool RuleUses64BitStorage(FormatArgumentRule rule)
140 case FormatArgumentRule::SignedLong:
141 return sizeof(long) >
sizeof(int32_t);
142 case FormatArgumentRule::SignedLongLong:
143 return sizeof(
long long) >
sizeof(int32_t);
144 case FormatArgumentRule::SignedIntMax:
145 return sizeof(intmax_t) >
sizeof(int32_t);
146 case FormatArgumentRule::SignedSize:
147 return sizeof(std::make_signed_t<size_t>) >
sizeof(int32_t);
148 case FormatArgumentRule::SignedPtrDiff:
149 return sizeof(ptrdiff_t) >
sizeof(int32_t);
150 case FormatArgumentRule::UnsignedLong:
151 return sizeof(
unsigned long) >
sizeof(uint32_t);
152 case FormatArgumentRule::UnsignedLongLong:
153 return sizeof(
unsigned long long) >
sizeof(uint32_t);
154 case FormatArgumentRule::UnsignedIntMax:
155 return sizeof(uintmax_t) >
sizeof(uint32_t);
156 case FormatArgumentRule::UnsignedSize:
157 return sizeof(size_t) >
sizeof(uint32_t);
158 case FormatArgumentRule::UnsignedPtrDiff:
159 return sizeof(std::make_unsigned_t<ptrdiff_t>) >
sizeof(uint32_t);
171[[nodiscard]]
constexpr bool UsesDoubleFloatStorage()
173 return Config::enable_float_double;
printf 降级阶段共享的描述表与策略辅助函数 / Shared descriptor-table and policy helpers for printf lowering
单个源级 printf 说明符描述项 / One source-level printf specifier descriptor