@@ -123,6 +123,8 @@ struct _Dynamic_format_specs : _Basic_format_specs<_CharT> {
123
123
int _Dynamic_precision_index = -1 ;
124
124
};
125
125
126
+ [[noreturn]] inline void _Throw_format_error (const char * _Message);
127
+
126
128
_EXPORT_STD template <class _CharT >
127
129
class basic_format_parse_context ;
128
130
@@ -398,6 +400,45 @@ constexpr bool enable_nonlocking_formatter_optimization<pair<_Ty1, _Ty2>> =
398
400
template <class ... _Ts>
399
401
constexpr bool enable_nonlocking_formatter_optimization<tuple<_Ts...>> =
400
402
(enable_nonlocking_formatter_optimization<_Ts> && ...);
403
+
404
+ template <class _CharT >
405
+ struct _Fill_align_and_width_specs {
406
+ int _Width = -1 ;
407
+ int _Dynamic_width_index = -1 ;
408
+ _Fmt_align _Alignment = _Fmt_align::_None;
409
+ uint8_t _Fill_length = 1 ;
410
+ // At most one codepoint (so one char32_t or four utf-8 char8_t).
411
+ _CharT _Fill[4 / sizeof (_CharT)]{' ' };
412
+ };
413
+
414
+ // TRANSITION, VSO-1236041: Avoid declaring and defining member functions in different headers.
415
+ template <class _CharT , class _Pc >
416
+ _NODISCARD constexpr _Pc::iterator _Fill_align_and_width_formatter_parse (
417
+ _Fill_align_and_width_specs<_CharT>& _Specs, _Pc& _Parse_ctx);
418
+
419
+ template <class _CharT , class _FormatContext , class _Func >
420
+ _NODISCARD _FormatContext::iterator _Fill_align_and_width_formatter_format (
421
+ const _Fill_align_and_width_specs<_CharT>& _Specs, _FormatContext& _Format_ctx, int _Width,
422
+ _Fmt_align _Default_align, _Func&& _Fn);
423
+
424
+ template <class _CharT >
425
+ struct _Fill_align_and_width_formatter {
426
+ public:
427
+ template <class _ParseContext = basic_format_parse_context<_CharT>> // improves throughput, see GH-5003
428
+ _NODISCARD constexpr _ParseContext::iterator _Parse (type_identity_t <_ParseContext&> _Parse_ctx) {
429
+ return _STD _Fill_align_and_width_formatter_parse (_Specs, _Parse_ctx);
430
+ }
431
+
432
+ template <class _FormatContext , class _Func >
433
+ _NODISCARD constexpr auto _Format (
434
+ _FormatContext& _Format_ctx, const int _Width, _Fmt_align _Default_align, _Func&& _Fn) const {
435
+ return _STD _Fill_align_and_width_formatter_format (
436
+ _Specs, _Format_ctx, _Width, _Default_align, _STD forward<_Func>(_Fn));
437
+ }
438
+
439
+ private:
440
+ _Fill_align_and_width_specs<_CharT> _Specs;
441
+ };
401
442
#endif // _HAS_CXX23
402
443
_STD_END
403
444
0 commit comments