Skip to content

Commit

Permalink
Ranges wide strings support (#2236)
Browse files Browse the repository at this point in the history
* Ranges copy wchar_t

* arg_join formatter not working for wide strings

* Added ranges wide string tests

Co-authored-by: Cristi <[email protected]>
  • Loading branch information
crbrz and Cristi authored Apr 16, 2021
1 parent 24c9751 commit 9260114
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 1 deletion.
2 changes: 1 addition & 1 deletion include/fmt/format.h
Original file line number Diff line number Diff line change
Expand Up @@ -3720,7 +3720,7 @@ struct formatter<arg_join<It, Sentinel, Char>, Char> {
private:
using value_type = typename std::iterator_traits<It>::value_type;
using formatter_type =
conditional_t<has_formatter<value_type, format_context>::value,
conditional_t<has_formatter<value_type, buffer_context<Char>>::value,
formatter<value_type, Char>,
detail::fallback_formatter<value_type, Char>>;

Expand Down
6 changes: 6 additions & 0 deletions include/fmt/ranges.h
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,12 @@ OutputIterator copy(char ch, OutputIterator out) {
return out;
}

template <typename OutputIterator>
OutputIterator copy(wchar_t ch, OutputIterator out) {
*out++ = ch;
return out;
}

/// Return true value if T has std::string interface, like std::string_view.
template <typename T> class is_like_std_string {
template <typename U>
Expand Down
19 changes: 19 additions & 0 deletions test/ranges-test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -224,6 +224,25 @@ TEST(RangesTest, JoinTuple) {
EXPECT_EQ("4", fmt::format("{}", fmt::join(t4, "/")));
}

TEST(RangesTest, WideStringJoinTuple) {
// Value tuple args
std::tuple<wchar_t, int, float> t1 = std::make_tuple('a', 1, 2.0f);
EXPECT_EQ(L"(a, 1, 2)", fmt::format(L"({})", fmt::join(t1, L", ")));

// Testing lvalue tuple args
int x = 4;
std::tuple<wchar_t, int&> t2{'b', x};
EXPECT_EQ(L"b + 4", fmt::format(L"{}", fmt::join(t2, L" + ")));

// Empty tuple
std::tuple<> t3;
EXPECT_EQ(L"", fmt::format(L"{}", fmt::join(t3, L"|")));

// Single element tuple
std::tuple<float> t4{4.0f};
EXPECT_EQ(L"4", fmt::format(L"{}", fmt::join(t4, L"/")));
}

TEST(RangesTest, JoinInitializerList) {
EXPECT_EQ("1, 2, 3", fmt::format("{}", fmt::join({1, 2, 3}, ", ")));
EXPECT_EQ("fmt rocks !",
Expand Down

0 comments on commit 9260114

Please sign in to comment.