digitalmars.D.learn - Introspecting a range for .front `scope`ness
- Dukc (32/32) May 24 2023 I'm trying to improve `std.array : array` to infer whether it's
I'm trying to improve `std.array : array` to infer whether it's
parameter range can be `scope`. To do this, I need to introspect
whether the `.front` of the range in question is `scope`. I also
need to differentiate plain `scope` front from `scope return` or
`return scope`. That is, I need to distinguish the first of these
from the latter two:
```D
struct Range
{ // Can point to stack, won't return self-references.
ElType front() scope;
// Can point to stack, might return a self-reference or
reference to pointed-to data.
ElType front() scope return;
// Can point to stack. If so, may return a pointer to stack,
but not to this struct itself.
ElType front() return scope;
}
```
I tried to solve it this way:
```D
static if(is(typeof((scope Range test, ElementType!Range[] out_)
=> out_[0] = test.front)))
```
However, this passes even if `range.front` is `return scope`
(which I want to fail this test). I suspect it's because scope
checks are only done in ` safe` code. I can't test the assignment
for safety since Phobos has to work with ranges that have
` system` `.front` or `.front.opAssign`.
I figured out I need to introspect the parameter storage class of
`test.front`, but how? `std.traits : ParameterStorageClassTuple`
would work, but it doesn't tell the storage classes of the hidden
`.this` pointer - only those of the visible parameters.
May 24 2023








Dukc <ajieskola gmail.com>