LineAndColumns: always pass by value
This commit is contained in:
parent
5d681f9efe
commit
3862b5cbb8
|
@ -86,7 +86,7 @@ bool Buffer::set_name(String name)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
BufferIterator Buffer::iterator_at(const BufferCoord& coord) const
|
BufferIterator Buffer::iterator_at(BufferCoord coord) const
|
||||||
{
|
{
|
||||||
return is_end(coord) ? end() : BufferIterator(*this, clamp(coord));
|
return is_end(coord) ? end() : BufferIterator(*this, clamp(coord));
|
||||||
}
|
}
|
||||||
|
@ -126,7 +126,7 @@ LineCount Buffer::line_count() const
|
||||||
return LineCount(m_lines.size());
|
return LineCount(m_lines.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
String Buffer::string(const BufferCoord& begin, const BufferCoord& end) const
|
String Buffer::string(BufferCoord begin, BufferCoord end) const
|
||||||
{
|
{
|
||||||
String res;
|
String res;
|
||||||
for (auto line = begin.line; line <= end.line and line < line_count(); ++line)
|
for (auto line = begin.line; line <= end.line and line < line_count(); ++line)
|
||||||
|
@ -187,7 +187,7 @@ class UndoGroupOptimizer
|
||||||
return coord;
|
return coord;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ByteCount count_byte_to(BufferCoord pos, const BufferCoord& endpos, const String& str)
|
static ByteCount count_byte_to(BufferCoord pos, BufferCoord endpos, const String& str)
|
||||||
{
|
{
|
||||||
ByteCount count = 0;
|
ByteCount count = 0;
|
||||||
for (auto it = str.begin(); it != str.end() and pos != endpos; ++it)
|
for (auto it = str.begin(); it != str.end() and pos != endpos; ++it)
|
||||||
|
@ -417,7 +417,7 @@ void Buffer::check_invariant() const
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
BufferCoord Buffer::do_insert(const BufferCoord& pos, const String& content)
|
BufferCoord Buffer::do_insert(BufferCoord pos, const String& content)
|
||||||
{
|
{
|
||||||
kak_assert(is_valid(pos));
|
kak_assert(is_valid(pos));
|
||||||
|
|
||||||
|
@ -497,7 +497,7 @@ BufferCoord Buffer::do_insert(const BufferCoord& pos, const String& content)
|
||||||
return begin;
|
return begin;
|
||||||
}
|
}
|
||||||
|
|
||||||
BufferCoord Buffer::do_erase(const BufferCoord& begin, const BufferCoord& end)
|
BufferCoord Buffer::do_erase(BufferCoord begin, BufferCoord end)
|
||||||
{
|
{
|
||||||
kak_assert(is_valid(begin));
|
kak_assert(is_valid(begin));
|
||||||
kak_assert(is_valid(end));
|
kak_assert(is_valid(end));
|
||||||
|
@ -531,7 +531,7 @@ BufferCoord Buffer::do_erase(const BufferCoord& begin, const BufferCoord& end)
|
||||||
void Buffer::apply_modification(const Modification& modification)
|
void Buffer::apply_modification(const Modification& modification)
|
||||||
{
|
{
|
||||||
const String& content = modification.content;
|
const String& content = modification.content;
|
||||||
const BufferCoord& coord = modification.coord;
|
BufferCoord coord = modification.coord;
|
||||||
|
|
||||||
kak_assert(is_valid(coord));
|
kak_assert(is_valid(coord));
|
||||||
// in modifications, end coords should be {line_count(), 0}
|
// in modifications, end coords should be {line_count(), 0}
|
||||||
|
@ -678,31 +678,31 @@ BufferCoord Buffer::char_prev(BufferCoord coord) const
|
||||||
return coord;
|
return coord;
|
||||||
}
|
}
|
||||||
|
|
||||||
ByteCount Buffer::distance(const BufferCoord& begin, const BufferCoord& end) const
|
ByteCount Buffer::distance(BufferCoord begin, BufferCoord end) const
|
||||||
{
|
{
|
||||||
return offset(end) - offset(begin);
|
return offset(end) - offset(begin);
|
||||||
}
|
}
|
||||||
|
|
||||||
ByteCount Buffer::offset(const BufferCoord& c) const
|
ByteCount Buffer::offset(BufferCoord c) const
|
||||||
{
|
{
|
||||||
if (c.line == line_count())
|
if (c.line == line_count())
|
||||||
return m_lines.back().start + m_lines.back().length();
|
return m_lines.back().start + m_lines.back().length();
|
||||||
return m_lines[c.line].start + c.column;
|
return m_lines[c.line].start + c.column;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Buffer::is_valid(const BufferCoord& c) const
|
bool Buffer::is_valid(BufferCoord c) const
|
||||||
{
|
{
|
||||||
return (c.line < line_count() and c.column < m_lines[c.line].length()) or
|
return (c.line < line_count() and c.column < m_lines[c.line].length()) or
|
||||||
(c.line == line_count() - 1 and c.column == m_lines.back().length()) or
|
(c.line == line_count() - 1 and c.column == m_lines.back().length()) or
|
||||||
(c.line == line_count() and c.column == 0);
|
(c.line == line_count() and c.column == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Buffer::is_end(const BufferCoord& c) const
|
bool Buffer::is_end(BufferCoord c) const
|
||||||
{
|
{
|
||||||
return c >= BufferCoord{line_count() - 1, m_lines.back().length()};
|
return c >= BufferCoord{line_count() - 1, m_lines.back().length()};
|
||||||
}
|
}
|
||||||
|
|
||||||
char Buffer::byte_at(const BufferCoord& c) const
|
char Buffer::byte_at(BufferCoord c) const
|
||||||
{
|
{
|
||||||
kak_assert(c.line < line_count() and c.column < m_lines[c.line].length());
|
kak_assert(c.line < line_count() and c.column < m_lines[c.line].length());
|
||||||
return m_lines[c.line].content[c.column];
|
return m_lines[c.line].content[c.column];
|
||||||
|
|
|
@ -69,8 +69,8 @@ private:
|
||||||
class BufferChangeListener
|
class BufferChangeListener
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual void on_insert(const Buffer& buffer, const BufferCoord& begin, const BufferCoord& end) = 0;
|
virtual void on_insert(const Buffer& buffer, BufferCoord begin, BufferCoord end) = 0;
|
||||||
virtual void on_erase(const Buffer& buffer, const BufferCoord& begin, const BufferCoord& end) = 0;
|
virtual void on_erase(const Buffer& buffer, BufferCoord begin, BufferCoord end) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
// A Buffer is a in-memory representation of a file
|
// A Buffer is a in-memory representation of a file
|
||||||
|
@ -109,11 +109,11 @@ public:
|
||||||
bool undo();
|
bool undo();
|
||||||
bool redo();
|
bool redo();
|
||||||
|
|
||||||
String string(const BufferCoord& begin, const BufferCoord& end) const;
|
String string(BufferCoord begin, BufferCoord end) const;
|
||||||
|
|
||||||
char byte_at(const BufferCoord& c) const;
|
char byte_at(BufferCoord c) const;
|
||||||
ByteCount offset(const BufferCoord& c) const;
|
ByteCount offset(BufferCoord c) const;
|
||||||
ByteCount distance(const BufferCoord& begin, const BufferCoord& end) const;
|
ByteCount distance(BufferCoord begin, BufferCoord end) const;
|
||||||
BufferCoord advance(BufferCoord coord, ByteCount count) const;
|
BufferCoord advance(BufferCoord coord, ByteCount count) const;
|
||||||
BufferCoord next(BufferCoord coord) const;
|
BufferCoord next(BufferCoord coord) const;
|
||||||
BufferCoord prev(BufferCoord coord) const;
|
BufferCoord prev(BufferCoord coord) const;
|
||||||
|
@ -124,8 +124,8 @@ public:
|
||||||
BufferCoord back_coord() const { return { line_count() - 1, m_lines.back().length() - 1 }; }
|
BufferCoord back_coord() const { return { line_count() - 1, m_lines.back().length() - 1 }; }
|
||||||
BufferCoord end_coord() const { return { line_count() - 1, m_lines.back().length() }; }
|
BufferCoord end_coord() const { return { line_count() - 1, m_lines.back().length() }; }
|
||||||
|
|
||||||
bool is_valid(const BufferCoord& c) const;
|
bool is_valid(BufferCoord c) const;
|
||||||
bool is_end(const BufferCoord& c) const;
|
bool is_end(BufferCoord c) const;
|
||||||
|
|
||||||
BufferIterator begin() const;
|
BufferIterator begin() const;
|
||||||
BufferIterator end() const;
|
BufferIterator end() const;
|
||||||
|
@ -136,7 +136,7 @@ public:
|
||||||
{ return m_lines[line].content; }
|
{ return m_lines[line].content; }
|
||||||
|
|
||||||
// returns an iterator at given coordinates. clamp line_and_column
|
// returns an iterator at given coordinates. clamp line_and_column
|
||||||
BufferIterator iterator_at(const BufferCoord& coord) const;
|
BufferIterator iterator_at(BufferCoord coord) const;
|
||||||
|
|
||||||
// returns nearest valid coordinates from given ones
|
// returns nearest valid coordinates from given ones
|
||||||
BufferCoord clamp(BufferCoord coord) const;
|
BufferCoord clamp(BufferCoord coord) const;
|
||||||
|
@ -177,8 +177,8 @@ private:
|
||||||
};
|
};
|
||||||
LineList m_lines;
|
LineList m_lines;
|
||||||
|
|
||||||
BufferCoord do_insert(const BufferCoord& pos, const String& content);
|
BufferCoord do_insert(BufferCoord pos, const String& content);
|
||||||
BufferCoord do_erase(const BufferCoord& begin, const BufferCoord& end);
|
BufferCoord do_erase(BufferCoord begin, BufferCoord end);
|
||||||
|
|
||||||
String m_name;
|
String m_name;
|
||||||
Flags m_flags;
|
Flags m_flags;
|
||||||
|
|
|
@ -36,12 +36,12 @@ void DynamicSelectionList::check_invariant() const
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void DynamicSelectionList::on_insert(const Buffer& buffer, const BufferCoord& begin, const BufferCoord& end)
|
void DynamicSelectionList::on_insert(const Buffer& buffer, BufferCoord begin, BufferCoord end)
|
||||||
{
|
{
|
||||||
update_insert(buffer, begin, end);
|
update_insert(buffer, begin, end);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DynamicSelectionList::on_erase(const Buffer& buffer, const BufferCoord& begin, const BufferCoord& end)
|
void DynamicSelectionList::on_erase(const Buffer& buffer, BufferCoord begin, BufferCoord end)
|
||||||
{
|
{
|
||||||
update_erase(buffer, begin, end);
|
update_erase(buffer, begin, end);
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,8 +19,8 @@ public:
|
||||||
void check_invariant() const;
|
void check_invariant() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void on_insert(const Buffer& buffer, const BufferCoord& begin, const BufferCoord& end) override;
|
void on_insert(const Buffer& buffer, BufferCoord begin, BufferCoord end) override;
|
||||||
void on_erase(const Buffer& buffer, const BufferCoord& begin, const BufferCoord& end) override;
|
void on_erase(const Buffer& buffer, BufferCoord begin, BufferCoord end) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -168,7 +168,7 @@ void sort_and_merge_overlapping(SelectionList& selections, size_t& main_selectio
|
||||||
merge_overlapping(selections, main_selection, overlaps);
|
merge_overlapping(selections, main_selection, overlaps);
|
||||||
}
|
}
|
||||||
|
|
||||||
BufferCoord Editor::offset_coord(const BufferCoord& coord, CharCount offset)
|
BufferCoord Editor::offset_coord(BufferCoord coord, CharCount offset)
|
||||||
{
|
{
|
||||||
auto& line = buffer()[coord.line];
|
auto& line = buffer()[coord.line];
|
||||||
auto character = std::max(0_char, std::min(line.char_count_to(coord.column) + offset,
|
auto character = std::max(0_char, std::min(line.char_count_to(coord.column) + offset,
|
||||||
|
@ -189,7 +189,7 @@ void Editor::move_selections(CharCount offset, SelectMode mode)
|
||||||
sort_and_merge_overlapping(m_selections, m_main_sel);
|
sort_and_merge_overlapping(m_selections, m_main_sel);
|
||||||
}
|
}
|
||||||
|
|
||||||
BufferCoord Editor::offset_coord(const BufferCoord& coord, LineCount offset)
|
BufferCoord Editor::offset_coord(BufferCoord coord, LineCount offset)
|
||||||
{
|
{
|
||||||
auto character = (*m_buffer)[coord.line].char_count_to(coord.column);
|
auto character = (*m_buffer)[coord.line].char_count_to(coord.column);
|
||||||
auto line = clamp(coord.line + offset, 0_line, m_buffer->line_count()-1);
|
auto line = clamp(coord.line + offset, 0_line, m_buffer->line_count()-1);
|
||||||
|
@ -364,21 +364,21 @@ public:
|
||||||
ModifiedRangesListener(Buffer& buffer)
|
ModifiedRangesListener(Buffer& buffer)
|
||||||
: BufferChangeListener_AutoRegister(buffer) {}
|
: BufferChangeListener_AutoRegister(buffer) {}
|
||||||
|
|
||||||
void on_insert(const Buffer& buffer, const BufferCoord& begin, const BufferCoord& end)
|
void on_insert(const Buffer& buffer, BufferCoord begin, BufferCoord end)
|
||||||
{
|
{
|
||||||
m_ranges.update_insert(buffer, begin, end);
|
m_ranges.update_insert(buffer, begin, end);
|
||||||
auto it = std::upper_bound(m_ranges.begin(), m_ranges.end(), begin,
|
auto it = std::upper_bound(m_ranges.begin(), m_ranges.end(), begin,
|
||||||
[](const BufferCoord& c, const Selection& sel)
|
[](BufferCoord c, const Selection& sel)
|
||||||
{ return c < sel.min(); });
|
{ return c < sel.min(); });
|
||||||
m_ranges.emplace(it, begin, buffer.char_prev(end));
|
m_ranges.emplace(it, begin, buffer.char_prev(end));
|
||||||
}
|
}
|
||||||
|
|
||||||
void on_erase(const Buffer& buffer, const BufferCoord& begin, const BufferCoord& end)
|
void on_erase(const Buffer& buffer, BufferCoord begin, BufferCoord end)
|
||||||
{
|
{
|
||||||
m_ranges.update_erase(buffer, begin, end);
|
m_ranges.update_erase(buffer, begin, end);
|
||||||
auto pos = std::min(begin, buffer.back_coord());
|
auto pos = std::min(begin, buffer.back_coord());
|
||||||
auto it = std::upper_bound(m_ranges.begin(), m_ranges.end(), pos,
|
auto it = std::upper_bound(m_ranges.begin(), m_ranges.end(), pos,
|
||||||
[](const BufferCoord& c, const Selection& sel)
|
[](BufferCoord c, const Selection& sel)
|
||||||
{ return c < sel.min(); });
|
{ return c < sel.min(); });
|
||||||
m_ranges.emplace(it, pos, pos);
|
m_ranges.emplace(it, pos, pos);
|
||||||
}
|
}
|
||||||
|
|
|
@ -61,7 +61,7 @@ public:
|
||||||
void flip_selections();
|
void flip_selections();
|
||||||
void keep_selection(int index);
|
void keep_selection(int index);
|
||||||
void remove_selection(int index);
|
void remove_selection(int index);
|
||||||
void select(const BufferCoord& c, SelectMode mode = SelectMode::Replace)
|
void select(BufferCoord c, SelectMode mode = SelectMode::Replace)
|
||||||
{ select(Selection{ buffer().clamp(c) }, mode); }
|
{ select(Selection{ buffer().clamp(c) }, mode); }
|
||||||
void select(const Selection& sel,
|
void select(const Selection& sel,
|
||||||
SelectMode mode = SelectMode::Replace);
|
SelectMode mode = SelectMode::Replace);
|
||||||
|
@ -91,8 +91,8 @@ private:
|
||||||
void begin_edition();
|
void begin_edition();
|
||||||
void end_edition();
|
void end_edition();
|
||||||
|
|
||||||
virtual BufferCoord offset_coord(const BufferCoord& coord, LineCount move);
|
virtual BufferCoord offset_coord(BufferCoord coord, LineCount move);
|
||||||
virtual BufferCoord offset_coord(const BufferCoord& coord, CharCount move);
|
virtual BufferCoord offset_coord(BufferCoord coord, CharCount move);
|
||||||
|
|
||||||
int m_edition_level;
|
int m_edition_level;
|
||||||
|
|
||||||
|
|
|
@ -386,7 +386,7 @@ private:
|
||||||
m_option->get<std::vector<LineAndFlag>>();
|
m_option->get<std::vector<LineAndFlag>>();
|
||||||
}
|
}
|
||||||
|
|
||||||
void on_insert(const Buffer&, const BufferCoord& begin, const BufferCoord& end) override
|
void on_insert(const Buffer&, BufferCoord begin, BufferCoord end) override
|
||||||
{
|
{
|
||||||
LineCount new_lines = end.line - begin.line;
|
LineCount new_lines = end.line - begin.line;
|
||||||
if (new_lines == 0)
|
if (new_lines == 0)
|
||||||
|
@ -401,7 +401,7 @@ private:
|
||||||
m_option->set(lines);
|
m_option->set(lines);
|
||||||
}
|
}
|
||||||
|
|
||||||
void on_erase(const Buffer&, const BufferCoord& begin, const BufferCoord& end) override
|
void on_erase(const Buffer&, BufferCoord begin, BufferCoord end) override
|
||||||
{
|
{
|
||||||
LineCount removed_lines = end.line - begin.line;
|
LineCount removed_lines = end.line - begin.line;
|
||||||
if (removed_lines == 0)
|
if (removed_lines == 0)
|
||||||
|
|
|
@ -497,7 +497,7 @@ struct BufferCompletion
|
||||||
};
|
};
|
||||||
|
|
||||||
static BufferCompletion complete_word(const Buffer& buffer,
|
static BufferCompletion complete_word(const Buffer& buffer,
|
||||||
const BufferCoord& cursor_pos,
|
BufferCoord cursor_pos,
|
||||||
bool other_buffers)
|
bool other_buffers)
|
||||||
{
|
{
|
||||||
auto pos = buffer.iterator_at(cursor_pos);
|
auto pos = buffer.iterator_at(cursor_pos);
|
||||||
|
@ -545,7 +545,7 @@ static BufferCompletion complete_word(const Buffer& buffer,
|
||||||
}
|
}
|
||||||
|
|
||||||
static BufferCompletion complete_opt(const Buffer& buffer,
|
static BufferCompletion complete_opt(const Buffer& buffer,
|
||||||
const BufferCoord& cursor_pos,
|
BufferCoord cursor_pos,
|
||||||
OptionManager& options)
|
OptionManager& options)
|
||||||
{
|
{
|
||||||
using StringList = std::vector<String>;
|
using StringList = std::vector<String>;
|
||||||
|
|
|
@ -13,60 +13,60 @@ struct LineAndColumn
|
||||||
constexpr LineAndColumn(LineType line = 0, ColumnType column = 0)
|
constexpr LineAndColumn(LineType line = 0, ColumnType column = 0)
|
||||||
: line(line), column(column) {}
|
: line(line), column(column) {}
|
||||||
|
|
||||||
constexpr EffectiveType operator+(const EffectiveType& other) const
|
constexpr EffectiveType operator+(EffectiveType other) const
|
||||||
{
|
{
|
||||||
return EffectiveType(line + other.line, column + other.column);
|
return EffectiveType(line + other.line, column + other.column);
|
||||||
}
|
}
|
||||||
|
|
||||||
EffectiveType& operator+=(const EffectiveType& other)
|
EffectiveType& operator+=(EffectiveType other)
|
||||||
{
|
{
|
||||||
line += other.line;
|
line += other.line;
|
||||||
column += other.column;
|
column += other.column;
|
||||||
return *static_cast<EffectiveType*>(this);
|
return *static_cast<EffectiveType*>(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr EffectiveType operator-(const EffectiveType& other) const
|
constexpr EffectiveType operator-(EffectiveType other) const
|
||||||
{
|
{
|
||||||
return EffectiveType(line - other.line, column - other.column);
|
return EffectiveType(line - other.line, column - other.column);
|
||||||
}
|
}
|
||||||
|
|
||||||
EffectiveType& operator-=(const EffectiveType& other)
|
EffectiveType& operator-=(EffectiveType other)
|
||||||
{
|
{
|
||||||
line -= other.line;
|
line -= other.line;
|
||||||
column -= other.column;
|
column -= other.column;
|
||||||
return *static_cast<EffectiveType*>(this);
|
return *static_cast<EffectiveType*>(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr bool operator< (const EffectiveType& other) const
|
constexpr bool operator< (EffectiveType other) const
|
||||||
{
|
{
|
||||||
return (line != other.line) ? line < other.line
|
return (line != other.line) ? line < other.line
|
||||||
: column < other.column;
|
: column < other.column;
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr bool operator<= (const EffectiveType& other) const
|
constexpr bool operator<= (EffectiveType other) const
|
||||||
{
|
{
|
||||||
return (line != other.line) ? line < other.line
|
return (line != other.line) ? line < other.line
|
||||||
: column <= other.column;
|
: column <= other.column;
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr bool operator> (const EffectiveType& other) const
|
constexpr bool operator> (EffectiveType other) const
|
||||||
{
|
{
|
||||||
return (line != other.line) ? line > other.line
|
return (line != other.line) ? line > other.line
|
||||||
: column > other.column;
|
: column > other.column;
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr bool operator>= (const EffectiveType& other) const
|
constexpr bool operator>= (EffectiveType other) const
|
||||||
{
|
{
|
||||||
return (line != other.line) ? line > other.line
|
return (line != other.line) ? line > other.line
|
||||||
: column >= other.column;
|
: column >= other.column;
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr bool operator== (const EffectiveType& other) const
|
constexpr bool operator== (EffectiveType other) const
|
||||||
{
|
{
|
||||||
return line == other.line and column == other.column;
|
return line == other.line and column == other.column;
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr bool operator!= (const EffectiveType& other) const
|
constexpr bool operator!= (EffectiveType other) const
|
||||||
{
|
{
|
||||||
return line != other.line or column != other.column;
|
return line != other.line or column != other.column;
|
||||||
}
|
}
|
||||||
|
|
|
@ -510,8 +510,8 @@ static DisplayCoord compute_needed_size(const String& str)
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
static DisplayCoord compute_pos(const DisplayCoord& anchor,
|
static DisplayCoord compute_pos(DisplayCoord anchor,
|
||||||
const DisplayCoord& size,
|
DisplayCoord size,
|
||||||
WINDOW* opt_window_to_avoid = nullptr)
|
WINDOW* opt_window_to_avoid = nullptr)
|
||||||
{
|
{
|
||||||
DisplayCoord scrsize = window_size(stdscr);
|
DisplayCoord scrsize = window_size(stdscr);
|
||||||
|
|
|
@ -723,7 +723,7 @@ void align(Context& context)
|
||||||
{
|
{
|
||||||
auto& selections = context.editor().selections();
|
auto& selections = context.editor().selections();
|
||||||
auto& buffer = context.buffer();
|
auto& buffer = context.buffer();
|
||||||
auto get_column = [&buffer](const BufferCoord& coord)
|
auto get_column = [&buffer](BufferCoord coord)
|
||||||
{ return buffer[coord.line].char_count_to(coord.column); };
|
{ return buffer[coord.line].char_count_to(coord.column); };
|
||||||
|
|
||||||
CharCount max_col = 0;
|
CharCount max_col = 0;
|
||||||
|
|
|
@ -19,10 +19,10 @@ namespace
|
||||||
|
|
||||||
template<template <bool, bool> class UpdateFunc>
|
template<template <bool, bool> class UpdateFunc>
|
||||||
void on_buffer_change(const Buffer& buffer, SelectionList& sels,
|
void on_buffer_change(const Buffer& buffer, SelectionList& sels,
|
||||||
const BufferCoord& begin, const BufferCoord& end, LineCount end_line)
|
BufferCoord begin, BufferCoord end, LineCount end_line)
|
||||||
{
|
{
|
||||||
auto update_beg = std::lower_bound(sels.begin(), sels.end(), begin,
|
auto update_beg = std::lower_bound(sels.begin(), sels.end(), begin,
|
||||||
[](const Selection& s, const BufferCoord& c) { return std::max(s.first(), s.last()) < c; });
|
[](const Selection& s, BufferCoord c) { return std::max(s.first(), s.last()) < c; });
|
||||||
auto update_only_line_beg = std::upper_bound(sels.begin(), sels.end(), end_line,
|
auto update_only_line_beg = std::upper_bound(sels.begin(), sels.end(), end_line,
|
||||||
[](LineCount l, const Selection& s) { return l < std::min(s.first(), s.last()).line; });
|
[](LineCount l, const Selection& s) { return l < std::min(s.first(), s.last()).line; });
|
||||||
|
|
||||||
|
@ -51,7 +51,7 @@ template<bool assume_different_line, bool assume_greater_than_begin>
|
||||||
struct UpdateInsert
|
struct UpdateInsert
|
||||||
{
|
{
|
||||||
void operator()(const Buffer& buffer, BufferCoord& coord,
|
void operator()(const Buffer& buffer, BufferCoord& coord,
|
||||||
const BufferCoord& begin, const BufferCoord& end) const
|
BufferCoord begin, BufferCoord end) const
|
||||||
{
|
{
|
||||||
if (assume_different_line)
|
if (assume_different_line)
|
||||||
kak_assert(begin.line < coord.line);
|
kak_assert(begin.line < coord.line);
|
||||||
|
@ -68,7 +68,7 @@ template<bool assume_different_line, bool assume_greater_than_begin>
|
||||||
struct UpdateErase
|
struct UpdateErase
|
||||||
{
|
{
|
||||||
void operator()(const Buffer& buffer, BufferCoord& coord,
|
void operator()(const Buffer& buffer, BufferCoord& coord,
|
||||||
const BufferCoord& begin, const BufferCoord& end) const
|
BufferCoord begin, BufferCoord end) const
|
||||||
{
|
{
|
||||||
if (not assume_greater_than_begin and coord < begin)
|
if (not assume_greater_than_begin and coord < begin)
|
||||||
return;
|
return;
|
||||||
|
@ -91,12 +91,12 @@ struct UpdateErase
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SelectionList::update_insert(const Buffer& buffer, const BufferCoord& begin, const BufferCoord& end)
|
void SelectionList::update_insert(const Buffer& buffer, BufferCoord begin, BufferCoord end)
|
||||||
{
|
{
|
||||||
on_buffer_change<UpdateInsert>(buffer, *this, begin, end, begin.line);
|
on_buffer_change<UpdateInsert>(buffer, *this, begin, end, begin.line);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SelectionList::update_erase(const Buffer& buffer, const BufferCoord& begin, const BufferCoord& end)
|
void SelectionList::update_erase(const Buffer& buffer, BufferCoord begin, BufferCoord end)
|
||||||
{
|
{
|
||||||
on_buffer_change<UpdateErase>(buffer, *this, begin, end, end.line);
|
on_buffer_change<UpdateErase>(buffer, *this, begin, end, end.line);
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,7 +10,7 @@ namespace Kakoune
|
||||||
struct Range
|
struct Range
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Range(const BufferCoord& first, const BufferCoord& last)
|
Range(BufferCoord first, BufferCoord last)
|
||||||
: m_first{first}, m_last{last} {}
|
: m_first{first}, m_last{last} {}
|
||||||
|
|
||||||
void merge_with(const Range& range);
|
void merge_with(const Range& range);
|
||||||
|
@ -56,8 +56,8 @@ using CaptureList = std::vector<String>;
|
||||||
// A selection is a Range, associated with a CaptureList
|
// A selection is a Range, associated with a CaptureList
|
||||||
struct Selection : public Range
|
struct Selection : public Range
|
||||||
{
|
{
|
||||||
explicit Selection(const BufferCoord& pos) : Range(pos,pos) {}
|
explicit Selection(BufferCoord pos) : Range(pos,pos) {}
|
||||||
Selection(const BufferCoord& first, const BufferCoord& last,
|
Selection(BufferCoord first, BufferCoord last,
|
||||||
CaptureList captures = {})
|
CaptureList captures = {})
|
||||||
: Range(first, last), m_captures(std::move(captures)) {}
|
: Range(first, last), m_captures(std::move(captures)) {}
|
||||||
|
|
||||||
|
@ -76,8 +76,8 @@ struct SelectionList : std::vector<Selection>
|
||||||
SelectionList() = default;
|
SelectionList() = default;
|
||||||
SelectionList(Selection s) : std::vector<Selection>{s} {}
|
SelectionList(Selection s) : std::vector<Selection>{s} {}
|
||||||
|
|
||||||
void update_insert(const Buffer& buffer, const BufferCoord& begin, const BufferCoord& end);
|
void update_insert(const Buffer& buffer, BufferCoord begin, BufferCoord end);
|
||||||
void update_erase(const Buffer& buffer, const BufferCoord& begin, const BufferCoord& end);
|
void update_erase(const Buffer& buffer, BufferCoord begin, BufferCoord end);
|
||||||
|
|
||||||
void check_invariant() const;
|
void check_invariant() const;
|
||||||
};
|
};
|
||||||
|
|
|
@ -228,8 +228,8 @@ Selection select_matching(const Buffer& buffer, const Selection& selection)
|
||||||
// c++14 will add std::optional, so we use boost::optional until then
|
// c++14 will add std::optional, so we use boost::optional until then
|
||||||
using boost::optional;
|
using boost::optional;
|
||||||
static optional<Range> find_surrounding(const Buffer& buffer,
|
static optional<Range> find_surrounding(const Buffer& buffer,
|
||||||
const BufferCoord& coord,
|
BufferCoord coord,
|
||||||
const CodepointPair& matching,
|
CodepointPair matching,
|
||||||
ObjectFlags flags)
|
ObjectFlags flags)
|
||||||
{
|
{
|
||||||
const bool to_begin = flags & ObjectFlags::ToBegin;
|
const bool to_begin = flags & ObjectFlags::ToBegin;
|
||||||
|
@ -290,7 +290,7 @@ static optional<Range> find_surrounding(const Buffer& buffer,
|
||||||
}
|
}
|
||||||
|
|
||||||
Selection select_surrounding(const Buffer& buffer, const Selection& selection,
|
Selection select_surrounding(const Buffer& buffer, const Selection& selection,
|
||||||
const CodepointPair& matching,
|
CodepointPair matching,
|
||||||
ObjectFlags flags)
|
ObjectFlags flags)
|
||||||
{
|
{
|
||||||
auto res = find_surrounding(buffer, selection.last(), matching, flags);
|
auto res = find_surrounding(buffer, selection.last(), matching, flags);
|
||||||
|
|
|
@ -68,8 +68,7 @@ SelectionList split_selection(const Buffer& buffer, const Selection& selection,
|
||||||
|
|
||||||
using CodepointPair = std::pair<Codepoint, Codepoint>;
|
using CodepointPair = std::pair<Codepoint, Codepoint>;
|
||||||
Selection select_surrounding(const Buffer& buffer, const Selection& selection,
|
Selection select_surrounding(const Buffer& buffer, const Selection& selection,
|
||||||
const CodepointPair& matching,
|
CodepointPair matching, ObjectFlags flags);
|
||||||
ObjectFlags flags);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -89,13 +89,13 @@ void Window::update_display_buffer()
|
||||||
m_timestamp = buffer().timestamp();
|
m_timestamp = buffer().timestamp();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Window::set_position(const DisplayCoord& position)
|
void Window::set_position(DisplayCoord position)
|
||||||
{
|
{
|
||||||
m_position.line = std::max(0_line, position.line);
|
m_position.line = std::max(0_line, position.line);
|
||||||
m_position.column = std::max(0_char, position.column);
|
m_position.column = std::max(0_char, position.column);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Window::set_dimensions(const DisplayCoord& dimensions)
|
void Window::set_dimensions(DisplayCoord dimensions)
|
||||||
{
|
{
|
||||||
m_dimensions = dimensions;
|
m_dimensions = dimensions;
|
||||||
}
|
}
|
||||||
|
@ -174,7 +174,7 @@ void Window::scroll_to_keep_cursor_visible_ifn()
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
CharCount find_display_column(const DisplayLine& line, const Buffer& buffer,
|
CharCount find_display_column(const DisplayLine& line, const Buffer& buffer,
|
||||||
const BufferCoord& coord)
|
BufferCoord coord)
|
||||||
{
|
{
|
||||||
CharCount column = 0;
|
CharCount column = 0;
|
||||||
for (auto& atom : line)
|
for (auto& atom : line)
|
||||||
|
@ -212,7 +212,7 @@ BufferCoord find_buffer_coord(const DisplayLine& line, const Buffer& buffer,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DisplayCoord Window::display_position(const BufferCoord& coord)
|
DisplayCoord Window::display_position(BufferCoord coord)
|
||||||
{
|
{
|
||||||
LineCount l = 0;
|
LineCount l = 0;
|
||||||
for (auto& line : m_display_buffer.lines())
|
for (auto& line : m_display_buffer.lines())
|
||||||
|
@ -225,7 +225,7 @@ DisplayCoord Window::display_position(const BufferCoord& coord)
|
||||||
return { 0, 0 };
|
return { 0, 0 };
|
||||||
}
|
}
|
||||||
|
|
||||||
BufferCoord Window::offset_coord(const BufferCoord& coord, LineCount offset)
|
BufferCoord Window::offset_coord(BufferCoord coord, LineCount offset)
|
||||||
{
|
{
|
||||||
auto line = clamp(coord.line + offset, 0_line, buffer().line_count()-1);
|
auto line = clamp(coord.line + offset, 0_line, buffer().line_count()-1);
|
||||||
DisplayBuffer display_buffer;
|
DisplayBuffer display_buffer;
|
||||||
|
|
|
@ -25,10 +25,10 @@ public:
|
||||||
~Window();
|
~Window();
|
||||||
|
|
||||||
const DisplayCoord& position() const { return m_position; }
|
const DisplayCoord& position() const { return m_position; }
|
||||||
void set_position(const DisplayCoord& position);
|
void set_position(DisplayCoord position);
|
||||||
|
|
||||||
const DisplayCoord& dimensions() const { return m_dimensions; }
|
const DisplayCoord& dimensions() const { return m_dimensions; }
|
||||||
void set_dimensions(const DisplayCoord& dimensions);
|
void set_dimensions(DisplayCoord dimensions);
|
||||||
|
|
||||||
const DisplayBuffer& display_buffer() const { return m_display_buffer; }
|
const DisplayBuffer& display_buffer() const { return m_display_buffer; }
|
||||||
|
|
||||||
|
@ -38,7 +38,7 @@ public:
|
||||||
void scroll(CharCount offset);
|
void scroll(CharCount offset);
|
||||||
void update_display_buffer();
|
void update_display_buffer();
|
||||||
|
|
||||||
DisplayCoord display_position(const BufferCoord& coord);
|
DisplayCoord display_position(BufferCoord coord);
|
||||||
|
|
||||||
HighlighterGroup& highlighters() { return m_highlighters; }
|
HighlighterGroup& highlighters() { return m_highlighters; }
|
||||||
|
|
||||||
|
@ -57,7 +57,7 @@ private:
|
||||||
|
|
||||||
void scroll_to_keep_cursor_visible_ifn();
|
void scroll_to_keep_cursor_visible_ifn();
|
||||||
|
|
||||||
BufferCoord offset_coord(const BufferCoord& coord, LineCount move) override;
|
BufferCoord offset_coord(BufferCoord coord, LineCount move) override;
|
||||||
|
|
||||||
DisplayCoord m_position;
|
DisplayCoord m_position;
|
||||||
DisplayCoord m_dimensions;
|
DisplayCoord m_dimensions;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user