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