digitalmars.D.bugs - [Issue 7146] New: enhance strip* (implementation provided)
- d-bugmail puremagic.com (104/104) Dec 21 2011 http://d.puremagic.com/issues/show_bug.cgi?id=7146
http://d.puremagic.com/issues/show_bug.cgi?id=7146 Summary: enhance strip* (implementation provided) Product: D Version: D2 Platform: Other OS/Version: All Status: NEW Severity: enhancement Priority: P2 Component: Phobos AssignedTo: nobody puremagic.com ReportedBy: pompei2 gmail.com In some languages (e.g. python), the string "strip" function family accepts an optional parameter which specifies the set of characters one wants to strip. If not given, this is "whitespace". I think this is very useful and the D strip should support that too. For example, I needed it when getting a char buffer filled by a C function and converting it to a string. Here is the implementation of these including unittests that you can just drop into the string.d file if you remove the import line. I would very much like to see this included in phobos - no copyright/whatever needed. // Remove when integrating into std.string. import std.range, std.string, std.traits, std.utf; /++ Strips leading characters. +/ S stripLeft(S)(S s, S charsToStrip) pure if(isSomeString!S) { bool foundIt; size_t notInSet; foreach(i, dchar c; s) { // Because of the call to indexOf, this function can't be safe anymore. if(indexOf(charsToStrip, c) == -1) { foundIt = true; notInSet = i; break; } } if(foundIt) return s[notInSet .. $]; return s[0 .. 0]; //Empty string with correct type. } unittest { debug(string) printf("string.stripLeft2.unittest\n"); string hi = "Hello, world!"; assert(hi.stripLeft("") == hi); assert(hi.stripLeft("H") == "ello, world!"); assert(hi.stripLeft("Hel") == "o, world!"); assert(hi.stripLeft("def") == hi); assert(hi.stripLeft(hi) == ""); } /++ Strips trailing characters. +/ S stripRight(S)(S s, S charsToStrip) if(isSomeString!S) { alias typeof(s[0]) C; size_t codeLen; foreach(dchar c; retro(s)) { // Because of the call to indexOf, this function can't be safe anymore. if(indexOf(charsToStrip, c) >= 0) codeLen += codeLength!C(c); else break; } return s[0 .. $ - codeLen]; } unittest { debug(string) printf("string.stripRight2.unittest\n"); string hi = "Hello, worldd!"; assert(hi.stripRight("") == hi); assert(hi.stripRight("!") == "Hello, worldd"); assert(hi.stripRight("!.d") == "Hello, worl"); assert(hi.stripRight("hex") == hi); assert(hi.stripRight(hi) == ""); } /++ Strips both leading and trailing characters. +/ S strip(S)(S s, S charsToStrip) if(isSomeString!S) { return stripRight(stripLeft(s, charsToStrip), charsToStrip); } unittest { debug(string) printf("string.strip2.unittest\n"); string hi = " ohfoo"; assert(hi.strip("") == hi); assert(hi.strip(" ") == "ohfoo"); assert(hi.strip(" o") == "hf"); assert(hi.strip("ext") == hi); assert(hi.strip(" ohf") == ""); } -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Dec 21 2011