Take subsequence matches index when sorting RankedMatch
This commit is contained in:
parent
f8e64ba29f
commit
9b70346a00
|
@ -46,18 +46,22 @@ static bool smartcase_eq(Codepoint query, Codepoint candidate)
|
||||||
return query == (islower(query) ? to_lower(candidate) : candidate);
|
return query == (islower(query) ? to_lower(candidate) : candidate);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool subsequence_match_smart_case(StringView str, StringView subseq)
|
static bool subsequence_match_smart_case(StringView str, StringView subseq, int& index_sum)
|
||||||
{
|
{
|
||||||
|
index_sum = 0;
|
||||||
Utf8It it{str.begin(), str};
|
Utf8It it{str.begin(), str};
|
||||||
|
int index = 0;
|
||||||
for (Utf8It subseq_it{subseq.begin(), subseq}; subseq_it != subseq.end(); ++subseq_it)
|
for (Utf8It subseq_it{subseq.begin(), subseq}; subseq_it != subseq.end(); ++subseq_it)
|
||||||
{
|
{
|
||||||
if (it == str.end())
|
if (it == str.end())
|
||||||
return false;
|
return false;
|
||||||
while (not smartcase_eq(*subseq_it, *it))
|
while (not smartcase_eq(*subseq_it, *it))
|
||||||
{
|
{
|
||||||
|
++index;
|
||||||
if (++it == str.end())
|
if (++it == str.end())
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
index_sum += index++;
|
||||||
++it;
|
++it;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
@ -74,7 +78,7 @@ RankedMatch::RankedMatch(StringView candidate, StringView query)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (not subsequence_match_smart_case(candidate, query))
|
if (not subsequence_match_smart_case(candidate, query, m_match_index_sum))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
m_candidate = candidate;
|
m_candidate = candidate;
|
||||||
|
@ -87,6 +91,9 @@ RankedMatch::RankedMatch(StringView candidate, StringView query)
|
||||||
|
|
||||||
bool RankedMatch::operator<(const RankedMatch& other) const
|
bool RankedMatch::operator<(const RankedMatch& other) const
|
||||||
{
|
{
|
||||||
|
if (m_first_char_match != other.m_first_char_match)
|
||||||
|
return m_first_char_match;
|
||||||
|
|
||||||
if (m_only_word_boundary and other.m_only_word_boundary)
|
if (m_only_word_boundary and other.m_only_word_boundary)
|
||||||
{
|
{
|
||||||
if (m_word_boundary_match_count != other.m_word_boundary_match_count)
|
if (m_word_boundary_match_count != other.m_word_boundary_match_count)
|
||||||
|
@ -101,8 +108,8 @@ bool RankedMatch::operator<(const RankedMatch& other) const
|
||||||
if (m_word_boundary_match_count != other.m_word_boundary_match_count)
|
if (m_word_boundary_match_count != other.m_word_boundary_match_count)
|
||||||
return m_word_boundary_match_count > other.m_word_boundary_match_count;
|
return m_word_boundary_match_count > other.m_word_boundary_match_count;
|
||||||
|
|
||||||
if (m_first_char_match != other.m_first_char_match)
|
if (m_match_index_sum != other.m_match_index_sum)
|
||||||
return m_first_char_match;
|
return m_match_index_sum < other.m_match_index_sum;
|
||||||
|
|
||||||
return std::lexicographical_compare(
|
return std::lexicographical_compare(
|
||||||
Utf8It{m_candidate.begin(), m_candidate}, Utf8It{m_candidate.end(), m_candidate},
|
Utf8It{m_candidate.begin(), m_candidate}, Utf8It{m_candidate.end(), m_candidate},
|
||||||
|
|
|
@ -21,6 +21,7 @@ private:
|
||||||
bool m_first_char_match = false;
|
bool m_first_char_match = false;
|
||||||
bool m_prefix = false;
|
bool m_prefix = false;
|
||||||
int m_word_boundary_match_count = 0;
|
int m_word_boundary_match_count = 0;
|
||||||
|
int m_match_index_sum;
|
||||||
bool m_only_word_boundary = false;
|
bool m_only_word_boundary = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user