From 251f09ff89bdba6cf52b3f9b7764620e0a2307e5 Mon Sep 17 00:00:00 2001 From: Maxime Coste Date: Wed, 27 Mar 2013 13:41:41 +0100 Subject: [PATCH] Merge {Filter,Highlighter}Group in a FunctionGroup template --- src/editor.hh | 1 - src/filter.hh | 2 ++ src/filter_group.cc | 57 ---------------------------------- src/filter_group.hh | 31 ------------------- src/filters.cc | 1 - src/function_group.hh | 66 ++++++++++++++++++++++++++++++++++++++++ src/highlighter.hh | 3 ++ src/highlighter_group.cc | 56 ---------------------------------- src/highlighter_group.hh | 34 --------------------- src/highlighters.cc | 1 - src/window.hh | 3 +- 11 files changed, 72 insertions(+), 183 deletions(-) delete mode 100644 src/filter_group.cc delete mode 100644 src/filter_group.hh create mode 100644 src/function_group.hh delete mode 100644 src/highlighter_group.cc delete mode 100644 src/highlighter_group.hh diff --git a/src/editor.hh b/src/editor.hh index 6a58eb49..0847e0c4 100644 --- a/src/editor.hh +++ b/src/editor.hh @@ -6,7 +6,6 @@ #include "filter.hh" #include "idvaluemap.hh" #include "memoryview.hh" -#include "filter_group.hh" namespace Kakoune { diff --git a/src/filter.hh b/src/filter.hh index d95d5151..c9f6bf08 100644 --- a/src/filter.hh +++ b/src/filter.hh @@ -7,6 +7,7 @@ #include "utils.hh" #include "memoryview.hh" #include "function_registry.hh" +#include "function_group.hh" namespace Kakoune { @@ -20,6 +21,7 @@ struct Selection; using FilterFunc = std::function; using FilterAndId = std::pair; +using FilterGroup = FunctionGroup; using FilterParameters = memoryview; using FilterFactory = std::function; diff --git a/src/filter_group.cc b/src/filter_group.cc deleted file mode 100644 index a366abf8..00000000 --- a/src/filter_group.cc +++ /dev/null @@ -1,57 +0,0 @@ -#include "filter_group.hh" - -#include "exception.hh" -#include "utils.hh" - -namespace Kakoune -{ - -void FilterGroup::operator()(Buffer& buffer, - Selection& selection, String& content) -{ - for (auto& filter : m_filters) - filter.second(buffer, selection, content); -} - -void FilterGroup::append(FilterAndId&& filter) -{ - if (m_filters.contains(filter.first)) - throw runtime_error("duplicate filter id: " + filter.first); - - m_filters.append(std::forward(filter)); -} - -void FilterGroup::remove(const String& id) -{ - m_filters.remove(id); -} - -FilterGroup& FilterGroup::get_group(const String& id) -{ - auto it = m_filters.find(id); - if (it == m_filters.end()) - throw runtime_error("no such id: " + id); - FilterGroup* group = it->second.target(); - if (not group) - throw runtime_error("not a group: " + id); - - return *group; -} - - -CandidateList FilterGroup::complete_id(const String& prefix, - ByteCount cursor_pos) -{ - return m_filters.complete_id(prefix, cursor_pos); -} - -CandidateList FilterGroup::complete_group_id(const String& prefix, - ByteCount cursor_pos) -{ - return m_filters.complete_id_if( - prefix, cursor_pos, - [](std::pair& func) - { return func.second.target() != nullptr; }); -} - -} diff --git a/src/filter_group.hh b/src/filter_group.hh deleted file mode 100644 index 952e157f..00000000 --- a/src/filter_group.hh +++ /dev/null @@ -1,31 +0,0 @@ -#ifndef filter_group_hh_INCLUDED -#define filter_group_hh_INCLUDED - -#include "filter.hh" -#include "idvaluemap.hh" - -namespace Kakoune -{ - -// FilterGroup is an filter which delegate to multiple -// other filters in order of insertion. -class FilterGroup -{ -public: - void operator()(Buffer& buffer, Selection& selection, String& content); - - void append(FilterAndId&& filter); - void remove(const String& id); - - FilterGroup& get_group(const String& id); - - CandidateList complete_id(const String& prefix, ByteCount cursor_pos); - CandidateList complete_group_id(const String& prefix, ByteCount cursor_pos); - -private: - idvaluemap m_filters; -}; - -} - -#endif // filter_group_hh_INCLUDED diff --git a/src/filters.cc b/src/filters.cc index 238de5e0..2458dc29 100644 --- a/src/filters.cc +++ b/src/filters.cc @@ -1,6 +1,5 @@ #include "filters.hh" #include "buffer.hh" -#include "filter_group.hh" #include "selection.hh" namespace Kakoune diff --git a/src/function_group.hh b/src/function_group.hh new file mode 100644 index 00000000..bafdab27 --- /dev/null +++ b/src/function_group.hh @@ -0,0 +1,66 @@ +#ifndef function_group_hh_INCLUDED +#define function_group_hh_INCLUDED + +#include "string.hh" +#include "idvaluemap.hh" +#include "exception.hh" + +namespace Kakoune +{ + +template +class FunctionGroup +{ +public: + using Function = std::function; + using FunctionAndId = std::pair>; + + void operator()(Args&&... args) + { + for (auto& func : m_functions) + func.second(std::forward(args)...); + } + + void append(FunctionAndId&& function) + { + if (m_functions.contains(function.first)) + throw runtime_error("duplicate id: " + function.first); + + m_functions.append(std::forward(function)); + } + void remove(const String& id) + { + m_functions.remove(id); + } + + FunctionGroup& get_group(const String& id) + { + auto it = m_functions.find(id); + if (it == m_functions.end()) + throw runtime_error("no such id: " + id); + FunctionGroup* group = it->second.template target(); + if (not group) + throw runtime_error("not a group: " + id); + return *group; + } + + CandidateList complete_id(const String& prefix, ByteCount cursor_pos) + { + return m_functions.complete_id(prefix, cursor_pos); + } + + CandidateList complete_group_id(const String& prefix, ByteCount cursor_pos) + { + return m_functions.complete_id_if( + prefix, cursor_pos, [](FunctionAndId& func) { + return func.second.template target() != nullptr; + }); + } + +private: + idvaluemap m_functions; +}; + +} + +#endif // function_group_hh_INCLUDED diff --git a/src/highlighter.hh b/src/highlighter.hh index 615680a5..185a2b9d 100644 --- a/src/highlighter.hh +++ b/src/highlighter.hh @@ -7,6 +7,7 @@ #include "utils.hh" #include "memoryview.hh" #include "function_registry.hh" +#include "function_group.hh" namespace Kakoune { @@ -26,6 +27,8 @@ typedef memoryview HighlighterParameters; using HighlighterFactory = std::function; +using HighlighterGroup = FunctionGroup; + struct HighlighterRegistry : FunctionRegistry, Singleton {}; diff --git a/src/highlighter_group.cc b/src/highlighter_group.cc deleted file mode 100644 index 1dac5fe9..00000000 --- a/src/highlighter_group.cc +++ /dev/null @@ -1,56 +0,0 @@ -#include "highlighter_group.hh" - -#include "exception.hh" -#include "utils.hh" - -namespace Kakoune -{ - -void HighlighterGroup::operator()(DisplayBuffer& display_buffer) -{ - for (auto& highlighter : m_highlighters) - highlighter.second(display_buffer); -} - -void HighlighterGroup::append(HighlighterAndId&& highlighter) -{ - if (m_highlighters.contains(highlighter.first)) - throw runtime_error("duplicate highlighter id: " + highlighter.first); - - m_highlighters.append(std::forward(highlighter)); -} - -void HighlighterGroup::remove(const String& id) -{ - m_highlighters.remove(id); -} - -HighlighterGroup& HighlighterGroup::get_group(const String& id) -{ - auto it = m_highlighters.find(id); - if (it == m_highlighters.end()) - throw runtime_error("no such id: " + id); - HighlighterGroup* group = it->second.target(); - if (not group) - throw runtime_error("not a group: " + id); - - return *group; -} - - -CandidateList HighlighterGroup::complete_id(const String& prefix, - ByteCount cursor_pos) -{ - return m_highlighters.complete_id(prefix, cursor_pos); -} - -CandidateList HighlighterGroup::complete_group_id(const String& prefix, - ByteCount cursor_pos) -{ - return m_highlighters.complete_id_if( - prefix, cursor_pos, - [](std::pair& func) - { return func.second.target() != nullptr; }); -} - -} diff --git a/src/highlighter_group.hh b/src/highlighter_group.hh deleted file mode 100644 index 50c883e7..00000000 --- a/src/highlighter_group.hh +++ /dev/null @@ -1,34 +0,0 @@ -#ifndef highlighter_group_hh_INCLUDED -#define highlighter_group_hh_INCLUDED - -#include "highlighter.hh" -#include "idvaluemap.hh" - -namespace Kakoune -{ - -class DisplayBuffer; -class Window; - -// HighlighterGroup is an highlighter which delegate to multiple -// other highlighters in order of insertion. -class HighlighterGroup -{ -public: - void operator()(DisplayBuffer& display_buffer); - - void append(HighlighterAndId&& highlighter); - void remove(const String& id); - - HighlighterGroup& get_group(const String& id); - - CandidateList complete_id(const String& prefix, ByteCount cursor_pos); - CandidateList complete_group_id(const String& prefix, ByteCount cursor_pos); - -private: - idvaluemap m_highlighters; -}; - -} - -#endif // highlighter_group_hh_INCLUDED diff --git a/src/highlighters.cc b/src/highlighters.cc index 2b50a209..409e07dd 100644 --- a/src/highlighters.cc +++ b/src/highlighters.cc @@ -1,7 +1,6 @@ #include "highlighters.hh" #include "assert.hh" #include "color_registry.hh" -#include "highlighter_group.hh" #include "register_manager.hh" #include "context.hh" #include "string.hh" diff --git a/src/window.hh b/src/window.hh index 68276422..4127b760 100644 --- a/src/window.hh +++ b/src/window.hh @@ -5,13 +5,12 @@ #include "display_buffer.hh" #include "completion.hh" #include "highlighter.hh" -#include "highlighter_group.hh" +#include "highlighter.hh" #include "hook_manager.hh" #include "option_manager.hh" namespace Kakoune { -class HighlighterGroup; // A Window is an editing view onto a Buffer //