This came to mind while working on a set of containers.

@safety often comes with a performance cost. For example, any container that wants to give out a range or iterator has to have a ref-counted or GC allocted payload to ensure safety. In a high-performance context though, the performance hit may be unacceptable.

It's fairly easy to make a container that toggles it's implementation between ref-counted, GC, or raw pointers/arrays, based on a template parameter. This would allow a single container to be used in both performance sensitive and safe contexts (in theory). The only problem would be the lack of actual @safe annotations on the container, as they would only be applicable to one variant, and otherwise cause a compile-time error.

One solution could be this:

struct Container(T, bool safetyOn = true)
{
        static if(safe)
                RefCounted!(T[]) data;
        else
                T[] data;
                
        auto opSlice() @safe(safetyOn) {
                return Range(data, 0, data.length);
        }
}

A similar solution could be applied to @nogc as well.

Reply via email to