libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
printf_frontend_binding_base.hpp
1#pragma once
2
7namespace SourceSyntax
8{
9namespace FieldSelection
10{
11
19[[nodiscard]] constexpr size_t LengthIndex(Length length)
20{
21 return static_cast<size_t>(length);
22}
23
31[[nodiscard]] constexpr bool IsUnsignedType(ValueKind type)
32{
33 switch (type)
34 {
35 case ValueKind::Unsigned:
36 case ValueKind::Binary:
37 case ValueKind::Octal:
38 case ValueKind::HexLower:
39 case ValueKind::HexUpper:
40 return true;
41 default:
42 return false;
43 }
44}
45
53[[nodiscard]] consteval SpecifierDescriptor LookupSpecifier(char token)
54{
55 for (const auto& descriptor : specifiers)
56 {
57 if (descriptor.token == token)
58 {
59 return descriptor;
60 }
61 }
62
63 return {};
64}
65
74[[nodiscard]] constexpr bool TypeEnabled(FeatureGate gate, Length length)
75{
76 switch (gate)
77 {
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);
95 }
96
97 return false;
98}
99
109[[nodiscard]] constexpr bool LengthAllowed(LengthPolicy policy, Length length)
110{
111 switch (policy)
112 {
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;
119 }
120
121 return false;
122}
123
131[[nodiscard]] constexpr FormatArgumentRule RuleFromTable(
132 const std::array<FormatArgumentRule, length_rule_count>& rules, Length length)
133{
134 return rules[LengthIndex(length)];
135}
136
145[[nodiscard]] consteval bool RuleUses64BitStorage(FormatArgumentRule rule)
146{
147 switch (rule)
148 {
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);
169 default:
170 return false;
171 }
172}
173
181[[nodiscard]] constexpr bool UsesDoubleFloatStorage()
182{
183 return Config::enable_float_double;
184}
185} // namespace FieldSelection
186} // namespace SourceSyntax
printf 降级阶段共享的描述表与策略辅助函数 / Shared descriptor-table and policy helpers for printf lowering
单个源级 printf 说明符描述项 / One source-level printf specifier descriptor