@safe(bool)
Nicholas Wilson via Digitalmars-d
digitalmars-d at puremagic.com
Sat Aug 19 17:49:28 PDT 2017
On Saturday, 19 August 2017 at 19:15:25 UTC, bitwise wrote:
> On Saturday, 19 August 2017 at 18:22:58 UTC, Guillaume Boucher
> wrote:
>> On Thursday, 17 August 2017 at 16:32:20 UTC, bitwise wrote:
>>> In a high-performance context though, the performance hit may
>>> be unacceptable.
>>
>> Well in those super rare situations, there's always the
>> workaround with mixins:
>
> Those situations are not rare.
>
>> mixin template funcWithAttr(string decl, string attributes,
>> string code) {
>> pragma(msg, "<<<" ~ code ~ ">>>");
>> mixin(decl ~ attributes ~ "{" ~ code ~" }");
>> }
>>
>> struct Container(T, bool safetyOn = true)
>> {
>> static if(safe)
>> RefCounted!(T[]) data;
>> else
>> T[] data;
>>
>> mixin funcWithAttr!("auto opSlice()", safetyOn ? "@safe" :
>> "", q{
>> return Range(data, 0, data.length);
>> });
>> }
>
> Really?
With DIP 1012 you should be able to go
struct Container(T, bool safetyOn = true)
{
static if(safe)
RefCounted!(T[]) data;
else
T[] data;
auto opSlice() @safeIf!safetyOn {
return Range(data, 0, data.length);
}
}
template safeIf(bool cond)
{
static if (cond) alias safeIf = AliasSeq!(safe);
else alias safeIf = AliasSeq!();
}
or even just
struct Container(T, FunctionSafety safetyOn = safe)
{
static if(safe)
RefCounted!(T[]) data;
else
T[] data;
auto opSlice() @safetyOn {
return Range(data, 0, data.length);
}
}
Container!int foo; // Container!(int, safe)
Container!(int, system) bar;
The only downside is that the second form leaves itself open to
Container!(int, trusted) quux;
which is probably undesirable.
More information about the Digitalmars-d
mailing list