Thread overview
Is it possible to set function attributes conditionally?
Jun 04, 2021
wjoe
Jun 04, 2021
Adam D. Ruppe
Jun 04, 2021
wjoe
June 04, 2021

Hi,

Consider Allocators, e.g.:

struct Mallocator
{
   enum usesGC = false;

   /// implement alloc, free, etc. @nogc
}

struct GCAllocator
{
  enum usesGC = true;

   /// implement alloc, free, etc. via the GC
}

Now I want to have the function attributes set depending on the allocator implementation

template AutoGC(ALLOCATOR) if (isAllocator!ALLOCATOR)
{
   static if (!ALLOCATOR.usesGC)
      AutoGC = pragma(attrib, @nogc);
   else
      AutoGC = pragma(attrib, none);
}

@AutoGC!ALLOCATOR void fun(ALLOCATOR)() if(isAllocator!ALLOCATOR)
{
   void* p = ALLOCATOR.alloc(1024);
   // do something with p
   ALLOCATOR.free(p);
}

So fun!Mallocator would be @nogc and fun!GCAllocator wouldn't be @nogc.

This is a contrived example. In reality I would use this with custom array, hash map and other container implementations so I could use them in @nogc territory by just switching out the allocator.

Is it possible to do something like this ?

June 04, 2021

On Friday, 4 June 2021 at 11:33:32 UTC, wjoe wrote:

>

This is a contrived example. In reality I would use this with custom array, hash map and other container implementations so I could use them in @nogc territory by just switching out the allocator.

If they are templates, just don't specify attributes and the compiler will infer them for you.

If they are not templates, you have to do a separate copy under version or static if.

June 04, 2021

On Friday, 4 June 2021 at 11:36:09 UTC, Adam D. Ruppe wrote:

>

On Friday, 4 June 2021 at 11:33:32 UTC, wjoe wrote:

>

This is a contrived example. In reality I would use this with custom array, hash map and other container implementations so I could use them in @nogc territory by just switching out the allocator.

If they are templates, just don't specify attributes and the compiler will infer them for you.

If they are not templates, you have to do a separate copy under version or static if.

That's good to know. Thanks :)
A separate copy is exactly what I wanted to avoid but since they are templates it's np.