23 template<
bool IsSigned>
27 static bool fits_in_int(T value)
29 unsigned max = std::numeric_limits<int>::max();
32 static bool fits_in_int(
bool)
42 static bool fits_in_int(T value)
44 return value >= std::numeric_limits<int>::min() && value <= std::numeric_limits<int>::max();
46 static bool fits_in_int(
int)
55 void report_unhandled_arg()
61 int visit_any_int(T value)
63 if (!
IntChecker<std::numeric_limits<T>::is_signed>::fits_in_int(value))
65 return static_cast<int>(value);
74 bool visit_any_int(T value)
94 char visit_pointer(
const void *)
100 char visit_any_int(T)
106 char visit_any_double(T)
111 char visit_unhandled_arg()
117 template<
typename T,
typename U>
139 template<
typename T =
void>
155 void visit_bool(
bool value)
158 visit_any_int(value);
161 void visit_char(
int value)
164 visit_any_int(value);
168 void visit_any_int(U value)
170 bool is_signed = type_ ==
'd' || type_ ==
'i';
173 is_signed = std::numeric_limits<U>::is_signed;
178 if (const_check(
sizeof(TargetType) <=
sizeof(
int)))
183 arg_.type = Arg::INT;
184 arg_.int_value =
static_cast<int>(
static_cast<TargetType
>(value));
188 arg_.type = Arg::UINT;
189 typedef typename internal::MakeUnsigned<TargetType>::Type Unsigned;
190 arg_.uint_value =
static_cast<unsigned>(
static_cast<Unsigned
>(value));
197 arg_.type = Arg::LONG_LONG;
201 arg_.long_long_value =
static_cast<LongLong
>(value);
205 arg_.type = Arg::ULONG_LONG;
206 arg_.ulong_long_value =
static_cast<typename internal::MakeUnsigned<U>::Type
>(value);
227 void visit_any_int(T value)
229 arg_.type = internal::Arg::CHAR;
230 arg_.int_value =
static_cast<char>(value);
249 void report_unhandled_arg()
255 unsigned visit_any_int(T value)
258 UnsignedType width =
static_cast<UnsignedType
>(value);
259 if (internal::is_negative(value))
261 spec_.align_ = ALIGN_LEFT;
264 unsigned int_max = std::numeric_limits<int>::max();
267 return static_cast<unsigned>(width);
289 template<
typename Impl,
typename Char,
typename Spec>
293 void write_null_pointer()
295 this->spec().type_ = 0;
296 this->write(
"(nil)");
310 : internal::ArgFormatterBase<Impl, Char, Spec>(w, s)
317 Spec &fmt_spec = this->spec();
318 if (fmt_spec.type_ !=
's')
319 return this->visit_any_int(value);
327 const Spec &fmt_spec = this->spec();
329 if (fmt_spec.type_ && fmt_spec.type_ !=
'c')
330 w.write_int(value, fmt_spec);
331 typedef typename BasicWriter<Char>::CharPtr CharPtr;
332 CharPtr out = CharPtr();
333 if (fmt_spec.width_ > 1)
336 out = w.grow_buffer(fmt_spec.width_);
337 if (fmt_spec.align_ != ALIGN_LEFT)
339 std::fill_n(out, fmt_spec.width_ - 1, fill);
340 out += fmt_spec.width_ - 1;
344 std::fill_n(out + 1, fmt_spec.width_ - 1, fill);
349 out = w.grow_buffer(1);
351 *out =
static_cast<Char
>(value);
358 Base::visit_cstring(value);
359 else if (this->spec().type_ ==
'p')
360 write_null_pointer();
362 this->write(
"(null)");
369 return Base::visit_pointer(value);
370 this->spec().type_ = 0;
371 write_null_pointer();
378 const Char format_str[] = {
'}', 0};
379 const Char *format = format_str;
380 c.format(&formatter, c.value, &format);
385 template<
typename Char>
397 template<
typename Char,
typename ArgFormatter = Pr
intfArgFormatter<Char>>
403 void parse_flags(
FormatSpec &spec,
const Char *&s);
407 internal::Arg get_arg(
const Char *s,
unsigned arg_index = (std::numeric_limits<unsigned>::max)());
410 unsigned parse_header(
const Char *&s,
FormatSpec &spec);
430 template<
typename Char,
typename AF>
438 spec.align_ = ALIGN_LEFT;
441 spec.flags_ |= SIGN_FLAG | PLUS_FLAG;
447 spec.flags_ |= SIGN_FLAG;
450 spec.flags_ |= HASH_FLAG;
459 template<
typename Char,
typename AF>
463 const char *error = FMT_NULL;
464 internal::Arg arg = arg_index == std::numeric_limits<unsigned>::max() ? next_arg(error) : FormatterBase::get_arg(arg_index - 1, error);
466 FMT_THROW(
FormatError(!*s ?
"invalid format string" : error));
470 template<
typename Char,
typename AF>
473 unsigned arg_index = std::numeric_limits<unsigned>::max();
475 if (c >=
'0' && c <=
'9')
479 unsigned value = internal::parse_nonnegative_int(s);
498 parse_flags(spec, s);
500 if (*s >=
'0' && *s <=
'9')
502 spec.width_ = internal::parse_nonnegative_int(s);
512 template<
typename Char,
typename AF>
515 const Char *start = format_str.
c_str();
516 const Char *s = start;
524 write(writer_, start, s);
528 write(writer_, start, s - 1);
531 spec.align_ = ALIGN_RIGHT;
534 unsigned arg_index = parse_header(s, spec);
540 if (
'0' <= *s && *s <=
'9')
542 spec.precision_ =
static_cast<int>(internal::parse_nonnegative_int(s));
556 Arg arg = get_arg(s, arg_index);
558 spec.flags_ &= ~internal::to_unsigned<int>(HASH_FLAG);
559 if (spec.fill_ ==
'0')
561 if (arg.type <= Arg::LAST_NUMERIC_TYPE)
562 spec.align_ = ALIGN_NUMERIC;
573 ArgConverter<signed char>(arg, *++s).visit(arg);
575 ArgConverter<short>(arg, *s).visit(arg);
579 ArgConverter<fmt::LongLong>(arg, *++s).visit(arg);
581 ArgConverter<long>(arg, *s).visit(arg);
584 ArgConverter<intmax_t>(arg, *s).visit(arg);
587 ArgConverter<std::size_t>(arg, *s).visit(arg);
590 ArgConverter<std::ptrdiff_t>(arg, *s).visit(arg);
598 ArgConverter<void>(arg, *s).visit(arg);
604 spec.type_ =
static_cast<char>(*s++);
606 if (spec.type_ ==
's')
612 if (arg.type <= Arg::LAST_INTEGER_TYPE)
631 AF(writer_, spec).visit(arg);
633 write(writer_, start, s);
660 printf(w, format, args);
663 FMT_VARIADIC(std::string, sprintf,
CStringRef)
668 printf(w, format, args);
683 FMT_VARIADIC(
int, fprintf, std::FILE *,
CStringRef)
696 return fprintf(stdout, format, args);
712 printf(w, format_str, args);
713 internal::write(os, w);
714 return static_cast<int>(w.
size());
716 FMT_VARIADIC(
int, fprintf, std::ostream &,
CStringRef)
719 #ifdef FMT_HEADER_ONLY 723 #endif // FMT_PRINTF_H_
Definition: format.h:1876
Definition: format.h:1136
Definition: format.h:1360
Definition: format.h:1408
Definition: format.h:1994
std::size_t size() const
Definition: format.h:3271
const Char * c_str() const
Definition: format.h:729
std::basic_string< Char > str() const
Definition: format.h:3302
Definition: format.h:3924
Result visit(const Arg &arg)
Definition: format.h:2108
Definition: format.h:1517