libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
format_frontend_binding_integer.hpp
1#pragma once
2
8namespace ArgumentResolution
9{
10
22[[nodiscard]] consteval ResolvedField ResolveIntegerField(const ParsedField& parsed,
23 bool signed_decimal,
24 bool uses_64bit_storage)
25{
26 if (!Config::enable_integer)
27 {
28 return ResolvedField{.error = Error::ArgumentTypeMismatch};
29 }
30 if (uses_64bit_storage && !Config::enable_integer_64bit)
31 {
32 return ResolvedField{.error = Error::ArgumentTypeMismatch};
33 }
34
35 if (parsed.has_precision)
36 {
37 return ResolvedField{.error = Error::ArgumentTypeMismatch};
38 }
39
40 if (parsed.presentation == 'c')
41 {
42 if (parsed.alternate || HasSignOption(parsed) || parsed.zero_pad)
43 {
44 return ResolvedField{.error = Error::ArgumentTypeMismatch};
45 }
46 return ResolvedField{
47 .field = MakeField(parsed, FormatType::Character, FormatPackKind::Character)};
48 }
49
50 if (IsDefaultOr(parsed.presentation, 'd'))
51 {
52 if (parsed.alternate)
53 {
54 return ResolvedField{.error = Error::ArgumentTypeMismatch};
55 }
56 if (!signed_decimal && HasSignOption(parsed))
57 {
58 return ResolvedField{.error = Error::ArgumentTypeMismatch};
59 }
60
61 if (signed_decimal)
62 {
63 return ResolvedField{
64 .field = MakeField(
65 parsed, uses_64bit_storage ? FormatType::Signed64 : FormatType::Signed32,
66 uses_64bit_storage ? FormatPackKind::I64 : FormatPackKind::I32)};
67 }
68
69 return ResolvedField{
70 .field = MakeField(
71 parsed, uses_64bit_storage ? FormatType::Unsigned64 : FormatType::Unsigned32,
72 uses_64bit_storage ? FormatPackKind::U64 : FormatPackKind::U32)};
73 }
74
75 if (!Config::enable_integer_base8_16 || HasSignOption(parsed))
76 {
77 return ResolvedField{.error = Error::ArgumentTypeMismatch};
78 }
79
80 switch (parsed.presentation)
81 {
82 case 'b':
83 return ResolvedField{
84 .field = MakeField(
85 parsed, uses_64bit_storage ? FormatType::Binary64 : FormatType::Binary32,
86 uses_64bit_storage ? FormatPackKind::U64 : FormatPackKind::U32)};
87 case 'B':
88 return ResolvedField{
89 .field = MakeField(
90 parsed, uses_64bit_storage ? FormatType::Binary64 : FormatType::Binary32,
91 uses_64bit_storage ? FormatPackKind::U64 : FormatPackKind::U32, true)};
92 case 'o':
93 return ResolvedField{
94 .field = MakeField(
95 parsed, uses_64bit_storage ? FormatType::Octal64 : FormatType::Octal32,
96 uses_64bit_storage ? FormatPackKind::U64 : FormatPackKind::U32)};
97 case 'x':
98 return ResolvedField{
99 .field = MakeField(
100 parsed,
101 uses_64bit_storage ? FormatType::HexLower64 : FormatType::HexLower32,
102 uses_64bit_storage ? FormatPackKind::U64 : FormatPackKind::U32)};
103 case 'X':
104 return ResolvedField{
105 .field = MakeField(
106 parsed,
107 uses_64bit_storage ? FormatType::HexUpper64 : FormatType::HexUpper32,
108 uses_64bit_storage ? FormatPackKind::U64 : FormatPackKind::U32, true)};
109 default:
110 return ResolvedField{.error = Error::ArgumentTypeMismatch};
111 }
112}
113
121[[nodiscard]] consteval ResolvedField ResolveBoolField(const ParsedField& parsed)
122{
123 if (parsed.presentation == 0)
124 {
125 return ResolvedField{.error = Error::ArgumentTypeMismatch};
126 }
127 return ResolveIntegerField(parsed, false, false);
128}
129
137[[nodiscard]] consteval ResolvedField ResolveCharacterField(const ParsedField& parsed)
138{
139 if (parsed.presentation != 0 && parsed.presentation != 'c')
140 {
141 return ResolvedField{.error = Error::ArgumentTypeMismatch};
142 }
143 if (parsed.alternate || HasSignOption(parsed) || parsed.zero_pad ||
144 parsed.has_precision)
145 {
146 return ResolvedField{.error = Error::ArgumentTypeMismatch};
147 }
148 if (!Config::enable_text)
149 {
150 return ResolvedField{.error = Error::ArgumentTypeMismatch};
151 }
152
153 ParsedField adjusted = parsed;
154 if (adjusted.align == Align::None)
155 {
156 adjusted.align = Align::Left;
157 }
158
159 return ResolvedField{
160 .field = MakeField(adjusted, FormatType::Character, FormatPackKind::Character)};
161}
162
170[[nodiscard]] consteval ResolvedField ResolveStringField(const ParsedField& parsed)
171{
172 if (parsed.presentation != 0 && parsed.presentation != 's')
173 {
174 return ResolvedField{.error = Error::ArgumentTypeMismatch};
175 }
176 if (parsed.alternate || HasSignOption(parsed) || parsed.zero_pad)
177 {
178 return ResolvedField{.error = Error::ArgumentTypeMismatch};
179 }
180 if (!Config::enable_text)
181 {
182 return ResolvedField{.error = Error::ArgumentTypeMismatch};
183 }
184
185 ParsedField adjusted = parsed;
186 if (adjusted.align == Align::None)
187 {
188 adjusted.align = Align::Left;
189 }
190
191 return ResolvedField{
192 .field = MakeField(adjusted, FormatType::String, FormatPackKind::StringView)};
193}
194
202[[nodiscard]] consteval ResolvedField ResolvePointerField(const ParsedField& parsed)
203{
204 if (parsed.presentation != 0 && parsed.presentation != 'p')
205 {
206 return ResolvedField{.error = Error::ArgumentTypeMismatch};
207 }
208 if (parsed.alternate || HasSignOption(parsed) || parsed.zero_pad ||
209 parsed.has_precision)
210 {
211 return ResolvedField{.error = Error::ArgumentTypeMismatch};
212 }
213 if (!Config::enable_pointer)
214 {
215 return ResolvedField{.error = Error::ArgumentTypeMismatch};
216 }
217
218 return ResolvedField{
219 .field = MakeField(parsed, FormatType::Pointer, FormatPackKind::Pointer)};
220}
221} // namespace ArgumentResolution
brace 前端共享的参数分类与字段形状构造辅助函数 / Shared brace-frontend argument classification and field-shape helpers
constexpr bool HasSignOption(const ParsedField &field)
判断某个已解析字段是否请求了显式符号策略 / Return whether one parsed field requested an explicit sign policy
consteval ResolvedField ResolveIntegerField(const ParsedField &parsed, bool signed_decimal, bool uses_64bit_storage)
针对整数类参数解析一个已解析的 brace 字段 / Resolve one parsed brace field for an integer-like argument
constexpr FormatField MakeField(const ParsedField &parsed, FormatType type, FormatPackKind pack, bool upper_case=false)
根据 brace 字段属性构造一条共享 FormatField 记录 / Build one shared FormatField record from parsed brace-field prop...
consteval ResolvedField ResolveBoolField(const ParsedField &parsed)
针对 bool 参数解析一个已解析的 brace 字段 / Resolve one parsed brace field for a bool argument
consteval ResolvedField ResolvePointerField(const ParsedField &parsed)
针对指针类参数解析一个已解析的 brace 字段 / Resolve one parsed brace field for a pointer-like argument
consteval ResolvedField ResolveCharacterField(const ParsedField &parsed)
针对字符参数解析一个已解析的 brace 字段 / Resolve one parsed brace field for a character argument
consteval ResolvedField ResolveStringField(const ParsedField &parsed)
针对字符串类参数解析一个已解析的 brace 字段 / Resolve one parsed brace field for a string-like argument
constexpr bool IsDefaultOr(char presentation, char expected)
判断展示字符是否缺省或等于目标字符 / Return whether the presentation is absent or matches the expected token