Utils: Move range_adaptor_closure to Utils::ranges

As an implentation of
https://en.cppreference.com/w/cpp/ranges/range_adaptor_closure it makes
it easier to write your own range adapters.

Change-Id: I573d9ca300af7e1cf4225f99f673fa652902e8e3
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
This commit is contained in:
Marco Bubke
2025-05-02 19:11:21 +02:00
parent 8cfecc462e
commit de855b3a79

View File

@@ -226,8 +226,6 @@ public:
template<typename Range> template<typename Range>
cache_latest_view(Range &&) -> cache_latest_view<std::views::all_t<Range>>; cache_latest_view(Range &&) -> cache_latest_view<std::views::all_t<Range>>;
namespace views {
namespace Internal {
template<typename Type> template<typename Type>
concept can_cache_latest = requires { cache_latest_view(std::declval<Type>()); }; concept can_cache_latest = requires { cache_latest_view(std::declval<Type>()); };
@@ -292,9 +290,10 @@ template<RangeAdaptorClosure FirstClosure, RangeAdaptorClosure SecondClosure>
return Internal::pipeable( return Internal::pipeable(
Internal::compose(std::forward<FirstClosure>(second), std::forward<SecondClosure>(first))); Internal::compose(std::forward<FirstClosure>(second), std::forward<SecondClosure>(first)));
} }
} // namespace Internal
struct CacheLatestFunctor : Internal::range_adaptor_closure<CacheLatestFunctor> namespace views {
struct CacheLatestFunctor : range_adaptor_closure<CacheLatestFunctor>
{ {
# if defined(__GNUC__) && !defined(__clang__) && __GNUC__ == 10 && __GNUC_MINOR__ < 5 # if defined(__GNUC__) && !defined(__clang__) && __GNUC__ == 10 && __GNUC_MINOR__ < 5
template<std::ranges::viewable_range Range> template<std::ranges::viewable_range Range>
@@ -304,7 +303,7 @@ struct CacheLatestFunctor : Internal::range_adaptor_closure<CacheLatestFunctor>
} }
# else # else
template<std::ranges::viewable_range Range> template<std::ranges::viewable_range Range>
requires Internal::can_cache_latest<Range> requires can_cache_latest<Range>
constexpr auto operator() [[nodiscard]] (Range &&range) const constexpr auto operator() [[nodiscard]] (Range &&range) const
{ {
return cache_latest_view(std::forward<Range>(range)); return cache_latest_view(std::forward<Range>(range));