Mercurial > projects > orange
diff orange/core/string.d @ 27:fc315d786f24 experimental
Added unit testing.
author | Jacob Carlborg <doob@me.com> |
---|---|
date | Fri, 19 Nov 2010 11:14:55 +0100 |
parents | 78e5fef4bbf2 |
children | 068e853b9c07 |
line wrap: on
line diff
--- a/orange/core/string.d Tue Oct 19 10:22:10 2010 +0200 +++ b/orange/core/string.d Fri Nov 19 11:14:55 2010 +0100 @@ -48,6 +48,8 @@ alias std.string.toString fromStringz; } +import orange.util.Traits; + version (Tango) { /** @@ -885,4 +887,54 @@ return i; } +} + +T[] replace (T) (T[] source, dchar match, dchar replacement) +{ + static assert(isChar!(T), `The type "` ~ T.stringof ~ `" is not a valid type for this function only strings are accepted`); + + dchar endOfCodeRange; + + static if (is(T == wchar)) + { + const encodedLength = 2; + endOfCodeRange = wchar.init; + } + + else static if (is(T == char)) + { + const encodedLength = 4; + endOfCodeRange = '\x7F'; + } + + if (replacement <= endOfCodeRange && match <= endOfCodeRange) + { + foreach (ref c ; source) + if (c == match) + c = replacement; + + return source; + } + + else + { + static if (!is(T == dchar)) + { + T[encodedLength] encodedMatch; + T[encodedLength] encodedReplacement; + + version (Tango) + return source.substitute(encode(encodedMatch, match), encode(encodedReplacement, replacement)); + + else + { + auto matchLength = encode(encodedMatch, match); + auto replacementLength = encode(encodedReplacement, replacement); + + return std.string.replace(source, encodedMatch[0 .. matchLength], encodedReplacement[0 .. replacementLength]); + } + } + } + + return source; } \ No newline at end of file