On Wednesday, 14 May 2014 at 15:42:13 UTC, Damian Day wrote:
On Wednesday, 14 May 2014 at 14:54:57 UTC, David Nadlinger wrote:

Could you post a short benchmark snippet explicitly showing the problem?

Benchmark found here:
http://dpaste.dzfl.pl/0058fc8341830

FYI, that implementation is wrong: Array.Range keeps `_a` and `_b`, which represents the "internal" bounds of the payload proper (and not "low" and "length"). You want something along the lines of:

Range searchForward(E)(E needle)
        if (isImplicitlyConvertible!(E, T))
{
           assert(_data.refCountedStore.isInitialized);

        auto haystack = _data._payload[_a .. _b];
    immutable len = _b - _a;

           for (size_t index = 0; index < len; ++index)
           {
                      if (haystack[index] is needle)
                        return Range(this, _b - len, _b);
           }
        
           return Range(this, _b, _b);
}

But even then, as I suggested above, while I think having searchForward could improve the situation, implementing it "in terms of" find would be better: This way, you'd still benefit from some of the highly optimized cases in find.

Reply via email to