On Sunday, 16 August 2015 at 15:29:10 UTC, Ali Çehreli wrote:
On 08/16/2015 04:53 AM, FreeSlave wrote:
> The problem is that this allocates delegate, so it can't be
used in
> @nogc code.
Would constructing the delegate by setting its .funcptr and
.ptr properties work in this case? You can have a pool of
context objects which become the context for the delegate.
http://ddili.org/ders/d.en/lambda.html#ix_lambda..funcptr
Ali
I don't see how this can solve the problem.
What I tried:
import std.stdio;
import std.range;
import std.algorithm;
struct Caller
{
this(uint context) {
_context = context;
}
uint method(uint value) {
return _context * value;
}
uint _context;
}
@nogc auto func(uint[] arr, uint function(uint) f)
{
return arr.map!(f);
}
void main(string[] args)
{
uint[] arr = [1,2,3];
uint context = 2;
auto c = Caller(context);
auto d = &c.method;
writeln(func(arr, d.funcptr));
}
It still says it needs allocation:
test.d(17): Error: function test.func @nogc function allocates a
closure with the GC
funcptr does not play any role here, since passing the delegate
directly leads to the same error.