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 "filter.hh"
|
||||||
#include "idvaluemap.hh"
|
#include "idvaluemap.hh"
|
||||||
#include "memoryview.hh"
|
#include "memoryview.hh"
|
||||||
#include "filter_group.hh"
|
|
||||||
|
|
||||||
namespace Kakoune
|
namespace Kakoune
|
||||||
{
|
{
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
#include "utils.hh"
|
#include "utils.hh"
|
||||||
#include "memoryview.hh"
|
#include "memoryview.hh"
|
||||||
#include "function_registry.hh"
|
#include "function_registry.hh"
|
||||||
|
#include "function_group.hh"
|
||||||
|
|
||||||
namespace Kakoune
|
namespace Kakoune
|
||||||
{
|
{
|
||||||
|
@ -20,6 +21,7 @@ struct Selection;
|
||||||
|
|
||||||
using FilterFunc = std::function<void (Buffer& buffer, Selection& selection, String& content)>;
|
using FilterFunc = std::function<void (Buffer& buffer, Selection& selection, String& content)>;
|
||||||
using FilterAndId = std::pair<String, FilterFunc>;
|
using FilterAndId = std::pair<String, FilterFunc>;
|
||||||
|
using FilterGroup = FunctionGroup<Buffer&, Selection&, String&>;
|
||||||
|
|
||||||
using FilterParameters = memoryview<String>;
|
using FilterParameters = memoryview<String>;
|
||||||
using FilterFactory = std::function<FilterAndId (const FilterParameters& params)>;
|
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 "filters.hh"
|
||||||
#include "buffer.hh"
|
#include "buffer.hh"
|
||||||
#include "filter_group.hh"
|
|
||||||
#include "selection.hh"
|
#include "selection.hh"
|
||||||
|
|
||||||
namespace Kakoune
|
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 "utils.hh"
|
||||||
#include "memoryview.hh"
|
#include "memoryview.hh"
|
||||||
#include "function_registry.hh"
|
#include "function_registry.hh"
|
||||||
|
#include "function_group.hh"
|
||||||
|
|
||||||
namespace Kakoune
|
namespace Kakoune
|
||||||
{
|
{
|
||||||
|
@ -26,6 +27,8 @@ typedef memoryview<String> HighlighterParameters;
|
||||||
using HighlighterFactory = std::function<HighlighterAndId (const HighlighterParameters& params,
|
using HighlighterFactory = std::function<HighlighterAndId (const HighlighterParameters& params,
|
||||||
const Window& window)>;
|
const Window& window)>;
|
||||||
|
|
||||||
|
using HighlighterGroup = FunctionGroup<DisplayBuffer&>;
|
||||||
|
|
||||||
struct HighlighterRegistry : FunctionRegistry<HighlighterFactory>,
|
struct HighlighterRegistry : FunctionRegistry<HighlighterFactory>,
|
||||||
Singleton<HighlighterRegistry>
|
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 "highlighters.hh"
|
||||||
#include "assert.hh"
|
#include "assert.hh"
|
||||||
#include "color_registry.hh"
|
#include "color_registry.hh"
|
||||||
#include "highlighter_group.hh"
|
|
||||||
#include "register_manager.hh"
|
#include "register_manager.hh"
|
||||||
#include "context.hh"
|
#include "context.hh"
|
||||||
#include "string.hh"
|
#include "string.hh"
|
||||||
|
|
|
@ -5,13 +5,12 @@
|
||||||
#include "display_buffer.hh"
|
#include "display_buffer.hh"
|
||||||
#include "completion.hh"
|
#include "completion.hh"
|
||||||
#include "highlighter.hh"
|
#include "highlighter.hh"
|
||||||
#include "highlighter_group.hh"
|
#include "highlighter.hh"
|
||||||
#include "hook_manager.hh"
|
#include "hook_manager.hh"
|
||||||
#include "option_manager.hh"
|
#include "option_manager.hh"
|
||||||
|
|
||||||
namespace Kakoune
|
namespace Kakoune
|
||||||
{
|
{
|
||||||
class HighlighterGroup;
|
|
||||||
|
|
||||||
// A Window is an editing view onto a Buffer
|
// A Window is an editing view onto a Buffer
|
||||||
//
|
//
|
||||||
|
|
Loading…
Reference in New Issue
Block a user