Extra .tupleof field in structs with disabled postblit blocks non-GC-allocation trait
Per Nordlöw
per.nordlow at gmail.com
Wed May 9 14:50:04 UTC 2018
On Wednesday, 9 May 2018 at 14:36:38 UTC, Per Nordlöw wrote:
> On Wednesday, 9 May 2018 at 14:34:02 UTC, Per Nordlöw wrote:
>> On Wednesday, 9 May 2018 at 14:20:41 UTC, Per Nordlöw wrote:
>>> If so, we can temporarily modify the trait to exclude the
>>> last `void*` member of the `S.tuple`. Given that it's always
>>> added as the last member.
>>
>> Also note that
>>
>> pragma(msg, __traits(isDisabled, S.this(this)));
>>
>> fails to compile as
>>
>> Error: identifier expected following `.`, not `this`
>
> Ahh, but both
>
> pragma(msg, __traits(isDisabled, S.__postblit));
> pragma(msg, __traits(isDisabled, S.__xpostblit));
>
> prints true for a struct with `@disable this(this);`
>
> Which one should I pick to check if last element of `S.tupleof`
> should be discarded?
Managed to put together the hack
private template mustAddGCRangeOfStructOrUnion(T)
if (is(T == struct) ||
is(T == union))
{
import std.traits : hasUDA;
import std.meta : anySatisfy;
static if (__traits(hasMember, T, "__postblit"))
{
static if (__traits(isDisabled, T.__postblit))
{
enum mustAddGCRangeOfStructOrUnion =
anySatisfy!(mustAddGCRangeOfMember, T.tupleof[0 .. $ - 1]);
}
else
{
enum mustAddGCRangeOfStructOrUnion =
anySatisfy!(mustAddGCRangeOfMember, T.tupleof);
}
}
else
{
enum mustAddGCRangeOfStructOrUnion =
anySatisfy!(mustAddGCRangeOfMember, T.tupleof);
}
}
defined here
https://github.com/nordlow/phobos-next/blob/master/src/gc_traits.d#L81
Destroy.
More information about the Digitalmars-d-learn
mailing list