Re: Is it possible to set function attributes conditionally?

2021-06-04 Thread wjoe via Digitalmars-d-learn

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.




Re: Is it possible to set function attributes conditionally?

2021-06-04 Thread Adam D. Ruppe via Digitalmars-d-learn

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.


Is it possible to set function attributes conditionally?

2021-06-04 Thread wjoe via Digitalmars-d-learn

Hi,

Consider Allocators, e.g.:

```d
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


```d
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 ?