opApply @safety

Basile B. via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Fri Jan 29 15:35:35 PST 2016


On Friday, 29 January 2016 at 17:44:34 UTC, Chris Wright wrote:
> I want to create an opApply for a type.
>
> I've marked my code @safe, because everything I wrote was 
> @safe. The body of opApply is @safe, but it calls a delegate 
> that may or may not be @safe.
>
> How do I make it so I can iterate through this type safely and 
> systemly?
>
> I want to support iteration like:
>
> foreach (string key, string value; collection) {}
> foreach (size_t i, string key, string value; collection) {}

You can implement an input range and annotate all the primitives 
as @safe.
Then if there's only an input range in your agregate, DMD will 
auto-detect that it must use it in foreach():

http://dlang.org/spec/statement.html#foreach-with-ranges

in the worst case (range not implementable directly but only as a 
getter in .range() or .opSlice() you'll have to change the style 
a bit and consume the range explicitly in a typical "while 
(!stuff.empty) {...}"




More information about the Digitalmars-d-learn mailing list