Merge {Filter,Highlighter}Group in a FunctionGroup template
This commit is contained in:
parent
ee0e640384
commit
251f09ff89
|
@ -6,7 +6,6 @@
|
|||
#include "filter.hh"
|
||||
#include "idvaluemap.hh"
|
||||
#include "memoryview.hh"
|
||||
#include "filter_group.hh"
|
||||
|
||||
namespace Kakoune
|
||||
{
|
||||
|
|
|
@ -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<void (Buffer& buffer, Selection& selection, String& content)>;
|
||||
using FilterAndId = std::pair<String, FilterFunc>;
|
||||
using FilterGroup = FunctionGroup<Buffer&, Selection&, String&>;
|
||||
|
||||
using FilterParameters = memoryview<String>;
|
||||
using FilterFactory = std::function<FilterAndId (const FilterParameters& params)>;
|
||||
|
|
|
@ -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<FilterAndId>(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<FilterGroup>();
|
||||
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<String, FilterFunc>& func)
|
||||
{ return func.second.target<FilterGroup>() != nullptr; });
|
||||
}
|
||||
|
||||
}
|
|
@ -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<String, FilterFunc> m_filters;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif // filter_group_hh_INCLUDED
|
|
@ -1,6 +1,5 @@
|
|||
#include "filters.hh"
|
||||
#include "buffer.hh"
|
||||
#include "filter_group.hh"
|
||||
#include "selection.hh"
|
||||
|
||||
namespace Kakoune
|
||||
|
|
66
src/function_group.hh
Normal file
66
src/function_group.hh
Normal file
|
@ -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<typename... Args>
|
||||
class FunctionGroup
|
||||
{
|
||||
public:
|
||||
using Function = std::function<void (Args...)>;
|
||||
using FunctionAndId = std::pair<String, std::function<void (Args...)>>;
|
||||
|
||||
void operator()(Args&&... args)
|
||||
{
|
||||
for (auto& func : m_functions)
|
||||
func.second(std::forward<Args>(args)...);
|
||||
}
|
||||
|
||||
void append(FunctionAndId&& function)
|
||||
{
|
||||
if (m_functions.contains(function.first))
|
||||
throw runtime_error("duplicate id: " + function.first);
|
||||
|
||||
m_functions.append(std::forward<FunctionAndId>(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<FunctionGroup>();
|
||||
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<FunctionGroup>() != nullptr;
|
||||
});
|
||||
}
|
||||
|
||||
private:
|
||||
idvaluemap<String, Function> m_functions;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif // function_group_hh_INCLUDED
|
|
@ -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<String> HighlighterParameters;
|
|||
using HighlighterFactory = std::function<HighlighterAndId (const HighlighterParameters& params,
|
||||
const Window& window)>;
|
||||
|
||||
using HighlighterGroup = FunctionGroup<DisplayBuffer&>;
|
||||
|
||||
struct HighlighterRegistry : FunctionRegistry<HighlighterFactory>,
|
||||
Singleton<HighlighterRegistry>
|
||||
{};
|
||||
|
|
|
@ -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<HighlighterAndId>(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<HighlighterGroup>();
|
||||
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<String, HighlighterFunc>& func)
|
||||
{ return func.second.target<HighlighterGroup>() != nullptr; });
|
||||
}
|
||||
|
||||
}
|
|
@ -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<String, HighlighterFunc> m_highlighters;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif // highlighter_group_hh_INCLUDED
|
|
@ -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"
|
||||
|
|
|
@ -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
|
||||
//
|
||||
|
|
Loading…
Reference in New Issue
Block a user