mirror of
https://github.com/shadps4-emu/ext-fmt.git
synced 2025-03-03 23:57:18 +00:00
Add a set formatter
This commit is contained in:
parent
121002d700
commit
c882790a2e
@ -19,21 +19,6 @@
|
|||||||
|
|
||||||
FMT_BEGIN_NAMESPACE
|
FMT_BEGIN_NAMESPACE
|
||||||
|
|
||||||
template <typename Char, typename Enable = void> struct formatting_range {
|
|
||||||
#ifdef FMT_DEPRECATED_BRACED_RANGES
|
|
||||||
Char prefix = '{';
|
|
||||||
Char postfix = '}';
|
|
||||||
#else
|
|
||||||
Char prefix = '[';
|
|
||||||
Char postfix = ']';
|
|
||||||
#endif
|
|
||||||
|
|
||||||
template <typename ParseContext>
|
|
||||||
FMT_CONSTEXPR auto parse(ParseContext& ctx) -> decltype(ctx.begin()) {
|
|
||||||
return ctx.begin();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename Char, typename Enable = void> struct formatting_tuple {
|
template <typename Char, typename Enable = void> struct formatting_tuple {
|
||||||
Char prefix = '(';
|
Char prefix = '(';
|
||||||
Char postfix = ')';
|
Char postfix = ')';
|
||||||
@ -87,7 +72,7 @@ template <typename Char>
|
|||||||
struct is_std_string_like<fmt::basic_string_view<Char>> : std::true_type {};
|
struct is_std_string_like<fmt::basic_string_view<Char>> : std::true_type {};
|
||||||
|
|
||||||
template <typename T> class is_map {
|
template <typename T> class is_map {
|
||||||
template <typename U> static auto check(U*) -> typename U::key_type;
|
template <typename U> static auto check(U*) -> typename U::mapped_type;
|
||||||
template <typename> static void check(...);
|
template <typename> static void check(...);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@ -99,6 +84,19 @@ template <typename T> class is_map {
|
|||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template <typename T> class is_set {
|
||||||
|
template <typename U> static auto check(U*) -> typename U::key_type;
|
||||||
|
template <typename> static void check(...);
|
||||||
|
|
||||||
|
public:
|
||||||
|
#ifdef FMT_FORMAT_SET_AS_LIST
|
||||||
|
static FMT_CONSTEXPR_DECL const bool value = false;
|
||||||
|
#else
|
||||||
|
static FMT_CONSTEXPR_DECL const bool value =
|
||||||
|
!std::is_void<decltype(check<T>(nullptr))>::value && !is_map<T>::value;
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
template <typename... Ts> struct conditional_helper {};
|
template <typename... Ts> struct conditional_helper {};
|
||||||
|
|
||||||
template <typename T, typename _ = void> struct is_range_ : std::false_type {};
|
template <typename T, typename _ = void> struct is_range_ : std::false_type {};
|
||||||
@ -602,11 +600,9 @@ struct formatter<
|
|||||||
detail::has_fallback_formatter<detail::value_type<T>, Char>::value)
|
detail::has_fallback_formatter<detail::value_type<T>, Char>::value)
|
||||||
#endif
|
#endif
|
||||||
>> {
|
>> {
|
||||||
formatting_range<Char> formatting;
|
|
||||||
|
|
||||||
template <typename ParseContext>
|
template <typename ParseContext>
|
||||||
FMT_CONSTEXPR auto parse(ParseContext& ctx) -> decltype(ctx.begin()) {
|
FMT_CONSTEXPR auto parse(ParseContext& ctx) -> decltype(ctx.begin()) {
|
||||||
return formatting.parse(ctx);
|
return ctx.begin();
|
||||||
}
|
}
|
||||||
|
|
||||||
template <
|
template <
|
||||||
@ -614,17 +610,26 @@ struct formatter<
|
|||||||
FMT_ENABLE_IF(
|
FMT_ENABLE_IF(
|
||||||
std::is_same<U, conditional_t<detail::has_const_begin_end<T>::value,
|
std::is_same<U, conditional_t<detail::has_const_begin_end<T>::value,
|
||||||
const T, T>>::value)>
|
const T, T>>::value)>
|
||||||
auto format(U& values, FormatContext& ctx) -> decltype(ctx.out()) {
|
auto format(U& range, FormatContext& ctx) -> decltype(ctx.out()) {
|
||||||
auto out = detail::copy(formatting.prefix, ctx.out());
|
#ifdef FMT_DEPRECATED_BRACED_RANGES
|
||||||
size_t i = 0;
|
Char prefix = '{';
|
||||||
auto it = std::begin(values);
|
Char postfix = '}';
|
||||||
auto end = std::end(values);
|
#else
|
||||||
|
Char prefix = detail::is_set<T>::value ? '{' : '[';
|
||||||
|
Char postfix = detail::is_set<T>::value ? '}' : ']';
|
||||||
|
#endif
|
||||||
|
auto out = ctx.out();
|
||||||
|
*out++ = prefix;
|
||||||
|
int i = 0;
|
||||||
|
auto it = std::begin(range);
|
||||||
|
auto end = std::end(range);
|
||||||
for (; it != end; ++it) {
|
for (; it != end; ++it) {
|
||||||
if (i > 0) out = detail::write_delimiter(out);
|
if (i > 0) out = detail::write_delimiter(out);
|
||||||
out = detail::write_range_entry<Char>(out, *it);
|
out = detail::write_range_entry<Char>(out, *it);
|
||||||
++i;
|
++i;
|
||||||
}
|
}
|
||||||
return detail::copy(formatting.postfix, out);
|
*out++ = postfix;
|
||||||
|
return out;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -58,6 +58,11 @@ TEST(ranges_test, format_map) {
|
|||||||
EXPECT_EQ(fmt::format("{}", m), "{\"one\": 1, \"two\": 2}");
|
EXPECT_EQ(fmt::format("{}", m), "{\"one\": 1, \"two\": 2}");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(ranges_test, format_set) {
|
||||||
|
EXPECT_EQ(fmt::format("{}", std::set<std::string>{"one", "two"}),
|
||||||
|
"{\"one\", \"two\"}");
|
||||||
|
}
|
||||||
|
|
||||||
TEST(ranges_test, format_pair) {
|
TEST(ranges_test, format_pair) {
|
||||||
auto p = std::pair<int, float>(42, 1.5f);
|
auto p = std::pair<int, float>(42, 1.5f);
|
||||||
EXPECT_EQ(fmt::format("{}", p), "(42, 1.5)");
|
EXPECT_EQ(fmt::format("{}", p), "(42, 1.5)");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user