summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2016-03-08 21:35:56 +0000
committerMaxime Coste <frrrwww@gmail.com>2016-03-08 21:35:56 +0000
commit9e15181dc9b56435c5e1d3ab87dd03404d6c31c9 (patch)
tree2fcf0f09cea4755e36c7295b517676a234c10c51 /src
parent21ae66215163976ea4c826dcdf55e04ddce54748 (diff)
Rework container helpers, use pipe syntax and cleanup implementation
use 'container | filter(func) | reverse() | transform(func)' instead of 'transform(reverse(filter(container), func), func)' to express container transformations.
Diffstat (limited to 'src')
-rw-r--r--src/alias_registry.cc2
-rw-r--r--src/buffer.cc2
-rw-r--r--src/client.cc2
-rw-r--r--src/client_manager.cc8
-rw-r--r--src/command_manager.cc15
-rw-r--r--src/commands.cc4
-rw-r--r--src/containers.hh256
-rw-r--r--src/face_registry.cc5
-rw-r--r--src/file.cc2
-rw-r--r--src/highlighter_group.cc7
-rw-r--r--src/highlighters.cc2
-rw-r--r--src/hook_manager.cc2
-rw-r--r--src/main.cc8
-rw-r--r--src/selection.cc4
-rw-r--r--src/selectors.cc2
15 files changed, 175 insertions, 146 deletions
diff --git a/src/alias_registry.cc b/src/alias_registry.cc
index 375246a3..690cde54 100644
--- a/src/alias_registry.cc
+++ b/src/alias_registry.cc
@@ -57,7 +57,7 @@ Vector<std::pair<StringView, StringView>> AliasRegistry::flatten_aliases() const
res = m_parent->flatten_aliases();
for (auto& alias : m_aliases)
{
- if (not contains(transformed(res, [](const AliasDesc& val) { return val.first; }), alias.key))
+ if (not contains(res | transform([](const AliasDesc& val) { return val.first; }), alias.key))
res.emplace_back(alias.key, alias.value);
}
return res;
diff --git a/src/buffer.cc b/src/buffer.cc
index e140f333..c0e25f0a 100644
--- a/src/buffer.cc
+++ b/src/buffer.cc
@@ -304,7 +304,7 @@ bool Buffer::undo()
--m_history_cursor;
- for (const Modification& modification : reversed(*m_history_cursor))
+ for (const Modification& modification : *m_history_cursor | reverse())
apply_modification(modification.inverse());
return true;
}
diff --git a/src/client.cc b/src/client.cc
index fcbba14c..cf8b3e71 100644
--- a/src/client.cc
+++ b/src/client.cc
@@ -235,7 +235,7 @@ void Client::redraw_ifn()
void Client::force_redraw()
{
- m_ui_pending |= Refresh | Draw |
+ m_ui_pending |= Refresh | Draw | StatusLine |
(m_menu.items.empty() ? MenuHide : MenuShow | MenuSelect) |
(m_info.content.empty() ? InfoHide : InfoShow);
}
diff --git a/src/client_manager.cc b/src/client_manager.cc
index b625fdc5..aff88d93 100644
--- a/src/client_manager.cc
+++ b/src/client_manager.cc
@@ -87,7 +87,7 @@ void ClientManager::remove_client(Client& client, bool graceful)
WindowAndSelections ClientManager::get_free_window(Buffer& buffer)
{
- auto it = find_if(reversed(m_free_windows),
+ auto it = find_if(m_free_windows | reverse(),
[&](const WindowAndSelections& ws)
{ return &ws.window->buffer() == &buffer; });
@@ -177,10 +177,8 @@ void ClientManager::redraw_clients() const
CandidateList ClientManager::complete_client_name(StringView prefix,
ByteCount cursor_pos) const
{
- auto c = transformed(m_clients,
- [](const std::unique_ptr<Client>& c) -> const String&
- { return c->context().name(); });
-
+ auto c = m_clients | transform([](const std::unique_ptr<Client>& c) -> const String&
+ { return c->context().name(); });
return complete(prefix, cursor_pos, c);
}
diff --git a/src/command_manager.cc b/src/command_manager.cc
index 65de501c..4902f068 100644
--- a/src/command_manager.cc
+++ b/src/command_manager.cc
@@ -515,12 +515,15 @@ CommandInfo CommandManager::command_info(const Context& context, StringView comm
Completions CommandManager::complete_command_name(const Context& context,
StringView query) const
{
- return{0, query.length(), Kakoune::complete(query, query.length(), concatenated(
- transformed(filtered(m_commands, [](const CommandMap::value_type& cmd)
- { return not (cmd.second.flags & CommandFlags::Hidden); }),
- [](const CommandMap::value_type& cmd) { return StringView{cmd.first}; }),
- transformed(context.aliases().flatten_aliases(),
- [](AliasRegistry::AliasDesc alias) { return alias.first; })))};
+ auto candidates = Kakoune::complete(
+ query, query.length(), concatenated(
+ m_commands
+ | filter([](const CommandMap::value_type& cmd) { return not (cmd.second.flags & CommandFlags::Hidden); })
+ | transform([](const CommandMap::value_type& cmd) { return StringView{cmd.first}; }),
+ context.aliases().flatten_aliases()
+ | transform([](AliasRegistry::AliasDesc alias) { return alias.first; })));
+
+ return {0, query.length(), std::move(candidates)};
}
Completions CommandManager::complete(const Context& context,
diff --git a/src/commands.cc b/src/commands.cc
index 3a8d6132..b376f081 100644
--- a/src/commands.cc
+++ b/src/commands.cc
@@ -543,7 +543,7 @@ Completions add_highlighter_completer(
if (token_to_complete == 1 and params[0] == "-group")
return complete_highlighter(context, params[1], pos_in_token, true);
else if (token_to_complete == 0 or (token_to_complete == 2 and params[0] == "-group"))
- return { 0_byte, arg.length(), complete(arg, pos_in_token, transformed(HighlighterRegistry::instance(), HighlighterRegistry::get_id)) };
+ return { 0_byte, arg.length(), complete(arg, pos_in_token, HighlighterRegistry::instance() | transform(HighlighterRegistry::get_id)) };
return Completions{};
}
@@ -626,7 +626,7 @@ const CommandDesc rm_highlighter_cmd = {
[](const ParametersParser& parser, Context& context, const ShellContext&)
{
StringView path = parser[0];
- auto sep_it = find(reversed(path), '/');
+ auto sep_it = find(path | reverse(), '/');
auto& group = sep_it != path.rend() ?
get_highlighter(context, {path.begin(), sep_it.base()})
: context.window().highlighters();
diff --git a/src/containers.hh b/src/containers.hh
index 871714ef..e37208dc 100644
--- a/src/containers.hh
+++ b/src/containers.hh
@@ -8,11 +8,21 @@
namespace Kakoune
{
+template<typename Factory>
+struct ContainerView { Factory factory; };
+
+template<typename Container, typename Factory>
+auto operator| (Container&& container, ContainerView<Factory> view) ->
+ decltype(view.factory(std::forward<Container>(container)))
+{
+ return view.factory(std::forward<Container>(container));
+}
+
template<typename Container>
-struct ReversedContainer
+struct ReverseView
{
using iterator = decltype(std::declval<Container>().rbegin());
- ReversedContainer(Container& container) : m_container(container) {}
+ ReverseView(Container& container) : m_container(container) {}
iterator begin() { return m_container.rbegin(); }
iterator end() { return m_container.rend(); }
@@ -21,166 +31,186 @@ private:
Container& m_container;
};
-template<typename Container>
-ReversedContainer<Container> reversed(Container&& container)
-{
- return ReversedContainer<Container>(container);
-}
-
-template<typename Iterator, typename Filter>
-struct FilteredIterator : std::iterator<std::forward_iterator_tag,
- typename Iterator::value_type>
+struct ReverseFactory
{
- FilteredIterator(Filter filter, Iterator it, Iterator end)
- : m_it{std::move(it)}, m_end{std::move(end)}, m_filter{std::move(filter)}
+ template<typename Container>
+ ReverseView<Container> operator()(Container&& container) const
{
- do_filter();
+ return {container};
}
+};
- auto operator*() -> decltype(*std::declval<Iterator>()) { return *m_it; }
- FilteredIterator& operator++() { ++m_it; do_filter(); return *this; }
- FilteredIterator operator++(int) { auto copy = *this; ++(*this); return copy; }
+inline ContainerView<ReverseFactory> reverse() { return {}; }
- friend bool operator==(const FilteredIterator& lhs, const FilteredIterator& rhs)
- {
- return lhs.m_it == rhs.m_it;
- }
+template<typename Container, typename Filter>
+struct FilterView
+{
+ using ContainerIt = decltype(begin(std::declval<Container>()));
- friend bool operator!=(const FilteredIterator& lhs, const FilteredIterator& rhs)
+ struct Iterator : std::iterator<std::forward_iterator_tag,
+ typename ContainerIt::value_type>
{
- return not (lhs == rhs);
- }
+ Iterator(const FilterView& view, ContainerIt it, ContainerIt end)
+ : m_it{std::move(it)}, m_end{std::move(end)}, m_view{view}
+ {
+ do_filter();
+ }
+
+ auto operator*() -> decltype(*std::declval<ContainerIt>()) { return *m_it; }
+ Iterator& operator++() { ++m_it; do_filter(); return *this; }
+ Iterator operator++(int) { auto copy = *this; ++(*this); return copy; }
+
+ friend bool operator==(const Iterator& lhs, const Iterator& rhs)
+ {
+ return lhs.m_it == rhs.m_it;
+ }
+
+ friend bool operator!=(const Iterator& lhs, const Iterator& rhs)
+ {
+ return not (lhs == rhs);
+ }
+
+ const ContainerIt& base() const { return m_it; }
+
+ private:
+ void do_filter()
+ {
+ while (m_it != m_end and not m_view.m_filter(*m_it))
+ ++m_it;
+ }
+
+ ContainerIt m_it;
+ ContainerIt m_end;
+ const FilterView& m_view;
+ };
+
+ FilterView(Container& container, Filter filter)
+ : m_container{container}, m_filter{std::move(filter)} {}
- Iterator base() const { return m_it; }
+ Iterator begin() const { return {*this, m_container.begin(), m_container.end()}; }
+ Iterator end() const { return {*this, m_container.end(), m_container.end()}; }
private:
- void do_filter()
- {
- while (m_it != m_end and not m_filter(*m_it))
- ++m_it;
- }
-
- Iterator m_it;
- Iterator m_end;
- Filter m_filter;
+ Container& m_container;
+ Filter m_filter;
};
-template<typename Container, typename Filter>
-struct FilteredContainer
+template<typename Filter>
+struct FilterFactory
{
- using iterator = FilteredIterator<decltype(begin(std::declval<Container>())), Filter>;
- FilteredContainer(Container& container, Filter filter)
- : m_container{container}, m_filter{std::move(filter)} {}
+ template<typename Container>
+ FilterView<Container, Filter> operator()(Container&& container) const { return {container, std::move(m_filter)}; }
- iterator begin() const { return {m_filter, m_container.begin(), m_container.end()}; }
- iterator end() const { return {m_filter, m_container.end(), m_container.end()}; }
-
-private:
- Container& m_container;
Filter m_filter;
};
-template<typename Container, typename Filter>
-FilteredContainer<Container, Filter> filtered(Container&& container, Filter filter)
-{
- return {container, std::move(filter)};
-}
+template<typename Filter>
+inline ContainerView<FilterFactory<Filter>> filter(Filter f) { return {std::move(f)}; }
template<typename I, typename T>
using TransformedResult = decltype(std::declval<T>()(*std::declval<I>()));
-template<typename Iterator, typename Transform>
-struct TransformedIterator : std::iterator<std::forward_iterator_tag,
- typename std::remove_reference<TransformedResult<Iterator, Transform>>::type>
+template<typename Container, typename Transform>
+struct TransformView
{
- TransformedIterator(Transform transform, Iterator it)
- : m_it{std::move(it)}, m_transform{std::move(transform)} {}
+ using ContainerIt = decltype(begin(std::declval<Container>()));
- auto operator*() -> TransformedResult<Iterator, Transform> { return m_transform(*m_it); }
- TransformedIterator& operator++() { ++m_it; return *this; }
- TransformedIterator operator++(int) { auto copy = *this; ++m_it; return copy; }
-
- friend bool operator==(const TransformedIterator& lhs, const TransformedIterator& rhs)
+ struct Iterator : std::iterator<std::forward_iterator_tag,
+ typename std::remove_reference<TransformedResult<ContainerIt, Transform>>::type>
{
- return lhs.m_it == rhs.m_it;
- }
+ Iterator(const TransformView& view, ContainerIt it)
+ : m_it{std::move(it)}, m_view{view} {}
- friend bool operator!=(const TransformedIterator& lhs, const TransformedIterator& rhs)
- {
- return not (lhs == rhs);
- }
+ auto operator*() -> TransformedResult<ContainerIt, Transform> { return m_view.m_transform(*m_it); }
+ Iterator& operator++() { ++m_it; return *this; }
+ Iterator operator++(int) { auto copy = *this; ++m_it; return copy; }
- Iterator base() const { return m_it; }
+ friend bool operator==(const Iterator& lhs, const Iterator& rhs)
+ {
+ return lhs.m_it == rhs.m_it;
+ }
-private:
- Iterator m_it;
- Transform m_transform;
-};
+ friend bool operator!=(const Iterator& lhs, const Iterator& rhs)
+ {
+ return not (lhs == rhs);
+ }
-template<typename Container, typename Transform>
-struct TransformedContainer
-{
- using iterator = TransformedIterator<decltype(begin(std::declval<Container>())), Transform>;
- TransformedContainer(Container& container, Transform transform)
+ ContainerIt base() const { return m_it; }
+
+ private:
+ ContainerIt m_it;
+ const TransformView& m_view;
+ };
+
+ TransformView(Container& container, Transform transform)
: m_container{container}, m_transform{std::move(transform)} {}
- iterator begin() const { return {m_transform, m_container.begin()}; }
- iterator end() const { return {m_transform, m_container.end()}; }
+ Iterator begin() const { return {*this, m_container.begin()}; }
+ Iterator end() const { return {*this, m_container.end()}; }
private:
Container& m_container;
Transform m_transform;
};
-template<typename Container, typename Transform>
-TransformedContainer<Container, Transform> transformed(Container&& container, Transform transform)
+template<typename Transform>
+struct TransformFactory
{
- return {container, std::move(transform)};
-}
+ template<typename Container>
+ TransformView<Container, Transform> operator()(Container&& container) const { return {container, std::move(m_transform)}; }
-template<typename Iterator1, typename Iterator2, typename ValueType = typename Iterator1::value_type>
-struct ConcatenatedIterator : std::iterator<std::forward_iterator_tag, ValueType>
-{
- static_assert(std::is_convertible<typename Iterator1::value_type, ValueType>::value, "");
- static_assert(std::is_convertible<typename Iterator2::value_type, ValueType>::value, "");
+ Transform m_transform;
+};
- ConcatenatedIterator(Iterator1 it1, Iterator1 end1, Iterator2 it2)
- : m_it1(std::move(it1)), m_end1(std::move(end1)), m_it2(std::move(it2)) {}
+template<typename Transform>
+inline ContainerView<TransformFactory<Transform>> transform(Transform t) { return {std::move(t)}; }
- decltype(*std::declval<Iterator1>()) operator*() { return is2() ? *m_it2 : *m_it1; }
- ConcatenatedIterator& operator++() { if (is2()) ++m_it2; else ++m_it1; return *this; }
- ConcatenatedIterator operator++(int) { auto copy = *this; ++*this; return copy; }
- friend bool operator==(const ConcatenatedIterator& lhs, const ConcatenatedIterator& rhs)
- {
- return lhs.m_it1 == rhs.m_it1 and lhs.m_end1 == rhs.m_end1 and lhs.m_it2 == rhs.m_it2;
- }
- friend bool operator!=(const ConcatenatedIterator& lhs, const ConcatenatedIterator& rhs)
+template<typename Container1, typename Container2>
+struct ConcatView
+{
+ using ContainerIt1 = decltype(begin(std::declval<Container1>()));
+ using ContainerIt2 = decltype(begin(std::declval<Container2>()));
+ using ValueType = typename ContainerIt1::value_type;
+
+ struct Iterator : std::iterator<std::forward_iterator_tag, ValueType>
{
- return not (lhs == rhs);
- }
+ static_assert(std::is_convertible<typename ContainerIt1::value_type, ValueType>::value, "");
+ static_assert(std::is_convertible<typename ContainerIt2::value_type, ValueType>::value, "");
-private:
- bool is2() const { return m_it1 == m_end1; }
+ Iterator(ContainerIt1 it1, ContainerIt1 end1, ContainerIt2 it2)
+ : m_it1(std::move(it1)), m_end1(std::move(end1)),
+ m_it2(std::move(it2)) {}
- Iterator1 m_it1;
- Iterator1 m_end1;
- Iterator2 m_it2;
-};
+ decltype(*std::declval<ContainerIt1>()) operator*() { return is2() ? *m_it2 : *m_it1; }
+ Iterator& operator++() { if (is2()) ++m_it2; else ++m_it1; return *this; }
+ Iterator operator++(int) { auto copy = *this; ++*this; return copy; }
+ friend bool operator==(const Iterator& lhs, const Iterator& rhs)
+ {
+ return lhs.m_it1 == rhs.m_it1 and lhs.m_end1 == rhs.m_end1 and
+ lhs.m_it2 == rhs.m_it2;
+ }
-template<typename Container1, typename Container2>
-struct ConcatenatedContainer
-{
- using iterator = ConcatenatedIterator<decltype(begin(std::declval<Container1>())),
- decltype(begin(std::declval<Container2>()))>;
+ friend bool operator!=(const Iterator& lhs, const Iterator& rhs)
+ {
+ return not (lhs == rhs);
+ }
+
+ private:
+ bool is2() const { return m_it1 == m_end1; }
+
+ ContainerIt1 m_it1;
+ ContainerIt1 m_end1;
+ ContainerIt2 m_it2;
+ };
- ConcatenatedContainer(Container1& container1, Container2& container2)
+ ConcatView(Container1& container1, Container2& container2)
: m_container1{container1}, m_container2{container2} {}
- iterator begin() const { return {m_container1.begin(), m_container1.end(), m_container2.begin()}; }
- iterator end() const { return {m_container1.end(), m_container1.end(), m_container2.end()}; }
+ Iterator begin() const { return {m_container1.begin(), m_container1.end(), m_container2.begin()}; }
+ Iterator end() const { return {m_container1.end(), m_container1.end(), m_container2.end()}; }
private:
Container1& m_container1;
@@ -188,7 +218,7 @@ private:
};
template<typename Container1, typename Container2>
-ConcatenatedContainer<Container1, Container2> concatenated(Container1&& container1, Container2&& container2)
+ConcatView<Container1, Container2> concatenated(Container1&& container1, Container2&& container2)
{
return {container1, container2};
}
diff --git a/src/face_registry.cc b/src/face_registry.cc
index 3a5ac6e1..7da57e9c 100644
--- a/src/face_registry.cc
+++ b/src/face_registry.cc
@@ -95,9 +95,8 @@ CandidateList FaceRegistry::complete_alias_name(StringView prefix,
ByteCount cursor_pos) const
{
return complete(prefix, cursor_pos,
- transformed(m_aliases,
- [](const AliasMap::value_type& v) -> const String&
- { return v.first; }));
+ m_aliases | transform([](const AliasMap::value_type& v) -> const String&
+ { return v.first; }));
}
FaceRegistry::FaceRegistry()
diff --git a/src/file.cc b/src/file.cc
index 2d3e6a82..6cf9a735 100644
--- a/src/file.cc
+++ b/src/file.cc
@@ -63,7 +63,7 @@ String parse_filename(StringView filename)
std::pair<StringView, StringView> split_path(StringView path)
{
- auto it = find(reversed(path), '/');
+ auto it = find(path | reverse(), '/');
if (it == path.rend())
return { {}, path };
const char* slash = it.base()-1;
diff --git a/src/highlighter_group.cc b/src/highlighter_group.cc
index d3755734..2d0a7a74 100644
--- a/src/highlighter_group.cc
+++ b/src/highlighter_group.cc
@@ -52,10 +52,9 @@ Completions HighlighterGroup::complete_child(StringView path, ByteCount cursor_p
auto candidates = complete(
path, cursor_pos,
- transformed(filtered(m_highlighters,
- [=](const HighlighterMap::Element& hl)
- { return not group or hl.value->has_children(); }),
- HighlighterMap::get_id));
+ m_highlighters | filter([=](const HighlighterMap::Element& hl)
+ { return not group or hl.value->has_children(); })
+ | transform(HighlighterMap::get_id));
return { 0, 0, std::move(candidates) };
}
diff --git a/src/highlighters.cc b/src/highlighters.cc
index 740320ac..871d549c 100644
--- a/src/highlighters.cc
+++ b/src/highlighters.cc
@@ -1303,7 +1303,7 @@ public:
return offset_pos(hl.complete_child(path.substr(offset), cursor_pos - offset, group), offset);
}
- auto container = transformed(m_groups, decltype(m_groups)::get_id);
+ auto container = m_groups | transform(decltype(m_groups)::get_id);
return { 0, 0, complete(path, cursor_pos, container) };
}
diff --git a/src/hook_manager.cc b/src/hook_manager.cc
index 81a00730..389c8504 100644
--- a/src/hook_manager.cc
+++ b/src/hook_manager.cc
@@ -31,7 +31,7 @@ CandidateList HookManager::complete_hook_group(StringView prefix, ByteCount pos_
CandidateList res;
for (auto& list : m_hook)
{
- auto container = transformed(list.value, decltype(list.value)::get_id);
+ auto container = list.value | transform(decltype(list.value)::get_id);
for (auto& c : complete(prefix, pos_in_token, container))
{
if (!contains(res, c))
diff --git a/src/main.cc b/src/main.cc
index 622543f1..0a9e713e 100644
--- a/src/main.cc
+++ b/src/main.cc
@@ -61,9 +61,9 @@ void register_env_vars()
}, {
"buflist", false,
[](StringView name, const Context& context)
- { return join(transformed(BufferManager::instance(),
- [](const SafePtr<Buffer>& b)
- { return b->display_name(); }), ':'); }
+ { return join(BufferManager::instance() |
+ transform([](const SafePtr<Buffer>& b)
+ { return b->display_name(); }), ':'); }
}, {
"timestamp", false,
[](StringView name, const Context& context) -> String
@@ -520,7 +520,7 @@ int run_server(StringView session, StringView init_command,
{
// create buffers in reverse order so that the first given buffer
// is the most recently created one.
- for (auto& file : reversed(files))
+ for (auto& file : files | reverse())
{
try
{
diff --git a/src/selection.cc b/src/selection.cc
index f24b0939..90580bdd 100644
--- a/src/selection.cc
+++ b/src/selection.cc
@@ -555,8 +555,8 @@ String selection_to_string(const Selection& selection)
String selection_list_to_string(const SelectionList& selections)
{
- return join(transformed(selections, [](const Selection& s)
- { return selection_to_string(s); }),
+ return join(selections | transform([](const Selection& s)
+ { return selection_to_string(s); }),
':', false);
}
diff --git a/src/selectors.cc b/src/selectors.cc
index 662cd6b0..1ca42a28 100644
--- a/src/selectors.cc
+++ b/src/selectors.cc
@@ -128,7 +128,7 @@ find_surrounding(Iterator begin, Iterator end,
{
using RevIt = std::reverse_iterator<Iterator>;
auto res = find_closing(RevIt{pos+1}, RevIt{begin},
- reversed(closing), reversed(opening),
+ closing | reverse(), opening | reverse(),
init_level, nestable);
if (not res)
return {};