phobos and splitting things... but not with whitespace.

simendsjo simendsjo at gmail.com
Sat Jun 23 12:41:17 PDT 2012


On Sat, 23 Jun 2012 20:41:29 +0200, Chad J  
<chadjoan at __spam.is.bad__gmail.com> wrote:

> IMO the "take away a single line" thing should be accomplishable with a  
> single concise expression

This takes a range to match against, so much like startsWith:

auto findSplitAny(Range, Ranges...)(Range data, Ranges matches) {
     auto rest = data;
     for(; !rest.empty; rest.popFront()) {
         foreach(match; matches) {
             if(rest.startsWith(match)) {
                 auto restStart = data.length-rest.length;
                 auto pre = data[0..restStart];
                 // we'll fetch it from the data instead of using the  
supplied
                 // match to be consistent with findSplit
                 auto dataMatch = data[restStart..restStart+match.length];
                 auto post = rest[match.length..$];
                 return tuple(pre, dataMatch, post);
             }
         }
     }
     return tuple(data, Range.init, Range.init);
}
unittest {
     auto text = "1\n2\r\n3\r4";

     auto res = text.findSplitAny("\r\n", "\n", "\r");
     assert(res[0] == "1");
     assert(res[1] == "\n");
     assert(res[2] == "2\r\n3\r4");

     res = res[2].findSplitAny("\r\n", "\n", "\r");
     assert(res[0] == "2");
     assert(res[1] == "\r\n");
     assert(res[2] == "3\r4");

     res = res[2].findSplitAny("\r\n", "\n", "\r");
     assert(res[0] == "3");
     assert(res[1] == "\r");
     assert(res[2] == "4");

     res = res[2].findSplitAny("\r\n", "\n", "\r");
     assert(res[0] == "4");
     assert(res[1] == "");
     assert(res[2] == "");
}


More information about the Digitalmars-d-learn mailing list