refactoring selectors
This commit is contained in:
parent
af90db8330
commit
2195d59b49
|
@ -59,19 +59,17 @@ bool is_begin(const Utf8Iterator& it) { return it.underlying_iterator().is_begin
|
||||||
bool is_end(const Utf8Iterator& it) { return it.underlying_iterator().is_end(); }
|
bool is_end(const Utf8Iterator& it) { return it.underlying_iterator().is_end(); }
|
||||||
|
|
||||||
template<typename Iterator, typename T>
|
template<typename Iterator, typename T>
|
||||||
bool skip_while(Iterator& it, T condition)
|
void skip_while(Iterator& it, T condition)
|
||||||
{
|
{
|
||||||
while (not is_end(it) and condition(*it))
|
while (not is_end(it) and condition(*it))
|
||||||
++it;
|
++it;
|
||||||
return not is_end(it) and condition(*it);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename Iterator, typename T>
|
template<typename Iterator, typename T>
|
||||||
bool skip_while_reverse(Iterator& it, T condition)
|
void skip_while_reverse(Iterator& it, T condition)
|
||||||
{
|
{
|
||||||
while (not is_begin(it) and condition(*it))
|
while (not is_begin(it) and condition(*it))
|
||||||
--it;
|
--it;
|
||||||
return not is_end(it) and condition(*it);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Selection utf8_selection(const Utf8Iterator& first, const Utf8Iterator& last)
|
Selection utf8_selection(const Utf8Iterator& first, const Utf8Iterator& last)
|
||||||
|
@ -99,9 +97,9 @@ Selection select_to_next_word(const Selection& selection)
|
||||||
else if (is_word<punctuation_is_word>(*begin))
|
else if (is_word<punctuation_is_word>(*begin))
|
||||||
skip_while(end, is_word<punctuation_is_word>);
|
skip_while(end, is_word<punctuation_is_word>);
|
||||||
|
|
||||||
bool with_end = skip_while(end, is_blank);
|
skip_while(end, is_blank);
|
||||||
|
|
||||||
return utf8_selection(begin, with_end ? end : end-1);
|
return utf8_selection(begin, end-1);
|
||||||
}
|
}
|
||||||
template Selection select_to_next_word<false>(const Selection&);
|
template Selection select_to_next_word<false>(const Selection&);
|
||||||
template Selection select_to_next_word<true>(const Selection&);
|
template Selection select_to_next_word<true>(const Selection&);
|
||||||
|
@ -118,13 +116,12 @@ Selection select_to_next_word_end(const Selection& selection)
|
||||||
Utf8Iterator end = begin;
|
Utf8Iterator end = begin;
|
||||||
skip_while(end, is_blank);
|
skip_while(end, is_blank);
|
||||||
|
|
||||||
bool with_end = false;
|
|
||||||
if (not punctuation_is_word and is_punctuation(*end))
|
if (not punctuation_is_word and is_punctuation(*end))
|
||||||
with_end = skip_while(end, is_punctuation);
|
skip_while(end, is_punctuation);
|
||||||
else if (is_word<punctuation_is_word>(*end))
|
else if (is_word<punctuation_is_word>(*end))
|
||||||
with_end = skip_while(end, is_word<punctuation_is_word>);
|
skip_while(end, is_word<punctuation_is_word>);
|
||||||
|
|
||||||
return utf8_selection(begin, with_end ? end : end-1);
|
return utf8_selection(begin, end-1);
|
||||||
}
|
}
|
||||||
template Selection select_to_next_word_end<false>(const Selection&);
|
template Selection select_to_next_word_end<false>(const Selection&);
|
||||||
template Selection select_to_next_word_end<true>(const Selection&);
|
template Selection select_to_next_word_end<true>(const Selection&);
|
||||||
|
@ -144,9 +141,15 @@ Selection select_to_previous_word(const Selection& selection)
|
||||||
|
|
||||||
bool with_end = false;
|
bool with_end = false;
|
||||||
if (not punctuation_is_word and is_punctuation(*end))
|
if (not punctuation_is_word and is_punctuation(*end))
|
||||||
with_end = skip_while_reverse(end, is_punctuation);
|
{
|
||||||
|
skip_while_reverse(end, is_punctuation);
|
||||||
|
with_end = is_punctuation(*end);
|
||||||
|
}
|
||||||
else if (is_word<punctuation_is_word>(*end))
|
else if (is_word<punctuation_is_word>(*end))
|
||||||
with_end = skip_while_reverse(end, is_word<punctuation_is_word>);
|
{
|
||||||
|
skip_while_reverse(end, is_word<punctuation_is_word>);
|
||||||
|
with_end = is_word<punctuation_is_word>(*end);
|
||||||
|
}
|
||||||
|
|
||||||
return utf8_selection(begin, with_end ? end : end+1);
|
return utf8_selection(begin, with_end ? end : end+1);
|
||||||
}
|
}
|
||||||
|
@ -325,7 +328,8 @@ Selection select_whole_word(const Selection& selection, bool inner)
|
||||||
Utf8Iterator last = first;
|
Utf8Iterator last = first;
|
||||||
if (is_word(*first))
|
if (is_word(*first))
|
||||||
{
|
{
|
||||||
if (not skip_while_reverse(first, is_word<punctuation_is_word>))
|
skip_while_reverse(first, is_word<punctuation_is_word>);
|
||||||
|
if (not is_word<punctuation_is_word>(*first))
|
||||||
++first;
|
++first;
|
||||||
skip_while(last, is_word<punctuation_is_word>);
|
skip_while(last, is_word<punctuation_is_word>);
|
||||||
if (not inner)
|
if (not inner)
|
||||||
|
@ -333,7 +337,8 @@ Selection select_whole_word(const Selection& selection, bool inner)
|
||||||
}
|
}
|
||||||
else if (not inner)
|
else if (not inner)
|
||||||
{
|
{
|
||||||
if (not skip_while_reverse(first, is_blank))
|
skip_while_reverse(first, is_blank);
|
||||||
|
if (is_blank(*first))
|
||||||
++first;
|
++first;
|
||||||
skip_while(last, is_blank);
|
skip_while(last, is_blank);
|
||||||
if (not is_word<punctuation_is_word>(*last))
|
if (not is_word<punctuation_is_word>(*last))
|
||||||
|
@ -348,19 +353,20 @@ template Selection select_whole_word<true>(const Selection&, bool);
|
||||||
|
|
||||||
Selection select_whole_lines(const Selection& selection)
|
Selection select_whole_lines(const Selection& selection)
|
||||||
{
|
{
|
||||||
// no need to be utf8 aware for is_eol as we only use \n as line seperator
|
// no need to be utf8 aware for is_eol as we only use \n as line seperator
|
||||||
BufferIterator first = selection.first();
|
BufferIterator first = selection.first();
|
||||||
BufferIterator last = selection.last();
|
BufferIterator last = selection.last();
|
||||||
BufferIterator& to_line_start = first <= last ? first : last;
|
BufferIterator& to_line_start = first <= last ? first : last;
|
||||||
BufferIterator& to_line_end = first <= last ? last : first;
|
BufferIterator& to_line_end = first <= last ? last : first;
|
||||||
|
|
||||||
--to_line_start;
|
--to_line_start;
|
||||||
skip_while_reverse(to_line_start, [](char cur) { return not is_eol(cur); });
|
skip_while_reverse(to_line_start, [](char cur) { return not is_eol(cur); });
|
||||||
++to_line_start;
|
if (is_eol(*to_line_start))
|
||||||
|
++to_line_start;
|
||||||
|
|
||||||
skip_while(to_line_end, [](char cur) { return not is_eol(cur); });
|
skip_while(to_line_end, [](char cur) { return not is_eol(cur); });
|
||||||
|
|
||||||
return Selection(first, last);
|
return Selection(first, last);
|
||||||
}
|
}
|
||||||
|
|
||||||
Selection select_whole_buffer(const Selection& selection)
|
Selection select_whole_buffer(const Selection& selection)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user