diff options
| author | Maxime Coste <frrrwww@gmail.com> | 2015-10-22 19:49:08 +0100 |
|---|---|---|
| committer | Maxime Coste <frrrwww@gmail.com> | 2015-10-22 19:49:08 +0100 |
| commit | c77cb7c777ffc6f23ad53003d3531c1957fcdd0b (patch) | |
| tree | 2f4454188d84c1a6ed20169ad2b6b5f62b384e80 /src/ranked_match.cc | |
| parent | 019b3235b0e7aaad086631e1ee9b3102f096d349 (diff) | |
Extract WordDB::RankedWord as RankedMatch in its own file
Diffstat (limited to 'src/ranked_match.cc')
| -rw-r--r-- | src/ranked_match.cc | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/src/ranked_match.cc b/src/ranked_match.cc new file mode 100644 index 00000000..0063b8ae --- /dev/null +++ b/src/ranked_match.cc @@ -0,0 +1,40 @@ +#include "ranked_match.hh" + +namespace Kakoune +{ + +int match_rank(StringView candidate, StringView query) +{ + int rank = 0; + auto it = candidate.begin(); + char prev = 0; + for (auto c : query) + { + if (it == candidate.end()) + return 0; + + const bool islow = islower(c); + auto eq_c = [islow, c](char ch) { return islow ? tolower(ch) == c : ch == c; }; + + if (eq_c(*it)) // improve rank on contiguous + ++rank; + + while (!eq_c(*it)) + { + prev = *it; + if (++it == candidate.end()) + return 0; + } + // Improve rank on word boundaries + if (prev == 0 or prev == '_' or + (islower(prev) and isupper(*it))) + rank += 5; + + prev = c; + ++rank; + ++it; + } + return rank; +} + +} |
