Skip to content

Commit

Permalink
Remove range_default_formatter
Browse files Browse the repository at this point in the history
  • Loading branch information
vitaut committed May 4, 2024
1 parent 19afc9c commit ceb406d
Showing 1 changed file with 49 additions and 58 deletions.
107 changes: 49 additions & 58 deletions include/fmt/ranges.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@

FMT_BEGIN_NAMESPACE

enum class range_format { disabled, map, set, sequence, string, debug_string };

namespace detail {

template <typename T> class is_map {
Expand Down Expand Up @@ -248,6 +250,18 @@ FMT_CONSTEXPR auto maybe_set_debug_format(Formatter& f, bool set)
template <typename Formatter>
FMT_CONSTEXPR void maybe_set_debug_format(Formatter&, ...) {}

template <typename T>
struct range_format_kind_
: std::integral_constant<range_format,
std::is_same<uncvref_type<T>, T>::value
? range_format::disabled
: is_map<T>::value ? range_format::map
: is_set<T>::value ? range_format::set
: range_format::sequence> {};

template <range_format K>
using range_format_constant = std::integral_constant<range_format, K>;

// These are not generic lambdas for compatibility with C++11.
template <typename ParseContext> struct parse_empty_specs {
template <typename Formatter> FMT_CONSTEXPR void operator()(Formatter& f) {
Expand Down Expand Up @@ -487,82 +501,59 @@ struct range_formatter<
}
};

enum class range_format { disabled, map, set, sequence, string, debug_string };

namespace detail {
template <typename T>
struct range_format_kind_
: std::integral_constant<range_format,
std::is_same<uncvref_type<T>, T>::value
? range_format::disabled
: is_map<T>::value ? range_format::map
: is_set<T>::value ? range_format::set
: range_format::sequence> {};

template <range_format K, typename R, typename Char, typename Enable = void>
struct range_default_formatter;

template <range_format K>
using range_format_constant = std::integral_constant<range_format, K>;
template <typename T, typename Char, typename Enable = void>
struct range_format_kind
: conditional_t<
is_range<T, Char>::value, detail::range_format_kind_<T>,
std::integral_constant<range_format, range_format::disabled>> {};

template <range_format K, typename R, typename Char>
struct range_default_formatter<
K, R, Char,
enable_if_t<(K == range_format::sequence || K == range_format::map ||
K == range_format::set)>> {
template <typename R, typename Char>
struct formatter<
R, Char,
enable_if_t<conjunction<bool_constant<range_format_kind<R, Char>::value !=
range_format::disabled>
// Workaround a bug in MSVC 2015 and earlier.
#if !FMT_MSC_VERSION || FMT_MSC_VERSION >= 1910
,
detail::is_formattable_delayed<R, Char>
#endif
>::value>> {
private:
using range_type = detail::maybe_const_range<R>;
range_formatter<detail::uncvref_type<range_type>, Char> underlying_;

FMT_CONSTEXPR range_default_formatter() { init(range_format_constant<K>()); }
range_formatter<detail::uncvref_type<range_type>, Char> range_formatter_;

FMT_CONSTEXPR void init(range_format_constant<range_format::set>) {
underlying_.set_brackets(detail::string_literal<Char, '{'>{},
detail::string_literal<Char, '}'>{});
FMT_CONSTEXPR void init(detail::range_format_constant<range_format::set>) {
range_formatter_.set_brackets(detail::string_literal<Char, '{'>{},
detail::string_literal<Char, '}'>{});
}

FMT_CONSTEXPR void init(range_format_constant<range_format::map>) {
underlying_.set_brackets(detail::string_literal<Char, '{'>{},
detail::string_literal<Char, '}'>{});
underlying_.underlying().set_brackets({}, {});
underlying_.underlying().set_separator(
FMT_CONSTEXPR void init(detail::range_format_constant<range_format::map>) {
range_formatter_.set_brackets(detail::string_literal<Char, '{'>{},
detail::string_literal<Char, '}'>{});
range_formatter_.underlying().set_brackets({}, {});
range_formatter_.underlying().set_separator(
detail::string_literal<Char, ':', ' '>{});
}

FMT_CONSTEXPR void init(range_format_constant<range_format::sequence>) {}
FMT_CONSTEXPR void init(
detail::range_format_constant<range_format::sequence>) {}

public:
FMT_CONSTEXPR formatter() {
init(detail::range_format_constant<range_format_kind<R, Char>::value>());
}

template <typename ParseContext>
FMT_CONSTEXPR auto parse(ParseContext& ctx) -> decltype(ctx.begin()) {
return underlying_.parse(ctx);
return range_formatter_.parse(ctx);
}

template <typename FormatContext>
auto format(range_type& range, FormatContext& ctx) const
-> decltype(ctx.out()) {
return underlying_.format(range, ctx);
return range_formatter_.format(range, ctx);
}
};
} // namespace detail

template <typename T, typename Char, typename Enable = void>
struct range_format_kind
: conditional_t<
is_range<T, Char>::value, detail::range_format_kind_<T>,
std::integral_constant<range_format, range_format::disabled>> {};

template <typename R, typename Char>
struct formatter<
R, Char,
enable_if_t<conjunction<bool_constant<range_format_kind<R, Char>::value !=
range_format::disabled>
// Workaround a bug in MSVC 2015 and earlier.
#if !FMT_MSC_VERSION || FMT_MSC_VERSION >= 1910
,
detail::is_formattable_delayed<R, Char>
#endif
>::value>>
: detail::range_default_formatter<range_format_kind<R, Char>::value, R,
Char> {
};

template <typename It, typename Sentinel, typename Char = char>
struct join_view : detail::view {
Expand Down

0 comments on commit ceb406d

Please sign in to comment.