This commit is contained in:
Dmitry Atamanov 2015-01-26 15:33:17 +05:00
parent 43286f8074
commit a69f9d0d66

View file

@ -1085,31 +1085,28 @@ size_t levenshteinDistance(alias equals = "a == b", Range1, Range2)
(Range1 s, Range2 t) (Range1 s, Range2 t)
if (isForwardRange!(Range1) && isForwardRange!(Range2)) if (isForwardRange!(Range1) && isForwardRange!(Range2))
{ {
alias comp = binaryFun!(equals); alias eq = binaryFun!(equals);
while (!s.empty() && !t.empty() && comp(s.front, t.front)) for (;;)
{ {
s.popFront(); if (s.empty) return t.walkLength;
t.popFront(); if (t.empty) return s.walkLength;
} if (eq(s.front, t.front))
static if (isBidirectionalRange!(Range1) && isBidirectionalRange!(Range2))
{
while (!s.empty() && !t.empty() && comp(s.back, t.back))
{ {
s.popBack(); s.popFront();
t.popBack(); t.popFront();
continue;
} }
} static if (isBidirectionalRange!(Range1) && isBidirectionalRange!(Range2))
{
if (s.empty()) if (eq(s.back, t.back))
{ {
return walkLength(t); s.popBack();
} t.popBack();
continue;
if (t.empty()) }
{ }
return walkLength(s); break;
} }
auto slen = walkLength(s.save); auto slen = walkLength(s.save);
@ -1117,7 +1114,7 @@ size_t levenshteinDistance(alias equals = "a == b", Range1, Range2)
if (slen == 1 && tlen == 1) if (slen == 1 && tlen == 1)
{ {
if (comp(s.front, t.front)) if (eq(s.front, t.front))
return 0; return 0;
else else
return 1; return 1;
@ -1125,12 +1122,12 @@ size_t levenshteinDistance(alias equals = "a == b", Range1, Range2)
if (slen > tlen) if (slen > tlen)
{ {
Levenshtein!(Range1, comp, size_t) lev; Levenshtein!(Range1, eq, size_t) lev;
return lev.distanceLowMem(s, t, slen, tlen); return lev.distanceLowMem(s, t, slen, tlen);
} }
else else
{ {
Levenshtein!(Range2, comp, size_t) lev; Levenshtein!(Range2, eq, size_t) lev;
return lev.distanceLowMem(t, s, tlen, slen); return lev.distanceLowMem(t, s, tlen, slen);
} }
} }