Samuele Carcagno:

I would like to find the indexes of all the elements of an array matching a certain value. I could simply loop over all the elements to do the job, but I was hoping for some ready made function that also works across different types (ints, floats etc...).

I have written you some code, but it's not tested, it works with just arrays, items inside the struct is const and this causes some troubles, etc.

Writing good library code requires a lot of work. Writing it quickly is dangerous.


import std.stdio;

struct FindAllIndexes(T) {
    const T[] items;
    T x;
    private size_t _front;

    this(in T[] items_, T x_) pure nothrow {
        this.items = items_;
        this.x = x_;
        for ( ; _front < items_.length; _front++)
            if (x_ == items[_front])
                break;
    }

    @property bool empty() const pure nothrow {
        return _front >= items.length;
    }

    @property size_t front() const pure nothrow {
        return _front;
    }

    void popFront() pure nothrow {
        _front++;
        for ( ; _front < items.length; _front++)
            if (x == items[_front])
                break;
    }
}

FindAllIndexes!T findAllIndexes(T)(in T[] items, T x) {
    return typeof(return)(items, x);
}

void main() {
    const data = [1, 5, 7, 9, 5, 10, 3, 5];
    writeln(data.findAllIndexes(5));
}


A slower higher level version:


import std.stdio, std.algorithm, std.range;

auto findAllIndexes(R, T)(in R items, T x) {
    return iota(size_t.max)
           .zip(items)
           .filter!(p => p[1] == x)()
           .map!q{a[0]}();
}

void main() {
    const data = [1, 5, 7, 9, 5, 10, 3, 5];
    writeln(data.findAllIndexes(5));
}

Bye,
bearophile

Reply via email to