libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
printf_frontend_lowering_base.hpp
1#pragma once
2
6namespace SourceSyntax
7{
8namespace FieldSelection
9{
10
17[[nodiscard]] constexpr size_t LengthIndex(Length length)
18{
19 return static_cast<size_t>(length);
20}
21
28[[nodiscard]] constexpr bool IsUnsignedType(ValueKind type)
29{
30 switch (type)
31 {
32 case ValueKind::Unsigned:
33 case ValueKind::Binary:
34 case ValueKind::Octal:
35 case ValueKind::HexLower:
36 case ValueKind::HexUpper:
37 return true;
38 default:
39 return false;
40 }
41}
42
49[[nodiscard]] consteval SpecifierDescriptor LookupSpecifier(char token)
50{
51 for (const auto& descriptor : specifiers)
52 {
53 if (descriptor.token == token)
54 {
55 return descriptor;
56 }
57 }
58
59 return {};
60}
61
68[[nodiscard]] constexpr bool TypeEnabled(FeatureGate gate, Length length)
69{
70 switch (gate)
71 {
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);
89 }
90
91 return false;
92}
93
102[[nodiscard]] constexpr bool LengthAllowed(LengthPolicy policy, Length length)
103{
104 switch (policy)
105 {
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;
112 }
113
114 return false;
115}
116
123[[nodiscard]] constexpr FormatArgumentRule RuleFromTable(
124 const std::array<FormatArgumentRule, length_rule_count>& rules, Length length)
125{
126 return rules[LengthIndex(length)];
127}
128
136[[nodiscard]] consteval bool RuleUses64BitStorage(FormatArgumentRule rule)
137{
138 switch (rule)
139 {
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);
160 default:
161 return false;
162 }
163}
164
171[[nodiscard]] constexpr bool UsesDoubleFloatStorage()
172{
173 return Config::enable_float_double;
174}
175} // namespace FieldSelection
176} // namespace SourceSyntax
printf 降级阶段共享的描述表与策略辅助函数 / Shared descriptor-table and policy helpers for printf lowering
单个源级 printf 说明符描述项 / One source-level printf specifier descriptor