fix levenshteinDistance for string-like types

This commit is contained in:
Martin Nowak 2015-10-22 23:51:24 +02:00
parent f5843a3cfe
commit f8af54dce7

View file

@ -1164,6 +1164,32 @@ size_t levenshteinDistance(alias equals = (a,b) => a == b, Range1, Range2)
assert(levenshteinDistance("cat"d, "rat"d) == 1);
}
// compat overload for alias this strings
size_t levenshteinDistance(alias equals = (a,b) => a == b, Range1, Range2)
(auto ref Range1 s, auto ref Range2 t)
if (isStringLike!Range1 || isStringLike!Range2)
{
import std.meta : staticMap;
alias Types = staticMap!(peelStringLike, Range1, Range2);
return levenshteinDistance!(equals, Types)(s, t);
}
@safe unittest
{
static struct S { string s; alias s this; }
assert(levenshteinDistance(S("cat"), S("rat")) == 1);
assert(levenshteinDistance("cat", S("rat")) == 1);
assert(levenshteinDistance(S("cat"), "rat") == 1);
}
@safe @nogc nothrow unittest
{
static struct S { dstring s; alias s this; }
assert(levenshteinDistance(S("cat"d), S("rat"d)) == 1);
assert(levenshteinDistance("cat"d, S("rat"d)) == 1);
assert(levenshteinDistance(S("cat"d), "rat"d) == 1);
}
/**
Returns the Levenshtein distance and the edit path between $(D s) and
$(D t).
@ -1180,7 +1206,7 @@ Returns:
Allocates GC memory for the returned EditOp[] array.
*/
Tuple!(size_t, EditOp[])
levenshteinDistanceAndPath(alias equals = "a == b", Range1, Range2)
levenshteinDistanceAndPath(alias equals = (a,b) => a == b, Range1, Range2)
(Range1 s, Range2 t)
if (isForwardRange!(Range1) && isForwardRange!(Range2))
{
@ -1210,6 +1236,25 @@ levenshteinDistanceAndPath(alias equals = "a == b", Range1, Range2)
assert(levenshteinDistance("kitten", "sitting") == 3);
}
// compat overload for alias this strings
Tuple!(size_t, EditOp[])
levenshteinDistanceAndPath(alias equals = (a,b) => a == b, Range1, Range2)
(auto ref Range1 s, auto ref Range2 t)
if (isStringLike!Range1 || isStringLike!Range2)
{
import std.meta : staticMap;
alias Types = staticMap!(peelStringLike, Range1, Range2);
return levenshteinDistanceAndPath!(equals, Types)(s, t);
}
@safe unittest
{
static struct S { string s; alias s this; }
assert(levenshteinDistanceAndPath(S("cat"), S("rat"))[0] == 1);
assert(levenshteinDistanceAndPath("cat", S("rat"))[0] == 1);
assert(levenshteinDistanceAndPath(S("cat"), "rat")[0] == 1);
}
// max
/**
Iterates the passed arguments and return the maximum value.