summaryrefslogtreecommitdiff
path: root/src/ranges.hh
diff options
context:
space:
mode:
authorMaxime Coste <mawww@kakoune.org>2021-11-21 11:15:08 +1100
committerMaxime Coste <mawww@kakoune.org>2021-11-21 11:41:50 +1100
commit91550639bbbd20c92957b83abfbb3ec4c43b3ab4 (patch)
tree6559c52e84e7e1abef540cf0636f322c1e5acbea /src/ranges.hh
parentcd2172eed6dd7aca7c24972e4dac0258e19c070b (diff)
More C++20 refactorings
Use CTAD instead of make functions, requires instead of enable_if
Diffstat (limited to 'src/ranges.hh')
-rw-r--r--src/ranges.hh51
1 files changed, 25 insertions, 26 deletions
diff --git a/src/ranges.hh b/src/ranges.hh
index 5fb1e2c9..cf436880 100644
--- a/src/ranges.hh
+++ b/src/ranges.hh
@@ -15,8 +15,7 @@ namespace Kakoune
template<typename Func> struct ViewFactory { Func func; };
template<typename Func>
-ViewFactory<std::remove_cvref_t<Func>>
-make_view_factory(Func&& func) { return {std::forward<Func>(func)}; }
+ViewFactory(Func&&) -> ViewFactory<std::remove_cvref_t<Func>>;
template<typename Range, typename Func>
decltype(auto) operator| (Range&& range, ViewFactory<Func> factory)
@@ -50,10 +49,10 @@ struct ReverseView
inline auto reverse()
{
- return make_view_factory([](auto&& range) {
+ return ViewFactory{[](auto&& range) {
using Range = decltype(range);
return ReverseView<decay_range<Range>>{std::forward<Range>(range)};
- });
+ }};
}
template<typename Range>
@@ -74,10 +73,10 @@ struct SkipView
inline auto skip(size_t count)
{
- return make_view_factory([count](auto&& range) {
+ return ViewFactory{[count](auto&& range) {
using Range = decltype(range);
return SkipView<decay_range<Range>>{std::forward<Range>(range), count};
- });
+ }};
}
template<typename Range>
@@ -92,10 +91,10 @@ struct DropView
inline auto drop(size_t count)
{
- return make_view_factory([count](auto&& range) {
+ return ViewFactory{[count](auto&& range) {
using Range = decltype(range);
return DropView<decay_range<Range>>{std::forward<Range>(range), count};
- });
+ }};
}
template<typename Range, typename Filter>
@@ -150,10 +149,10 @@ struct FilterView
template<typename Filter>
inline auto filter(Filter f)
{
- return make_view_factory([f = std::move(f)](auto&& range) {
+ return ViewFactory{[f = std::move(f)](auto&& range) {
using Range = decltype(range);
return FilterView<decay_range<Range>, Filter>{std::forward<Range>(range), std::move(f)};
- });
+ }};
}
template<typename Range>
@@ -196,10 +195,10 @@ struct EnumerateView
inline auto enumerate()
{
- return make_view_factory([](auto&& range) {
+ return ViewFactory{[](auto&& range) {
using Range = decltype(range);
return EnumerateView<decay_range<Range>>{std::forward<Range>(range)};
- });
+ }};
}
template<typename Range, typename Transform>
@@ -255,10 +254,10 @@ struct TransformView
template<typename Transform>
inline auto transform(Transform t)
{
- return make_view_factory([t = std::move(t)](auto&& range) {
+ return ViewFactory{[t = std::move(t)](auto&& range) {
using Range = decltype(range);
return TransformView<decay_range<Range>, Transform>{std::forward<Range>(range), std::move(t)};
- });
+ }};
}
template<typename T, typename U>
@@ -363,28 +362,28 @@ struct SplitView
template<typename ValueType = void, typename Element>
auto split(Element separator)
{
- return make_view_factory([s = std::move(separator)](auto&& range) {
+ return ViewFactory{[s = std::move(separator)](auto&& range) {
using Range = decltype(range);
return SplitView<decay_range<Range>, false, false, Element, ValueType>{std::forward<Range>(range), std::move(s), {}};
- });
+ }};
}
template<typename ValueType = void, typename Element>
auto split_after(Element separator)
{
- return make_view_factory([s = std::move(separator)](auto&& range) {
+ return ViewFactory{[s = std::move(separator)](auto&& range) {
using Range = decltype(range);
return SplitView<decay_range<Range>, false, true, Element, ValueType>{std::forward<Range>(range), std::move(s), {}};
- });
+ }};
}
template<typename ValueType = void, typename Element>
auto split(Element separator, Element escaper)
{
- return make_view_factory([s = std::move(separator), e = std::move(escaper)](auto&& range) {
+ return ViewFactory{[s = std::move(separator), e = std::move(escaper)](auto&& range) {
using Range = decltype(range);
return SplitView<decay_range<Range>, true, false, Element, ValueType>{std::forward<Range>(range), std::move(s), std::move(e)};
- });
+ }};
}
template<typename Range1, typename Range2>
@@ -518,26 +517,26 @@ void for_n_best(Range&& c, size_t count, Compare&& compare, Func&& func)
template<typename Container>
auto gather()
{
- return make_view_factory([](auto&& range) {
+ return ViewFactory{[](auto&& range) {
using std::begin; using std::end;
return Container(begin(range), end(range));
- });
+ }};
}
template<template <typename Element> class Container>
auto gather()
{
- return make_view_factory([](auto&& range) {
+ return ViewFactory{[](auto&& range) {
using std::begin; using std::end;
using ValueType = std::remove_cv_t<std::remove_reference_t<decltype(*begin(range))>>;
return Container<ValueType>(begin(range), end(range));
- });
+ }};
}
template<typename ExceptionType, bool exact_size, size_t... Indexes>
auto elements()
{
- return make_view_factory([=] (auto&& range) {
+ return ViewFactory{[=] (auto&& range) {
using std::begin; using std::end;
auto it = begin(range), end_it = end(range);
size_t i = 0;
@@ -551,7 +550,7 @@ auto elements()
if (exact_size and ++it != end_it)
throw ExceptionType{++i};
return res;
- });
+ }};
}
template<typename ExceptionType, bool exact_size, size_t... Indexes>