Skip to content

Commit

Permalink
implement changes
Browse files Browse the repository at this point in the history
  • Loading branch information
js324 committed Mar 4, 2024
1 parent e36ec04 commit 645fde4
Showing 1 changed file with 32 additions and 37 deletions.
69 changes: 32 additions & 37 deletions include/fmt/ranges.h
Original file line number Diff line number Diff line change
Expand Up @@ -412,66 +412,61 @@ struct range_formatter<
FMT_CONSTEXPR auto parse(ParseContext& ctx) -> decltype(ctx.begin()) {
auto it = ctx.begin();
auto end = ctx.end();
detail::maybe_set_debug_format(underlying_, true);
if (it == end) {
return underlying_.parse(ctx);
}

if (it != end && *it == 'n') {
switch (detail::to_ascii(*it)) {
case 'n':
set_brackets({}, {});
++it;
} else {
bool check_for_s = false;
if (it != end && *it == '?') {
++it;
detail::maybe_set_debug_format(underlying_, true);
set_brackets({}, {});
check_for_s = true;
is_debug = true;
}
if (it != end && *it == 's') {
if (!std::is_same<T, Char>::value) {
report_error("invalid format specifier");
}
if (!is_debug) {
set_brackets(detail::string_literal<Char, '"'>{},
detail::string_literal<Char, '"'>{});
}
check_for_s = false;
is_string_format = true;
++it;
}
if (check_for_s) {
break;
case '?':
is_debug = true;
set_brackets({}, {});
++it;
FMT_FALLTHROUGH;
case 's':
if (it == end || *it != 's' || !std::is_same<T, Char>::value) {
report_error("invalid format specifier");
}
if (!is_debug) {
set_brackets(detail::string_literal<Char, '"'>{},
detail::string_literal<Char, '"'>{});
set_separator({});
detail::maybe_set_debug_format(underlying_, false);
}
is_string_format = true;
++it;
return it;
}

if (it != end && *it != '}') {
if (is_string_format || *it != ':')
report_error("invalid format specifier");
if (*it != ':') report_error("invalid format specifier");
detail::maybe_set_debug_format(underlying_, false);
++it;
} else {
if (!is_string_format) detail::maybe_set_debug_format(underlying_, true);
}

ctx.advance_to(it);
return underlying_.parse(ctx);
}

template <typename Output, typename Iter, typename IterEnd, typename U = T,
enable_if_t<std::is_same<U, Char>::value, bool> = true>
FMT_ENABLE_IF(std::is_same<U, Char>::value)>
auto write_debug_string(Output& out, Iter& it, IterEnd& end) const -> Output {
auto buf = basic_memory_buffer<Char>();
for (; it != end; ++it) {
auto&& item = *it;
buf.push_back(item);
buf.push_back(*it);
}
format_specs spec_str{};
format_specs spec_str;
spec_str.type = presentation_type::debug;
return detail::write<Char>(
out, basic_string_view<Char>(buf.data(), buf.size()), spec_str);
}
template <typename Output, typename Iter, typename IterEnd, typename U = T,
enable_if_t<!(std::is_same<U, Char>::value), bool> = true>
auto write_debug_string(Output& out, Iter& it, IterEnd& end) const -> Output {
detail::ignore_unused(it);
detail::ignore_unused(end);
FMT_ENABLE_IF(!std::is_same<U, Char>::value)>
auto write_debug_string(Output& out, Iter&, IterEnd&) const -> Output {
return out;
}

Expand All @@ -481,14 +476,14 @@ struct range_formatter<
auto out = ctx.out();
auto it = detail::range_begin(range);
auto end = detail::range_end(range);
if (is_string_format && is_debug) {
if (is_debug) {
return write_debug_string(out, it, end);
}

out = detail::copy<Char>(opening_bracket_, out);
int i = 0;
for (; it != end; ++it) {
if (i > 0 && !is_string_format) out = detail::copy<Char>(separator_, out);
if (i > 0) out = detail::copy<Char>(separator_, out);
ctx.advance_to(out);
auto&& item = *it;
out = underlying_.format(mapper.map(item), ctx);
Expand Down

0 comments on commit 645fde4

Please sign in to comment.