On 08/27/2012 12:46 PM, Ellery Newcomer wrote:
On 08/24/2012 12:23 PM, JN wrote:
I feel kinda stupid here, what's wrong with C++ remove_if (
http://www.cplusplus.com/reference/algorithm/remove_if/ )?
you mean something like
c.erase(remove_if(c.begin(), c.end(), predicate), c.end())
?
That actually is the sort of thing one could accomplish with position
ranges:
c.remove(filter!(anti_predicate)(c.position_range()));
Doh.
import std.stdio;
import std.container;
void main(){
auto sl = SList!int([1,2,3,4,5,6,7,8]);
auto rng = sl[];
writeln(sl[]);
sl.linearRemove(remove_if!"a % 2 == 1"(sl[]));
writeln(sl[]);
}
auto remove_if(alias _pred, Rng)(Rng rng) {
import std.functional;
alias unaryFun!_pred pred;
Rng res = rng.save();
while(!rng.empty) {
if(!pred(rng.front)) {
res.front = rng.moveFront();
res.popFront();
}
rng.popFront();
}
return res;
}
Hmm. In multi_index,
res.front = rng.moveFront();
has some slightly nasty ramifications which I am not sure how to get
around (without access to the node pointer of the element being
assigned, multi_index has to remove the element and then add it back
in). I wonder what boost::multi_index does?