[Issue 7716] New: Add an indexed overload to countUntil

d-bugmail at puremagic.com d-bugmail at puremagic.com
Thu Mar 15 09:55:15 PDT 2012


http://d.puremagic.com/issues/show_bug.cgi?id=7716

           Summary: Add an indexed overload to countUntil
           Product: D
           Version: D2
          Platform: All
        OS/Version: All
            Status: NEW
          Severity: enhancement
          Priority: P2
         Component: Phobos
        AssignedTo: nobody at puremagic.com
        ReportedBy: andrej.mitrovich at gmail.com


--- Comment #0 from Andrej Mitrovic <andrej.mitrovich at gmail.com> 2012-03-15 09:55:27 PDT ---
Sometimes I want to find the index of a substring, but not necessarily the
index of the first occurence. E.g. in the string "foo x foo y" I want to get
the index of the second foo. Here's a simple implementation based on the
existing countUntil:

import std.algorithm : startsWith;
import std.array;
import std.traits;

sizediff_t countUntil(alias pred = "a == b", R, N)(R haystack, N needle, size_t
index)
if (is(typeof(startsWith!pred(haystack, needle))))
{
    size_t count;
    static if (isNarrowString!R)
    {
        // Narrow strings are handled a bit differently
        auto length = haystack.length;
        for (; !haystack.empty; haystack.popFront())
        {
            if (startsWith!pred(haystack, needle))
            {
                if (count == index)
                    return length - haystack.length;
                else
                    count++;
            }
        }
    }
    else
    {
        typeof(return) result;
        for (; !haystack.empty; ++result, haystack.popFront())
        {
            if (startsWith!pred(haystack, needle))
            {
                if (count == index)
                    return result;
                else
                    count++;
            }
        }
    }
    return -1;
}

void main()
{
    string s = "foo x foo y";

    auto idx1 = s.countUntil("foo", 0);
    auto idx2 = s.countUntil("foo", 1);
    auto idx3 = s.countUntil("foo", 2);

    assert(idx1 == 0);
    assert(idx2 == 6);
    assert(idx3 == -1);
}

Equivalent functionality could be added to std.string.indexOf to allow
case-unsensitive searches.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------


More information about the Digitalmars-d-bugs mailing list