mirror of
https://github.com/dlang/phobos.git
synced 2025-04-28 22:21:09 +03:00
fix levenshteinDistance for string-like types
This commit is contained in:
parent
f5843a3cfe
commit
f8af54dce7
1 changed files with 46 additions and 1 deletions
|
@ -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.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue