Missing test in std.string.replace
simendsjo
simen.endsjo at pandavre.com
Mon Aug 9 15:53:19 PDT 2010
On 10.08.2010 00:29, simendsjo wrote:
> Replacing with "" / null is missing.
> I first looked at the function and modified it. Quickly noticed that a
> few unit tests were missing:
>
> assert(replace("foo", "foo", "") == "");
> assert(replace("foo", "foo", null) == "");
I refactored replace to understand what was going on (related to my post
"is this more readable").
I've seen a couple of functions using Appender, and it's documentation
says it's faster than ~=. I tried to change char[] result to Appender,
but dmd crashed...
string replace(string s, string from, string to)
{
if (from.length == 0) // Nothing to replace
return s;
char[] result;
for (size_t searchIndex; searchIndex < s.length; )
{
auto rest = s[searchIndex .. s.length];
auto fromIndex = indexOf(rest, from);
bool nothingToReplace = (fromIndex == -1);
if (nothingToReplace)
{
bool firstSearch = (searchIndex == 0);
if (firstSearch)
{
// Never found, so just return s
return s;
}
result ~= rest;
break;
}
auto beforeFrom = s[searchIndex .. searchIndex + fromIndex];
result ~= beforeFrom;
result ~= to;
searchIndex += fromIndex + from.length;
}
return assumeUnique(result);
}
More information about the Digitalmars-d-learn
mailing list