On Fri, 04 Mar 2011 12:13:34 -0500, spir <denis.s...@gmail.com> wrote:

On 03/04/2011 05:43 PM, Steven Schveighoffer wrote:
But with the current compiler, you can use opApply to achieve that behavior.

opApply should work but it is supposed to be slower.

It depends on the application and aggregate you are trying to iterate.

If inlining is possible, ranges can be extremely fast. However, there are certain applications that are better suited or only work with opApply:

 * iterating polymorphic types (i.e. classes or interfaces)
 * iterating non-linearly (e.g. iterating a tree)
 * iterating multiple items in foreach (i.e. foreach(i, v; arr) )

In addition, LDC is able to inline opApply delegates that are compiler-generated, making opApply pretty much as fast as a range iteration. I hope some day dmd can do this too.

Defining range primitives directly on the object/container cannot work as of now, unfortunately, because of a pair of bugs (conflicts in formatValue template definitions between struct/class on one hand and ranges on the other).

It is not a good idea to define range primitives on a container. This would mean that iterating the container destroys the data. What you want is a range on the container, and to iterate that range. Think of a range as a view of the data in the container. Think of the container as the owner of the data. A confusing aspect is that builtin arrays are often thought of as containers. They are not containers, they are ranges. The owner of the data is actually the GC.

-Steve

Reply via email to