-
-
Notifications
You must be signed in to change notification settings - Fork 734
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Input range -> take -> filter -> chain: Take gets applied *after* filter #10561
Labels
Comments
AFAICT this is a value vs. reference semantics issue. import std.algorithm;
import std.range;
import std.stdio;
struct Range
{
private int i;
enum bool empty = false;
int front() => i;
void popFront() { ++i; }
}
void main()
{
writeln( Range() .take(10).filter!"a>8".chain(only(100)));
writeln((new Range()).take(10).filter!"a>8".chain(only(100)));
}
|
import std.algorithm;
import std.range;
import std.stdio;
struct Range
{
private int i = 0;
enum bool empty = false;
int front() => i;
void popFront() { ++i; }
}
void main()
{
writeln(chain(
(new Range()).take(2).filter!"a > 0",
(new Range()).take(2).filter!"a > 0",
));
}
|
Inkrementator
added a commit
to Inkrementator/phobos
that referenced
this issue
Feb 19, 2025
The constructor of the result of std.range.chain copies it's input tuple and then has to check which of the input-ranges in the first non-empty one. The member function empty is not guaranteed to be const, filter is probably the most prominent function that has to be "primed". On the first call to empty(), filter will try to advance all it's input ranges to the first element that matches the predicate. For ranges with full value semantics, using the old input object instead of the new internal buffer means that the work of priming is done twice. If any ranges have reference semantics, the references gets advances, but the value-semantic parts of the range-composition gets reset. This fixes dlang#10561 and dlang#9877
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
qigezx+dc40d6nao940k reported this on 2024-09-20T13:14:28Z
Transfered from https://issues.dlang.org/show_bug.cgi?id=24775
Description
The text was updated successfully, but these errors were encountered: