Fix Issue 20943 - std.algorithm.setops.cartesianProduct fails for ranges with @system popFront (#7519)

Let safety of cartesianProduct.Result.popFront be inferred.
This commit is contained in:
John Colvin 2020-06-18 10:08:14 +01:00 committed by GitHub
parent a6caa89885
commit b8e90f4a22
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -391,7 +391,7 @@ if (ranges.length >= 2 &&
return mixin(algoFormat("tuple(%(current[%d].front%|,%))",
iota(0, current.length)));
}
void popFront() scope @safe
void popFront() scope
{
foreach_reverse (i, ref r; current)
{
@ -554,6 +554,40 @@ pure @safe nothrow @nogc unittest
foreach (pair; cartesianProduct(seq, seq)) {}
}
@system unittest
{
import std.algorithm.comparison : equal;
import std.typecons : tuple;
static struct SystemRange
{
int[] data;
int front() @system @property inout
{
return data[0];
}
bool empty() @system @property inout
{
return data.length == 0;
}
void popFront() @system
{
data = data[1 .. $];
}
SystemRange save() @system
{
return this;
}
}
assert(SystemRange([1, 2]).cartesianProduct(SystemRange([3, 4]))
.equal([tuple(1, 3), tuple(1, 4), tuple(2, 3), tuple(2, 4)]));
}
// largestPartialIntersection
/**
Given a range of sorted $(REF_ALTTEXT forward ranges, isForwardRange, std,range,primitives)