libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
format_frontend_binding_integer.hpp
1#pragma once
2
6namespace ArgumentResolution
7{
8
16[[nodiscard]] consteval ResolvedField ResolveIntegerField(const ParsedField& parsed,
17 bool signed_decimal,
18 bool uses_64bit_storage)
19{
20 if (!Config::enable_integer)
21 {
22 return ResolvedField{.error = Error::ArgumentTypeMismatch};
23 }
24 if (uses_64bit_storage && !Config::enable_integer_64bit)
25 {
26 return ResolvedField{.error = Error::ArgumentTypeMismatch};
27 }
28
29 if (parsed.has_precision)
30 {
31 return ResolvedField{.error = Error::ArgumentTypeMismatch};
32 }
33
34 if (parsed.presentation == 'c')
35 {
36 if (parsed.alternate || HasSignOption(parsed) || parsed.zero_pad)
37 {
38 return ResolvedField{.error = Error::ArgumentTypeMismatch};
39 }
40 return ResolvedField{.field = MakeField(parsed, FormatType::Character,
41 FormatPackKind::Character)};
42 }
43
44 if (IsDefaultOr(parsed.presentation, 'd'))
45 {
46 if (parsed.alternate)
47 {
48 return ResolvedField{.error = Error::ArgumentTypeMismatch};
49 }
50 if (!signed_decimal && HasSignOption(parsed))
51 {
52 return ResolvedField{.error = Error::ArgumentTypeMismatch};
53 }
54
55 if (signed_decimal)
56 {
57 return ResolvedField{.field = MakeField(
58 parsed,
59 uses_64bit_storage ? FormatType::Signed64
60 : FormatType::Signed32,
61 uses_64bit_storage ? FormatPackKind::I64
62 : FormatPackKind::I32)};
63 }
64
65 return ResolvedField{.field = MakeField(
66 parsed,
67 uses_64bit_storage ? FormatType::Unsigned64
68 : FormatType::Unsigned32,
69 uses_64bit_storage ? FormatPackKind::U64
70 : FormatPackKind::U32)};
71 }
72
73 if (!Config::enable_integer_base8_16 || HasSignOption(parsed))
74 {
75 return ResolvedField{.error = Error::ArgumentTypeMismatch};
76 }
77
78 switch (parsed.presentation)
79 {
80 case 'b':
81 return ResolvedField{.field = MakeField(
82 parsed,
83 uses_64bit_storage ? FormatType::Binary64
84 : FormatType::Binary32,
85 uses_64bit_storage ? FormatPackKind::U64
86 : FormatPackKind::U32)};
87 case 'B':
88 return ResolvedField{.field = MakeField(
89 parsed,
90 uses_64bit_storage ? FormatType::Binary64
91 : FormatType::Binary32,
92 uses_64bit_storage ? FormatPackKind::U64
93 : FormatPackKind::U32,
94 true)};
95 case 'o':
96 return ResolvedField{.field = MakeField(
97 parsed,
98 uses_64bit_storage ? FormatType::Octal64
99 : FormatType::Octal32,
100 uses_64bit_storage ? FormatPackKind::U64
101 : FormatPackKind::U32)};
102 case 'x':
103 return ResolvedField{.field = MakeField(
104 parsed,
105 uses_64bit_storage ? FormatType::HexLower64
106 : FormatType::HexLower32,
107 uses_64bit_storage ? FormatPackKind::U64
108 : FormatPackKind::U32)};
109 case 'X':
110 return ResolvedField{.field = MakeField(
111 parsed,
112 uses_64bit_storage ? FormatType::HexUpper64
113 : FormatType::HexUpper32,
114 uses_64bit_storage ? FormatPackKind::U64
115 : FormatPackKind::U32,
116 true)};
117 default:
118 return ResolvedField{.error = Error::ArgumentTypeMismatch};
119 }
120}
121
127[[nodiscard]] consteval ResolvedField ResolveBoolField(const ParsedField& parsed)
128{
129 if (parsed.presentation == 0)
130 {
131 return ResolvedField{.error = Error::ArgumentTypeMismatch};
132 }
133 return ResolveIntegerField(parsed, false, false);
134}
135
141[[nodiscard]] consteval ResolvedField ResolveCharacterField(const ParsedField& parsed)
142{
143 if (parsed.presentation != 0 && parsed.presentation != 'c')
144 {
145 return ResolvedField{.error = Error::ArgumentTypeMismatch};
146 }
147 if (parsed.alternate || HasSignOption(parsed) || parsed.zero_pad || parsed.has_precision)
148 {
149 return ResolvedField{.error = Error::ArgumentTypeMismatch};
150 }
151 if (!Config::enable_text)
152 {
153 return ResolvedField{.error = Error::ArgumentTypeMismatch};
154 }
155
156 ParsedField adjusted = parsed;
157 if (adjusted.align == Align::None)
158 {
159 adjusted.align = Align::Left;
160 }
161
162 return ResolvedField{
163 .field = MakeField(adjusted, FormatType::Character, FormatPackKind::Character)};
164}
165
171[[nodiscard]] consteval ResolvedField ResolveStringField(const ParsedField& parsed)
172{
173 if (parsed.presentation != 0 && parsed.presentation != 's')
174 {
175 return ResolvedField{.error = Error::ArgumentTypeMismatch};
176 }
177 if (parsed.alternate || HasSignOption(parsed) || parsed.zero_pad)
178 {
179 return ResolvedField{.error = Error::ArgumentTypeMismatch};
180 }
181 if (!Config::enable_text)
182 {
183 return ResolvedField{.error = Error::ArgumentTypeMismatch};
184 }
185
186 ParsedField adjusted = parsed;
187 if (adjusted.align == Align::None)
188 {
189 adjusted.align = Align::Left;
190 }
191
192 return ResolvedField{
193 .field = MakeField(adjusted, FormatType::String, FormatPackKind::StringView)};
194}
195
201[[nodiscard]] consteval ResolvedField ResolvePointerField(const ParsedField& parsed)
202{
203 if (parsed.presentation != 0 && parsed.presentation != 'p')
204 {
205 return ResolvedField{.error = Error::ArgumentTypeMismatch};
206 }
207 if (parsed.alternate || HasSignOption(parsed) || parsed.zero_pad || parsed.has_precision)
208 {
209 return ResolvedField{.error = Error::ArgumentTypeMismatch};
210 }
211 if (!Config::enable_pointer)
212 {
213 return ResolvedField{.error = Error::ArgumentTypeMismatch};
214 }
215
216 return ResolvedField{
217 .field = MakeField(parsed, FormatType::Pointer, FormatPackKind::Pointer)};
218}
219} // 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