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