comparison 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
comparison
equal deleted inserted replaced
26:78e5fef4bbf2 27:fc315d786f24
45 alias std.string.toStringz toStringz; 45 alias std.string.toStringz toStringz;
46 alias std.utf.toUTF16z toString16z; 46 alias std.utf.toUTF16z toString16z;
47 47
48 alias std.string.toString fromStringz; 48 alias std.string.toString fromStringz;
49 } 49 }
50
51 import orange.util.Traits;
50 52
51 version (Tango) 53 version (Tango)
52 { 54 {
53 /** 55 /**
54 * string alias 56 * string alias
884 ++i; 886 ++i;
885 887
886 return i; 888 return i;
887 } 889 }
888 } 890 }
891
892 T[] replace (T) (T[] source, dchar match, dchar replacement)
893 {
894 static assert(isChar!(T), `The type "` ~ T.stringof ~ `" is not a valid type for this function only strings are accepted`);
895
896 dchar endOfCodeRange;
897
898 static if (is(T == wchar))
899 {
900 const encodedLength = 2;
901 endOfCodeRange = wchar.init;
902 }
903
904 else static if (is(T == char))
905 {
906 const encodedLength = 4;
907 endOfCodeRange = '\x7F';
908 }
909
910 if (replacement <= endOfCodeRange && match <= endOfCodeRange)
911 {
912 foreach (ref c ; source)
913 if (c == match)
914 c = replacement;
915
916 return source;
917 }
918
919 else
920 {
921 static if (!is(T == dchar))
922 {
923 T[encodedLength] encodedMatch;
924 T[encodedLength] encodedReplacement;
925
926 version (Tango)
927 return source.substitute(encode(encodedMatch, match), encode(encodedReplacement, replacement));
928
929 else
930 {
931 auto matchLength = encode(encodedMatch, match);
932 auto replacementLength = encode(encodedReplacement, replacement);
933
934 return std.string.replace(source, encodedMatch[0 .. matchLength], encodedReplacement[0 .. replacementLength]);
935 }
936 }
937 }
938
939 return source;
940 }