www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - findSplit corner case bug?

Although it is a bit of a corner case, I would argue that the 
following behaviour is buggy:

     assert(findSplit!(reverseArgs!canFind)("078.12.13-4.5", ".-") 
== tuple("078", ".1", "2.13-4.5"));

To understand why, consider the following more explicit code:

     void main()
     {
         static bool oneOf(dchar a, string b)
         {
             bool r = false;

             foreach(c; b)
             {
                 if(c == a)
                 {
                     r = true;
                     break;
                 }
             }

             writefln(`matching a='%s' b="%s" returns %s`, a, b, 
r);

             return r;
         }

         auto s = findSplit!oneOf("078.12.13-4.5", ".-");

         writefln("%s %s %s", s[0], s[1], s[2]);
     }

Output:

     matching a='0' b=".-" returns false
     matching a='7' b=".-" returns false
     matching a='8' b=".-" returns false
     matching a='.' b=".-" returns true
     078 .1 2.13-4.5

The findSplit documentation says: "result[1] is the portion of 
haystack that matches needle". Yet, the only character for which 
the predicate returned true was '.'. Therefore, that should be 
the only part of result[1]. The alternative would be to clarify 
and change the documentation, I guess.

BTW 1: it's not very clear what the predicate arguments are / can 
be, unless I missed some part of the docs. Apparently, findSplit 
tries to use both `bool function(dchar, dchar)` and `bool 
function(dchar, string)`, IIRC.

BTW 2: Any particular reason for binaryReverseArgs to exist, 
instead of always just using reverseArgs?
Aug 10 2015