More C++20 refactorings

Use CTAD instead of make functions, requires instead of enable_if
This commit is contained in:
Maxime Coste 2021-11-21 11:15:08 +11:00
parent cd2172eed6
commit 91550639bb
5 changed files with 36 additions and 36 deletions

View File

@ -297,14 +297,15 @@ Token parse_percent_token(ParseState& state, bool throw_on_unterminated)
}
}
template<typename Target, typename = std::enable_if_t<std::is_same_v<Target, Vector<String>> or std::is_same_v<Target, String>>>
template<typename Target>
requires (std::is_same_v<Target, Vector<String>> or std::is_same_v<Target, String>)
void expand_token(Token&& token, const Context& context, const ShellContext& shell_context, Target& target)
{
constexpr bool single = std::is_same_v<Target, String>;
auto set_target = [&](auto&& s) {
if constexpr (single)
target = std::move(s);
else if constexpr (std::is_same_v<std::decay_t<decltype(s)>, String>)
else if constexpr (std::is_same_v<std::remove_cvref_t<decltype(s)>, String>)
target.push_back(std::move(s));
else if constexpr (std::is_same_v<decltype(s), Vector<String>&&>)
target.insert(target.end(), std::make_move_iterator(s.begin()), std::make_move_iterator(s.end()));

View File

@ -84,7 +84,7 @@ struct Key
constexpr uint64_t val() const { return (uint64_t)modifiers << 32 | key; }
constexpr bool operator==(Key other) const { return val() == other.val(); }
constexpr bool operator<(Key other) const { return val() < other.val(); }
constexpr std::strong_ordering operator<=>(Key other) const { return val() <=> other.val(); }
constexpr DisplayCoord coord() const { return {(int)((key & 0xFFFF0000) >> 16), (int)(key & 0x0000FFFF)}; }
constexpr MouseButton mouse_button() { return MouseButton{((int)modifiers & (int)Modifiers::MouseButtonMask) >> 6}; }

View File

@ -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>

View File

@ -95,9 +95,9 @@ struct WrapView
inline auto wrap_at(ColumnCount max_width)
{
return make_view_factory([=](StringView text) {
return ViewFactory{[=](StringView text) {
return WrapView{text, max_width};
});
}};
}
int str_to_int(StringView str); // throws on error

View File

@ -173,11 +173,11 @@ public:
}}
{}
template<typename Target,
typename = std::enable_if_t<
not std::is_same_v<FunctionRef, std::decay_t<Target>> and
std::is_convertible_v<decltype(std::declval<Target>()(std::declval<Args>()...)), Res>
>>
template<typename Target>
requires requires (Target t, Args... a) {
requires not std::is_same_v<FunctionRef, std::remove_cvref_t<Target>>;
{ t(a...) } -> std::convertible_to<Res>;
}
FunctionRef(Target&& target)
: m_target{&target},
m_invoker{[](void* target, Args... args) {