Hi, I'm currently trying to replace the array in my signal implementation with the SList from std.container. I need to remove elements from the list, but I can't seem to get it right. According to the documentation, I expect linearRemove to remove the contents of the passed range, but linearRemove always removes all elements in the range and _after the range_ . For linearRemove(Range r) it seems to be expected? At least the code obviously behaves like that: http://www.dsource.org/projects/phobos/browser/trunk/phobos/std/container.d#L1251 ------------------------------------------------------------------------- auto n = findNode(_root, r._head); //find beginning of range in list n._next = null; //ignore all elements after that element return Range(null); ------------------------------------------------------------------------- Is this really the expected behavior for linearRemove?
The linearRemove(Take!Range r) version doesn't work either, but this time I'm sure it's a bug: it seems to happen if I use a Take!Range with the first element being the SList root node. looking at the code: http://www.dsource.org/projects/phobos/browser/trunk/phobos/std/container.d#L1270 ------------------------------------------------------------------------- Range linearRemove(Take!Range r) { auto orig = r.original; // We have something to remove here if (orig._head == _root) { // remove straight from the head of the list for (; !orig.empty; orig.popFront()) <----- _why orig.empty and orig.popFront? should be r.empty and r.popFront_ { removeFront(); } return this[]; } [...] } ------------------------------------------------------------------------- Testcase ------------------------------------------------------------------------- import std.container; import std.range; import std.algorithm; void main() { auto s = SList!int(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); auto r = s[]; auto r1 = take(r, 4); assert(equal(r1, [1, 2, 3, 4])); auto r2 = s.linearRemove(r1); assert(s == SList!int()); //passes - should fail! assert(s == SList!int(5, 6, 7, 8, 9, 10)); //fails } ------------------------------------------------------------------------- I guess I should file a bug report, but this really is a showstopper for me. Is there any way to get this fixed faster? The fix is really trivial. -- Johannes Pfau