summaryrefslogtreecommitdiff
path: root/src/ranked_match.cc
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2015-10-22 19:49:08 +0100
committerMaxime Coste <frrrwww@gmail.com>2015-10-22 19:49:08 +0100
commitc77cb7c777ffc6f23ad53003d3531c1957fcdd0b (patch)
tree2f4454188d84c1a6ed20169ad2b6b5f62b384e80 /src/ranked_match.cc
parent019b3235b0e7aaad086631e1ee9b3102f096d349 (diff)
Extract WordDB::RankedWord as RankedMatch in its own file
Diffstat (limited to 'src/ranked_match.cc')
-rw-r--r--src/ranked_match.cc40
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;
+}
+
+}