On Monday, 29 January 2018 at 06:46:26 UTC, Ali Çehreli wrote:
I think the following trivial wrapper around std.algorithm.remove() should do:

void removeMatching(R, N)(ref R r, N needles) {
    import std.algorithm : remove, canFind;
    r = r.remove!(e => needles.canFind(e));
}


Haha awesome! Yes that's much better :)

Note to self: learn to scroll down in the docs to find other definitions. I was convinced that remove only acted on indices :p

I'm not convinced that unfoundElements is needed at all. :)

Can't argue with that :)

> 6) It will not work when I pass in a range that has const
elements.
>
> ie:
>
> const(int)[] arr = [1, 2, 3, 4, 5];
> arr.pull([2, 3]);
>
> This I guess makes sense because moveEmplaceAll depends on
isInputRange
> and from my understanding, a const range cannot be one (is
that
> correct?).

Yes but your range is not const, the elements are. So, although const(int)[] is a range, it does not have mutable elements.

Ah right, yes the range is not const indeed.

You don't want to mutate const elements anyway. It would be breaking a promise that other parts of the program may be depending on. I would return a filtered-out range:

Right, I want to mutate the range though, not the elements. So moving things from one location is not considered as a const violation in c++ for eg, maybe the D way is different though? Any reading material there?

Also hasMobileElements!(const int[]) is true, so that means I can move elements around right?

If I can move elements, that means I should be able to move the ones I want to the beginning, of the range, but then I'm also unsure about how to go about changing the size of a range.

popBack on a mutable range with const data might cause destructors to be called, so I'm going to say that should be ok because as a user, if you're calling a range that mutates by removing things, and if you try and access those things later that's probably along the same lines as removing elements from a range that you're "foreach"ing over.

And your second approach is definitely more practical I'd say, but I'm going to go about this as a learning exercise in dealing with mutations, and const with ranges in D.

Thanks you for the comments!


Reply via email to