12template <OutputSink Sink, FormatProfile Profile>
15 return sink_.Write(text);
24template <OutputSink Sink, FormatProfile Profile>
28 std::memset(chunk, fill,
sizeof(chunk));
32 size_t step = (count <
sizeof(chunk)) ? count :
sizeof(chunk);
33 auto ec = WriteRaw(std::string_view(chunk, step));
34 if (ec != ErrorCode::OK)
50template <OutputSink Sink, FormatProfile Profile>
54 size_t pad = FieldPadding(spec.width, text.size());
61 else if (spec.CenterAlign())
64 right_pad = pad - left_pad;
71 if (
auto ec = WritePadding(spec.fill, left_pad); ec != ErrorCode::OK)
75 if (
auto ec = WriteRaw(text); ec != ErrorCode::OK)
79 return WritePadding(spec.fill, right_pad);
90template <OutputSink Sink, FormatProfile Profile>
92 char sign_char, std::string_view prefix, std::string_view digits,
const Spec& spec)
94 auto write_char = [
this](
char ch) -> ErrorCode {
99 return WriteRaw(std::string_view(&ch, 1));
101 auto write_text = [
this](std::string_view text) -> ErrorCode {
104 return ErrorCode::OK;
106 return WriteRaw(text);
109 size_t zeros = IntegerPrecisionZeros(spec, digits.size());
110 size_t total = digits.size() + zeros + prefix.size() +
111 static_cast<size_t>(sign_char !=
'\0');
112 size_t pad = FieldPadding(spec.width, total);
113 bool zero_fill = spec.ZeroPad() && !spec.LeftAlign() && !spec.CenterAlign() &&
114 !spec.HasPrecision();
116 size_t middle_zeros = zero_fill ? pad : 0;
117 size_t right_pad = 0;
120 if (spec.LeftAlign())
124 else if (spec.CenterAlign())
127 right_pad = pad - left_pad;
135 if (
auto ec = WritePadding(spec.fill, left_pad); ec != ErrorCode::OK)
139 if (
auto ec = write_char(sign_char); ec != ErrorCode::OK)
143 if (
auto ec = write_text(prefix); ec != ErrorCode::OK)
147 if (
auto ec = WritePadding(
'0', middle_zeros); ec != ErrorCode::OK)
151 if (
auto ec = WritePadding(
'0', zeros); ec != ErrorCode::OK)
155 if (
auto ec = write_text(digits); ec != ErrorCode::OK)
159 return WritePadding(spec.fill, right_pad);
169template <OutputSink Sink, FormatProfile Profile>
171 std::string_view text,
174 auto write_char = [
this](
char ch) -> ErrorCode {
177 return ErrorCode::OK;
179 return WriteRaw(std::string_view(&ch, 1));
182 size_t total = text.size() +
static_cast<size_t>(sign_char !=
'\0');
183 size_t pad = FieldPadding(spec.width, total);
184 bool zero_fill = spec.ZeroPad() && !spec.LeftAlign() && !spec.CenterAlign();
186 size_t middle_zeros = zero_fill ? pad : 0;
187 size_t right_pad = 0;
190 if (spec.LeftAlign())
194 else if (spec.CenterAlign())
197 right_pad = pad - left_pad;
205 if (
auto ec = WritePadding(spec.fill, left_pad); ec != ErrorCode::OK)
209 if (
auto ec = write_char(sign_char); ec != ErrorCode::OK)
213 if (
auto ec = WritePadding(
'0', middle_zeros); ec != ErrorCode::OK)
217 if (
auto ec = WriteRaw(text); ec != ErrorCode::OK)
221 return WritePadding(spec.fill, right_pad);
ErrorCode WriteRaw(std::string_view text)
运行期执行器共享的字段写出原语,供所有操作码路径复用 / Executor-side field-writing primitives shared by all runtime opcodes
ErrorCode WriteTextField(std::string_view text, const Spec &spec)
按宽度与对齐策略写出一个文本字段 / Write one text field with width/alignment policy applied
ErrorCode WriteIntegerField(char sign_char, std::string_view prefix, std::string_view digits, const Spec &spec)
按符号、前缀、精度与填充策略写出一个整数载荷 / Write one integer payload with sign, prefix, precision, and padding policy a...
ErrorCode WriteFloatField(char sign_char, std::string_view text, const Spec &spec)
按符号与字段填充策略写出一个浮点文本载荷 / Write one float text payload with sign and field padding applied
ErrorCode WritePadding(char fill, size_t count)
向输出端写入重复填充字符 / Write repeated fill characters into the sink