www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Is there anyway to make opApply nogc?

reply Gary Willoughby <dev nomad.so> writes:
Is there any way to make opApply  nogc? or provide the same 
foreach functionality without implementing a range interface?

I want to iterate over a piece of memory using a pointer. I 
thought about using opSlice but that doesn't provide information 
for an index in a foreach loop.

auto opSlice()
{
     return this._pointer[0 .. size];
}

Anyone got any ideas?
Jun 20 2016
parent reply Mathias Lang <mathias.lang sociomantic.com> writes:
On Monday, 20 June 2016 at 14:08:58 UTC, Gary Willoughby wrote:
 Is there any way to make opApply  nogc? or provide the same 
 foreach functionality without implementing a range interface?

 I want to iterate over a piece of memory using a pointer. I 
 thought about using opSlice but that doesn't provide 
 information for an index in a foreach loop.

 auto opSlice()
 {
     return this._pointer[0 .. size];
 }

 Anyone got any ideas?
Can't `opApply` with `auto` return type works since it infers attributes ?
Jun 20 2016
parent reply Gary Willoughby <dev nomad.so> writes:
On Monday, 20 June 2016 at 14:34:33 UTC, Mathias Lang wrote:
 Can't `opApply` with `auto` return type works since it infers 
 attributes ?
I think the problem is that the delegate which is required by opApply is allocated using the GC.
Jun 20 2016
parent reply Adam D. Ruppe <destructionator gmail.com> writes:
On Monday, 20 June 2016 at 15:13:53 UTC, Gary Willoughby wrote:
 I think the problem is that the delegate which is required by 
 opApply is allocated using the GC.
make the delegate in opApply scope int opApply(scope int delegate(whatever) dg)
Jun 20 2016
next sibling parent reply Gary Willoughby <dev nomad.so> writes:
On Monday, 20 June 2016 at 15:27:32 UTC, Adam D. Ruppe wrote:
 On Monday, 20 June 2016 at 15:13:53 UTC, Gary Willoughby wrote:
 I think the problem is that the delegate which is required by 
 opApply is allocated using the GC.
make the delegate in opApply scope int opApply(scope int delegate(whatever) dg)
What effect does this have? and how does it beat the GC?
Jun 20 2016
parent Gary Willoughby <dev nomad.so> writes:
On Monday, 20 June 2016 at 15:47:44 UTC, Gary Willoughby wrote:
 On Monday, 20 June 2016 at 15:27:32 UTC, Adam D. Ruppe wrote:
 On Monday, 20 June 2016 at 15:13:53 UTC, Gary Willoughby wrote:
 I think the problem is that the delegate which is required by 
 opApply is allocated using the GC.
make the delegate in opApply scope int opApply(scope int delegate(whatever) dg)
What effect does this have? and how does it beat the GC?
Found the explanation here: http://stackoverflow.com/questions/4711309/meaning-of-scope-in-d-for-a-parameter I give it a go. Thanks.
Jun 20 2016
prev sibling parent reply Gary Willoughby <dev nomad.so> writes:
On Monday, 20 June 2016 at 15:27:32 UTC, Adam D. Ruppe wrote:
 On Monday, 20 June 2016 at 15:13:53 UTC, Gary Willoughby wrote:
 I think the problem is that the delegate which is required by 
 opApply is allocated using the GC.
make the delegate in opApply scope int opApply(scope int delegate(whatever) dg)
I'm still not sure what this achieves. The description on the stackoverflow question reads: "And when the compiler sees this on delegates, it will avoid allocating a closure when taking the address of a local function. This is essential in opApply loops." I have no idea what that means. Can anyone shed more light on this, please?
Jun 21 2016
parent reply Adam D. Ruppe <destructionator gmail.com> writes:
On Tuesday, 21 June 2016 at 12:48:04 UTC, Gary Willoughby wrote:
 I have no idea what that means. Can anyone shed more light on 
 this, please?
So when you use local variables in a delegate, the compiler usually makes a copy of them just in case the delegate gets saved for later. When you mark it scope, you promise that you won't save it for later, so the compiler skips making the copy.
Jun 21 2016
parent reply Gary Willoughby <dev nomad.so> writes:
On Tuesday, 21 June 2016 at 12:53:11 UTC, Adam D. Ruppe wrote:
 On Tuesday, 21 June 2016 at 12:48:04 UTC, Gary Willoughby wrote:
 I have no idea what that means. Can anyone shed more light on 
 this, please?
So when you use local variables in a delegate, the compiler usually makes a copy of them just in case the delegate gets saved for later. When you mark it scope, you promise that you won't save it for later, so the compiler skips making the copy.
Right ok, thanks! It doesn't seem to help though as the compiler complains about it being not nogc.
Jun 21 2016
parent reply Marc =?UTF-8?B?U2Now7x0eg==?= <schuetzm gmx.net> writes:
On Tuesday, 21 June 2016 at 19:21:01 UTC, Gary Willoughby wrote:
 Right ok, thanks! It doesn't seem to help though as the 
 compiler complains about it being not  nogc.
You probably need to declare the delegate and opApply() itself as nogc, too: int opApply(scope int delegate(int) nogc dg) nogc { }
Jun 22 2016
parent Gary Willoughby <dev nomad.so> writes:
On Wednesday, 22 June 2016 at 13:36:54 UTC, Marc Sch├╝tz wrote:
 On Tuesday, 21 June 2016 at 19:21:01 UTC, Gary Willoughby wrote:
 Right ok, thanks! It doesn't seem to help though as the 
 compiler complains about it being not  nogc.
You probably need to declare the delegate and opApply() itself as nogc, too: int opApply(scope int delegate(int) nogc dg) nogc { }
That fixed it, thanks all for your help. :)
Jun 22 2016