diff --git a/include/fmt/ranges.h b/include/fmt/ranges.h index 86f9e01e5ffa..0009ca43c7c9 100644 --- a/include/fmt/ranges.h +++ b/include/fmt/ranges.h @@ -69,13 +69,13 @@ struct has_member_fn_begin_end_t().begin()), decltype(std::declval().end())>> : std::true_type {}; -// Member function overload +// Member function overloads. template auto range_begin(T&& rng) FMT_DECLTYPE_RETURN(static_cast(rng).begin()); template auto range_end(T&& rng) FMT_DECLTYPE_RETURN(static_cast(rng).end()); -// ADL overload. Only participates in overload resolution if member functions +// ADL overloads. Only participate in overload resolution if member functions // are not found. template auto range_begin(T&& rng) @@ -619,22 +619,6 @@ auto join(It begin, Sentinel end, string_view sep) -> join_view { return {begin, end, sep}; } -namespace detail { -// ADL helpers for fmt::join() -namespace adl { -using std::begin; -using std::end; - -template auto adlbegin(Range& r) -> decltype(begin(r)) { - return begin(r); -} - -template auto adlend(Range& r) -> decltype(end(r)) { - return end(r); -} -} // namespace adl -} // namespace detail - /** \rst Returns a view that formats `range` with elements separated by `sep`. @@ -652,10 +636,10 @@ template auto adlend(Range& r) -> decltype(end(r)) { \endrst */ template -auto join(Range&& range, string_view sep) - -> join_view { - return join(detail::adl::adlbegin(range), detail::adl::adlend(range), sep); +auto join(Range&& r, string_view sep) + -> join_view { + return {detail::range_begin(r), detail::range_end(r), sep}; } template struct tuple_join_view : detail::view { diff --git a/test/ranges-test.cc b/test/ranges-test.cc index db86e4161d90..7905fd49d7a2 100644 --- a/test/ranges-test.cc +++ b/test/ranges-test.cc @@ -462,18 +462,16 @@ TEST(ranges_test, join_range) { } namespace adl { -struct vec : std::vector { - using std::vector::vector; // inherit all constructors +struct vec { + int n[2] = {42, 43}; }; -// ADL-found begin() and end() skip the first and last element -auto begin(vec& v) -> typename vec::iterator { return v.begin() + 1; } -auto end(vec& v) -> typename vec::iterator { return v.end() - 1; } +auto begin(const vec& v) -> const int* { return v.n; } +auto end(const vec& v) -> const int* { return v.n + 2; } } TEST(ranges_test, format_join_adl_begin_end) { - auto v = adl::vec{41, 42, 43, 44}; - EXPECT_EQ(fmt::format("{}", fmt::join(v, "/")), "42/43"); + EXPECT_EQ(fmt::format("{}", fmt::join(adl::vec(), "/")), "42/43"); } #endif // FMT_RANGES_TEST_ENABLE_JOIN